From f887d8721f49c26c4e5eb3b03ae05e918142bccc Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Fri, 26 Jul 2024 16:36:55 +0200 Subject: [PATCH 001/145] Voortschrijdend inzicht op aanmeldingsspel --- appinfo/routes.php | 1 + lib/Controller/DirectoryController.php | 10 +++- lib/Service/DirectoryService.php | 63 +++++++++++++++++--------- 3 files changed, 51 insertions(+), 23 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index 7aadd29c..7869186a 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -17,6 +17,7 @@ ['name' => 'search#index', 'url' => '/api/search', 'verb' => 'GET'], ['name' => 'search#show', 'url' => '/api/search/{id}', 'verb' => 'GET'], ['name' => 'directory#page', 'url' => '/directory', 'verb' => 'GET'], + ['name' => 'directory#add', 'url' => '/api/directory/add', 'verb' => 'POST'], ['name' => 'configuration#index', 'url' => '/configuration', 'verb' => 'GET'], ['name' => 'configuration#create', 'url' => '/configuration', 'verb' => 'POST'] ], diff --git a/lib/Controller/DirectoryController.php b/lib/Controller/DirectoryController.php index 17539119..d93b9c8f 100644 --- a/lib/Controller/DirectoryController.php +++ b/lib/Controller/DirectoryController.php @@ -70,11 +70,17 @@ public function page(?string $getParameter) ); } + + /** + * @PublicPage + * @NoCSRFRequired + */ public function add(?string $url, DirectoryService $directoryService): JSONResponse { + $directories = []; + $directoryService->registerToExternalDirectory(url: $url, externalDirectories: $directories); - - return new JSONResponse($listing); + return new JSONResponse(['listings added' => $directories]); } diff --git a/lib/Service/DirectoryService.php b/lib/Service/DirectoryService.php index f6848563..b718f2b7 100644 --- a/lib/Service/DirectoryService.php +++ b/lib/Service/DirectoryService.php @@ -4,17 +4,23 @@ use DateTime; use GuzzleHttp\Client; +use OCA\OpenCatalogi\Db\Catalog; +use OCA\OpenCatalogi\Db\CatalogMapper; +use OCA\OpenCatalogi\Db\ListingMapper; use OCP\IAppConfig; use OCP\IURLGenerator; class DirectoryService { + private string $appName = 'opencatalogi'; private Client $client; public function __construct( private readonly IURLGenerator $urlGenerator, private readonly IAppConfig $config, private readonly ObjectService $objectService, + private readonly CatalogMapper $catalogMapper, + private readonly ListingMapper $listingMapper, ) { $this->client = new Client([]); @@ -37,22 +43,32 @@ private function getDirectoryEntry(string $catalogId): array ]; } - public function registerToExternalDirectory (array $newDirectory): int + public function registerToExternalDirectory (array $newDirectory = [], ?string $url = null, array &$externalDirectories = []): int { + if($newDirectory !== [] && $url === null) { + $url = $newDirectory['directory']; + } + - if($this->config->getValueString()) - $dbConfig['base_uri'] = $this->config->getValueString('opencatalogi', 'mongodbLocation'); - $dbConfig['headers']['api-key'] = $this->config->getValueString('opencatalogi', 'mongodbKey'); - $dbConfig['mongodbCluster'] = $this->config->getValueString('opencatalogi', 'mongodbCluster'); + if($this->config->getValueString($this->appName, 'mongoStorage') !== '1') { + $catalogi = $this->catalogMapper->findAll(); + } else { + $dbConfig['base_uri'] = $this->config->getValueString('opencatalogi', 'mongodbLocation'); + $dbConfig['headers']['api-key'] = $this->config->getValueString('opencatalogi', 'mongodbKey'); + $dbConfig['mongodbCluster'] = $this->config->getValueString('opencatalogi', 'mongodbCluster'); - $catalogi = $this->objectService->findObjects(filters: ['_schema' => 'catalog'], config: $dbConfig)['documents']; + $catalogi = $this->objectService->findObjects(filters: ['_schema' => 'catalog'], config: $dbConfig)['documents']; + } foreach($catalogi as $catalog) { + if($catalog instanceof Catalog) { + $catalog = $catalog->jsonSerialize(); + } $directory = $this->getDirectoryEntry($catalog['id']); - $result = $this->client->post(uri: $newDirectory['directory'], options: ['json' => $directory, 'http_errors' => false]); + $result = $this->client->post(uri: $url, options: ['json' => $directory, 'http_errors' => false]); } - $externalDirectories = $this->fetchFromExternalDirectory($newDirectory); + $externalDirectories = $this->fetchFromExternalDirectory(url: $url); return $result->getStatusCode(); @@ -66,30 +82,35 @@ private function createDirectoryFromResult(array $result): ?array return null; } - $dbConfig['base_uri'] = $this->config->getValueString(app: 'opencatalogi', key: 'mongodbLocation'); - $dbConfig['headers']['api-key'] = $this->config->getValueString(app: 'opencatalogi', key: 'mongodbKey'); - $dbConfig['mongodbCluster'] = $this->config->getValueString(app: 'opencatalogi', key: 'mongodbCluster'); + if($this->config->getValueString($this->appName, 'mongoStorage') === '1') { + $dbConfig['base_uri'] = $this->config->getValueString(app: 'opencatalogi', key: 'mongodbLocation'); + $dbConfig['headers']['api-key'] = $this->config->getValueString(app: 'opencatalogi', key: 'mongodbKey'); + $dbConfig['mongodbCluster'] = $this->config->getValueString(app: 'opencatalogi', key: 'mongodbCluster'); - $result['_schema'] = 'directory'; + $result['_schema'] = 'directory'; - $returnData = $this->objectService->saveObject( - data: $result, - config: $dbConfig - ); + $returnData = $this->objectService->saveObject( + data: $result, + config: $dbConfig + ); + } else { + $this->listingMapper->createFromArray($result); + } $this->registerToExternalDirectory(newDirectory: $result); return $returnData; } - public function fetchFromExternalDirectory(array $directory): array + public function fetchFromExternalDirectory(array $directory = [], ?string $url = null): array { - $result = $this->client->get($directory['directory']); + if($directory !== [] && $url === null) { + $url = $directory['directory']; + } + $result = $this->client->get($url); $results = json_decode($result->getBody()->getContents(), true); - var_dump($results); - foreach($results['results'] as $record) { $this->createDirectoryFromResult($record); } @@ -99,6 +120,6 @@ public function fetchFromExternalDirectory(array $directory): array public function updateToExternalDirectory(): array { - + return []; } } From 8edab70a63f6f2bb021ba0f81f94c3c227f98869 Mon Sep 17 00:00:00 2001 From: Wilco Louwerse Date: Tue, 30 Jul 2024 17:10:49 +0200 Subject: [PATCH 002/145] Use $this->client not $client --- lib/Service/SearchService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Service/SearchService.php b/lib/Service/SearchService.php index bd03bcb7..4d0ca09f 100644 --- a/lib/Service/SearchService.php +++ b/lib/Service/SearchService.php @@ -109,7 +109,7 @@ public function search(array $parameters, array $elasticConfig, array $dbConfig, $parameters['_catalogi'] = $catalogi; - $promises[] = $client->getAsync($searchEndpoint, ['query' => $parameters]); + $promises[] = $this->client->getAsync($searchEndpoint, ['query' => $parameters]); } $responses = Utils::settle($promises)->wait(); From 8d91d9fe58255f0ffac900466c1775fa86052b9c Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Wed, 31 Jul 2024 13:43:41 +0200 Subject: [PATCH 003/145] Fix serialization of featured --- lib/Db/Publication.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Db/Publication.php b/lib/Db/Publication.php index 076cbd78..508bed58 100644 --- a/lib/Db/Publication.php +++ b/lib/Db/Publication.php @@ -18,7 +18,7 @@ class Publication extends Entity implements JsonSerializable protected ?string $portal = null; protected ?string $catalogi = null; protected ?string $metaData = null; - protected ?DateTime $published = null; + protected ?DateTime $published = null; protected ?DateTime $modified = null; protected ?string $featured = null; protected ?array $organization = []; @@ -110,7 +110,7 @@ public function jsonSerialize(): array 'metaData' => $this->metaData, 'published' => $this->published->format('c'), 'modified' => $this->modified->format('c'), - 'featured' => $this->featured, + 'featured' => $this->featured !== null ? (bool) $this->featured : null, 'organization' => $this->organization, 'data' => $this->data, 'attachments' => $this->attachments, From 463d6046cd709d4c42924dd91e6144402ee28e76 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Wed, 31 Jul 2024 15:16:11 +0200 Subject: [PATCH 004/145] Fixes from redesign --- composer.json | 3 ++- lib/Db/ListingMapper.php | 6 +++++- lib/Service/DirectoryService.php | 16 ++++++++++++++++ lib/Service/SearchService.php | 21 ++++++++++++++------- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index ec3d5b23..27f35662 100644 --- a/composer.json +++ b/composer.json @@ -43,7 +43,8 @@ "php": "^8.1", "elasticsearch/elasticsearch": "^v8.14.0", "adbario/php-dot-notation": "^3.3.0", - "guzzlehttp/guzzle": "^7.0" + "guzzlehttp/guzzle": "^7.0", + "symfony/uid": "^6.4" }, "require-dev": { "nextcloud/ocp": "dev-stable29", diff --git a/lib/Db/ListingMapper.php b/lib/Db/ListingMapper.php index 2400a3c7..098e0f8b 100644 --- a/lib/Db/ListingMapper.php +++ b/lib/Db/ListingMapper.php @@ -28,7 +28,7 @@ public function find(int $id): Listing return $this->findEntity(query: $qb); } - public function findAll($limit = null, $offset = null): array + public function findAll($limit = null, $offset = null, $filters = []): array { $qb = $this->db->getQueryBuilder(); @@ -37,6 +37,10 @@ public function findAll($limit = null, $offset = null): array ->setMaxResults($limit) ->setFirstResult($offset); + foreach($filters as $filter => $value) { + $qb->andWhere($qb->expr()->eq($filter, $qb->createNamedParameter($value))); + } + return $this->findEntities(query: $qb); } diff --git a/lib/Service/DirectoryService.php b/lib/Service/DirectoryService.php index b718f2b7..71662ecd 100644 --- a/lib/Service/DirectoryService.php +++ b/lib/Service/DirectoryService.php @@ -122,4 +122,20 @@ public function updateToExternalDirectory(): array { return []; } + + public function listDirectory(array $filters = [], int $limit = 30, int $offset = 0): array + { + if ($this->config->hasKey($this->appName, 'mongoStorage') === false + || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' + ) { + return $this->listingMapper->findAll(limit: $limit, offset: $offset, filters: $filters); + } + $filters['_schema'] = 'directory'; + + $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); + $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); + $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); + + return $this->objectService->findObjects(filters: $filters, config: $dbConfig); + } } diff --git a/lib/Service/SearchService.php b/lib/Service/SearchService.php index bd03bcb7..1844e648 100644 --- a/lib/Service/SearchService.php +++ b/lib/Service/SearchService.php @@ -16,8 +16,8 @@ class SearchService ]; public function __construct( - private readonly ObjectService $objectService, - private readonly ElasticSearchService $elasticService + private readonly ElasticSearchService $elasticService, + private readonly DirectoryService $directoryService, ) { $this->client = new Client(); } @@ -78,11 +78,18 @@ public function sortResultArray(array $a, array $b): int public function search(array $parameters, array $elasticConfig, array $dbConfig, array $catalogi = []): array { - $localResults = $this->elasticService->searchObject($parameters, $elasticConfig); + $localResults['results'] = []; + $localResults['facets'] = []; - $directory = $this->objectService->findObjects(filters: ['_schema' => 'directory'], config: $dbConfig); + if($elasticConfig['location'] !== '') { + $localResults = $this->elasticService->searchObject($parameters, $elasticConfig); + } + + $directory = $this->directoryService->listDirectory(limit: 1000); + +// $directory = $this->objectService->findObjects(filters: ['_schema' => 'directory'], config: $dbConfig); - if(count($directory['documents']) === 0) { + if(count($directory) === 0) { return $localResults; } @@ -92,7 +99,7 @@ public function search(array $parameters, array $elasticConfig, array $dbConfig, $searchEndpoints = []; $promises = []; - foreach($directory['documents'] as $instance) { + foreach($directory as $instance) { if( $instance['default'] === false && isset($parameters['.catalogi']) === true @@ -109,7 +116,7 @@ public function search(array $parameters, array $elasticConfig, array $dbConfig, $parameters['_catalogi'] = $catalogi; - $promises[] = $client->getAsync($searchEndpoint, ['query' => $parameters]); + $promises[] = $this->client->getAsync($searchEndpoint, ['query' => $parameters]); } $responses = Utils::settle($promises)->wait(); From 3a5a422736afbd120e050f20df3ffda0f90cd9a1 Mon Sep 17 00:00:00 2001 From: Robert Zondervan Date: Wed, 31 Jul 2024 16:54:26 +0200 Subject: [PATCH 005/145] Fixes from tests --- lib/Controller/DirectoryController.php | 4 +- lib/Db/Listing.php | 19 +++--- lib/Migration/Version6Date20240731141731.php | 61 ++++++++++++++++++++ lib/Service/DirectoryService.php | 21 +++++-- 4 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 lib/Migration/Version6Date20240731141731.php diff --git a/lib/Controller/DirectoryController.php b/lib/Controller/DirectoryController.php index 64bee71f..522b2446 100644 --- a/lib/Controller/DirectoryController.php +++ b/lib/Controller/DirectoryController.php @@ -80,7 +80,7 @@ public function add(?string $url, DirectoryService $directoryService): JSONRespo $directories = []; $directoryService->registerToExternalDirectory(url: $url, externalDirectories: $directories); - return new JSONResponse(['listings added' => $directories]); + return new JSONResponse(['listingsAdded' => $directories]); } @@ -172,8 +172,6 @@ public function create(ObjectService $objectService, DirectoryService $directory config: $dbConfig ); - $directoryService->registerToExternalDirectory(newDirectory: $data); - // get post from requests return new JSONResponse($returnData); } diff --git a/lib/Db/Listing.php b/lib/Db/Listing.php index e0222dca..f4503bbb 100644 --- a/lib/Db/Listing.php +++ b/lib/Db/Listing.php @@ -16,10 +16,11 @@ class Listing extends Entity implements JsonSerializable protected ?string $search = null; protected ?string $directory = null; protected ?string $metadata = null; + protected ?string $catalogus = null; protected ?string $status = null; protected ?DateTime $lastSync = null; - protected bool $default = false; - protected bool $available = false; + protected ?bool $default = false; + protected ?bool $available = false; public function __construct() { $this->addType(fieldName: 'title', type: 'string'); @@ -28,6 +29,7 @@ public function __construct() { $this->addType(fieldName: 'search', type: 'string'); $this->addType(fieldName: 'directory', type: 'string'); $this->addType(fieldName: 'metadata', type: 'string'); + $this->addType(fieldName: 'catalogus', type: 'string'); $this->addType(fieldName: 'status', type: 'string'); $this->addType(fieldName: 'lastSync', type: 'datetime'); $this->addType(fieldName: 'default', type: 'boolean'); @@ -72,12 +74,13 @@ public function jsonSerialize(): array 'summary' => $this->summary, 'description' => $this->description, 'search' => $this->search, - 'directory' => $this->search, - 'metadata' => $this->search, - 'status' => $this->search, - 'lastSync' => $this->search, - 'default' => $this->search, - 'available' => $this->search, + 'directory' => $this->directory, + 'metadata' => $this->metadata, + 'catalogus' => $this->catalogus, + 'status' => $this->status, + 'lastSync' => $this->lastSync, + 'default' => $this->default, + 'available' => $this->available, ]; $jsonFields = $this->getJsonFields(); diff --git a/lib/Migration/Version6Date20240731141731.php b/lib/Migration/Version6Date20240731141731.php new file mode 100644 index 00000000..2bee8979 --- /dev/null +++ b/lib/Migration/Version6Date20240731141731.php @@ -0,0 +1,61 @@ +hasTable(tableName: 'listings') === true) { + $table = $schema->getTable(tableName: 'listings'); + + if($table->hasColumn(name: 'catalogus') === false) { + $table->addColumn(name: 'catalogus', typeName: Types::STRING); + } + } + + return $schema; + } + + /** + * @param IOutput $output + * @param Closure(): ISchemaWrapper $schemaClosure + * @param array $options + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + } +} diff --git a/lib/Service/DirectoryService.php b/lib/Service/DirectoryService.php index 71662ecd..1b41fc30 100644 --- a/lib/Service/DirectoryService.php +++ b/lib/Service/DirectoryService.php @@ -70,15 +70,24 @@ public function registerToExternalDirectory (array $newDirectory = [], ?string $ $externalDirectories = $this->fetchFromExternalDirectory(url: $url); - return $result->getStatusCode(); + if($result !== null) { + return $result->getStatusCode(); + } + return 200; } private function createDirectoryFromResult(array $result): ?array { + unset($result['id']); + $myDirectory = $this->getDirectoryEntry(''); - if(isset($result['directory']) === false || $result['directory'] === $myDirectory['directory']) { + if( + isset($result['directory']) === false + || $result['directory'] === $myDirectory['directory'] + || count($this->listDirectory(filters: ['catalogus' => $result['catalogus'], 'directory' => $result['directory']])) > 0 + ) { return null; } @@ -111,11 +120,13 @@ public function fetchFromExternalDirectory(array $directory = [], ?string $url = $results = json_decode($result->getBody()->getContents(), true); + $addedDirectories = []; + foreach($results['results'] as $record) { - $this->createDirectoryFromResult($record); + $addedDirectories[] = $this->createDirectoryFromResult($record); } - return $results['results']; + return $addedDirectories; } public function updateToExternalDirectory(): array @@ -136,6 +147,6 @@ public function listDirectory(array $filters = [], int $limit = 30, int $offset $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); - return $this->objectService->findObjects(filters: $filters, config: $dbConfig); + return $this->objectService->findObjects(filters: $filters, config: $dbConfig)['documents']; } } From c604640b1f38e162ee9ea80a7eeb83d50f7b147a Mon Sep 17 00:00:00 2001 From: Thijn Date: Fri, 2 Aug 2024 13:59:59 +0200 Subject: [PATCH 006/145] changed english to nl and a few spelling fixes --- .vscode/settings.json | 6 +- .../attachment/CopyAttachmentDialog.vue | 8 +- .../attachment/DepublishAttachmentDialog.vue | 8 +- .../attachment/PublishAttachmentDialog.vue | 6 +- src/dialogs/listing/DeleteListingDialog.vue | 2 +- src/dialogs/metaData/CopyMetaDataDialog.vue | 6 +- .../CopyMetaDataPropertiesDialog.vue | 6 +- .../publication/ArchivePublicationDialog.vue | 2 +- .../publication/CopyPublicationDialog.vue | 6 +- .../publication/DeletePublicationDialog.vue | 2 +- .../DepublishPublicationDialog.vue | 6 +- .../publication/PublishPublicationDialog.vue | 6 +- src/modals/directory/AddListingModal.vue | 2 +- src/modals/directory/EditListingModal.vue | 2 +- .../metaData/AddMetaDataPropertyModal.vue | 3 +- .../metaData/EditMetaDataPropertyModal.vue | 2 +- .../publication/AddPublicationModal.vue | 1 - src/navigation/MainMenu.vue | 30 +++--- src/sidebars/dashboard/DashboardSideBar.vue | 12 +-- src/sidebars/directory/DirectorySideBar.vue | 12 +-- src/sidebars/search/SearchSideBar.vue | 6 +- src/views/catalogi/CatalogiList.vue | 20 ++-- src/views/directory/DirectoryList.vue | 92 +++++++++---------- src/views/directory/ListingDetails.vue | 2 +- src/views/metaData/MetaDataDetail.vue | 4 +- src/views/metaData/MetaDataList.vue | 22 ++--- src/views/publications/PublicationList.vue | 26 +++--- 27 files changed, 151 insertions(+), 149 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 822c0bda..ae5e4039 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,9 +3,13 @@ "editor.defaultFormatter": "dbaeumer.vscode-eslint", "editor.formatOnSave": true, "cSpell.words": [ + "depubliceerd", + "depubliceren", "Depubliceren", + "Matadata", "nextcloud", "opencatalogi", - "pinia" + "pinia", + "Toegangs" ] } diff --git a/src/dialogs/attachment/CopyAttachmentDialog.vue b/src/dialogs/attachment/CopyAttachmentDialog.vue index a6e8583b..f1d4eb4f 100644 --- a/src/dialogs/attachment/CopyAttachmentDialog.vue +++ b/src/dialogs/attachment/CopyAttachmentDialog.vue @@ -5,13 +5,13 @@ import { publicationStore, navigationStore } from '../../store/store.js' - Kopieren + Kopiëren diff --git a/src/dialogs/attachment/DepublishAttachmentDialog.vue b/src/dialogs/attachment/DepublishAttachmentDialog.vue index b04fcd50..b15edcb3 100644 --- a/src/dialogs/attachment/DepublishAttachmentDialog.vue +++ b/src/dialogs/attachment/DepublishAttachmentDialog.vue @@ -5,13 +5,13 @@ import { publicationStore, navigationStore } from '../../store/store.js' - Depubliseren + Depubliceren diff --git a/src/dialogs/attachment/PublishAttachmentDialog.vue b/src/dialogs/attachment/PublishAttachmentDialog.vue index 7c0ce69b..7b5a1a31 100644 --- a/src/dialogs/attachment/PublishAttachmentDialog.vue +++ b/src/dialogs/attachment/PublishAttachmentDialog.vue @@ -8,10 +8,10 @@ import { publicationStore, navigationStore } from '../../store/store.js' name="Bijlage publiseren" :can-close="false">

- Wil je {{ publicationStore.attachmentItem.name ?? publicationStore.attachmentItem.title }} publiseren? + Wil je {{ publicationStore.attachmentItem.name ?? publicationStore.attachmentItem.title }} publiceren?

-

Bijlage succesvol gepubliseerd

+

Bijlage succesvol gepubliceerd

{{ error }}

@@ -35,7 +35,7 @@ import { publicationStore, navigationStore } from '../../store/store.js' - Publiseren + Publiceren diff --git a/src/dialogs/listing/DeleteListingDialog.vue b/src/dialogs/listing/DeleteListingDialog.vue index 91158c3f..2c668fc3 100644 --- a/src/dialogs/listing/DeleteListingDialog.vue +++ b/src/dialogs/listing/DeleteListingDialog.vue @@ -8,7 +8,7 @@ import { directoryStore, navigationStore } from '../../store/store.js' name="Listing verwijderen" :can-close="false">

- Wil je {{ directoryStore.listingItem.name ?? directoryStore.listingItem.title }} definitef verwijderen? Deze actie kan niet ongedaan worden gemaakt. + Wil je {{ directoryStore.listingItem.name ?? directoryStore.listingItem.title }} definitief verwijderen? Deze actie kan niet ongedaan worden gemaakt.

Listing succesvol verwijderd

diff --git a/src/dialogs/metaData/CopyMetaDataDialog.vue b/src/dialogs/metaData/CopyMetaDataDialog.vue index c127806a..99914efd 100644 --- a/src/dialogs/metaData/CopyMetaDataDialog.vue +++ b/src/dialogs/metaData/CopyMetaDataDialog.vue @@ -8,10 +8,10 @@ import { navigationStore, metadataStore } from '../../store/store.js' name="Metadata kopieren" :can-close="false">

- Wil je {{ metadataStore.metaDataItem.title ?? metadataStore.metaDataItem.name }} kopieren? + Wil je {{ metadataStore.metaDataItem.title ?? metadataStore.metaDataItem.name }} kopiëren?

-

Metadata succesvol gekopierd

+

Metadata succesvol gekopieerd

{{ error }}

@@ -32,7 +32,7 @@ import { navigationStore, metadataStore } from '../../store/store.js' - Kopieren + Kopiëren diff --git a/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue b/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue index 603fd881..bd19711a 100644 --- a/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue +++ b/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue @@ -8,10 +8,10 @@ import { navigationStore, metadataStore } from '../../store/store.js' name="Metadata eigenschap verwijderen" :can-close="false">

- Wil je {{ metadataStore.metadataDataKey }} kopieren? + Wil je {{ metadataStore.metadataDataKey }} kopiëren?

-

Metadata eigenschap succesvol gekpierd

+

Metadata eigenschap succesvol gekopieerd

{{ error }}

@@ -33,7 +33,7 @@ import { navigationStore, metadataStore } from '../../store/store.js' - Kopieren + Kopiëren diff --git a/src/dialogs/publication/ArchivePublicationDialog.vue b/src/dialogs/publication/ArchivePublicationDialog.vue index 563ba916..0adfd4cd 100644 --- a/src/dialogs/publication/ArchivePublicationDialog.vue +++ b/src/dialogs/publication/ArchivePublicationDialog.vue @@ -8,7 +8,7 @@ import { navigationStore, publicationStore } from '../../store/store.js' name="Publicatie archiveren" :can-close="false">

- Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} archiveren? Dit betekend dat de publicatie wordt de gepubliseerd en niet langer vindbaar is. Bij de eerste volgende gelegendheid wordt de publicatie automatisch over gebracht naar het digitaal archief. + Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} archiveren? Dit betekend dat de publicatie wordt de gepubliceerd en niet langer vindbaar is. Bij de eerste volgende gelegenheid wordt de publicatie automatisch over gebracht naar het digitaal archief.

Publicatie succesvol gearchiveerd

diff --git a/src/dialogs/publication/CopyPublicationDialog.vue b/src/dialogs/publication/CopyPublicationDialog.vue index 4979637c..03cd452e 100644 --- a/src/dialogs/publication/CopyPublicationDialog.vue +++ b/src/dialogs/publication/CopyPublicationDialog.vue @@ -8,10 +8,10 @@ import { navigationStore, publicationStore } from '../../store/store.js' name="Publicatie kopieren" :can-close="false">

- Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} kopieren? + Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} kopiëren?

-

Publicatie succesvol gekopierd

+

Publicatie succesvol gekopieerd

{{ error }}

@@ -32,7 +32,7 @@ import { navigationStore, publicationStore } from '../../store/store.js' - Kopieren + Kopiëren diff --git a/src/dialogs/publication/DeletePublicationDialog.vue b/src/dialogs/publication/DeletePublicationDialog.vue index 12d59e31..17fd9526 100644 --- a/src/dialogs/publication/DeletePublicationDialog.vue +++ b/src/dialogs/publication/DeletePublicationDialog.vue @@ -8,7 +8,7 @@ import { navigationStore, publicationStore } from '../../store/store.js' name="Publicatie verwijderen" :can-close="false">

- Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} definitef verwijderen? Deze actie kan niet ongedaan worden gemaakt. + Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} definitief verwijderen? Deze actie kan niet ongedaan worden gemaakt.

Publicatie succesvol verwijderd

diff --git a/src/dialogs/publication/DepublishPublicationDialog.vue b/src/dialogs/publication/DepublishPublicationDialog.vue index 016d5dbe..ce7b1ce7 100644 --- a/src/dialogs/publication/DepublishPublicationDialog.vue +++ b/src/dialogs/publication/DepublishPublicationDialog.vue @@ -8,10 +8,10 @@ import { navigationStore, publicationStore } from '../../store/store.js' name="Publicatie de-publiseren" :can-close="false">

- Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} depubliseren? De publicatie is dan niet meer vindbaar via de zoek index. Bijlagen die alléén aan deze publicatie zijn gekoppeld zijn dan ook niet meer vindbaar + Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} depubliceren? De publicatie is dan niet meer vindbaar via de zoek index. Bijlagen die alléén aan deze publicatie zijn gekoppeld zijn dan ook niet meer vindbaar

-

Publicatie succesvol gedepubliseerd

+

Publicatie succesvol depubliceerd

{{ error }}

@@ -33,7 +33,7 @@ import { navigationStore, publicationStore } from '../../store/store.js' - Depubliseren + Depubliceren diff --git a/src/dialogs/publication/PublishPublicationDialog.vue b/src/dialogs/publication/PublishPublicationDialog.vue index ee2a420a..b33e6616 100644 --- a/src/dialogs/publication/PublishPublicationDialog.vue +++ b/src/dialogs/publication/PublishPublicationDialog.vue @@ -8,10 +8,10 @@ import { navigationStore, publicationStore } from '../../store/store.js' name="Publicatie publiseren" :can-close="false">

- Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} publiseren? Deze actie betekend dat de publicatie (en gepubliseerde bijlagen) worden opgenomen in de zoekindex en publiek toegankenlijk zijn. + Wil je {{ publicationStore.publicationItem.name ?? publicationStore.publicationItem.title }} publiceren? Deze actie betekend dat de publicatie (en gepubliceerde bijlagen) worden opgenomen in de zoekindex en publiek toegankelijk zijn.

-

Publicatie succesvol gepubliseerd

+

Publicatie succesvol gepubliceerd

{{ error }}

@@ -33,7 +33,7 @@ import { navigationStore, publicationStore } from '../../store/store.js' - Publiseren + Publiceren diff --git a/src/modals/directory/AddListingModal.vue b/src/modals/directory/AddListingModal.vue index 88259d7e..b04b674f 100644 --- a/src/modals/directory/AddListingModal.vue +++ b/src/modals/directory/AddListingModal.vue @@ -31,7 +31,7 @@ import { navigationStore, directoryStore } from '../../store/store.js' - Submit + Toevoegen diff --git a/src/modals/directory/EditListingModal.vue b/src/modals/directory/EditListingModal.vue index 4e2fcf24..d7ff56f4 100644 --- a/src/modals/directory/EditListingModal.vue +++ b/src/modals/directory/EditListingModal.vue @@ -32,7 +32,7 @@ import { navigationStore, directoryStore, metadataStore } from '../../store/stor - Submit + Bewerken diff --git a/src/modals/metaData/AddMetaDataPropertyModal.vue b/src/modals/metaData/AddMetaDataPropertyModal.vue index 8152c705..1ed900a9 100644 --- a/src/modals/metaData/AddMetaDataPropertyModal.vue +++ b/src/modals/metaData/AddMetaDataPropertyModal.vue @@ -17,7 +17,6 @@ import { navigationStore, metadataStore } from '../../store/store.js'
- - - + +

- Here you can set the details for varius Connections + Hier kunt u de details instellen voor verschillende verbindingen.

- {{ t('forms', 'Use external storage (e.g. MongoDb) instead of Next Cloud internal storage') }} + {{ t('forms', 'Gebruik externe opslag (bijv. MongoDb) in plaats van de interne opslag van Next Cloud.') }} - {{ t('forms', 'Use VNG APIs instead of MongoDB') }} + {{ t('forms', 'Gebruik VNG API\'s in plaats van MongoDB.') }}

@@ -165,54 +165,54 @@ import { navigationStore, catalogiStore, publicationStore } from '../store/store

- - Save + Opslaan

{{ configurationSuccess ? - 'Success saving configuration' : - 'Failed saving configuration' + 'Configuratie succesvol opgeslagen.' : + 'Opslaan van configuratie mislukt.' }}

- +

- Here you can set the details for your organisation + Hier kunt u de details voor uw organisatie instellen.

- - Save + Opslaan

{{ configurationSuccess ? - 'Success saving configuration' : - 'Failed saving configuration' + 'Configuratie succesvol opgeslagen.' : + 'Opslaan van configuratie mislukt.' }}

diff --git a/src/sidebars/dashboard/DashboardSideBar.vue b/src/sidebars/dashboard/DashboardSideBar.vue index d8855344..6e75f75b 100644 --- a/src/sidebars/dashboard/DashboardSideBar.vue +++ b/src/sidebars/dashboard/DashboardSideBar.vue @@ -10,10 +10,10 @@ import { navigationStore, searchStore, publicationStore } from '../../store/stor - Zoek snel in het voor uw beschickbare federatieve netwerk + Zoek snel in het voor uw beschikbare federatieve netwerk + label="Zoeken" /> - + - + - - + - - + - - - - -

- Hier kunt u de details instellen voor verschillende verbindingen. -

- - {{ t('forms', 'Gebruik externe opslag (bijv. MongoDb) in plaats van de interne opslag van Next Cloud.') }} - - - {{ t('forms', 'Gebruik VNG API\'s in plaats van MongoDB.') }} - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- DRC - Location - - Key - -
- ORC - Location - - Key - -
- Elastic - Location - - Key - - Index - -
- Mongo DB - Location - - Key - - Cluster name - -
-

- - - Opslaan - -
- -

- {{ configurationSuccess ? - 'Configuratie succesvol opgeslagen.' : - 'Opslaan van configuratie mislukt.' - }} -

-
-
-
- - - -

- Hier kunt u de details voor uw organisatie instellen. -

- - - - - - - - Opslaan - -
- -

- {{ configurationSuccess ? - 'Configuratie succesvol opgeslagen.' : - 'Opslaan van configuratie mislukt.' - }} -

-
-
-
-
+ @@ -236,26 +75,23 @@ import { NcAppNavigationItem, NcAppNavigationNew, NcAppNavigationSettings, - NcAppSettingsDialog, - NcAppSettingsSection, - NcButton, - NcTextField, - NcTextArea, - NcNoteCard, - NcCheckboxRadioSwitch, } from '@nextcloud/vue' -import Connection from 'vue-material-design-icons/Connection.vue' +// Configuration +import Configuration from './Configuration.vue' + +// Icons + import Plus from 'vue-material-design-icons/Plus.vue' import DatabaseEyeOutline from 'vue-material-design-icons/DatabaseEyeOutline.vue' import DatabaseCogOutline from 'vue-material-design-icons/DatabaseCogOutline.vue' import LayersSearchOutline from 'vue-material-design-icons/LayersSearchOutline.vue' import LayersOutline from 'vue-material-design-icons/LayersOutline.vue' import FileTreeOutline from 'vue-material-design-icons/FileTreeOutline.vue' -import CogOutline from 'vue-material-design-icons/CogOutline.vue' -import ContentSave from 'vue-material-design-icons/ContentSave.vue' import Finance from 'vue-material-design-icons/Finance.vue' -import HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue' +import BookOpenVariantOutline from 'vue-material-design-icons/BookOpenVariantOutline.vue' +import OfficeBuildingOutline from 'vue-material-design-icons/OfficeBuildingOutline.vue' +import ShapeOutline from 'vue-material-design-icons/ShapeOutline.vue' export default { name: 'MainMenu', @@ -266,24 +102,18 @@ export default { NcAppNavigationItem, NcAppNavigationNew, NcAppNavigationSettings, - NcAppSettingsDialog, - NcAppSettingsSection, - NcTextField, - NcTextArea, - NcButton, - NcNoteCard, - NcCheckboxRadioSwitch, + Configuration, // icons Plus, - Connection, DatabaseEyeOutline, DatabaseCogOutline, LayersSearchOutline, LayersOutline, FileTreeOutline, - CogOutline, - ContentSave, Finance, + BookOpenVariantOutline, + OfficeBuildingOutline, + ShapeOutline, }, data() { return { @@ -322,70 +152,16 @@ export default { } }, mounted() { - this.fetchData() catalogiStore.refreshCatalogiList() }, methods: { - // We use the catalogi in the menu so lets fetch those - fetchData(newPage) { - this.loading = true - - fetch( - '/index.php/apps/opencatalogi/configuration', - { - method: 'GET', - }, - ) - .then((response) => { - response.json().then((data) => { - this.configuration = data - }) - }) - .catch((err) => { - console.error(err) - }) - }, - saveConfig() { - // Simple POST request with a JSON body using fetch - const requestOptions = { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(this.configuration), - } - - const debounceNotification = (status) => { - this.configurationSuccess = status - - if (this.debounceTimeout) { - clearTimeout(this.debounceTimeout) - } - - this.debounceTimeout = setTimeout(() => { - this.feedbackPosition = undefined - this.configurationSuccess = -1 - }, 1500) - } - - fetch('/index.php/apps/opencatalogi/configuration', requestOptions) - .then((response) => { - debounceNotification(response.ok) - - response.json().then((data) => { - this.configuration = data - }) - }) - .catch((err) => { - debounceNotification(false) - console.error(err) - }) - }, switchCatalogus(catalogus) { if (catalogus.id !== navigationStore.selectedCatalogus) publicationStore.setPublicationItem(false) // for when you switch catalogus navigationStore.setSelected('publication') navigationStore.setSelectedCatalogus(catalogus.id) catalogiStore.setCatalogiItem(catalogus) }, - open(url, type) { + open(url, type = '') { window.open(url, type) }, }, diff --git a/src/store/modules/catalogi.js b/src/store/modules/catalogi.js index e2a0f84c..f293a01f 100644 --- a/src/store/modules/catalogi.js +++ b/src/store/modules/catalogi.js @@ -20,10 +20,10 @@ export const useCatalogiStore = defineStore('catalogi', { }, async refreshCatalogiList(search = null) { // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/catalogi'; - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } + let endpoint = '/index.php/apps/opencatalogi/api/catalogi' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } return fetch(endpoint, { method: 'GET', }) diff --git a/src/store/modules/directory.js b/src/store/modules/directory.js index a2bfe30a..419f614d 100644 --- a/src/store/modules/directory.js +++ b/src/store/modules/directory.js @@ -20,10 +20,10 @@ export const useDirectoryStore = defineStore('directory', { }, async refreshListingList(search = null) { // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/directory' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } + let endpoint = '/index.php/apps/opencatalogi/api/directory' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } return fetch(endpoint, { method: 'GET', }) diff --git a/src/store/modules/metadata.js b/src/store/modules/metadata.js index b3cb85c0..89cf9e0b 100644 --- a/src/store/modules/metadata.js +++ b/src/store/modules/metadata.js @@ -25,12 +25,12 @@ export const useMetadataStore = defineStore('metadata', { ) console.log('Active metadata lest set') }, - async refreshMetaDataList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/metadata' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } + async refreshMetaDataList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/metadata' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } return fetch( endpoint, { diff --git a/src/store/modules/publication.js b/src/store/modules/publication.js index 32a5ae6c..4c5226e7 100644 --- a/src/store/modules/publication.js +++ b/src/store/modules/publication.js @@ -22,12 +22,12 @@ export const usePublicationStore = defineStore('publication', { this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) console.log('Active publication item set to ' + publicationList.length) }, - async refreshPublicationList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/publications' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } + async refreshPublicationList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/publications' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } return fetch( endpoint, { diff --git a/src/views/catalogi/CatalogiDetails.vue b/src/views/catalogi/CatalogiDetails.vue index f77b12eb..5b67dd24 100644 --- a/src/views/catalogi/CatalogiDetails.vue +++ b/src/views/catalogi/CatalogiDetails.vue @@ -8,43 +8,46 @@ import { catalogiStore, navigationStore } from '../../store/store.js'

{{ catalogi.title }}

-
- - - - - - + + + + + + Help + + + + Bewerken + + + + Catalogus bekijken + + - - - Bewerken - - - - Catalogus bekijken - - - - Verwijderen - - -
+ Verwijderen + +
{{ catalogi.summary }}
@@ -68,7 +71,6 @@ import { NcActions, NcActionButton, NcLoadingIcon, - NcButton, } from '@nextcloud/vue' import { BTabs, BTab } from 'bootstrap-vue' @@ -139,6 +141,9 @@ export default { this.loading = false }) }, + open(url, type = '') { + window.open(url, type) + }, }, } diff --git a/src/views/catalogi/CatalogiList.vue b/src/views/catalogi/CatalogiList.vue index 3b23bc60..8a158338 100644 --- a/src/views/catalogi/CatalogiList.vue +++ b/src/views/catalogi/CatalogiList.vue @@ -108,6 +108,10 @@ export default { Pencil, Delete, }, + beforeRouteLeave(to, from, next) { + search = '' + next() + }, props: { search: { type: String, @@ -118,7 +122,6 @@ export default { return { loading: false, catalogi: [], - search: '', } }, watch: { @@ -143,10 +146,6 @@ export default { this.fetchData(search) }, 500), }, - beforeRouteLeave(to, from, next) { - search = '' - next() - }, } diff --git a/src/dialogs/attachment/DeleteAttachmentDialog.vue b/src/dialogs/attachment/DeleteAttachmentDialog.vue deleted file mode 100644 index 30e3d14d..00000000 --- a/src/dialogs/attachment/DeleteAttachmentDialog.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - diff --git a/src/dialogs/attachment/DepublishAttachmentDialog.vue b/src/dialogs/attachment/DepublishAttachmentDialog.vue deleted file mode 100644 index bf0a2ff1..00000000 --- a/src/dialogs/attachment/DepublishAttachmentDialog.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - diff --git a/src/dialogs/attachment/PublishAttachmentDialog.vue b/src/dialogs/attachment/PublishAttachmentDialog.vue deleted file mode 100644 index 7b5a1a31..00000000 --- a/src/dialogs/attachment/PublishAttachmentDialog.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - diff --git a/src/dialogs/catalog/DeleteCatalogDialog.vue b/src/dialogs/catalog/DeleteCatalogDialog.vue deleted file mode 100644 index efca5d7f..00000000 --- a/src/dialogs/catalog/DeleteCatalogDialog.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - diff --git a/src/dialogs/listing/DeleteListingDialog.vue b/src/dialogs/listing/DeleteListingDialog.vue deleted file mode 100644 index 2c668fc3..00000000 --- a/src/dialogs/listing/DeleteListingDialog.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - diff --git a/src/dialogs/logs/ViewLogDialog.vue b/src/dialogs/logs/ViewLogDialog.vue deleted file mode 100644 index 3c0fbe4d..00000000 --- a/src/dialogs/logs/ViewLogDialog.vue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - diff --git a/src/dialogs/metaData/CopyMetaDataDialog.vue b/src/dialogs/metaData/CopyMetaDataDialog.vue deleted file mode 100644 index 99914efd..00000000 --- a/src/dialogs/metaData/CopyMetaDataDialog.vue +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - diff --git a/src/dialogs/metaData/DeleteMetaDataDialog.vue b/src/dialogs/metaData/DeleteMetaDataDialog.vue deleted file mode 100644 index 98b0e9ec..00000000 --- a/src/dialogs/metaData/DeleteMetaDataDialog.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - diff --git a/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue b/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue deleted file mode 100644 index bd19711a..00000000 --- a/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - diff --git a/src/dialogs/metaDataProperties/DeleteMetaDataPropertiesDialog.vue b/src/dialogs/metaDataProperties/DeleteMetaDataPropertiesDialog.vue deleted file mode 100644 index 1c9de05c..00000000 --- a/src/dialogs/metaDataProperties/DeleteMetaDataPropertiesDialog.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - diff --git a/src/dialogs/publication/ArchivePublicationDialog.vue b/src/dialogs/publication/ArchivePublicationDialog.vue deleted file mode 100644 index 0adfd4cd..00000000 --- a/src/dialogs/publication/ArchivePublicationDialog.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - diff --git a/src/dialogs/publication/CopyPublicationDialog.vue b/src/dialogs/publication/CopyPublicationDialog.vue deleted file mode 100644 index 03cd452e..00000000 --- a/src/dialogs/publication/CopyPublicationDialog.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - diff --git a/src/dialogs/publication/DeletePublicationDialog.vue b/src/dialogs/publication/DeletePublicationDialog.vue deleted file mode 100644 index 17fd9526..00000000 --- a/src/dialogs/publication/DeletePublicationDialog.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - diff --git a/src/dialogs/publication/DepublishPublicationDialog.vue b/src/dialogs/publication/DepublishPublicationDialog.vue deleted file mode 100644 index 7426a657..00000000 --- a/src/dialogs/publication/DepublishPublicationDialog.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - diff --git a/src/dialogs/publication/PublishPublicationDialog.vue b/src/dialogs/publication/PublishPublicationDialog.vue deleted file mode 100644 index b33e6616..00000000 --- a/src/dialogs/publication/PublishPublicationDialog.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - diff --git a/src/dialogs/publicationData/DeletePublicationDataDialog.vue b/src/dialogs/publicationData/DeletePublicationDataDialog.vue deleted file mode 100644 index 70a4e9c5..00000000 --- a/src/dialogs/publicationData/DeletePublicationDataDialog.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - diff --git a/src/entities/attachment/attachment.spec.ts b/src/entities/attachment/attachment.spec.ts deleted file mode 100644 index d315e81c..00000000 --- a/src/entities/attachment/attachment.spec.ts +++ /dev/null @@ -1,109 +0,0 @@ -/* eslint-disable no-console */ -import { Attachment } from './attachment' -import { TAttachment } from './attachment.types' - -describe('Attachment Store', () => { - it('create Attachment entity with full data', () => { - const attachment = new Attachment(testData[0]) - - expect(attachment).toBeInstanceOf(Attachment) - expect(attachment).toEqual(testData[0]) - - expect(attachment.validate()).toBe(true) - }) - - it('create Attachment entity with partial data', () => { - const attachment = new Attachment(testData[1]) - - expect(attachment).toBeInstanceOf(Attachment) - expect(attachment.id).toBe(testData[1].id) - expect(attachment.reference).toBe(testData[1].reference) - expect(attachment.title).toBe(testData[1].title) - expect(attachment.summary).toBe(testData[1].summary) - expect(attachment.description).toBe(testData[1].description) - expect(attachment.labels).toBe(testData[1].labels) - expect(attachment.accessURL).toBe(testData[1].accessURL) - expect(attachment.downloadURL).toBe(testData[1].downloadURL) - expect(attachment.type).toBe(testData[1].type) - expect(attachment.extension).toBe(testData[1].extension) - expect(attachment.size).toBe(testData[1].size) - expect(attachment.anonymization).toBe(testData[1].anonymization) - expect(attachment.language).toBe(testData[1].language) - expect(attachment.versionOf).toBe(testData[1].versionOf) - expect(attachment.hash).toBe('') - expect(attachment.published).toBe('') - expect(attachment.modified).toBe('') - expect(attachment.license).toBe(testData[1].license) - - expect(attachment.validate()).toBe(true) - }) - - it('create Attachment entity with falsy data', () => { - const attachment = new Attachment(testData[2]) - - expect(attachment).toBeInstanceOf(Attachment) - expect(attachment).toEqual(testData[2]) - - expect(attachment.validate()).toBe(false) - }) -}) - -const testData: TAttachment[] = [ - { // full data - id: '1', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag1' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, - { // partial data - id: '2', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag2' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - license: 'MIT', - }, - { // invalid data - id: '3', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag3' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, -] diff --git a/src/entities/attachment/attachment.ts b/src/entities/attachment/attachment.ts deleted file mode 100644 index 04f12928..00000000 --- a/src/entities/attachment/attachment.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { TAttachment } from './attachment.types' -import { z } from 'zod' - -export class Attachment implements TAttachment { - - public id: string - public reference?: string - public title: string - public summary: string - public description?: string - public labels?: object[] - public accessURL?: string - public downloadURL?: string - public type?: string - public extension?: string - public size?: number - public anonymization?: { - anonymized?: string - results?: string - } - - public language?: { - code?: string - level?: string - } - - public versionOf?: string - public hash?: string - public published?: string - public modified?: string - public license?: string - - constructor(data: TAttachment) { - this.hydrate(data) - } - - /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods - private hydrate(data: TAttachment) { - this.id = data.id?.toString() || '' - this.reference = data.reference || '' - this.title = data.title || '' - this.summary = data.summary || '' - this.description = data.description || '' - this.labels = data.labels || [] - this.accessURL = data.accessURL || '' - this.downloadURL = data.downloadURL || '' - this.type = data.type || '' - this.extension = data.extension || '' - this.size = data.size || 0 - this.anonymization = (!Array.isArray(data.anonymization) && data.anonymization) || {} - this.language = (!Array.isArray(data.language) && data.language) || {} - this.versionOf = data.versionOf || '' - this.hash = data.hash || '' - this.published = data.published || '' - this.modified = data.modified || '' - this.license = data.license || '' - } - - /* istanbul ignore next */ - public validate(): boolean { - // https://conduction.stoplight.io/docs/open-catalogi/9zm7p6fnazuod-attachment - const schema = z.object({ - title: z.string().min(25).max(255), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) - summary: z.string().min(50).max(2500), - description: z.string().max(2500).optional(), - reference: z.string().max(255).optional(), - labels: z.string().array().optional(), - accessURL: z.string().url().optional(), - downloadURL: z.string().url().optional(), - type: z.string().optional(), - extension: z.string().optional(), - size: z.number().optional(), - anonymization: z.object({ - anonymized: z.boolean().optional(), - results: z.string().max(2500).optional(), - }).optional(), - language: z.object({ - // this regex checks if the code has either 2 or 3 characters per group, and the -aaa after the first is optional - code: z.string() - .max(7) - .regex(/([a-z]{2,3})(-[a-z]{2,3})?/g, 'language code is not a valid ISO 639-1 code (e.g. en-us)') - .optional(), - title: z.string().min(1), - }).optional(), - }) - - const result = schema.safeParse({ - id: this.id, - title: this.title, - description: this.description, - // version: this.version, - // required: this.required, - // properties: this.properties, - }) - - return result.success - } - -} diff --git a/src/entities/attachment/attachment.types.ts b/src/entities/attachment/attachment.types.ts deleted file mode 100644 index 2861e1d1..00000000 --- a/src/entities/attachment/attachment.types.ts +++ /dev/null @@ -1,26 +0,0 @@ -export type TAttachment = { - id: string - reference?: string - title: string - summary: string - description?: string - labels?: object[] - accessURL?: string - downloadURL?: string - type?: string - extension?: string - size?: number - anonymization?: { - anonymized?: string - results?: string - } - language?: { - code?: string - level?: string - } - versionOf?: string - hash?: string - published?: string - modified?: string - license?: string -} diff --git a/src/entities/attachment/index.js b/src/entities/attachment/index.js deleted file mode 100644 index 71891394..00000000 --- a/src/entities/attachment/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './attachment.ts' -export * from './attachment.types.ts' diff --git a/src/entities/catalogi/catalogi.spec.ts b/src/entities/catalogi/catalogi.spec.ts deleted file mode 100644 index 635c1c76..00000000 --- a/src/entities/catalogi/catalogi.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable no-console */ -import { Catalogi } from './catalogi' -import { TCatalogi } from './catalogi.types' - -describe('Catalogi Store', () => { - it('create Catalogi entity with full data', () => { - const catalogi = new Catalogi(testData[0]) - - expect(catalogi).toBeInstanceOf(Catalogi) - expect(catalogi).toEqual(testData[0]) - - expect(catalogi.validate()).toBe(true) - }) - - it('create Catalogi entity with partial data', () => { - const catalogi = new Catalogi(testData[1]) - - expect(catalogi).toBeInstanceOf(Catalogi) - expect(catalogi.id).toBe(testData[1].id) - expect(catalogi.title).toBe(testData[1].title) - expect(catalogi.summary).toBe(testData[1].summary) - expect(catalogi.description).toBe(testData[1].description) - expect(catalogi.image).toBe('') - expect(catalogi.search).toBe('') - - expect(catalogi.validate()).toBe(true) - }) - - it('create Catalogi entity with falsy data', () => { - const catalogi = new Catalogi(testData[2]) - - expect(catalogi).toBeInstanceOf(Catalogi) - expect(catalogi).toEqual(testData[2]) - - expect(catalogi.validate()).toBe(false) - }) -}) - -const testData: TCatalogi[] = [ - { // full data - id: '1', - title: 'Decat', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, - { // partial data - id: '2', - title: 'Woo', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - }, - { // invalid data - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, -] diff --git a/src/entities/catalogi/catalogi.ts b/src/entities/catalogi/catalogi.ts deleted file mode 100644 index 9bfae9ae..00000000 --- a/src/entities/catalogi/catalogi.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { TCatalogi } from './catalogi.types' - -export class Catalogi implements TCatalogi { - - public id: string - public title: string - public summary: string - public description?: string - public image?: string - public search?: string - - constructor(data: TCatalogi) { - this.hydrate(data) - } - - /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods - private hydrate(data: TCatalogi) { - this.id = data?.id?.toString() || '' - // @ts-expect-error data.name is not supposed to exist but you can still get it from the backend, so this is just backwards compatibility - this.title = data?.title || data?.name || '' - this.summary = data?.summary || '' - this.description = data?.description || '' - this.image = data?.image || '' - this.search = data?.search || '' - } - - /* istanbul ignore next */ - public validate(): boolean { - // these have to exist - if (!this.id || typeof this.id !== 'string') return false - if (!this.title || typeof this.title !== 'string') return false - if (!this.summary || typeof this.summary !== 'string') return false - // these can be optional - if (typeof this.description !== 'string') return false - if (typeof this.image !== 'string') return false - if (typeof this.search !== 'string') return false - return true - } - -} diff --git a/src/entities/catalogi/catalogi.types.ts b/src/entities/catalogi/catalogi.types.ts deleted file mode 100644 index bf10f04d..00000000 --- a/src/entities/catalogi/catalogi.types.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type TCatalogi = { - id: string - title: string - summary: string - description?: string - image?: string - search?: string -} diff --git a/src/entities/catalogi/index.js b/src/entities/catalogi/index.js deleted file mode 100644 index 2faee26d..00000000 --- a/src/entities/catalogi/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './catalogi.ts' -export * from './catalogi.types.ts' diff --git a/src/entities/index.js b/src/entities/index.js deleted file mode 100644 index 2383330f..00000000 --- a/src/entities/index.js +++ /dev/null @@ -1,6 +0,0 @@ -/* eslint-disable import/export */ -export * from './catalogi/index.js' -export * from './listing/index.js' -export * from './attachment/index.js' -export * from './publication/index.js' -export * from './metadata/index.js' diff --git a/src/entities/listing/index.js b/src/entities/listing/index.js deleted file mode 100644 index 841b4d40..00000000 --- a/src/entities/listing/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './listing.ts' -export * from './listing.types.ts' diff --git a/src/entities/listing/listing.spec.ts b/src/entities/listing/listing.spec.ts deleted file mode 100644 index 9efb63c9..00000000 --- a/src/entities/listing/listing.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* eslint-disable no-console */ -import { Listing } from './listing' -import { TListing } from './listing.types' - -describe('Listing Store', () => { - it('create Listing entity with full data', () => { - const listing = new Listing(testData[0]) - - expect(listing).toBeInstanceOf(Listing) - expect(listing).toEqual(testData[0]) - - expect(listing.validate()).toBe(true) - }) - - it('create Listing entity with partial data', () => { - const listing = new Listing(testData[1]) - - expect(listing).toBeInstanceOf(Listing) - expect(listing.id).toBe(testData[1].id) - expect(listing.title).toBe(testData[1].title) - expect(listing.summary).toBe(testData[1].summary) - expect(listing.description).toBe(testData[1].description) - expect(listing.search).toBe('') - expect(listing.directory).toBe(testData[1].directory) - expect(listing.metadata).toBe('') - expect(listing.status).toBe('') - expect(listing.lastSync).toBe(testData[1].lastSync) - expect(listing.default).toBe(testData[1].default) - expect(listing.available).toBe(testData[1].available) - - expect(listing.validate()).toBe(true) - }) - - it('create Listing entity with falsy data', () => { - const listing = new Listing(testData[2]) - - expect(listing).toBeInstanceOf(Listing) - expect(listing).toEqual(testData[2]) - - expect(listing.validate()).toBe(false) - }) -}) - -const testData: TListing[] = [ - { // full data - id: '1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'active', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, - { // partial data - id: '2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - directory: 'string', - lastSync: '2024-07-25T00:00:00Z', - default: 'yes', - available: 'no', - }, - { // invalid data - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'pending', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, -] diff --git a/src/entities/listing/listing.ts b/src/entities/listing/listing.ts deleted file mode 100644 index eb6f4f63..00000000 --- a/src/entities/listing/listing.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { TListing } from './listing.types' - -export class Listing implements TListing { - - public id: string - public title: string - public summary: string - public description?: string - public search?: string - public directory?: string - public metadata?: string - public status?: string - public lastSync?: string - public default?: string - public available?: string - - constructor(data: TListing) { - this.hydrate(data) - } - - /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods - private hydrate(data: TListing) { - this.id = data?.id?.toString() || '' - this.title = data?.title || '' - this.summary = data?.summary || '' - this.description = data?.description || '' - this.search = data?.search || '' - this.directory = data?.directory || '' - this.metadata = data?.metadata || '' - this.status = data?.status || '' - this.lastSync = data?.lastSync || '' - this.default = data?.default || '' - this.available = data?.available || '' - } - - /* istanbul ignore next */ - public validate(): boolean { - // these have to exist - if (!this.id || typeof this.id !== 'string') return false - if (!this.title || typeof this.title !== 'string') return false - if (!this.summary || typeof this.summary !== 'string') return false - // these can be optional - if (typeof this.description !== 'string') return false - if (typeof this.search !== 'string') return false - if (typeof this.directory !== 'string') return false - if (typeof this.metadata !== 'string') return false - if (typeof this.status !== 'string') return false - if (typeof this.lastSync !== 'string') return false - if (typeof this.default !== 'string') return false - if (typeof this.available !== 'string') return false - return true - } - -} diff --git a/src/entities/listing/listing.types.ts b/src/entities/listing/listing.types.ts deleted file mode 100644 index b057632f..00000000 --- a/src/entities/listing/listing.types.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type TListing = { - id: string - title: string - summary: string - description?: string - search?: string - directory?: string - metadata?: string - status?: string - lastSync?: string - default?: string - available?: string -} diff --git a/src/entities/metadata/index.js b/src/entities/metadata/index.js deleted file mode 100644 index aaf6099c..00000000 --- a/src/entities/metadata/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './metadata.ts' -export * from './metadata.types.ts' diff --git a/src/entities/metadata/metadata.spec.ts b/src/entities/metadata/metadata.spec.ts deleted file mode 100644 index 08d19ee4..00000000 --- a/src/entities/metadata/metadata.spec.ts +++ /dev/null @@ -1,161 +0,0 @@ -/* eslint-disable no-console */ -import { Metadata } from './metadata' -import { TMetadata } from './metadata.types' - -describe('Metadata entity', () => { - it('create Metadata entity with full data', () => { - const metadata = new Metadata(testData[0]) - - expect(metadata).toBeInstanceOf(Metadata) - expect(metadata).toEqual(testData[0]) - - expect(metadata.validate()).toBe(true) - }) - - it('create Metadata entity with partial data', () => { - const metadata = new Metadata(testData[1]) - - expect(metadata).toBeInstanceOf(Metadata) - expect(metadata.id).toBe(testData[1].id) - expect(metadata.title).toBe('') - expect(metadata.description).toBe(testData[1].description) - expect(metadata.required).toEqual(testData[1].required) - expect(metadata.version).toBe(testData[1].version) - expect(metadata.properties).toEqual(testData[1].properties) - - expect(metadata.validate()).toBe(true) - }) - - it('create Metadata entity with falsy data', () => { - const metadata = new Metadata(testData[2]) - - expect(metadata).toBeInstanceOf(Metadata) - expect(metadata).toEqual(testData[2]) - - expect(metadata.validate()).toBe(false) - }) -}) - -const testData: TMetadata[] = [ - { // full data - id: '1', - title: 'Test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - required: ['test'], - properties: { - test: { - title: 'test prop', - description: 'a long description', - type: 'string', - format: 'date', - pattern: 1, - default: 'true', - behavior: 'silly', - required: false, - deprecated: false, - minLength: 5, - maxLength: 6, - example: 'gooby example', - minimum: 1, - maximum: 3, - multipleOf: 1, - exclusiveMin: false, - exclusiveMax: false, - minItems: 0, - maxItems: 6, - }, - gfdgds: { - title: 'gfdgds prop', - description: 'property description', - type: 'string', - format: 'uuid', - pattern: 2, - default: 'false', - behavior: 'goofy perchance', - required: false, - deprecated: false, - minLength: 5.5, - maxLength: 5.11, - example: 'bazinga', - minimum: 1, - maximum: 2, - multipleOf: 1, - exclusiveMin: true, - exclusiveMax: false, - minItems: 1, - maxItems: 7, - }, - }, - }, - { // partial data - id: '1', - title: 'Test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - properties: { - test: { - title: 'test prop', - description: 'a long description', - type: 'string', - behavior: 'silly', - required: false, - exclusiveMin: false, - exclusiveMax: false, - minItems: 0, - maxItems: 6, - }, - }, - }, - { // invalid data - id: '1', - title: '', // cannot be empty - description: 'this is a very long description for test metadata', - version: '0.0.1', - required: ['test'], - properties: { - test: { - title: 'test prop', - description: 'a long description', - type: 'string', - format: 'date', - pattern: 1, - default: 'true', - behavior: 'silly', - required: false, - deprecated: false, - minLength: 5, - maxLength: 6, - example: 'gooby example', - minimum: 1, - maximum: 3, - multipleOf: 1, - exclusiveMin: false, - exclusiveMax: false, - minItems: 0, - maxItems: 6, - }, - gfdgds: { - title: 'gfdgds prop', - description: 'property description', - type: 'string', - format: 'uuid', - pattern: 2, - default: 'false', - behavior: 'goofy perchance', - required: false, - deprecated: false, - minLength: 5.5, - maxLength: 5.11, - example: 'bazinga', - minimum: 1, - maximum: 2, - multipleOf: 1, - exclusiveMin: true, - exclusiveMax: false, - minItems: 1, - maxItems: 7, - }, - }, - }, -] diff --git a/src/entities/metadata/metadata.ts b/src/entities/metadata/metadata.ts deleted file mode 100644 index 06c96863..00000000 --- a/src/entities/metadata/metadata.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { TMetadata } from './metadata.types' -import { z } from 'zod' - -export class Metadata implements TMetadata { - - public id: string - public title: string - public description?: string - public version?: string - public required?: string[] - - public properties: Record - - constructor(data: TMetadata) { - this.hydrate(data) - } - - /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods - private hydrate(data: TMetadata) { - this.id = data?.id?.toString() || '' - this.title = data?.title || '' - this.description = data?.description || '' - this.version = data?.version || '' - this.required = data?.required || [] - // backend (PHP) doesn't know objects so it will return an array if empty - this.properties = (!Array.isArray(data?.properties) && data?.properties) || {} - } - - /* istanbul ignore next */ - public validate(): boolean { - // https://conduction.stoplight.io/docs/open-catalogi/92e81a078982b-metadata - const propertiesDataSchema = z.object({ - title: z.string().min(1), - description: z.string().optional(), - type: z.string().min(1), - format: z.string().optional(), - pattern: z.number().optional(), - default: z.string().optional(), - behavior: z.string().optional(), - required: z.boolean().optional(), - deprecated: z.boolean().optional(), - minLength: z.number().optional(), - maxLength: z.number().optional(), - example: z.string().optional(), - minimum: z.number().optional(), - maximum: z.number().optional(), - multipleOf: z.number().optional(), - exclusiveMin: z.boolean().optional(), - exclusiveMax: z.boolean().optional(), - minItems: z.number().optional(), - maxItems: z.number().optional(), - }) - - const schema = z.object({ - title: z.string().min(1), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) - description: z.string().optional(), - version: z.string().optional(), - required: z.string().array().optional(), - properties: z.record(propertiesDataSchema).optional(), // z.record allows for any amount of any keys, with specific type for value validation - }) - - const result = schema.safeParse({ - id: this.id, - title: this.title, - description: this.description, - version: this.version, - required: this.required, - properties: this.properties, - }) - - return result.success - } - -} diff --git a/src/entities/metadata/metadata.types.ts b/src/entities/metadata/metadata.types.ts deleted file mode 100644 index 12488f2d..00000000 --- a/src/entities/metadata/metadata.types.ts +++ /dev/null @@ -1,28 +0,0 @@ -export type TMetadata = { - id: string - title: string - description?: string - version?: string - required?: string[] - properties: Record -} diff --git a/src/entities/publication/index.js b/src/entities/publication/index.js deleted file mode 100644 index 223b3332..00000000 --- a/src/entities/publication/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export * from './publication.ts' -export * from './publication.types.ts' diff --git a/src/entities/publication/publication.spec.ts b/src/entities/publication/publication.spec.ts deleted file mode 100644 index fe84aa9a..00000000 --- a/src/entities/publication/publication.spec.ts +++ /dev/null @@ -1,127 +0,0 @@ -/* eslint-disable no-console */ -import { Publication } from './publication' -import { TPublication } from './publication.types' - -describe('Directory Store', () => { - it('create Publication entity with full data', () => { - const publication = new Publication(testData[0]) - - expect(publication).toBeInstanceOf(Publication) - expect(publication).toEqual(testData[0]) - - expect(publication.validate()).toBe(true) - }) - - it('create Publication entity with partial data', () => { - const publication = new Publication(testData[1]) - - expect(publication).toBeInstanceOf(Publication) - expect(publication.id).toBe(testData[1].id) - expect(publication.title).toBe(testData[1].title) - expect(publication.summary).toBe(testData[1].summary) - expect(publication.reference).toBe(testData[1].reference) - expect(publication.description).toBe(testData[1].description) - expect(publication.image).toBe(testData[1].image) - expect(publication.category).toBe(testData[1].category) - expect(publication.portal).toBe(testData[1].portal) - expect(publication.catalogi).toBe(testData[1].catalogi) - expect(publication.metaData).toBe(testData[1].metaData) - expect(publication.published).toBe(testData[1].published) - expect(publication.modified).toBe(testData[1].modified) - expect(publication.featured).toBe(testData[1].featured) - expect(publication.organization).toEqual(testData[1].organization) - expect(publication.data).toEqual(testData[1].data) - expect(publication.attachments).toEqual(testData[1].attachments) - expect(publication.attachmentCount).toBe(testData[1].attachmentCount) - expect(publication.schema).toBe('') - expect(publication.status).toBe('') - expect(publication.license).toBe('') - expect(publication.themes).toBe(testData[1].themes) - expect(publication.anonymization).toEqual(testData[1].anonymization) - - expect(publication.validate()).toBe(true) - }) - - it('create Publication entity with falsy data', () => { - const publication = new Publication(testData[2]) - - expect(publication).toBeInstanceOf(Publication) - expect(publication).toEqual(testData[2]) - - expect(publication.validate()).toBe(false) - }) -}) - -const testData: TPublication[] = [ - { // full data - id: '1', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category1', - portal: 'portal1', - catalogi: 'catalogi1', - metaData: 'meta1', - published: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: { - type: 'string', - }, - data: {}, - attachments: {}, - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: ['theme1'], - anonymization: {}, - }, - { // partial data - id: '2', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category2', - portal: 'portal2', - catalogi: 'catalogi2', - metaData: 'meta2', - published: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: {}, - data: {}, - attachments: {}, - attachmentCount: 1, - themes: ['theme1'], - anonymization: {}, - }, - { // invalid data - id: '3', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category3', - portal: 'portal3', - catalogi: 'catalogi3', - metaData: 'meta3', - published: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: {}, - data: {}, - attachments: {}, - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: ['theme1'], - anonymization: {}, - }, -] diff --git a/src/entities/publication/publication.ts b/src/entities/publication/publication.ts deleted file mode 100644 index bde994c7..00000000 --- a/src/entities/publication/publication.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { TPublication } from './publication.types' - -export class Publication implements TPublication { - - public id: string - public title: string - public summary: string - public description?: string - public reference?: string - public image?: string - public category: string - public catalogi: string - public metaData: string - public portal?: string - public featured?: boolean - public organization?: { - type?: string - $ref?: string - format?: string - description?: string - } - - public schema?: string - public status?: string - public attachments?: { - type?: string - items?: { - $ref?: string - } - format?: string - } - - public attachmentCount?: number - public themes?: string[] - public data?: { - type?: string - required?: boolean - } - - public anonymization?: { - type?: string - $ref?: string - format?: string - description?: string - } - - public languageObject?: { - type?: string - $ref?: string - format?: string - description?: string - } - - public published?: string | Date - public modified?: string | Date - public license?: string - - constructor(data: TPublication) { - this.hydrate(data) - } - - /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods - private hydrate(data: TPublication) { - this.id = data.id?.toString() || '' - this.title = data.title || '' - this.summary = data.summary || '' - this.reference = data.reference || '' - this.description = data.description || '' - this.image = data.image || '' - this.category = data.category || '' - this.catalogi = data.catalogi || '' - // @ts-expect-error -- for backwards compatibility metaData will be used if metadata cannot be found - this.metaData = (data.metadata ?? data.metaData) || '' - this.portal = data.portal || '' - this.featured = (typeof data.featured === 'boolean' && data.featured) - // backend can send true and false back as "1" and "" (yes. not "0") - // FIXME: remove once bug is fixed - || (typeof data.featured === 'string' && !!parseInt(data.featured)) - || false - this.organization = (!Array.isArray(data.organization) && data.organization) || {} - this.schema = data.schema || '' - this.status = data.status || '' - this.attachments = (!Array.isArray(data.attachments) && data.attachments) || {} - this.attachmentCount = data.attachmentCount || 0 - this.themes = data.themes || [] - this.data = (!Array.isArray(data.data) && data.data) || {} - this.anonymization = (!Array.isArray(data.anonymization) && data.anonymization) || {} - this.languageObject = (!Array.isArray(data.languageObject) && data.languageObject) || {} - this.published = new Date(data.published) || '' - this.modified = new Date(data.modified) || '' - this.license = data.license || '' - } - - /* istanbul ignore next */ - public validate(): boolean { - // TODO: change this over to Zod schema, already exists on 'feature/DIMOC-101/entities' (requires slight modification) - // these have to exist - if (!this.id || typeof this.id !== 'string') return false - if (!this.title || typeof this.title !== 'string') return false - if (!this.summary || typeof this.summary !== 'string') return false - // these can be optional but if they exist, they must be of the right type - if (!this.reference && typeof this.reference !== 'string') return false - if (!this.description && typeof this.description !== 'string') return false - if (!this.image && typeof this.image !== 'string') return false - if (!this.category && typeof this.category !== 'string') return false - if (!this.portal && typeof this.portal !== 'string') return false - if (!this.catalogi && typeof this.catalogi !== 'string') return false - if (!this.metaData && typeof this.metaData !== 'string') return false - if (!this.published && typeof this.published !== 'string') return false - if (!this.modified && typeof this.modified !== 'string') return false - if (!this.featured && typeof this.featured !== 'boolean') return false - if (!this.organization && !Array.isArray(this.organization)) return false - if (!this.data && !Array.isArray(this.data)) return false - if (!this.attachments && !Array.isArray(this.attachments)) return false - if (!this.attachmentCount && typeof this.attachmentCount !== 'number') return false - if (!this.schema && typeof this.schema !== 'string') return false - if (!this.status && typeof this.status !== 'string') return false - if (!this.license && typeof this.license !== 'string') return false - if (!this.themes && typeof this.themes !== 'string') return false - if (!this.anonymization && typeof this.anonymization !== 'object') return false - return true - } - -} diff --git a/src/entities/publication/publication.types.ts b/src/entities/publication/publication.types.ts deleted file mode 100644 index a9877ef7..00000000 --- a/src/entities/publication/publication.types.ts +++ /dev/null @@ -1,51 +0,0 @@ -// TODO: double check this type for correct properties and optionals when stoplight updates - https://conduction.stoplight.io/docs/open-catalogi/fee989a9c8e3f-publication - -export type TPublication = { - id: string - title: string - summary: string - description?: string - reference?: string - image?: string - category: string - catalogi: string - metaData: string - portal?: string - featured?: boolean - organization?: { - type?: string - $ref?: string - format?: string - description?: string - } - schema?: string - status?: string - attachments?: { - type?: string - items?: { - $ref?: string - } - format?: string - } - attachmentCount?: number - themes?: string[] - data?: { - type?: string - required?: boolean - } - anonymization?: { - type?: string - $ref?: string - format?: string - description?: string - } - languageObject?: { - type?: string - $ref?: string - format?: string - description?: string - } - published?: string | Date - modified?: string | Date - license?: string -} diff --git a/src/main.js b/src/main.js deleted file mode 100644 index f6bf3bfc..00000000 --- a/src/main.js +++ /dev/null @@ -1,14 +0,0 @@ -import Vue from 'vue' -import { PiniaVuePlugin } from 'pinia' -import pinia from './pinia.js' -import App from './App.vue' -Vue.mixin({ methods: { t, n } }) - -Vue.use(PiniaVuePlugin) - -new Vue( - { - pinia, - render: h => h(App), - }, -).$mount('#opencatalogi') diff --git a/src/modals/Modals.vue b/src/modals/Modals.vue deleted file mode 100644 index db50e228..00000000 --- a/src/modals/Modals.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - diff --git a/src/modals/attachment/AddAttachmentModal.vue b/src/modals/attachment/AddAttachmentModal.vue deleted file mode 100644 index bd339333..00000000 --- a/src/modals/attachment/AddAttachmentModal.vue +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - diff --git a/src/modals/attachment/EditAttachmentModal.vue b/src/modals/attachment/EditAttachmentModal.vue deleted file mode 100644 index 4b26a372..00000000 --- a/src/modals/attachment/EditAttachmentModal.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - diff --git a/src/modals/catalog/AddCatalogModal.vue b/src/modals/catalog/AddCatalogModal.vue deleted file mode 100644 index 8836499d..00000000 --- a/src/modals/catalog/AddCatalogModal.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - diff --git a/src/modals/catalog/EditCatalogModal.vue b/src/modals/catalog/EditCatalogModal.vue deleted file mode 100644 index f57a4981..00000000 --- a/src/modals/catalog/EditCatalogModal.vue +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - diff --git a/src/modals/directory/AddListingModal.vue b/src/modals/directory/AddListingModal.vue deleted file mode 100644 index 35a0f4bb..00000000 --- a/src/modals/directory/AddListingModal.vue +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - diff --git a/src/modals/directory/EditListingModal.vue b/src/modals/directory/EditListingModal.vue deleted file mode 100644 index d7ff56f4..00000000 --- a/src/modals/directory/EditListingModal.vue +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - diff --git a/src/modals/metaData/AddMetaDataModal.vue b/src/modals/metaData/AddMetaDataModal.vue deleted file mode 100644 index f82994ba..00000000 --- a/src/modals/metaData/AddMetaDataModal.vue +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - diff --git a/src/modals/metaData/AddMetaDataPropertyModal.vue b/src/modals/metaData/AddMetaDataPropertyModal.vue deleted file mode 100644 index 1ed900a9..00000000 --- a/src/modals/metaData/AddMetaDataPropertyModal.vue +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - diff --git a/src/modals/metaData/EditMetaDataModal.vue b/src/modals/metaData/EditMetaDataModal.vue deleted file mode 100644 index f2c8d9c1..00000000 --- a/src/modals/metaData/EditMetaDataModal.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - diff --git a/src/modals/metaData/EditMetaDataPropertyModal.vue b/src/modals/metaData/EditMetaDataPropertyModal.vue deleted file mode 100644 index 40fba50c..00000000 --- a/src/modals/metaData/EditMetaDataPropertyModal.vue +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - diff --git a/src/modals/publication/AddPublicationModal.vue b/src/modals/publication/AddPublicationModal.vue deleted file mode 100644 index b1fb3b80..00000000 --- a/src/modals/publication/AddPublicationModal.vue +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - diff --git a/src/modals/publication/EditPublicationModal.vue b/src/modals/publication/EditPublicationModal.vue deleted file mode 100644 index 0addd0e0..00000000 --- a/src/modals/publication/EditPublicationModal.vue +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - diff --git a/src/modals/publicationData/AddPublicationDataModal.vue b/src/modals/publicationData/AddPublicationDataModal.vue deleted file mode 100644 index a35be621..00000000 --- a/src/modals/publicationData/AddPublicationDataModal.vue +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - diff --git a/src/modals/publicationData/EditPublicationDataModal.vue b/src/modals/publicationData/EditPublicationDataModal.vue deleted file mode 100644 index 5277b3c8..00000000 --- a/src/modals/publicationData/EditPublicationDataModal.vue +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - diff --git a/src/navigation/Configuration.vue b/src/navigation/Configuration.vue deleted file mode 100644 index 9fa10520..00000000 --- a/src/navigation/Configuration.vue +++ /dev/null @@ -1,330 +0,0 @@ - - - diff --git a/src/navigation/MainMenu.vue b/src/navigation/MainMenu.vue deleted file mode 100644 index 8df6c863..00000000 --- a/src/navigation/MainMenu.vue +++ /dev/null @@ -1,197 +0,0 @@ - - - - - diff --git a/src/pinia.js b/src/pinia.js deleted file mode 100644 index 8a059806..00000000 --- a/src/pinia.js +++ /dev/null @@ -1,5 +0,0 @@ -import { createPinia } from 'pinia' - -const pinia = createPinia() - -export default pinia diff --git a/src/sidebars/SideBars.vue b/src/sidebars/SideBars.vue deleted file mode 100644 index b94fa7d5..00000000 --- a/src/sidebars/SideBars.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - - - diff --git a/src/sidebars/dashboard/DashboardSideBar.vue b/src/sidebars/dashboard/DashboardSideBar.vue deleted file mode 100644 index 6e75f75b..00000000 --- a/src/sidebars/dashboard/DashboardSideBar.vue +++ /dev/null @@ -1,155 +0,0 @@ - - - - diff --git a/src/sidebars/directory/DirectorySideBar.vue b/src/sidebars/directory/DirectorySideBar.vue deleted file mode 100644 index 7863f244..00000000 --- a/src/sidebars/directory/DirectorySideBar.vue +++ /dev/null @@ -1,152 +0,0 @@ - - - - diff --git a/src/sidebars/search/SearchSideBar.vue b/src/sidebars/search/SearchSideBar.vue deleted file mode 100644 index af477209..00000000 --- a/src/sidebars/search/SearchSideBar.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - - diff --git a/src/store/modules/catalogi.js b/src/store/modules/catalogi.js deleted file mode 100644 index 67d9bacc..00000000 --- a/src/store/modules/catalogi.js +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable no-console */ -import { defineStore } from 'pinia' -import { Catalogi } from '../../entities/index.js' - -export const useCatalogiStore = defineStore( - 'catalogi', { - state: () => ({ - catalogiItem: false, - catalogiList: [], - }), - actions: { - setCatalogiItem(catalogiItem) { - this.catalogiItem = catalogiItem && new Catalogi(catalogiItem) - console.log('Active catalog item set to ' + catalogiItem && catalogiItem?.id) - }, - setCatalogiList(catalogiList) { - this.catalogiList = catalogiList.map( - (catalogiItem) => new Catalogi(catalogiItem), - ) - console.log('Catalogi list set to ' + catalogiList.length + ' item') - }, - async refreshCatalogiList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/catalogi' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.catalogiList = data.results.map( - (catalogiItem) => new Catalogi(catalogiItem), - ) - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - }, - ) - }, - }, - }, -) diff --git a/src/store/modules/catalogi.spec.js b/src/store/modules/catalogi.spec.js deleted file mode 100644 index ea313261..00000000 --- a/src/store/modules/catalogi.spec.js +++ /dev/null @@ -1,91 +0,0 @@ -/* eslint-disable no-console */ -import { setActivePinia, createPinia } from 'pinia' - -import { useCatalogiStore } from './catalogi.js' -import { Catalogi } from '../../entities/index.js' - -describe( - 'Catalogi Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - }, - ) - - it( - 'sets catalogi item correctly', () => { - const store = useCatalogiStore() - - store.setCatalogiItem(testData[0]) - - expect(store.catalogiItem).toBeInstanceOf(Catalogi) - expect(store.catalogiItem).toEqual(testData[0]) - - expect(store.catalogiItem.validate()).toBe(true) - }, - ) - - it( - 'sets catalogi list correctly', () => { - const store = useCatalogiStore() - - store.setCatalogiList(testData) - - expect(store.catalogiList).toHaveLength(testData.length) - - // list item 1 - expect(store.catalogiList[0]).toBeInstanceOf(Catalogi) - expect(store.catalogiList[0]).toEqual(testData[0]) - - expect(store.catalogiList[0].validate()).toBe(true) - - // list item 2 - expect(store.catalogiList[1]).toBeInstanceOf(Catalogi) - expect(store.catalogiList[1].id).toBe(testData[1].id) - expect(store.catalogiList[1].title).toBe(testData[1].title) - expect(store.catalogiList[1].summary).toBe(testData[1].summary) - expect(store.catalogiList[1].description).toBe(testData[1].description) - expect(store.catalogiList[1].image).toBe('') - expect(store.catalogiList[1].search).toBe('') - - expect(store.catalogiList[1].validate()).toBe(true) - - // list item 3 - expect(store.catalogiList[2]).toBeInstanceOf(Catalogi) - expect(store.catalogiList[2].id).toBe(testData[2].id) - expect(store.catalogiList[2].title).toBe('') - expect(store.catalogiList[2].summary).toBe(testData[2].summary) - expect(store.catalogiList[2].description).toBe(testData[2].description) - expect(store.catalogiList[2].image).toBe(testData[2].image) - expect(store.catalogiList[2].search).toBe(testData[2].search) - - expect(store.catalogiList[2].validate()).toBe(false) // id, title and summary are required, causing a falsy result - }, - ) - }, -) - -const testData = [ - { - id: '1', - title: 'Decat', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, - { - id: '2', - title: 'Woo', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - }, - { - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, -] diff --git a/src/store/modules/directory.js b/src/store/modules/directory.js deleted file mode 100644 index eb2a32bd..00000000 --- a/src/store/modules/directory.js +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable no-console */ -import { defineStore } from 'pinia' -import { Listing } from '../../entities/index.js' - -export const useDirectoryStore = defineStore( - 'directory', { - state: () => ({ - listingItem: false, - listingList: [], - }), - actions: { - setListingItem(listingItem) { - this.listingItem = listingItem && new Listing(listingItem) - console.log('Active directory item set to ' + listingItem && listingItem.id) - }, - setListingList(listingList) { - this.listingList = listingList.map( - (listingItem) => new Listing(listingItem), - ) - console.log('Active directory item set to ' + listingList.length) - }, - async refreshListingList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/directory' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.listingList = data.results.map( - (listingItem) => new Listing(listingItem), - ) - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - }, - ) - }, - }, - }, -) diff --git a/src/store/modules/directory.spec.js b/src/store/modules/directory.spec.js deleted file mode 100644 index a3ca566e..00000000 --- a/src/store/modules/directory.spec.js +++ /dev/null @@ -1,113 +0,0 @@ -/* eslint-disable no-console */ -import { setActivePinia, createPinia } from 'pinia' - -import { useDirectoryStore } from './directory.js' -import { Listing } from '../../entities/index.js' - -describe( - 'Directory Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - }, - ) - - it( - 'sets listing item correctly', () => { - const store = useDirectoryStore() - - store.setListingItem(testData[0]) - - expect(store.listingItem).toBeInstanceOf(Listing) - expect(store.listingItem).toEqual(testData[0]) - }, - ) - - it( - 'sets listings list correctly', () => { - const store = useDirectoryStore() - - store.setListingList(testData) - - expect(store.listingList).toHaveLength(testData.length) - - // list item 1 - expect(store.listingList[0]).toBeInstanceOf(Listing) - expect(store.listingList[0]).toEqual(testData[0]) - - expect(store.listingList[0].validate()).toBe(true) - - // list item 2 - expect(store.listingList[1]).toBeInstanceOf(Listing) - expect(store.listingList[1].id).toBe(testData[1].id) - expect(store.listingList[1].title).toBe(testData[1].title) - expect(store.listingList[1].summary).toBe(testData[1].summary) - expect(store.listingList[1].description).toBe(testData[1].description) - expect(store.listingList[1].search).toBe('') - expect(store.listingList[1].directory).toBe(testData[1].directory) - expect(store.listingList[1].metadata).toBe('') - expect(store.listingList[1].status).toBe('') - expect(store.listingList[1].lastSync).toBe(testData[1].lastSync) - expect(store.listingList[1].default).toBe(testData[1].default) - expect(store.listingList[1].available).toBe(testData[1].available) - - expect(store.listingList[1].validate()).toBe(true) - - // list item 3 - expect(store.listingList[2]).toBeInstanceOf(Listing) - expect(store.listingList[2].id).toBe(testData[2].id) - expect(store.listingList[2].title).toBe('') - expect(store.listingList[2].summary).toBe(testData[2].summary) - expect(store.listingList[2].description).toBe(testData[2].description) - expect(store.listingList[2].search).toBe(testData[2].search) - expect(store.listingList[2].directory).toBe(testData[2].directory) - expect(store.listingList[2].metadata).toBe(testData[2].metadata) - expect(store.listingList[2].status).toBe(testData[2].status) - expect(store.listingList[2].lastSync).toBe(testData[2].lastSync) - expect(store.listingList[2].default).toBe(testData[2].default) - expect(store.listingList[2].available).toBe(testData[2].available) - - expect(store.listingList[2].validate()).toBe(false) - }, - ) - }, -) - -const testData = [ - { // full data - id: '1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'active', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, - { // partial data - id: '2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - directory: 'string', - lastSync: '2024-07-25T00:00:00Z', - default: 'yes', - available: 'no', - }, - { // invalid data - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'pending', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, -] diff --git a/src/store/modules/metadata.js b/src/store/modules/metadata.js deleted file mode 100644 index 1426eb4b..00000000 --- a/src/store/modules/metadata.js +++ /dev/null @@ -1,83 +0,0 @@ -/* eslint-disable no-console */ -import { defineStore } from 'pinia' -import { Metadata } from '../../entities/index.js' - -export const useMetadataStore = defineStore( - 'metadata', { - state: () => ({ - metaDataItem: false, - metaDataList: [], - metadataDataKey: false, - }), - actions: { - setMetaDataItem(metaDataItem) { - this.metaDataItem = metaDataItem && new Metadata(metaDataItem) - - // for backward compatibility - if (typeof this.metaDataItem?.properties === 'string') { - this.metaDataItem.properties = JSON.parse(this.metaDataItem.properties) - } - - console.log('Active metadata object set to ' + metaDataItem && metaDataItem.id) - }, - setMetaDataList(metaDataList) { - this.metaDataList = metaDataList.map( - (metadataItem) => new Metadata(metadataItem), - ) - console.log('Active metadata lest set') - }, - async refreshMetaDataList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/metadata' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.metaDataList = data.results.map( - (metadataItem) => new Metadata(metadataItem), - ) - return data - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - return err - }, - ) - }, - setMetadataDataKey(metadataDataKey) { - this.metadataDataKey = metadataDataKey - console.log('Active metadata data key set to ' + metadataDataKey) - }, - getMetadataPropertyKeys(property) { - const defaultKeys = { - type: '', - description: '', - format: '', - maxDate: '', - required: false, - default: false, - $ref: '', // $ref should probably be removed as it is not mentioned in the schema - cascadeDelete: false, - exclusiveMinimum: 0, - } - - const propertyKeys = this.metaDataItem.properties[property] - - return { ...defaultKeys, ...propertyKeys } - }, - }, - }, -) diff --git a/src/store/modules/metadata.spec.js b/src/store/modules/metadata.spec.js deleted file mode 100644 index 0f26eb79..00000000 --- a/src/store/modules/metadata.spec.js +++ /dev/null @@ -1,180 +0,0 @@ -/* eslint-disable no-console */ -import { setActivePinia, createPinia } from 'pinia' - -import { useMetadataStore } from './metadata.js' - -describe( - 'Metadata Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - }, - ) - - it( - 'sets metadata item correctly', () => { - const store = useMetadataStore() - const metadataItem = { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test listing', - description: 'this is a very long description for test listing', - version: '0.0.1', - properties: { - sasds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - }, - } - - store.setMetaDataItem(metadataItem) - - expect(store.metaDataItem).toEqual(metadataItem) - }, - ) - - it( - 'sets metadata item with string "properties" property', () => { - const store = useMetadataStore() - const metadataItem = { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test listing', - description: 'this is a very long description for test listing', - version: '0.0.1', - properties: '{"sasds":{"type":"string","description":"property description","format":"a format","maxDate":"2025-07-13","required":false,"default":false,"cascadeDelete":false,"exclusiveMinimum":"2"}}', - } - - store.setMetaDataItem(metadataItem) - - expect(store.metaDataItem.id).toBe('1') - expect(store.metaDataItem.name).toBe('Test metadata name') - expect(store.metaDataItem.title).toBe('Test metadata') - expect(store.metaDataItem.summary).toBe('This is a test listing') - expect(store.metaDataItem.description).toBe('this is a very long description for test listing') - expect(store.metaDataItem.version).toBe('0.0.1') - // properties - expect(store.metaDataItem.properties.sasds.type).toBe('string') - expect(store.metaDataItem.properties.sasds.description).toBe('property description') - expect(store.metaDataItem.properties.sasds.format).toBe('a format') - expect(store.metaDataItem.properties.sasds.maxDate).toBe('2025-07-13') - expect(store.metaDataItem.properties.sasds.required).toBe(false) - expect(store.metaDataItem.properties.sasds.default).toBe(false) - expect(store.metaDataItem.properties.sasds.cascadeDelete).toBe(false) - expect(store.metaDataItem.properties.sasds.exclusiveMinimum).toBe('2') - }, - ) - - it( - 'sets metadata list correctly', () => { - const store = useMetadataStore() - const metadataList = [ - { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - properties: { - sasds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - gfdgds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - }, - }, - { - id: '2', - name: 'Test metadata naming', - title: 'Test metadata aaaa', - summary: 'This is a test metadata baaa da daaa', - description: 'this is a very long descriptio-', - version: '0.0.1', - properties: {}, - }, - ] - - store.setMetaDataList(metadataList) - - expect(store.metaDataList).toHaveLength(metadataList.length) - store.metaDataList.forEach( - (item, index) => { - expect(item).toEqual(metadataList[index]) - }, - ) - }, - ) - - it( - 'get metadata property from key', () => { - const store = useMetadataStore() - const metadataItem = { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - properties: { - sasds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - $ref: '', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - gfdgds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - }, - } - - store.setMetaDataItem(metadataItem) - store.setMetadataDataKey('sasds') - - expect(store.metaDataItem).toEqual(metadataItem) - expect(store.metadataDataKey).toBe('sasds') - - const properties = store.getMetadataPropertyKeys('sasds') - - expect(properties).toEqual(metadataItem.properties.sasds) - }, - ) - }, -) diff --git a/src/store/modules/navigation.js b/src/store/modules/navigation.js deleted file mode 100644 index 656c26d1..00000000 --- a/src/store/modules/navigation.js +++ /dev/null @@ -1,35 +0,0 @@ -/* eslint-disable no-console */ -import { defineStore } from 'pinia' - -export const useNavigationStore = defineStore( - 'ui', { - state: () => ({ - // The currently active menu item, defaults to '' which triggers the dashboard - selected: 'dashboard', - // The currently selected catalogi within 'publications' - selectedCatalogus: false, - // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time - modal: false, - // The currently active dialog - dialog: false, - }), - actions: { - setSelected(selected) { - this.selected = selected - console.log('Active menu item set to ' + selected) - }, - setSelectedCatalogus(selectedCatalogus) { - this.selectedCatalogus = selectedCatalogus - console.log('Active catalogus menu set to ' + selectedCatalogus) - }, - setModal(modal) { - this.modal = modal - console.log('Active modal set to ' + modal) - }, - setDialog(dialog) { - this.dialog = dialog - console.log('Active dialog set to ' + dialog) - }, - }, - }, -) diff --git a/src/store/modules/navigation.spec.js b/src/store/modules/navigation.spec.js deleted file mode 100644 index 73f2e8ff..00000000 --- a/src/store/modules/navigation.spec.js +++ /dev/null @@ -1,74 +0,0 @@ -/* eslint-disable no-console */ -import { setActivePinia, createPinia } from 'pinia' - -import { useNavigationStore } from './navigation.js' - -describe( - 'Navigation Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - }, - ) - - it( - 'set current selected view correctly', () => { - const store = useNavigationStore() - - store.setSelected('publication') - expect(store.selected).toBe('publication') - - store.setSelected('catalogi') - expect(store.selected).toBe('catalogi') - - store.setSelected('metadata') - expect(store.selected).toBe('metadata') - }, - ) - - it( - 'set current selected publication catalogi correctly', () => { - const store = useNavigationStore() - - store.setSelectedCatalogus('7a048bfd-210f-4e93-a1e8-5aa9261740b7') - expect(store.selectedCatalogus).toBe('7a048bfd-210f-4e93-a1e8-5aa9261740b7') - - store.setSelectedCatalogus('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') - expect(store.selectedCatalogus).toBe('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') - - store.setSelectedCatalogus('3b1cbee2-756e-4904-a157-29fb0cbe01d3') - expect(store.selectedCatalogus).toBe('3b1cbee2-756e-4904-a157-29fb0cbe01d3') - }, - ) - - it( - 'set modal correctly', () => { - const store = useNavigationStore() - - store.setModal('editPublication') - expect(store.modal).toBe('editPublication') - - store.setModal('editCatalogi') - expect(store.modal).toBe('editCatalogi') - - store.setModal('editMetadata') - expect(store.modal).toBe('editMetadata') - }, - ) - - it( - 'set modal correctly', () => { - const store = useNavigationStore() - - store.setDialog('deletePublication') - expect(store.dialog).toBe('deletePublication') - - store.setDialog('deleteCatalogi') - expect(store.dialog).toBe('deleteCatalogi') - - store.setDialog('deleteMetadata') - expect(store.dialog).toBe('deleteMetadata') - }, - ) - }, -) diff --git a/src/store/modules/publication.js b/src/store/modules/publication.js deleted file mode 100644 index 53b0d490..00000000 --- a/src/store/modules/publication.js +++ /dev/null @@ -1,140 +0,0 @@ -/* eslint-disable no-console */ -import { Attachment, Publication } from '../../entities/index.js' -import { defineStore } from 'pinia' - -export const usePublicationStore = defineStore( - 'publication', { - state: () => ({ - publicationItem: false, - publicationList: [], - publicationDataKey: false, - attachmentItem: false, - publicationAttachments: [], - conceptPublications: [], - conceptAttachments: [], - }), - actions: { - setPublicationItem(publicationItem) { - // To prevent forms etc from braking we alway use a default/skeleton object - this.publicationItem = publicationItem && new Publication(publicationItem) - console.log('Active publication item set to ' + publicationItem && publicationItem.id) - }, - setPublicationList(publicationList) { - this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) - console.log('Active publication item set to ' + publicationList.length) - }, - async refreshPublicationList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/publications' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.setPublicationList(data?.results) - return data - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - return err - }, - ) - }, - getPublicationAttachments(publication) { // @todo this might belong in a service? - fetch( - '/index.php/apps/opencatalogi/api/attachments', - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.publicationAttachments = data.results.map( - (attachmentItem) => new Attachment(attachmentItem), - ) - return data - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - return err - }, - ) - }, - getConceptPublications() { // @todo this might belong in a service? - fetch( - '/index.php/apps/opencatalogi/api/publications?status=concept', - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.conceptPublications = data - return data - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - return err - }, - ) - }, - getConceptAttachments() { // @todo this might belong in a service? - fetch( - '/index.php/apps/opencatalogi/api/attachments?status=concept', - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.conceptAttachments = data - return data - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - return err - }, - ) - }, - // @todo why does the following run through the store? -- because its impossible with props, and its vital information for the modal. - setPublicationDataKey(publicationDataKey) { - this.publicationDataKey = publicationDataKey - console.log('Active publication data key set to ' + publicationDataKey) - }, - setAttachmentItem(attachmentItem) { - this.attachmentItem = attachmentItem && new Attachment(attachmentItem) - console.log('Active attachment item set to ' + attachmentItem) - }, - }, - }, -) diff --git a/src/store/modules/publication.spec.js b/src/store/modules/publication.spec.js deleted file mode 100644 index c96c1372..00000000 --- a/src/store/modules/publication.spec.js +++ /dev/null @@ -1,232 +0,0 @@ -/* eslint-disable no-console */ -import { setActivePinia, createPinia } from 'pinia' - -import { usePublicationStore } from './publication.js' -import { Attachment, Publication } from '../../entities/index.js' - -describe( - 'Metadata Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - }, - ) - - it( - 'sets publication item correctly', () => { - const store = usePublicationStore() - - store.setPublicationItem(testData[0]) - - expect(store.publicationItem).toBeInstanceOf(Publication) - expect(store.publicationItem).toEqual(testData[0]) - expect(store.publicationItem.validate()).toBe(true) - - store.setPublicationItem(testData[1]) - - expect(store.publicationItem).toBeInstanceOf(Publication) - expect(store.publicationItem).not.toEqual(testData[1]) - expect(store.publicationItem.validate()).toBe(true) - - store.setPublicationItem(testData[2]) - - expect(store.publicationItem).toBeInstanceOf(Publication) - expect(store.publicationItem).toEqual(testData[2]) - expect(store.publicationItem.validate()).toBe(false) - }, - ) - - it( - 'sets publication list correctly', () => { - const store = usePublicationStore() - - store.setPublicationList(testData) - - expect(store.publicationList).toHaveLength(testData.length) - - expect(store.publicationList[0]).toBeInstanceOf(Publication) - expect(store.publicationList[0]).toEqual(testData[0]) - expect(store.publicationList[0].validate()).toBe(true) - - expect(store.publicationList[1]).toBeInstanceOf(Publication) - expect(store.publicationList[1]).not.toEqual(testData[1]) - expect(store.publicationList[1].validate()).toBe(true) - - expect(store.publicationList[2]).toBeInstanceOf(Publication) - expect(store.publicationList[2]).toEqual(testData[2]) - expect(store.publicationList[2].validate()).toBe(false) - }, - ) - - // TODO: fix this - it( - 'set publication data.data property key correctly', () => { - const store = usePublicationStore() - - store.setPublicationDataKey('contactPoint') - - expect(store.publicationDataKey).toBe('contactPoint') - }, - ) - - it( - 'set attachment item correctly', () => { - const store = usePublicationStore() - - store.setAttachmentItem(attachmentTestData[0]) - - expect(store.attachmentItem).toBeInstanceOf(Attachment) - expect(store.attachmentItem).toEqual(attachmentTestData[0]) - expect(store.attachmentItem.validate()).toBe(true) - - store.setAttachmentItem(attachmentTestData[1]) - - expect(store.attachmentItem).toBeInstanceOf(Attachment) - expect(store.attachmentItem).not.toEqual(attachmentTestData[1]) - expect(store.attachmentItem.validate()).toBe(true) - - store.setAttachmentItem(attachmentTestData[2]) - - expect(store.attachmentItem).toBeInstanceOf(Attachment) - expect(store.attachmentItem).toEqual(attachmentTestData[2]) - expect(store.attachmentItem.validate()).toBe(false) - }, - ) - }, -) - -const testData = [ - { // full data - id: '1', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category1', - portal: 'portal1', - catalogi: 'catalogi1', - metaData: 'meta1', - publicationDate: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: [{ name: 'Org1' }], - data: [{ key: 'value1' }], - attachments: ['attachment1'], - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: 'theme1', - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - }, - { // partial data - id: '2', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category2', - portal: 'portal2', - catalogi: 'catalogi2', - metaData: 'meta2', - publicationDate: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: [{ name: 'Org1' }], - data: [{ key: 'value1' }], - attachments: ['attachment1'], - attachmentCount: 1, - - themes: 'theme1', - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - }, - { // invalid data - id: '3', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category3', - portal: 'portal3', - catalogi: 'catalogi3', - metaData: 'meta3', - publicationDate: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: [{ name: 'Org1' }], - data: [{ key: 'value1' }], - attachments: ['attachment1'], - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: 'theme1', - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - }, -] - -const attachmentTestData = [ - { // full data - id: '9044ab1e-cf5a-490a-be74-6be7a0c48a5f', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag1' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, - { // partial data - id: 'f849f287-492d-4100-91e1-1c4137f0abb5', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag2' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - license: 'MIT', - }, - { // invalid data - id: 'e193ea6b-1222-44cf-a71c-6ddcc232a79b', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag3' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, -] diff --git a/src/store/modules/search.js b/src/store/modules/search.js deleted file mode 100644 index 0ad14f75..00000000 --- a/src/store/modules/search.js +++ /dev/null @@ -1,46 +0,0 @@ -/* eslint-disable no-console */ -import { defineStore } from 'pinia' - -export const useSearchStore = defineStore( - 'search', { - state: () => ({ - search: '', - searchResults: '', - }), - actions: { - setSearch(search) { - this.search = search - console.log('Active search set to ' + search) - }, - setSearchResults(searchResults) { - this.searchResults = searchResults - console.log('Active search set to ' + searchResults) - }, - getSearchResults() { - fetch( - '/index.php/apps/opencatalogi/api/search?_search=' + this.search, - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.searchResults = data - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - }, - ) - }, - clearSearch() { - this.search = '' - }, - }, - }, -) diff --git a/src/store/modules/search.spec.js b/src/store/modules/search.spec.js deleted file mode 100644 index 6fcf6305..00000000 --- a/src/store/modules/search.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable no-console */ -import { setActivePinia, createPinia } from 'pinia' - -import { useSearchStore } from './search.js' - -describe( - 'Search Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - }, - ) - - it( - 'set search correctly', () => { - const store = useSearchStore() - - store.setSearch('cata') - expect(store.search).toBe('cata') - - store.setSearch('woo') - expect(store.search).toBe('woo') - - store.setSearch('foo bar') - expect(store.search).toBe('foo bar') - }, - ) - - it( - 'set search result correctly', () => { - const store = useSearchStore() - - store.setSearchResults(['foo', 'bar', 'bux']) - expect(store.searchResults).toEqual(['foo', 'bar', 'bux']) - }, - ) - - it( - 'clear search correctly', () => { - const store = useSearchStore() - - store.setSearch('Lorem ipsum dolor sit amet') - expect(store.search).toBe('Lorem ipsum dolor sit amet') - - store.clearSearch() - - expect(store.search).toBe('') - }, - ) - }, -) diff --git a/src/store/store.js b/src/store/store.js deleted file mode 100644 index f58c70a2..00000000 --- a/src/store/store.js +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable no-console */ -// The store script handles app wide variables (or state), for the use of these variables and there governing concepts read the design.md -import pinia from '../pinia.js' -import { useNavigationStore } from './modules/navigation.js' -import { useSearchStore } from './modules/search.js' -import { useCatalogiStore } from './modules/catalogi.js' -import { useDirectoryStore } from './modules/directory.js' -import { useMetadataStore } from './modules/metadata.js' -import { usePublicationStore } from './modules/publication.js' - -const navigationStore = useNavigationStore(pinia) -const searchStore = useSearchStore(pinia) -const catalogiStore = useCatalogiStore(pinia) -const directoryStore = useDirectoryStore(pinia) -const metadataStore = useMetadataStore(pinia) -const publicationStore = usePublicationStore(pinia) - -export { - // generic - navigationStore, - searchStore, - // feature-specific - catalogiStore, - directoryStore, - metadataStore, - publicationStore, -} diff --git a/src/views/Views.vue b/src/views/Views.vue deleted file mode 100644 index ae5905ed..00000000 --- a/src/views/Views.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/src/views/catalogi/CatalogiDetails.vue b/src/views/catalogi/CatalogiDetails.vue deleted file mode 100644 index 910310b9..00000000 --- a/src/views/catalogi/CatalogiDetails.vue +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - diff --git a/src/views/catalogi/CatalogiIndex.vue b/src/views/catalogi/CatalogiIndex.vue deleted file mode 100644 index d524901e..00000000 --- a/src/views/catalogi/CatalogiIndex.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/src/views/catalogi/CatalogiList.vue b/src/views/catalogi/CatalogiList.vue deleted file mode 100644 index 8a158338..00000000 --- a/src/views/catalogi/CatalogiList.vue +++ /dev/null @@ -1,176 +0,0 @@ - - - - - diff --git a/src/views/dashboard/DashboardIndex.vue b/src/views/dashboard/DashboardIndex.vue deleted file mode 100644 index e4adff06..00000000 --- a/src/views/dashboard/DashboardIndex.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - - - diff --git a/src/views/directory/DirectoryIndex.vue b/src/views/directory/DirectoryIndex.vue deleted file mode 100644 index 3471ee88..00000000 --- a/src/views/directory/DirectoryIndex.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/src/views/directory/DirectoryList.vue b/src/views/directory/DirectoryList.vue deleted file mode 100644 index 0681121f..00000000 --- a/src/views/directory/DirectoryList.vue +++ /dev/null @@ -1,163 +0,0 @@ - - - - - diff --git a/src/views/directory/ListingDetails.vue b/src/views/directory/ListingDetails.vue deleted file mode 100644 index 3facaf70..00000000 --- a/src/views/directory/ListingDetails.vue +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - diff --git a/src/views/metaData/MetaDataDetail.vue b/src/views/metaData/MetaDataDetail.vue deleted file mode 100644 index 3226da1f..00000000 --- a/src/views/metaData/MetaDataDetail.vue +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - diff --git a/src/views/metaData/MetaDataIndex.vue b/src/views/metaData/MetaDataIndex.vue deleted file mode 100644 index 79c5ff0e..00000000 --- a/src/views/metaData/MetaDataIndex.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/src/views/metaData/MetaDataList.vue b/src/views/metaData/MetaDataList.vue deleted file mode 100644 index 1a014c77..00000000 --- a/src/views/metaData/MetaDataList.vue +++ /dev/null @@ -1,174 +0,0 @@ - - - - - diff --git a/src/views/publications/PublicationDetail.vue b/src/views/publications/PublicationDetail.vue deleted file mode 100644 index e80d1747..00000000 --- a/src/views/publications/PublicationDetail.vue +++ /dev/null @@ -1,592 +0,0 @@ - - - - - - - diff --git a/src/views/publications/PublicationIndex.vue b/src/views/publications/PublicationIndex.vue deleted file mode 100644 index ca8149ff..00000000 --- a/src/views/publications/PublicationIndex.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - - - diff --git a/src/views/publications/PublicationList.vue b/src/views/publications/PublicationList.vue deleted file mode 100644 index 89475368..00000000 --- a/src/views/publications/PublicationList.vue +++ /dev/null @@ -1,233 +0,0 @@ - - - - - diff --git a/src/views/search/SearchIndex.vue b/src/views/search/SearchIndex.vue deleted file mode 100644 index cc44813a..00000000 --- a/src/views/search/SearchIndex.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - From 446effccc6e96f3f956282f42beae869114dc2c4 Mon Sep 17 00:00:00 2001 From: Remko Date: Mon, 5 Aug 2024 13:58:04 +0200 Subject: [PATCH 043/145] removed vue warn --- src/modals/metaData/EditMetaDataModal.vue | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/modals/metaData/EditMetaDataModal.vue b/src/modals/metaData/EditMetaDataModal.vue index f2c8d9c1..e29ed5fa 100644 --- a/src/modals/metaData/EditMetaDataModal.vue +++ b/src/modals/metaData/EditMetaDataModal.vue @@ -24,7 +24,7 @@ import { navigationStore, metadataStore } from '../../store/store.js' - +
{ response.json().then((data) => { metadataStore.setMetaDataItem(data) + this.metadataRequired = data.required.toString() }) this.loading = false }) @@ -96,7 +97,7 @@ export default { }, body: JSON.stringify({ ...metadataStore.metaDataItem, - required: metadataStore.metaDataItem.required.split(/, */g), + required: this.metadataRequired.split(/, */g), }), }, ).then((response) => { From 5045be1f48f3bc402f7176394b58acb53bd74e5b Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 14:00:50 +0200 Subject: [PATCH 044/145] readded src --- src/App.vue | 31 + src/dialogs/Dialogs.vue | 67 ++ .../attachment/CopyAttachmentDialog.vue | 129 ++++ .../attachment/DeleteAttachmentDialog.vue | 122 ++++ .../attachment/DepublishAttachmentDialog.vue | 127 ++++ .../attachment/PublishAttachmentDialog.vue | 127 ++++ src/dialogs/catalog/DeleteCatalogDialog.vue | 121 ++++ src/dialogs/listing/DeleteListingDialog.vue | 116 ++++ src/dialogs/logs/ViewLogDialog.vue | 83 +++ src/dialogs/metaData/CopyMetaDataDialog.vue | 125 ++++ src/dialogs/metaData/DeleteMetaDataDialog.vue | 116 ++++ .../CopyMetaDataPropertiesDialog.vue | 122 ++++ .../DeleteMetaDataPropertiesDialog.vue | 122 ++++ .../publication/ArchivePublicationDialog.vue | 119 ++++ .../publication/CopyPublicationDialog.vue | 127 ++++ .../publication/DeletePublicationDialog.vue | 116 ++++ .../DepublishPublicationDialog.vue | 120 ++++ .../publication/PublishPublicationDialog.vue | 119 ++++ .../DeletePublicationDataDialog.vue | 121 ++++ src/entities/attachment/attachment.spec.ts | 109 ++++ src/entities/attachment/attachment.ts | 99 +++ src/entities/attachment/attachment.types.ts | 26 + src/entities/attachment/index.js | 2 + src/entities/catalogi/catalogi.spec.ts | 62 ++ src/entities/catalogi/catalogi.ts | 40 ++ src/entities/catalogi/catalogi.types.ts | 8 + src/entities/catalogi/index.js | 2 + src/entities/index.js | 6 + src/entities/listing/index.js | 2 + src/entities/listing/listing.spec.ts | 81 +++ src/entities/listing/listing.ts | 54 ++ src/entities/listing/listing.types.ts | 13 + src/entities/metadata/index.js | 2 + src/entities/metadata/metadata.spec.ts | 161 +++++ src/entities/metadata/metadata.ts | 94 +++ src/entities/metadata/metadata.types.ts | 28 + src/entities/publication/index.js | 2 + src/entities/publication/publication.spec.ts | 127 ++++ src/entities/publication/publication.ts | 124 ++++ src/entities/publication/publication.types.ts | 51 ++ src/main.js | 12 + src/modals/Modals.vue | 59 ++ src/modals/attachment/AddAttachmentModal.vue | 146 +++++ src/modals/attachment/EditAttachmentModal.vue | 141 +++++ src/modals/catalog/AddCatalogModal.vue | 141 +++++ src/modals/catalog/EditCatalogModal.vue | 130 ++++ src/modals/directory/AddListingModal.vue | 151 +++++ src/modals/directory/EditListingModal.vue | 134 ++++ src/modals/metaData/AddMetaDataModal.vue | 136 ++++ .../metaData/AddMetaDataPropertyModal.vue | 297 +++++++++ src/modals/metaData/EditMetaDataModal.vue | 141 +++++ .../metaData/EditMetaDataPropertyModal.vue | 309 +++++++++ .../publication/AddPublicationModal.vue | 344 ++++++++++ .../publication/EditPublicationModal.vue | 318 ++++++++++ .../AddPublicationDataModal.vue | 158 +++++ .../EditPublicationDataModal.vue | 233 +++++++ src/navigation/Configuration.vue | 330 ++++++++++ src/navigation/MainMenu.vue | 197 ++++++ src/pinia.js | 5 + src/sidebars/SideBars.vue | 29 + src/sidebars/dashboard/DashboardSideBar.vue | 155 +++++ src/sidebars/directory/DirectorySideBar.vue | 152 +++++ src/sidebars/search/SearchSideBar.vue | 60 ++ src/store/modules/catalogi.js | 42 ++ src/store/modules/catalogi.spec.js | 83 +++ src/store/modules/directory.js | 42 ++ src/store/modules/directory.spec.js | 105 ++++ src/store/modules/metadata.js | 75 +++ src/store/modules/metadata.spec.js | 166 +++++ src/store/modules/navigation.js | 33 + src/store/modules/navigation.spec.js | 62 ++ src/store/modules/publication.js | 114 ++++ src/store/modules/publication.spec.js | 220 +++++++ src/store/modules/search.js | 38 ++ src/store/modules/search.spec.js | 41 ++ src/store/store.js | 27 + src/views/Views.vue | 45 ++ src/views/catalogi/CatalogiDetails.vue | 198 ++++++ src/views/catalogi/CatalogiIndex.vue | 52 ++ src/views/catalogi/CatalogiList.vue | 176 ++++++ src/views/dashboard/DashboardIndex.vue | 50 ++ src/views/directory/DirectoryIndex.vue | 52 ++ src/views/directory/DirectoryList.vue | 163 +++++ src/views/directory/ListingDetails.vue | 199 ++++++ src/views/metaData/MetaDataDetail.vue | 260 ++++++++ src/views/metaData/MetaDataIndex.vue | 52 ++ src/views/metaData/MetaDataList.vue | 174 +++++ src/views/publications/PublicationDetail.vue | 592 ++++++++++++++++++ src/views/publications/PublicationIndex.vue | 51 ++ src/views/publications/PublicationList.vue | 233 +++++++ src/views/search/SearchIndex.vue | 86 +++ 91 files changed, 10432 insertions(+) create mode 100644 src/App.vue create mode 100644 src/dialogs/Dialogs.vue create mode 100644 src/dialogs/attachment/CopyAttachmentDialog.vue create mode 100644 src/dialogs/attachment/DeleteAttachmentDialog.vue create mode 100644 src/dialogs/attachment/DepublishAttachmentDialog.vue create mode 100644 src/dialogs/attachment/PublishAttachmentDialog.vue create mode 100644 src/dialogs/catalog/DeleteCatalogDialog.vue create mode 100644 src/dialogs/listing/DeleteListingDialog.vue create mode 100644 src/dialogs/logs/ViewLogDialog.vue create mode 100644 src/dialogs/metaData/CopyMetaDataDialog.vue create mode 100644 src/dialogs/metaData/DeleteMetaDataDialog.vue create mode 100644 src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue create mode 100644 src/dialogs/metaDataProperties/DeleteMetaDataPropertiesDialog.vue create mode 100644 src/dialogs/publication/ArchivePublicationDialog.vue create mode 100644 src/dialogs/publication/CopyPublicationDialog.vue create mode 100644 src/dialogs/publication/DeletePublicationDialog.vue create mode 100644 src/dialogs/publication/DepublishPublicationDialog.vue create mode 100644 src/dialogs/publication/PublishPublicationDialog.vue create mode 100644 src/dialogs/publicationData/DeletePublicationDataDialog.vue create mode 100644 src/entities/attachment/attachment.spec.ts create mode 100644 src/entities/attachment/attachment.ts create mode 100644 src/entities/attachment/attachment.types.ts create mode 100644 src/entities/attachment/index.js create mode 100644 src/entities/catalogi/catalogi.spec.ts create mode 100644 src/entities/catalogi/catalogi.ts create mode 100644 src/entities/catalogi/catalogi.types.ts create mode 100644 src/entities/catalogi/index.js create mode 100644 src/entities/index.js create mode 100644 src/entities/listing/index.js create mode 100644 src/entities/listing/listing.spec.ts create mode 100644 src/entities/listing/listing.ts create mode 100644 src/entities/listing/listing.types.ts create mode 100644 src/entities/metadata/index.js create mode 100644 src/entities/metadata/metadata.spec.ts create mode 100644 src/entities/metadata/metadata.ts create mode 100644 src/entities/metadata/metadata.types.ts create mode 100644 src/entities/publication/index.js create mode 100644 src/entities/publication/publication.spec.ts create mode 100644 src/entities/publication/publication.ts create mode 100644 src/entities/publication/publication.types.ts create mode 100644 src/main.js create mode 100644 src/modals/Modals.vue create mode 100644 src/modals/attachment/AddAttachmentModal.vue create mode 100644 src/modals/attachment/EditAttachmentModal.vue create mode 100644 src/modals/catalog/AddCatalogModal.vue create mode 100644 src/modals/catalog/EditCatalogModal.vue create mode 100644 src/modals/directory/AddListingModal.vue create mode 100644 src/modals/directory/EditListingModal.vue create mode 100644 src/modals/metaData/AddMetaDataModal.vue create mode 100644 src/modals/metaData/AddMetaDataPropertyModal.vue create mode 100644 src/modals/metaData/EditMetaDataModal.vue create mode 100644 src/modals/metaData/EditMetaDataPropertyModal.vue create mode 100644 src/modals/publication/AddPublicationModal.vue create mode 100644 src/modals/publication/EditPublicationModal.vue create mode 100644 src/modals/publicationData/AddPublicationDataModal.vue create mode 100644 src/modals/publicationData/EditPublicationDataModal.vue create mode 100644 src/navigation/Configuration.vue create mode 100644 src/navigation/MainMenu.vue create mode 100644 src/pinia.js create mode 100644 src/sidebars/SideBars.vue create mode 100644 src/sidebars/dashboard/DashboardSideBar.vue create mode 100644 src/sidebars/directory/DirectorySideBar.vue create mode 100644 src/sidebars/search/SearchSideBar.vue create mode 100644 src/store/modules/catalogi.js create mode 100644 src/store/modules/catalogi.spec.js create mode 100644 src/store/modules/directory.js create mode 100644 src/store/modules/directory.spec.js create mode 100644 src/store/modules/metadata.js create mode 100644 src/store/modules/metadata.spec.js create mode 100644 src/store/modules/navigation.js create mode 100644 src/store/modules/navigation.spec.js create mode 100644 src/store/modules/publication.js create mode 100644 src/store/modules/publication.spec.js create mode 100644 src/store/modules/search.js create mode 100644 src/store/modules/search.spec.js create mode 100644 src/store/store.js create mode 100644 src/views/Views.vue create mode 100644 src/views/catalogi/CatalogiDetails.vue create mode 100644 src/views/catalogi/CatalogiIndex.vue create mode 100644 src/views/catalogi/CatalogiList.vue create mode 100644 src/views/dashboard/DashboardIndex.vue create mode 100644 src/views/directory/DirectoryIndex.vue create mode 100644 src/views/directory/DirectoryList.vue create mode 100644 src/views/directory/ListingDetails.vue create mode 100644 src/views/metaData/MetaDataDetail.vue create mode 100644 src/views/metaData/MetaDataIndex.vue create mode 100644 src/views/metaData/MetaDataList.vue create mode 100644 src/views/publications/PublicationDetail.vue create mode 100644 src/views/publications/PublicationIndex.vue create mode 100644 src/views/publications/PublicationList.vue create mode 100644 src/views/search/SearchIndex.vue diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 00000000..6c8c3c91 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/dialogs/Dialogs.vue b/src/dialogs/Dialogs.vue new file mode 100644 index 00000000..c0af7791 --- /dev/null +++ b/src/dialogs/Dialogs.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/dialogs/attachment/CopyAttachmentDialog.vue b/src/dialogs/attachment/CopyAttachmentDialog.vue new file mode 100644 index 00000000..f1d4eb4f --- /dev/null +++ b/src/dialogs/attachment/CopyAttachmentDialog.vue @@ -0,0 +1,129 @@ + + + + + + + diff --git a/src/dialogs/attachment/DeleteAttachmentDialog.vue b/src/dialogs/attachment/DeleteAttachmentDialog.vue new file mode 100644 index 00000000..9d6b36b0 --- /dev/null +++ b/src/dialogs/attachment/DeleteAttachmentDialog.vue @@ -0,0 +1,122 @@ + + + + + + + diff --git a/src/dialogs/attachment/DepublishAttachmentDialog.vue b/src/dialogs/attachment/DepublishAttachmentDialog.vue new file mode 100644 index 00000000..bf0a2ff1 --- /dev/null +++ b/src/dialogs/attachment/DepublishAttachmentDialog.vue @@ -0,0 +1,127 @@ + + + + + + + diff --git a/src/dialogs/attachment/PublishAttachmentDialog.vue b/src/dialogs/attachment/PublishAttachmentDialog.vue new file mode 100644 index 00000000..7b5a1a31 --- /dev/null +++ b/src/dialogs/attachment/PublishAttachmentDialog.vue @@ -0,0 +1,127 @@ + + + + + + + diff --git a/src/dialogs/catalog/DeleteCatalogDialog.vue b/src/dialogs/catalog/DeleteCatalogDialog.vue new file mode 100644 index 00000000..a78eed61 --- /dev/null +++ b/src/dialogs/catalog/DeleteCatalogDialog.vue @@ -0,0 +1,121 @@ + + + + + + + diff --git a/src/dialogs/listing/DeleteListingDialog.vue b/src/dialogs/listing/DeleteListingDialog.vue new file mode 100644 index 00000000..5290ecbe --- /dev/null +++ b/src/dialogs/listing/DeleteListingDialog.vue @@ -0,0 +1,116 @@ + + + + + + + diff --git a/src/dialogs/logs/ViewLogDialog.vue b/src/dialogs/logs/ViewLogDialog.vue new file mode 100644 index 00000000..3c0fbe4d --- /dev/null +++ b/src/dialogs/logs/ViewLogDialog.vue @@ -0,0 +1,83 @@ + + + + + + + diff --git a/src/dialogs/metaData/CopyMetaDataDialog.vue b/src/dialogs/metaData/CopyMetaDataDialog.vue new file mode 100644 index 00000000..99914efd --- /dev/null +++ b/src/dialogs/metaData/CopyMetaDataDialog.vue @@ -0,0 +1,125 @@ + + + + + + + diff --git a/src/dialogs/metaData/DeleteMetaDataDialog.vue b/src/dialogs/metaData/DeleteMetaDataDialog.vue new file mode 100644 index 00000000..9297863b --- /dev/null +++ b/src/dialogs/metaData/DeleteMetaDataDialog.vue @@ -0,0 +1,116 @@ + + + + + + + diff --git a/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue b/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue new file mode 100644 index 00000000..bd19711a --- /dev/null +++ b/src/dialogs/metaDataProperties/CopyMetaDataPropertiesDialog.vue @@ -0,0 +1,122 @@ + + + + + + + diff --git a/src/dialogs/metaDataProperties/DeleteMetaDataPropertiesDialog.vue b/src/dialogs/metaDataProperties/DeleteMetaDataPropertiesDialog.vue new file mode 100644 index 00000000..8f1dd886 --- /dev/null +++ b/src/dialogs/metaDataProperties/DeleteMetaDataPropertiesDialog.vue @@ -0,0 +1,122 @@ + + + + + + + diff --git a/src/dialogs/publication/ArchivePublicationDialog.vue b/src/dialogs/publication/ArchivePublicationDialog.vue new file mode 100644 index 00000000..0adfd4cd --- /dev/null +++ b/src/dialogs/publication/ArchivePublicationDialog.vue @@ -0,0 +1,119 @@ + + + + + + + diff --git a/src/dialogs/publication/CopyPublicationDialog.vue b/src/dialogs/publication/CopyPublicationDialog.vue new file mode 100644 index 00000000..03cd452e --- /dev/null +++ b/src/dialogs/publication/CopyPublicationDialog.vue @@ -0,0 +1,127 @@ + + + + + + + diff --git a/src/dialogs/publication/DeletePublicationDialog.vue b/src/dialogs/publication/DeletePublicationDialog.vue new file mode 100644 index 00000000..779483da --- /dev/null +++ b/src/dialogs/publication/DeletePublicationDialog.vue @@ -0,0 +1,116 @@ + + + + + + + diff --git a/src/dialogs/publication/DepublishPublicationDialog.vue b/src/dialogs/publication/DepublishPublicationDialog.vue new file mode 100644 index 00000000..7426a657 --- /dev/null +++ b/src/dialogs/publication/DepublishPublicationDialog.vue @@ -0,0 +1,120 @@ + + + + + + + diff --git a/src/dialogs/publication/PublishPublicationDialog.vue b/src/dialogs/publication/PublishPublicationDialog.vue new file mode 100644 index 00000000..b33e6616 --- /dev/null +++ b/src/dialogs/publication/PublishPublicationDialog.vue @@ -0,0 +1,119 @@ + + + + + + + diff --git a/src/dialogs/publicationData/DeletePublicationDataDialog.vue b/src/dialogs/publicationData/DeletePublicationDataDialog.vue new file mode 100644 index 00000000..70a4e9c5 --- /dev/null +++ b/src/dialogs/publicationData/DeletePublicationDataDialog.vue @@ -0,0 +1,121 @@ + + + + + + + diff --git a/src/entities/attachment/attachment.spec.ts b/src/entities/attachment/attachment.spec.ts new file mode 100644 index 00000000..d315e81c --- /dev/null +++ b/src/entities/attachment/attachment.spec.ts @@ -0,0 +1,109 @@ +/* eslint-disable no-console */ +import { Attachment } from './attachment' +import { TAttachment } from './attachment.types' + +describe('Attachment Store', () => { + it('create Attachment entity with full data', () => { + const attachment = new Attachment(testData[0]) + + expect(attachment).toBeInstanceOf(Attachment) + expect(attachment).toEqual(testData[0]) + + expect(attachment.validate()).toBe(true) + }) + + it('create Attachment entity with partial data', () => { + const attachment = new Attachment(testData[1]) + + expect(attachment).toBeInstanceOf(Attachment) + expect(attachment.id).toBe(testData[1].id) + expect(attachment.reference).toBe(testData[1].reference) + expect(attachment.title).toBe(testData[1].title) + expect(attachment.summary).toBe(testData[1].summary) + expect(attachment.description).toBe(testData[1].description) + expect(attachment.labels).toBe(testData[1].labels) + expect(attachment.accessURL).toBe(testData[1].accessURL) + expect(attachment.downloadURL).toBe(testData[1].downloadURL) + expect(attachment.type).toBe(testData[1].type) + expect(attachment.extension).toBe(testData[1].extension) + expect(attachment.size).toBe(testData[1].size) + expect(attachment.anonymization).toBe(testData[1].anonymization) + expect(attachment.language).toBe(testData[1].language) + expect(attachment.versionOf).toBe(testData[1].versionOf) + expect(attachment.hash).toBe('') + expect(attachment.published).toBe('') + expect(attachment.modified).toBe('') + expect(attachment.license).toBe(testData[1].license) + + expect(attachment.validate()).toBe(true) + }) + + it('create Attachment entity with falsy data', () => { + const attachment = new Attachment(testData[2]) + + expect(attachment).toBeInstanceOf(Attachment) + expect(attachment).toEqual(testData[2]) + + expect(attachment.validate()).toBe(false) + }) +}) + +const testData: TAttachment[] = [ + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag1' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, + { // partial data + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag2' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + license: 'MIT', + }, + { // invalid data + id: '3', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag3' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, +] diff --git a/src/entities/attachment/attachment.ts b/src/entities/attachment/attachment.ts new file mode 100644 index 00000000..04f12928 --- /dev/null +++ b/src/entities/attachment/attachment.ts @@ -0,0 +1,99 @@ +import { TAttachment } from './attachment.types' +import { z } from 'zod' + +export class Attachment implements TAttachment { + + public id: string + public reference?: string + public title: string + public summary: string + public description?: string + public labels?: object[] + public accessURL?: string + public downloadURL?: string + public type?: string + public extension?: string + public size?: number + public anonymization?: { + anonymized?: string + results?: string + } + + public language?: { + code?: string + level?: string + } + + public versionOf?: string + public hash?: string + public published?: string + public modified?: string + public license?: string + + constructor(data: TAttachment) { + this.hydrate(data) + } + + /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods + private hydrate(data: TAttachment) { + this.id = data.id?.toString() || '' + this.reference = data.reference || '' + this.title = data.title || '' + this.summary = data.summary || '' + this.description = data.description || '' + this.labels = data.labels || [] + this.accessURL = data.accessURL || '' + this.downloadURL = data.downloadURL || '' + this.type = data.type || '' + this.extension = data.extension || '' + this.size = data.size || 0 + this.anonymization = (!Array.isArray(data.anonymization) && data.anonymization) || {} + this.language = (!Array.isArray(data.language) && data.language) || {} + this.versionOf = data.versionOf || '' + this.hash = data.hash || '' + this.published = data.published || '' + this.modified = data.modified || '' + this.license = data.license || '' + } + + /* istanbul ignore next */ + public validate(): boolean { + // https://conduction.stoplight.io/docs/open-catalogi/9zm7p6fnazuod-attachment + const schema = z.object({ + title: z.string().min(25).max(255), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) + summary: z.string().min(50).max(2500), + description: z.string().max(2500).optional(), + reference: z.string().max(255).optional(), + labels: z.string().array().optional(), + accessURL: z.string().url().optional(), + downloadURL: z.string().url().optional(), + type: z.string().optional(), + extension: z.string().optional(), + size: z.number().optional(), + anonymization: z.object({ + anonymized: z.boolean().optional(), + results: z.string().max(2500).optional(), + }).optional(), + language: z.object({ + // this regex checks if the code has either 2 or 3 characters per group, and the -aaa after the first is optional + code: z.string() + .max(7) + .regex(/([a-z]{2,3})(-[a-z]{2,3})?/g, 'language code is not a valid ISO 639-1 code (e.g. en-us)') + .optional(), + title: z.string().min(1), + }).optional(), + }) + + const result = schema.safeParse({ + id: this.id, + title: this.title, + description: this.description, + // version: this.version, + // required: this.required, + // properties: this.properties, + }) + + return result.success + } + +} diff --git a/src/entities/attachment/attachment.types.ts b/src/entities/attachment/attachment.types.ts new file mode 100644 index 00000000..2861e1d1 --- /dev/null +++ b/src/entities/attachment/attachment.types.ts @@ -0,0 +1,26 @@ +export type TAttachment = { + id: string + reference?: string + title: string + summary: string + description?: string + labels?: object[] + accessURL?: string + downloadURL?: string + type?: string + extension?: string + size?: number + anonymization?: { + anonymized?: string + results?: string + } + language?: { + code?: string + level?: string + } + versionOf?: string + hash?: string + published?: string + modified?: string + license?: string +} diff --git a/src/entities/attachment/index.js b/src/entities/attachment/index.js new file mode 100644 index 00000000..71891394 --- /dev/null +++ b/src/entities/attachment/index.js @@ -0,0 +1,2 @@ +export * from './attachment.ts' +export * from './attachment.types.ts' diff --git a/src/entities/catalogi/catalogi.spec.ts b/src/entities/catalogi/catalogi.spec.ts new file mode 100644 index 00000000..635c1c76 --- /dev/null +++ b/src/entities/catalogi/catalogi.spec.ts @@ -0,0 +1,62 @@ +/* eslint-disable no-console */ +import { Catalogi } from './catalogi' +import { TCatalogi } from './catalogi.types' + +describe('Catalogi Store', () => { + it('create Catalogi entity with full data', () => { + const catalogi = new Catalogi(testData[0]) + + expect(catalogi).toBeInstanceOf(Catalogi) + expect(catalogi).toEqual(testData[0]) + + expect(catalogi.validate()).toBe(true) + }) + + it('create Catalogi entity with partial data', () => { + const catalogi = new Catalogi(testData[1]) + + expect(catalogi).toBeInstanceOf(Catalogi) + expect(catalogi.id).toBe(testData[1].id) + expect(catalogi.title).toBe(testData[1].title) + expect(catalogi.summary).toBe(testData[1].summary) + expect(catalogi.description).toBe(testData[1].description) + expect(catalogi.image).toBe('') + expect(catalogi.search).toBe('') + + expect(catalogi.validate()).toBe(true) + }) + + it('create Catalogi entity with falsy data', () => { + const catalogi = new Catalogi(testData[2]) + + expect(catalogi).toBeInstanceOf(Catalogi) + expect(catalogi).toEqual(testData[2]) + + expect(catalogi.validate()).toBe(false) + }) +}) + +const testData: TCatalogi[] = [ + { // full data + id: '1', + title: 'Decat', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + search: 'string', + }, + { // partial data + id: '2', + title: 'Woo', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + }, + { // invalid data + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + search: 'string', + }, +] diff --git a/src/entities/catalogi/catalogi.ts b/src/entities/catalogi/catalogi.ts new file mode 100644 index 00000000..9bfae9ae --- /dev/null +++ b/src/entities/catalogi/catalogi.ts @@ -0,0 +1,40 @@ +import { TCatalogi } from './catalogi.types' + +export class Catalogi implements TCatalogi { + + public id: string + public title: string + public summary: string + public description?: string + public image?: string + public search?: string + + constructor(data: TCatalogi) { + this.hydrate(data) + } + + /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods + private hydrate(data: TCatalogi) { + this.id = data?.id?.toString() || '' + // @ts-expect-error data.name is not supposed to exist but you can still get it from the backend, so this is just backwards compatibility + this.title = data?.title || data?.name || '' + this.summary = data?.summary || '' + this.description = data?.description || '' + this.image = data?.image || '' + this.search = data?.search || '' + } + + /* istanbul ignore next */ + public validate(): boolean { + // these have to exist + if (!this.id || typeof this.id !== 'string') return false + if (!this.title || typeof this.title !== 'string') return false + if (!this.summary || typeof this.summary !== 'string') return false + // these can be optional + if (typeof this.description !== 'string') return false + if (typeof this.image !== 'string') return false + if (typeof this.search !== 'string') return false + return true + } + +} diff --git a/src/entities/catalogi/catalogi.types.ts b/src/entities/catalogi/catalogi.types.ts new file mode 100644 index 00000000..bf10f04d --- /dev/null +++ b/src/entities/catalogi/catalogi.types.ts @@ -0,0 +1,8 @@ +export type TCatalogi = { + id: string + title: string + summary: string + description?: string + image?: string + search?: string +} diff --git a/src/entities/catalogi/index.js b/src/entities/catalogi/index.js new file mode 100644 index 00000000..2faee26d --- /dev/null +++ b/src/entities/catalogi/index.js @@ -0,0 +1,2 @@ +export * from './catalogi.ts' +export * from './catalogi.types.ts' diff --git a/src/entities/index.js b/src/entities/index.js new file mode 100644 index 00000000..2383330f --- /dev/null +++ b/src/entities/index.js @@ -0,0 +1,6 @@ +/* eslint-disable import/export */ +export * from './catalogi/index.js' +export * from './listing/index.js' +export * from './attachment/index.js' +export * from './publication/index.js' +export * from './metadata/index.js' diff --git a/src/entities/listing/index.js b/src/entities/listing/index.js new file mode 100644 index 00000000..841b4d40 --- /dev/null +++ b/src/entities/listing/index.js @@ -0,0 +1,2 @@ +export * from './listing.ts' +export * from './listing.types.ts' diff --git a/src/entities/listing/listing.spec.ts b/src/entities/listing/listing.spec.ts new file mode 100644 index 00000000..9efb63c9 --- /dev/null +++ b/src/entities/listing/listing.spec.ts @@ -0,0 +1,81 @@ +/* eslint-disable no-console */ +import { Listing } from './listing' +import { TListing } from './listing.types' + +describe('Listing Store', () => { + it('create Listing entity with full data', () => { + const listing = new Listing(testData[0]) + + expect(listing).toBeInstanceOf(Listing) + expect(listing).toEqual(testData[0]) + + expect(listing.validate()).toBe(true) + }) + + it('create Listing entity with partial data', () => { + const listing = new Listing(testData[1]) + + expect(listing).toBeInstanceOf(Listing) + expect(listing.id).toBe(testData[1].id) + expect(listing.title).toBe(testData[1].title) + expect(listing.summary).toBe(testData[1].summary) + expect(listing.description).toBe(testData[1].description) + expect(listing.search).toBe('') + expect(listing.directory).toBe(testData[1].directory) + expect(listing.metadata).toBe('') + expect(listing.status).toBe('') + expect(listing.lastSync).toBe(testData[1].lastSync) + expect(listing.default).toBe(testData[1].default) + expect(listing.available).toBe(testData[1].available) + + expect(listing.validate()).toBe(true) + }) + + it('create Listing entity with falsy data', () => { + const listing = new Listing(testData[2]) + + expect(listing).toBeInstanceOf(Listing) + expect(listing).toEqual(testData[2]) + + expect(listing.validate()).toBe(false) + }) +}) + +const testData: TListing[] = [ + { // full data + id: '1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'string', + directory: 'string', + metadata: 'string', + status: 'active', + lastSync: '2024-07-25T00:00:00Z', + default: 'no', + available: 'yes', + }, + { // partial data + id: '2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + directory: 'string', + lastSync: '2024-07-25T00:00:00Z', + default: 'yes', + available: 'no', + }, + { // invalid data + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'string', + directory: 'string', + metadata: 'string', + status: 'pending', + lastSync: '2024-07-25T00:00:00Z', + default: 'no', + available: 'yes', + }, +] diff --git a/src/entities/listing/listing.ts b/src/entities/listing/listing.ts new file mode 100644 index 00000000..eb6f4f63 --- /dev/null +++ b/src/entities/listing/listing.ts @@ -0,0 +1,54 @@ +import { TListing } from './listing.types' + +export class Listing implements TListing { + + public id: string + public title: string + public summary: string + public description?: string + public search?: string + public directory?: string + public metadata?: string + public status?: string + public lastSync?: string + public default?: string + public available?: string + + constructor(data: TListing) { + this.hydrate(data) + } + + /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods + private hydrate(data: TListing) { + this.id = data?.id?.toString() || '' + this.title = data?.title || '' + this.summary = data?.summary || '' + this.description = data?.description || '' + this.search = data?.search || '' + this.directory = data?.directory || '' + this.metadata = data?.metadata || '' + this.status = data?.status || '' + this.lastSync = data?.lastSync || '' + this.default = data?.default || '' + this.available = data?.available || '' + } + + /* istanbul ignore next */ + public validate(): boolean { + // these have to exist + if (!this.id || typeof this.id !== 'string') return false + if (!this.title || typeof this.title !== 'string') return false + if (!this.summary || typeof this.summary !== 'string') return false + // these can be optional + if (typeof this.description !== 'string') return false + if (typeof this.search !== 'string') return false + if (typeof this.directory !== 'string') return false + if (typeof this.metadata !== 'string') return false + if (typeof this.status !== 'string') return false + if (typeof this.lastSync !== 'string') return false + if (typeof this.default !== 'string') return false + if (typeof this.available !== 'string') return false + return true + } + +} diff --git a/src/entities/listing/listing.types.ts b/src/entities/listing/listing.types.ts new file mode 100644 index 00000000..b057632f --- /dev/null +++ b/src/entities/listing/listing.types.ts @@ -0,0 +1,13 @@ +export type TListing = { + id: string + title: string + summary: string + description?: string + search?: string + directory?: string + metadata?: string + status?: string + lastSync?: string + default?: string + available?: string +} diff --git a/src/entities/metadata/index.js b/src/entities/metadata/index.js new file mode 100644 index 00000000..aaf6099c --- /dev/null +++ b/src/entities/metadata/index.js @@ -0,0 +1,2 @@ +export * from './metadata.ts' +export * from './metadata.types.ts' diff --git a/src/entities/metadata/metadata.spec.ts b/src/entities/metadata/metadata.spec.ts new file mode 100644 index 00000000..08d19ee4 --- /dev/null +++ b/src/entities/metadata/metadata.spec.ts @@ -0,0 +1,161 @@ +/* eslint-disable no-console */ +import { Metadata } from './metadata' +import { TMetadata } from './metadata.types' + +describe('Metadata entity', () => { + it('create Metadata entity with full data', () => { + const metadata = new Metadata(testData[0]) + + expect(metadata).toBeInstanceOf(Metadata) + expect(metadata).toEqual(testData[0]) + + expect(metadata.validate()).toBe(true) + }) + + it('create Metadata entity with partial data', () => { + const metadata = new Metadata(testData[1]) + + expect(metadata).toBeInstanceOf(Metadata) + expect(metadata.id).toBe(testData[1].id) + expect(metadata.title).toBe('') + expect(metadata.description).toBe(testData[1].description) + expect(metadata.required).toEqual(testData[1].required) + expect(metadata.version).toBe(testData[1].version) + expect(metadata.properties).toEqual(testData[1].properties) + + expect(metadata.validate()).toBe(true) + }) + + it('create Metadata entity with falsy data', () => { + const metadata = new Metadata(testData[2]) + + expect(metadata).toBeInstanceOf(Metadata) + expect(metadata).toEqual(testData[2]) + + expect(metadata.validate()).toBe(false) + }) +}) + +const testData: TMetadata[] = [ + { // full data + id: '1', + title: 'Test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + required: ['test'], + properties: { + test: { + title: 'test prop', + description: 'a long description', + type: 'string', + format: 'date', + pattern: 1, + default: 'true', + behavior: 'silly', + required: false, + deprecated: false, + minLength: 5, + maxLength: 6, + example: 'gooby example', + minimum: 1, + maximum: 3, + multipleOf: 1, + exclusiveMin: false, + exclusiveMax: false, + minItems: 0, + maxItems: 6, + }, + gfdgds: { + title: 'gfdgds prop', + description: 'property description', + type: 'string', + format: 'uuid', + pattern: 2, + default: 'false', + behavior: 'goofy perchance', + required: false, + deprecated: false, + minLength: 5.5, + maxLength: 5.11, + example: 'bazinga', + minimum: 1, + maximum: 2, + multipleOf: 1, + exclusiveMin: true, + exclusiveMax: false, + minItems: 1, + maxItems: 7, + }, + }, + }, + { // partial data + id: '1', + title: 'Test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + properties: { + test: { + title: 'test prop', + description: 'a long description', + type: 'string', + behavior: 'silly', + required: false, + exclusiveMin: false, + exclusiveMax: false, + minItems: 0, + maxItems: 6, + }, + }, + }, + { // invalid data + id: '1', + title: '', // cannot be empty + description: 'this is a very long description for test metadata', + version: '0.0.1', + required: ['test'], + properties: { + test: { + title: 'test prop', + description: 'a long description', + type: 'string', + format: 'date', + pattern: 1, + default: 'true', + behavior: 'silly', + required: false, + deprecated: false, + minLength: 5, + maxLength: 6, + example: 'gooby example', + minimum: 1, + maximum: 3, + multipleOf: 1, + exclusiveMin: false, + exclusiveMax: false, + minItems: 0, + maxItems: 6, + }, + gfdgds: { + title: 'gfdgds prop', + description: 'property description', + type: 'string', + format: 'uuid', + pattern: 2, + default: 'false', + behavior: 'goofy perchance', + required: false, + deprecated: false, + minLength: 5.5, + maxLength: 5.11, + example: 'bazinga', + minimum: 1, + maximum: 2, + multipleOf: 1, + exclusiveMin: true, + exclusiveMax: false, + minItems: 1, + maxItems: 7, + }, + }, + }, +] diff --git a/src/entities/metadata/metadata.ts b/src/entities/metadata/metadata.ts new file mode 100644 index 00000000..06c96863 --- /dev/null +++ b/src/entities/metadata/metadata.ts @@ -0,0 +1,94 @@ +import { TMetadata } from './metadata.types' +import { z } from 'zod' + +export class Metadata implements TMetadata { + + public id: string + public title: string + public description?: string + public version?: string + public required?: string[] + + public properties: Record + + constructor(data: TMetadata) { + this.hydrate(data) + } + + /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods + private hydrate(data: TMetadata) { + this.id = data?.id?.toString() || '' + this.title = data?.title || '' + this.description = data?.description || '' + this.version = data?.version || '' + this.required = data?.required || [] + // backend (PHP) doesn't know objects so it will return an array if empty + this.properties = (!Array.isArray(data?.properties) && data?.properties) || {} + } + + /* istanbul ignore next */ + public validate(): boolean { + // https://conduction.stoplight.io/docs/open-catalogi/92e81a078982b-metadata + const propertiesDataSchema = z.object({ + title: z.string().min(1), + description: z.string().optional(), + type: z.string().min(1), + format: z.string().optional(), + pattern: z.number().optional(), + default: z.string().optional(), + behavior: z.string().optional(), + required: z.boolean().optional(), + deprecated: z.boolean().optional(), + minLength: z.number().optional(), + maxLength: z.number().optional(), + example: z.string().optional(), + minimum: z.number().optional(), + maximum: z.number().optional(), + multipleOf: z.number().optional(), + exclusiveMin: z.boolean().optional(), + exclusiveMax: z.boolean().optional(), + minItems: z.number().optional(), + maxItems: z.number().optional(), + }) + + const schema = z.object({ + title: z.string().min(1), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) + description: z.string().optional(), + version: z.string().optional(), + required: z.string().array().optional(), + properties: z.record(propertiesDataSchema).optional(), // z.record allows for any amount of any keys, with specific type for value validation + }) + + const result = schema.safeParse({ + id: this.id, + title: this.title, + description: this.description, + version: this.version, + required: this.required, + properties: this.properties, + }) + + return result.success + } + +} diff --git a/src/entities/metadata/metadata.types.ts b/src/entities/metadata/metadata.types.ts new file mode 100644 index 00000000..12488f2d --- /dev/null +++ b/src/entities/metadata/metadata.types.ts @@ -0,0 +1,28 @@ +export type TMetadata = { + id: string + title: string + description?: string + version?: string + required?: string[] + properties: Record +} diff --git a/src/entities/publication/index.js b/src/entities/publication/index.js new file mode 100644 index 00000000..223b3332 --- /dev/null +++ b/src/entities/publication/index.js @@ -0,0 +1,2 @@ +export * from './publication.ts' +export * from './publication.types.ts' diff --git a/src/entities/publication/publication.spec.ts b/src/entities/publication/publication.spec.ts new file mode 100644 index 00000000..fe84aa9a --- /dev/null +++ b/src/entities/publication/publication.spec.ts @@ -0,0 +1,127 @@ +/* eslint-disable no-console */ +import { Publication } from './publication' +import { TPublication } from './publication.types' + +describe('Directory Store', () => { + it('create Publication entity with full data', () => { + const publication = new Publication(testData[0]) + + expect(publication).toBeInstanceOf(Publication) + expect(publication).toEqual(testData[0]) + + expect(publication.validate()).toBe(true) + }) + + it('create Publication entity with partial data', () => { + const publication = new Publication(testData[1]) + + expect(publication).toBeInstanceOf(Publication) + expect(publication.id).toBe(testData[1].id) + expect(publication.title).toBe(testData[1].title) + expect(publication.summary).toBe(testData[1].summary) + expect(publication.reference).toBe(testData[1].reference) + expect(publication.description).toBe(testData[1].description) + expect(publication.image).toBe(testData[1].image) + expect(publication.category).toBe(testData[1].category) + expect(publication.portal).toBe(testData[1].portal) + expect(publication.catalogi).toBe(testData[1].catalogi) + expect(publication.metaData).toBe(testData[1].metaData) + expect(publication.published).toBe(testData[1].published) + expect(publication.modified).toBe(testData[1].modified) + expect(publication.featured).toBe(testData[1].featured) + expect(publication.organization).toEqual(testData[1].organization) + expect(publication.data).toEqual(testData[1].data) + expect(publication.attachments).toEqual(testData[1].attachments) + expect(publication.attachmentCount).toBe(testData[1].attachmentCount) + expect(publication.schema).toBe('') + expect(publication.status).toBe('') + expect(publication.license).toBe('') + expect(publication.themes).toBe(testData[1].themes) + expect(publication.anonymization).toEqual(testData[1].anonymization) + + expect(publication.validate()).toBe(true) + }) + + it('create Publication entity with falsy data', () => { + const publication = new Publication(testData[2]) + + expect(publication).toBeInstanceOf(Publication) + expect(publication).toEqual(testData[2]) + + expect(publication.validate()).toBe(false) + }) +}) + +const testData: TPublication[] = [ + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category1', + portal: 'portal1', + catalogi: 'catalogi1', + metaData: 'meta1', + published: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: { + type: 'string', + }, + data: {}, + attachments: {}, + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: ['theme1'], + anonymization: {}, + }, + { // partial data + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category2', + portal: 'portal2', + catalogi: 'catalogi2', + metaData: 'meta2', + published: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: {}, + data: {}, + attachments: {}, + attachmentCount: 1, + themes: ['theme1'], + anonymization: {}, + }, + { // invalid data + id: '3', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category3', + portal: 'portal3', + catalogi: 'catalogi3', + metaData: 'meta3', + published: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: {}, + data: {}, + attachments: {}, + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: ['theme1'], + anonymization: {}, + }, +] diff --git a/src/entities/publication/publication.ts b/src/entities/publication/publication.ts new file mode 100644 index 00000000..bde994c7 --- /dev/null +++ b/src/entities/publication/publication.ts @@ -0,0 +1,124 @@ +import { TPublication } from './publication.types' + +export class Publication implements TPublication { + + public id: string + public title: string + public summary: string + public description?: string + public reference?: string + public image?: string + public category: string + public catalogi: string + public metaData: string + public portal?: string + public featured?: boolean + public organization?: { + type?: string + $ref?: string + format?: string + description?: string + } + + public schema?: string + public status?: string + public attachments?: { + type?: string + items?: { + $ref?: string + } + format?: string + } + + public attachmentCount?: number + public themes?: string[] + public data?: { + type?: string + required?: boolean + } + + public anonymization?: { + type?: string + $ref?: string + format?: string + description?: string + } + + public languageObject?: { + type?: string + $ref?: string + format?: string + description?: string + } + + public published?: string | Date + public modified?: string | Date + public license?: string + + constructor(data: TPublication) { + this.hydrate(data) + } + + /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods + private hydrate(data: TPublication) { + this.id = data.id?.toString() || '' + this.title = data.title || '' + this.summary = data.summary || '' + this.reference = data.reference || '' + this.description = data.description || '' + this.image = data.image || '' + this.category = data.category || '' + this.catalogi = data.catalogi || '' + // @ts-expect-error -- for backwards compatibility metaData will be used if metadata cannot be found + this.metaData = (data.metadata ?? data.metaData) || '' + this.portal = data.portal || '' + this.featured = (typeof data.featured === 'boolean' && data.featured) + // backend can send true and false back as "1" and "" (yes. not "0") + // FIXME: remove once bug is fixed + || (typeof data.featured === 'string' && !!parseInt(data.featured)) + || false + this.organization = (!Array.isArray(data.organization) && data.organization) || {} + this.schema = data.schema || '' + this.status = data.status || '' + this.attachments = (!Array.isArray(data.attachments) && data.attachments) || {} + this.attachmentCount = data.attachmentCount || 0 + this.themes = data.themes || [] + this.data = (!Array.isArray(data.data) && data.data) || {} + this.anonymization = (!Array.isArray(data.anonymization) && data.anonymization) || {} + this.languageObject = (!Array.isArray(data.languageObject) && data.languageObject) || {} + this.published = new Date(data.published) || '' + this.modified = new Date(data.modified) || '' + this.license = data.license || '' + } + + /* istanbul ignore next */ + public validate(): boolean { + // TODO: change this over to Zod schema, already exists on 'feature/DIMOC-101/entities' (requires slight modification) + // these have to exist + if (!this.id || typeof this.id !== 'string') return false + if (!this.title || typeof this.title !== 'string') return false + if (!this.summary || typeof this.summary !== 'string') return false + // these can be optional but if they exist, they must be of the right type + if (!this.reference && typeof this.reference !== 'string') return false + if (!this.description && typeof this.description !== 'string') return false + if (!this.image && typeof this.image !== 'string') return false + if (!this.category && typeof this.category !== 'string') return false + if (!this.portal && typeof this.portal !== 'string') return false + if (!this.catalogi && typeof this.catalogi !== 'string') return false + if (!this.metaData && typeof this.metaData !== 'string') return false + if (!this.published && typeof this.published !== 'string') return false + if (!this.modified && typeof this.modified !== 'string') return false + if (!this.featured && typeof this.featured !== 'boolean') return false + if (!this.organization && !Array.isArray(this.organization)) return false + if (!this.data && !Array.isArray(this.data)) return false + if (!this.attachments && !Array.isArray(this.attachments)) return false + if (!this.attachmentCount && typeof this.attachmentCount !== 'number') return false + if (!this.schema && typeof this.schema !== 'string') return false + if (!this.status && typeof this.status !== 'string') return false + if (!this.license && typeof this.license !== 'string') return false + if (!this.themes && typeof this.themes !== 'string') return false + if (!this.anonymization && typeof this.anonymization !== 'object') return false + return true + } + +} diff --git a/src/entities/publication/publication.types.ts b/src/entities/publication/publication.types.ts new file mode 100644 index 00000000..a9877ef7 --- /dev/null +++ b/src/entities/publication/publication.types.ts @@ -0,0 +1,51 @@ +// TODO: double check this type for correct properties and optionals when stoplight updates - https://conduction.stoplight.io/docs/open-catalogi/fee989a9c8e3f-publication + +export type TPublication = { + id: string + title: string + summary: string + description?: string + reference?: string + image?: string + category: string + catalogi: string + metaData: string + portal?: string + featured?: boolean + organization?: { + type?: string + $ref?: string + format?: string + description?: string + } + schema?: string + status?: string + attachments?: { + type?: string + items?: { + $ref?: string + } + format?: string + } + attachmentCount?: number + themes?: string[] + data?: { + type?: string + required?: boolean + } + anonymization?: { + type?: string + $ref?: string + format?: string + description?: string + } + languageObject?: { + type?: string + $ref?: string + format?: string + description?: string + } + published?: string | Date + modified?: string | Date + license?: string +} diff --git a/src/main.js b/src/main.js new file mode 100644 index 00000000..92e4a028 --- /dev/null +++ b/src/main.js @@ -0,0 +1,12 @@ +import Vue from 'vue' +import { PiniaVuePlugin } from 'pinia' +import pinia from './pinia.js' +import App from './App.vue' +Vue.mixin({ methods: { t, n } }) + +Vue.use(PiniaVuePlugin) + +new Vue({ + pinia, + render: h => h(App), +}).$mount('#opencatalogi') diff --git a/src/modals/Modals.vue b/src/modals/Modals.vue new file mode 100644 index 00000000..03ea8c7b --- /dev/null +++ b/src/modals/Modals.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/modals/attachment/AddAttachmentModal.vue b/src/modals/attachment/AddAttachmentModal.vue new file mode 100644 index 00000000..bd339333 --- /dev/null +++ b/src/modals/attachment/AddAttachmentModal.vue @@ -0,0 +1,146 @@ + + + + + + + diff --git a/src/modals/attachment/EditAttachmentModal.vue b/src/modals/attachment/EditAttachmentModal.vue new file mode 100644 index 00000000..4b26a372 --- /dev/null +++ b/src/modals/attachment/EditAttachmentModal.vue @@ -0,0 +1,141 @@ + + + + + + + diff --git a/src/modals/catalog/AddCatalogModal.vue b/src/modals/catalog/AddCatalogModal.vue new file mode 100644 index 00000000..80d822c2 --- /dev/null +++ b/src/modals/catalog/AddCatalogModal.vue @@ -0,0 +1,141 @@ + + + + + + + diff --git a/src/modals/catalog/EditCatalogModal.vue b/src/modals/catalog/EditCatalogModal.vue new file mode 100644 index 00000000..7620261c --- /dev/null +++ b/src/modals/catalog/EditCatalogModal.vue @@ -0,0 +1,130 @@ + + + + + + + diff --git a/src/modals/directory/AddListingModal.vue b/src/modals/directory/AddListingModal.vue new file mode 100644 index 00000000..deff81aa --- /dev/null +++ b/src/modals/directory/AddListingModal.vue @@ -0,0 +1,151 @@ + + + + + + + diff --git a/src/modals/directory/EditListingModal.vue b/src/modals/directory/EditListingModal.vue new file mode 100644 index 00000000..98f5d69a --- /dev/null +++ b/src/modals/directory/EditListingModal.vue @@ -0,0 +1,134 @@ + + + + + + + diff --git a/src/modals/metaData/AddMetaDataModal.vue b/src/modals/metaData/AddMetaDataModal.vue new file mode 100644 index 00000000..09e93574 --- /dev/null +++ b/src/modals/metaData/AddMetaDataModal.vue @@ -0,0 +1,136 @@ + + + + + + + diff --git a/src/modals/metaData/AddMetaDataPropertyModal.vue b/src/modals/metaData/AddMetaDataPropertyModal.vue new file mode 100644 index 00000000..1ed900a9 --- /dev/null +++ b/src/modals/metaData/AddMetaDataPropertyModal.vue @@ -0,0 +1,297 @@ + + + + + + diff --git a/src/modals/metaData/EditMetaDataModal.vue b/src/modals/metaData/EditMetaDataModal.vue new file mode 100644 index 00000000..a3caf167 --- /dev/null +++ b/src/modals/metaData/EditMetaDataModal.vue @@ -0,0 +1,141 @@ + + + + + + + diff --git a/src/modals/metaData/EditMetaDataPropertyModal.vue b/src/modals/metaData/EditMetaDataPropertyModal.vue new file mode 100644 index 00000000..40fba50c --- /dev/null +++ b/src/modals/metaData/EditMetaDataPropertyModal.vue @@ -0,0 +1,309 @@ + + + + + + diff --git a/src/modals/publication/AddPublicationModal.vue b/src/modals/publication/AddPublicationModal.vue new file mode 100644 index 00000000..621c2d42 --- /dev/null +++ b/src/modals/publication/AddPublicationModal.vue @@ -0,0 +1,344 @@ + + + + + + diff --git a/src/modals/publication/EditPublicationModal.vue b/src/modals/publication/EditPublicationModal.vue new file mode 100644 index 00000000..fcf1a399 --- /dev/null +++ b/src/modals/publication/EditPublicationModal.vue @@ -0,0 +1,318 @@ + + + + + + diff --git a/src/modals/publicationData/AddPublicationDataModal.vue b/src/modals/publicationData/AddPublicationDataModal.vue new file mode 100644 index 00000000..a35be621 --- /dev/null +++ b/src/modals/publicationData/AddPublicationDataModal.vue @@ -0,0 +1,158 @@ + + + + + + diff --git a/src/modals/publicationData/EditPublicationDataModal.vue b/src/modals/publicationData/EditPublicationDataModal.vue new file mode 100644 index 00000000..b2b66126 --- /dev/null +++ b/src/modals/publicationData/EditPublicationDataModal.vue @@ -0,0 +1,233 @@ + + + + + + diff --git a/src/navigation/Configuration.vue b/src/navigation/Configuration.vue new file mode 100644 index 00000000..9fa10520 --- /dev/null +++ b/src/navigation/Configuration.vue @@ -0,0 +1,330 @@ + + + diff --git a/src/navigation/MainMenu.vue b/src/navigation/MainMenu.vue new file mode 100644 index 00000000..598012c9 --- /dev/null +++ b/src/navigation/MainMenu.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/src/pinia.js b/src/pinia.js new file mode 100644 index 00000000..8a059806 --- /dev/null +++ b/src/pinia.js @@ -0,0 +1,5 @@ +import { createPinia } from 'pinia' + +const pinia = createPinia() + +export default pinia diff --git a/src/sidebars/SideBars.vue b/src/sidebars/SideBars.vue new file mode 100644 index 00000000..266fc760 --- /dev/null +++ b/src/sidebars/SideBars.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/sidebars/dashboard/DashboardSideBar.vue b/src/sidebars/dashboard/DashboardSideBar.vue new file mode 100644 index 00000000..97bf04f9 --- /dev/null +++ b/src/sidebars/dashboard/DashboardSideBar.vue @@ -0,0 +1,155 @@ + + + + diff --git a/src/sidebars/directory/DirectorySideBar.vue b/src/sidebars/directory/DirectorySideBar.vue new file mode 100644 index 00000000..7863f244 --- /dev/null +++ b/src/sidebars/directory/DirectorySideBar.vue @@ -0,0 +1,152 @@ + + + + diff --git a/src/sidebars/search/SearchSideBar.vue b/src/sidebars/search/SearchSideBar.vue new file mode 100644 index 00000000..9d9774fc --- /dev/null +++ b/src/sidebars/search/SearchSideBar.vue @@ -0,0 +1,60 @@ + + + + diff --git a/src/store/modules/catalogi.js b/src/store/modules/catalogi.js new file mode 100644 index 00000000..f293a01f --- /dev/null +++ b/src/store/modules/catalogi.js @@ -0,0 +1,42 @@ +/* eslint-disable no-console */ +import { defineStore } from 'pinia' +import { Catalogi } from '../../entities/index.js' + +export const useCatalogiStore = defineStore('catalogi', { + state: () => ({ + catalogiItem: false, + catalogiList: [], + }), + actions: { + setCatalogiItem(catalogiItem) { + this.catalogiItem = catalogiItem && new Catalogi(catalogiItem) + console.log('Active catalog item set to ' + catalogiItem && catalogiItem?.id) + }, + setCatalogiList(catalogiList) { + this.catalogiList = catalogiList.map( + (catalogiItem) => new Catalogi(catalogiItem), + ) + console.log('Catalogi list set to ' + catalogiList.length + ' item') + }, + async refreshCatalogiList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/catalogi' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch(endpoint, { + method: 'GET', + }) + .then((response) => { + response.json().then((data) => { + this.catalogiList = data.results.map( + (catalogiItem) => new Catalogi(catalogiItem), + ) + }) + }) + .catch((err) => { + console.error(err) + }) + }, + }, +}) diff --git a/src/store/modules/catalogi.spec.js b/src/store/modules/catalogi.spec.js new file mode 100644 index 00000000..d8ce2a58 --- /dev/null +++ b/src/store/modules/catalogi.spec.js @@ -0,0 +1,83 @@ +/* eslint-disable no-console */ +import { setActivePinia, createPinia } from 'pinia' + +import { useCatalogiStore } from './catalogi.js' +import { Catalogi } from '../../entities/index.js' + +describe('Catalogi Store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('sets catalogi item correctly', () => { + const store = useCatalogiStore() + + store.setCatalogiItem(testData[0]) + + expect(store.catalogiItem).toBeInstanceOf(Catalogi) + expect(store.catalogiItem).toEqual(testData[0]) + + expect(store.catalogiItem.validate()).toBe(true) + }) + + it('sets catalogi list correctly', () => { + const store = useCatalogiStore() + + store.setCatalogiList(testData) + + expect(store.catalogiList).toHaveLength(testData.length) + + // list item 1 + expect(store.catalogiList[0]).toBeInstanceOf(Catalogi) + expect(store.catalogiList[0]).toEqual(testData[0]) + + expect(store.catalogiList[0].validate()).toBe(true) + + // list item 2 + expect(store.catalogiList[1]).toBeInstanceOf(Catalogi) + expect(store.catalogiList[1].id).toBe(testData[1].id) + expect(store.catalogiList[1].title).toBe(testData[1].title) + expect(store.catalogiList[1].summary).toBe(testData[1].summary) + expect(store.catalogiList[1].description).toBe(testData[1].description) + expect(store.catalogiList[1].image).toBe('') + expect(store.catalogiList[1].search).toBe('') + + expect(store.catalogiList[1].validate()).toBe(true) + + // list item 3 + expect(store.catalogiList[2]).toBeInstanceOf(Catalogi) + expect(store.catalogiList[2].id).toBe(testData[2].id) + expect(store.catalogiList[2].title).toBe('') + expect(store.catalogiList[2].summary).toBe(testData[2].summary) + expect(store.catalogiList[2].description).toBe(testData[2].description) + expect(store.catalogiList[2].image).toBe(testData[2].image) + expect(store.catalogiList[2].search).toBe(testData[2].search) + + expect(store.catalogiList[2].validate()).toBe(false) // id, title and summary are required, causing a falsy result + }) +}) + +const testData = [ + { + id: '1', + title: 'Decat', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + search: 'string', + }, + { + id: '2', + title: 'Woo', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + }, + { + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + search: 'string', + }, +] diff --git a/src/store/modules/directory.js b/src/store/modules/directory.js new file mode 100644 index 00000000..419f614d --- /dev/null +++ b/src/store/modules/directory.js @@ -0,0 +1,42 @@ +/* eslint-disable no-console */ +import { defineStore } from 'pinia' +import { Listing } from '../../entities/index.js' + +export const useDirectoryStore = defineStore('directory', { + state: () => ({ + listingItem: false, + listingList: [], + }), + actions: { + setListingItem(listingItem) { + this.listingItem = listingItem && new Listing(listingItem) + console.log('Active directory item set to ' + listingItem && listingItem.id) + }, + setListingList(listingList) { + this.listingList = listingList.map( + (listingItem) => new Listing(listingItem), + ) + console.log('Active directory item set to ' + listingList.length) + }, + async refreshListingList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/directory' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch(endpoint, { + method: 'GET', + }) + .then((response) => { + response.json().then((data) => { + this.listingList = data.results.map( + (listingItem) => new Listing(listingItem), + ) + }) + }) + .catch((err) => { + console.error(err) + }) + }, + }, +}) diff --git a/src/store/modules/directory.spec.js b/src/store/modules/directory.spec.js new file mode 100644 index 00000000..bc18b519 --- /dev/null +++ b/src/store/modules/directory.spec.js @@ -0,0 +1,105 @@ +/* eslint-disable no-console */ +import { setActivePinia, createPinia } from 'pinia' + +import { useDirectoryStore } from './directory.js' +import { Listing } from '../../entities/index.js' + +describe('Directory Store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('sets listing item correctly', () => { + const store = useDirectoryStore() + + store.setListingItem(testData[0]) + + expect(store.listingItem).toBeInstanceOf(Listing) + expect(store.listingItem).toEqual(testData[0]) + }) + + it('sets listings list correctly', () => { + const store = useDirectoryStore() + + store.setListingList(testData) + + expect(store.listingList).toHaveLength(testData.length) + + // list item 1 + expect(store.listingList[0]).toBeInstanceOf(Listing) + expect(store.listingList[0]).toEqual(testData[0]) + + expect(store.listingList[0].validate()).toBe(true) + + // list item 2 + expect(store.listingList[1]).toBeInstanceOf(Listing) + expect(store.listingList[1].id).toBe(testData[1].id) + expect(store.listingList[1].title).toBe(testData[1].title) + expect(store.listingList[1].summary).toBe(testData[1].summary) + expect(store.listingList[1].description).toBe(testData[1].description) + expect(store.listingList[1].search).toBe('') + expect(store.listingList[1].directory).toBe(testData[1].directory) + expect(store.listingList[1].metadata).toBe('') + expect(store.listingList[1].status).toBe('') + expect(store.listingList[1].lastSync).toBe(testData[1].lastSync) + expect(store.listingList[1].default).toBe(testData[1].default) + expect(store.listingList[1].available).toBe(testData[1].available) + + expect(store.listingList[1].validate()).toBe(true) + + // list item 3 + expect(store.listingList[2]).toBeInstanceOf(Listing) + expect(store.listingList[2].id).toBe(testData[2].id) + expect(store.listingList[2].title).toBe('') + expect(store.listingList[2].summary).toBe(testData[2].summary) + expect(store.listingList[2].description).toBe(testData[2].description) + expect(store.listingList[2].search).toBe(testData[2].search) + expect(store.listingList[2].directory).toBe(testData[2].directory) + expect(store.listingList[2].metadata).toBe(testData[2].metadata) + expect(store.listingList[2].status).toBe(testData[2].status) + expect(store.listingList[2].lastSync).toBe(testData[2].lastSync) + expect(store.listingList[2].default).toBe(testData[2].default) + expect(store.listingList[2].available).toBe(testData[2].available) + + expect(store.listingList[2].validate()).toBe(false) + }) +}) + +const testData = [ + { // full data + id: '1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'string', + directory: 'string', + metadata: 'string', + status: 'active', + lastSync: '2024-07-25T00:00:00Z', + default: 'no', + available: 'yes', + }, + { // partial data + id: '2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + directory: 'string', + lastSync: '2024-07-25T00:00:00Z', + default: 'yes', + available: 'no', + }, + { // invalid data + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'string', + directory: 'string', + metadata: 'string', + status: 'pending', + lastSync: '2024-07-25T00:00:00Z', + default: 'no', + available: 'yes', + }, +] diff --git a/src/store/modules/metadata.js b/src/store/modules/metadata.js new file mode 100644 index 00000000..89cf9e0b --- /dev/null +++ b/src/store/modules/metadata.js @@ -0,0 +1,75 @@ +/* eslint-disable no-console */ +import { defineStore } from 'pinia' +import { Metadata } from '../../entities/index.js' + +export const useMetadataStore = defineStore('metadata', { + state: () => ({ + metaDataItem: false, + metaDataList: [], + metadataDataKey: false, + }), + actions: { + setMetaDataItem(metaDataItem) { + this.metaDataItem = metaDataItem && new Metadata(metaDataItem) + + // for backward compatibility + if (typeof this.metaDataItem?.properties === 'string') { + this.metaDataItem.properties = JSON.parse(this.metaDataItem.properties) + } + + console.log('Active metadata object set to ' + metaDataItem && metaDataItem.id) + }, + setMetaDataList(metaDataList) { + this.metaDataList = metaDataList.map( + (metadataItem) => new Metadata(metadataItem), + ) + console.log('Active metadata lest set') + }, + async refreshMetaDataList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/metadata' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.metaDataList = data.results.map( + (metadataItem) => new Metadata(metadataItem), + ) + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + setMetadataDataKey(metadataDataKey) { + this.metadataDataKey = metadataDataKey + console.log('Active metadata data key set to ' + metadataDataKey) + }, + getMetadataPropertyKeys(property) { + const defaultKeys = { + type: '', + description: '', + format: '', + maxDate: '', + required: false, + default: false, + $ref: '', // $ref should probably be removed as it is not mentioned in the schema + cascadeDelete: false, + exclusiveMinimum: 0, + } + + const propertyKeys = this.metaDataItem.properties[property] + + return { ...defaultKeys, ...propertyKeys } + }, + }, +}) diff --git a/src/store/modules/metadata.spec.js b/src/store/modules/metadata.spec.js new file mode 100644 index 00000000..6eb6d986 --- /dev/null +++ b/src/store/modules/metadata.spec.js @@ -0,0 +1,166 @@ +/* eslint-disable no-console */ +import { setActivePinia, createPinia } from 'pinia' + +import { useMetadataStore } from './metadata.js' + +describe('Metadata Store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('sets metadata item correctly', () => { + const store = useMetadataStore() + const metadataItem = { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test listing', + description: 'this is a very long description for test listing', + version: '0.0.1', + properties: { + sasds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + }, + } + + store.setMetaDataItem(metadataItem) + + expect(store.metaDataItem).toEqual(metadataItem) + }) + + it('sets metadata item with string "properties" property', () => { + const store = useMetadataStore() + const metadataItem = { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test listing', + description: 'this is a very long description for test listing', + version: '0.0.1', + properties: '{"sasds":{"type":"string","description":"property description","format":"a format","maxDate":"2025-07-13","required":false,"default":false,"cascadeDelete":false,"exclusiveMinimum":"2"}}', + } + + store.setMetaDataItem(metadataItem) + + expect(store.metaDataItem.id).toBe('1') + expect(store.metaDataItem.name).toBe('Test metadata name') + expect(store.metaDataItem.title).toBe('Test metadata') + expect(store.metaDataItem.summary).toBe('This is a test listing') + expect(store.metaDataItem.description).toBe('this is a very long description for test listing') + expect(store.metaDataItem.version).toBe('0.0.1') + // properties + expect(store.metaDataItem.properties.sasds.type).toBe('string') + expect(store.metaDataItem.properties.sasds.description).toBe('property description') + expect(store.metaDataItem.properties.sasds.format).toBe('a format') + expect(store.metaDataItem.properties.sasds.maxDate).toBe('2025-07-13') + expect(store.metaDataItem.properties.sasds.required).toBe(false) + expect(store.metaDataItem.properties.sasds.default).toBe(false) + expect(store.metaDataItem.properties.sasds.cascadeDelete).toBe(false) + expect(store.metaDataItem.properties.sasds.exclusiveMinimum).toBe('2') + }) + + it('sets metadata list correctly', () => { + const store = useMetadataStore() + const metadataList = [ + { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + properties: { + sasds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + gfdgds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + }, + }, + { + id: '2', + name: 'Test metadata naming', + title: 'Test metadata aaaa', + summary: 'This is a test metadata baaa da daaa', + description: 'this is a very long descriptio-', + version: '0.0.1', + properties: {}, + }, + ] + + store.setMetaDataList(metadataList) + + expect(store.metaDataList).toHaveLength(metadataList.length) + store.metaDataList.forEach((item, index) => { + expect(item).toEqual(metadataList[index]) + }) + }) + + it('get metadata property from key', () => { + const store = useMetadataStore() + const metadataItem = { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + properties: { + sasds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + $ref: '', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + gfdgds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + }, + } + + store.setMetaDataItem(metadataItem) + store.setMetadataDataKey('sasds') + + expect(store.metaDataItem).toEqual(metadataItem) + expect(store.metadataDataKey).toBe('sasds') + + const properties = store.getMetadataPropertyKeys('sasds') + + expect(properties).toEqual(metadataItem.properties.sasds) + }) +}) diff --git a/src/store/modules/navigation.js b/src/store/modules/navigation.js new file mode 100644 index 00000000..07f55234 --- /dev/null +++ b/src/store/modules/navigation.js @@ -0,0 +1,33 @@ +/* eslint-disable no-console */ +import { defineStore } from 'pinia' + +export const useNavigationStore = defineStore('ui', { + state: () => ({ + // The currently active menu item, defaults to '' which triggers the dashboard + selected: 'dashboard', + // The currently selected catalogi within 'publications' + selectedCatalogus: false, + // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time + modal: false, + // The currently active dialog + dialog: false, + }), + actions: { + setSelected(selected) { + this.selected = selected + console.log('Active menu item set to ' + selected) + }, + setSelectedCatalogus(selectedCatalogus) { + this.selectedCatalogus = selectedCatalogus + console.log('Active catalogus menu set to ' + selectedCatalogus) + }, + setModal(modal) { + this.modal = modal + console.log('Active modal set to ' + modal) + }, + setDialog(dialog) { + this.dialog = dialog + console.log('Active dialog set to ' + dialog) + }, + }, +}) diff --git a/src/store/modules/navigation.spec.js b/src/store/modules/navigation.spec.js new file mode 100644 index 00000000..5f252581 --- /dev/null +++ b/src/store/modules/navigation.spec.js @@ -0,0 +1,62 @@ +/* eslint-disable no-console */ +import { setActivePinia, createPinia } from 'pinia' + +import { useNavigationStore } from './navigation.js' + +describe('Navigation Store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('set current selected view correctly', () => { + const store = useNavigationStore() + + store.setSelected('publication') + expect(store.selected).toBe('publication') + + store.setSelected('catalogi') + expect(store.selected).toBe('catalogi') + + store.setSelected('metadata') + expect(store.selected).toBe('metadata') + }) + + it('set current selected publication catalogi correctly', () => { + const store = useNavigationStore() + + store.setSelectedCatalogus('7a048bfd-210f-4e93-a1e8-5aa9261740b7') + expect(store.selectedCatalogus).toBe('7a048bfd-210f-4e93-a1e8-5aa9261740b7') + + store.setSelectedCatalogus('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') + expect(store.selectedCatalogus).toBe('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') + + store.setSelectedCatalogus('3b1cbee2-756e-4904-a157-29fb0cbe01d3') + expect(store.selectedCatalogus).toBe('3b1cbee2-756e-4904-a157-29fb0cbe01d3') + }) + + it('set modal correctly', () => { + const store = useNavigationStore() + + store.setModal('editPublication') + expect(store.modal).toBe('editPublication') + + store.setModal('editCatalogi') + expect(store.modal).toBe('editCatalogi') + + store.setModal('editMetadata') + expect(store.modal).toBe('editMetadata') + }) + + it('set modal correctly', () => { + const store = useNavigationStore() + + store.setDialog('deletePublication') + expect(store.dialog).toBe('deletePublication') + + store.setDialog('deleteCatalogi') + expect(store.dialog).toBe('deleteCatalogi') + + store.setDialog('deleteMetadata') + expect(store.dialog).toBe('deleteMetadata') + }) +}) diff --git a/src/store/modules/publication.js b/src/store/modules/publication.js new file mode 100644 index 00000000..4c5226e7 --- /dev/null +++ b/src/store/modules/publication.js @@ -0,0 +1,114 @@ +/* eslint-disable no-console */ +import { Attachment, Publication } from '../../entities/index.js' +import { defineStore } from 'pinia' + +export const usePublicationStore = defineStore('publication', { + state: () => ({ + publicationItem: false, + publicationList: [], + publicationDataKey: false, + attachmentItem: false, + publicationAttachments: [], + conceptPublications: [], + conceptAttachments: [], + }), + actions: { + setPublicationItem(publicationItem) { + // To prevent forms etc from braking we alway use a default/skeleton object + this.publicationItem = publicationItem && new Publication(publicationItem) + console.log('Active publication item set to ' + publicationItem && publicationItem.id) + }, + setPublicationList(publicationList) { + this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) + console.log('Active publication item set to ' + publicationList.length) + }, + async refreshPublicationList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/publications' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.setPublicationList(data?.results) + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getPublicationAttachments(publication) { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.publicationAttachments = data.results.map( + (attachmentItem) => new Attachment(attachmentItem), + ) + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getConceptPublications() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/publications?status=concept', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.conceptPublications = data + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getConceptAttachments() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments?status=concept', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.conceptAttachments = data + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + // @todo why does the following run through the store? -- because its impossible with props, and its vital information for the modal. + setPublicationDataKey(publicationDataKey) { + this.publicationDataKey = publicationDataKey + console.log('Active publication data key set to ' + publicationDataKey) + }, + setAttachmentItem(attachmentItem) { + this.attachmentItem = attachmentItem && new Attachment(attachmentItem) + console.log('Active attachment item set to ' + attachmentItem) + }, + }, +}) diff --git a/src/store/modules/publication.spec.js b/src/store/modules/publication.spec.js new file mode 100644 index 00000000..8adee3ba --- /dev/null +++ b/src/store/modules/publication.spec.js @@ -0,0 +1,220 @@ +/* eslint-disable no-console */ +import { setActivePinia, createPinia } from 'pinia' + +import { usePublicationStore } from './publication.js' +import { Attachment, Publication } from '../../entities/index.js' + +describe('Metadata Store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('sets publication item correctly', () => { + const store = usePublicationStore() + + store.setPublicationItem(testData[0]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[0]) + expect(store.publicationItem.validate()).toBe(true) + + store.setPublicationItem(testData[1]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).not.toEqual(testData[1]) + expect(store.publicationItem.validate()).toBe(true) + + store.setPublicationItem(testData[2]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[2]) + expect(store.publicationItem.validate()).toBe(false) + }) + + it('sets publication list correctly', () => { + const store = usePublicationStore() + + store.setPublicationList(testData) + + expect(store.publicationList).toHaveLength(testData.length) + + expect(store.publicationList[0]).toBeInstanceOf(Publication) + expect(store.publicationList[0]).toEqual(testData[0]) + expect(store.publicationList[0].validate()).toBe(true) + + expect(store.publicationList[1]).toBeInstanceOf(Publication) + expect(store.publicationList[1]).not.toEqual(testData[1]) + expect(store.publicationList[1].validate()).toBe(true) + + expect(store.publicationList[2]).toBeInstanceOf(Publication) + expect(store.publicationList[2]).toEqual(testData[2]) + expect(store.publicationList[2].validate()).toBe(false) + }) + + // TODO: fix this + it('set publication data.data property key correctly', () => { + const store = usePublicationStore() + + store.setPublicationDataKey('contactPoint') + + expect(store.publicationDataKey).toBe('contactPoint') + }) + + it('set attachment item correctly', () => { + const store = usePublicationStore() + + store.setAttachmentItem(attachmentTestData[0]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[0]) + expect(store.attachmentItem.validate()).toBe(true) + + store.setAttachmentItem(attachmentTestData[1]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).not.toEqual(attachmentTestData[1]) + expect(store.attachmentItem.validate()).toBe(true) + + store.setAttachmentItem(attachmentTestData[2]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[2]) + expect(store.attachmentItem.validate()).toBe(false) + }) +}) + +const testData = [ + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category1', + portal: 'portal1', + catalogi: 'catalogi1', + metaData: 'meta1', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // partial data + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category2', + portal: 'portal2', + catalogi: 'catalogi2', + metaData: 'meta2', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // invalid data + id: '3', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category3', + portal: 'portal3', + catalogi: 'catalogi3', + metaData: 'meta3', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, +] + +const attachmentTestData = [ + { // full data + id: '9044ab1e-cf5a-490a-be74-6be7a0c48a5f', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag1' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, + { // partial data + id: 'f849f287-492d-4100-91e1-1c4137f0abb5', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag2' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + license: 'MIT', + }, + { // invalid data + id: 'e193ea6b-1222-44cf-a71c-6ddcc232a79b', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag3' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, +] diff --git a/src/store/modules/search.js b/src/store/modules/search.js new file mode 100644 index 00000000..0065ac56 --- /dev/null +++ b/src/store/modules/search.js @@ -0,0 +1,38 @@ +/* eslint-disable no-console */ +import { defineStore } from 'pinia' + +export const useSearchStore = defineStore('search', { + state: () => ({ + search: '', + searchResults: '', + }), + actions: { + setSearch(search) { + this.search = search + console.log('Active search set to ' + search) + }, + setSearchResults(searchResults) { + this.searchResults = searchResults + console.log('Active search set to ' + searchResults) + }, + getSearchResults() { + fetch( + '/index.php/apps/opencatalogi/api/search?_search=' + this.search, + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.searchResults = data + }) + }) + .catch((err) => { + console.error(err) + }) + }, + clearSearch() { + this.search = '' + }, + }, +}) diff --git a/src/store/modules/search.spec.js b/src/store/modules/search.spec.js new file mode 100644 index 00000000..7e0b6e90 --- /dev/null +++ b/src/store/modules/search.spec.js @@ -0,0 +1,41 @@ +/* eslint-disable no-console */ +import { setActivePinia, createPinia } from 'pinia' + +import { useSearchStore } from './search.js' + +describe('Search Store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('set search correctly', () => { + const store = useSearchStore() + + store.setSearch('cata') + expect(store.search).toBe('cata') + + store.setSearch('woo') + expect(store.search).toBe('woo') + + store.setSearch('foo bar') + expect(store.search).toBe('foo bar') + }) + + it('set search result correctly', () => { + const store = useSearchStore() + + store.setSearchResults(['foo', 'bar', 'bux']) + expect(store.searchResults).toEqual(['foo', 'bar', 'bux']) + }) + + it('clear search correctly', () => { + const store = useSearchStore() + + store.setSearch('Lorem ipsum dolor sit amet') + expect(store.search).toBe('Lorem ipsum dolor sit amet') + + store.clearSearch() + + expect(store.search).toBe('') + }) +}) diff --git a/src/store/store.js b/src/store/store.js new file mode 100644 index 00000000..f58c70a2 --- /dev/null +++ b/src/store/store.js @@ -0,0 +1,27 @@ +/* eslint-disable no-console */ +// The store script handles app wide variables (or state), for the use of these variables and there governing concepts read the design.md +import pinia from '../pinia.js' +import { useNavigationStore } from './modules/navigation.js' +import { useSearchStore } from './modules/search.js' +import { useCatalogiStore } from './modules/catalogi.js' +import { useDirectoryStore } from './modules/directory.js' +import { useMetadataStore } from './modules/metadata.js' +import { usePublicationStore } from './modules/publication.js' + +const navigationStore = useNavigationStore(pinia) +const searchStore = useSearchStore(pinia) +const catalogiStore = useCatalogiStore(pinia) +const directoryStore = useDirectoryStore(pinia) +const metadataStore = useMetadataStore(pinia) +const publicationStore = usePublicationStore(pinia) + +export { + // generic + navigationStore, + searchStore, + // feature-specific + catalogiStore, + directoryStore, + metadataStore, + publicationStore, +} diff --git a/src/views/Views.vue b/src/views/Views.vue new file mode 100644 index 00000000..f464280c --- /dev/null +++ b/src/views/Views.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/views/catalogi/CatalogiDetails.vue b/src/views/catalogi/CatalogiDetails.vue new file mode 100644 index 00000000..0c17edfa --- /dev/null +++ b/src/views/catalogi/CatalogiDetails.vue @@ -0,0 +1,198 @@ + + + + + + + diff --git a/src/views/catalogi/CatalogiIndex.vue b/src/views/catalogi/CatalogiIndex.vue new file mode 100644 index 00000000..669f1cca --- /dev/null +++ b/src/views/catalogi/CatalogiIndex.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/views/catalogi/CatalogiList.vue b/src/views/catalogi/CatalogiList.vue new file mode 100644 index 00000000..4134db7f --- /dev/null +++ b/src/views/catalogi/CatalogiList.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/src/views/dashboard/DashboardIndex.vue b/src/views/dashboard/DashboardIndex.vue new file mode 100644 index 00000000..4e33fe88 --- /dev/null +++ b/src/views/dashboard/DashboardIndex.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/src/views/directory/DirectoryIndex.vue b/src/views/directory/DirectoryIndex.vue new file mode 100644 index 00000000..80101273 --- /dev/null +++ b/src/views/directory/DirectoryIndex.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/views/directory/DirectoryList.vue b/src/views/directory/DirectoryList.vue new file mode 100644 index 00000000..4583962f --- /dev/null +++ b/src/views/directory/DirectoryList.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/src/views/directory/ListingDetails.vue b/src/views/directory/ListingDetails.vue new file mode 100644 index 00000000..5f68ac58 --- /dev/null +++ b/src/views/directory/ListingDetails.vue @@ -0,0 +1,199 @@ + + + + + + + diff --git a/src/views/metaData/MetaDataDetail.vue b/src/views/metaData/MetaDataDetail.vue new file mode 100644 index 00000000..b4f439eb --- /dev/null +++ b/src/views/metaData/MetaDataDetail.vue @@ -0,0 +1,260 @@ + + + + + + + diff --git a/src/views/metaData/MetaDataIndex.vue b/src/views/metaData/MetaDataIndex.vue new file mode 100644 index 00000000..441e2463 --- /dev/null +++ b/src/views/metaData/MetaDataIndex.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/views/metaData/MetaDataList.vue b/src/views/metaData/MetaDataList.vue new file mode 100644 index 00000000..386f3333 --- /dev/null +++ b/src/views/metaData/MetaDataList.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/src/views/publications/PublicationDetail.vue b/src/views/publications/PublicationDetail.vue new file mode 100644 index 00000000..e80d1747 --- /dev/null +++ b/src/views/publications/PublicationDetail.vue @@ -0,0 +1,592 @@ + + + + + + + diff --git a/src/views/publications/PublicationIndex.vue b/src/views/publications/PublicationIndex.vue new file mode 100644 index 00000000..a99d6b2c --- /dev/null +++ b/src/views/publications/PublicationIndex.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/views/publications/PublicationList.vue b/src/views/publications/PublicationList.vue new file mode 100644 index 00000000..a68c5b09 --- /dev/null +++ b/src/views/publications/PublicationList.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/src/views/search/SearchIndex.vue b/src/views/search/SearchIndex.vue new file mode 100644 index 00000000..82c0ca40 --- /dev/null +++ b/src/views/search/SearchIndex.vue @@ -0,0 +1,86 @@ + + + + + + From 22666d20a5ec1aa32657a840044a3052b32bbb10 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 5 Aug 2024 12:04:06 +0000 Subject: [PATCH 045/145] Update src from PHP Codesniffer --- src/main.js | 10 +- src/store/modules/catalogi.js | 86 +++--- src/store/modules/catalogi.spec.js | 158 ++++++----- src/store/modules/directory.js | 86 +++--- src/store/modules/directory.spec.js | 178 ++++++------ src/store/modules/metadata.js | 142 +++++----- src/store/modules/metadata.spec.js | 336 +++++++++++----------- src/store/modules/navigation.js | 62 ++-- src/store/modules/navigation.spec.js | 126 +++++---- src/store/modules/publication.js | 246 ++++++++-------- src/store/modules/publication.spec.js | 390 +++++++++++++------------- src/store/modules/search.js | 78 +++--- src/store/modules/search.spec.js | 82 +++--- 13 files changed, 1055 insertions(+), 925 deletions(-) diff --git a/src/main.js b/src/main.js index 92e4a028..3be88eff 100644 --- a/src/main.js +++ b/src/main.js @@ -6,7 +6,9 @@ Vue.mixin({ methods: { t, n } }) Vue.use(PiniaVuePlugin) -new Vue({ - pinia, - render: h => h(App), -}).$mount('#opencatalogi') +new Vue( + { + pinia, + render: h => h(App), + } +).$mount('#opencatalogi') diff --git a/src/store/modules/catalogi.js b/src/store/modules/catalogi.js index f293a01f..80f19aae 100644 --- a/src/store/modules/catalogi.js +++ b/src/store/modules/catalogi.js @@ -2,41 +2,51 @@ import { defineStore } from 'pinia' import { Catalogi } from '../../entities/index.js' -export const useCatalogiStore = defineStore('catalogi', { - state: () => ({ - catalogiItem: false, - catalogiList: [], - }), - actions: { - setCatalogiItem(catalogiItem) { - this.catalogiItem = catalogiItem && new Catalogi(catalogiItem) - console.log('Active catalog item set to ' + catalogiItem && catalogiItem?.id) - }, - setCatalogiList(catalogiList) { - this.catalogiList = catalogiList.map( - (catalogiItem) => new Catalogi(catalogiItem), - ) - console.log('Catalogi list set to ' + catalogiList.length + ' item') - }, - async refreshCatalogiList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/catalogi' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch(endpoint, { - method: 'GET', - }) - .then((response) => { - response.json().then((data) => { - this.catalogiList = data.results.map( - (catalogiItem) => new Catalogi(catalogiItem), - ) - }) - }) - .catch((err) => { - console.error(err) - }) - }, - }, -}) +export const useCatalogiStore = defineStore( + 'catalogi', { + state: () => ({ + catalogiItem: false, + catalogiList: [], + }), + actions: { + setCatalogiItem(catalogiItem) { + this.catalogiItem = catalogiItem && new Catalogi(catalogiItem) + console.log('Active catalog item set to ' + catalogiItem && catalogiItem?.id) + }, + setCatalogiList(catalogiList) { + this.catalogiList = catalogiList.map( + (catalogiItem) => new Catalogi(catalogiItem), + ) + console.log('Catalogi list set to ' + catalogiList.length + ' item') + }, + async refreshCatalogiList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/catalogi' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, { + method: 'GET', + } + ) + .then( + (response) => { + response.json().then( + (data) => { + this.catalogiList = data.results.map( + (catalogiItem) => new Catalogi(catalogiItem), + ) + } + ) + } + ) + .catch( + (err) => { + console.error(err) + } + ) + }, + }, + } +) diff --git a/src/store/modules/catalogi.spec.js b/src/store/modules/catalogi.spec.js index d8ce2a58..bdfd1f67 100644 --- a/src/store/modules/catalogi.spec.js +++ b/src/store/modules/catalogi.spec.js @@ -4,80 +4,88 @@ import { setActivePinia, createPinia } from 'pinia' import { useCatalogiStore } from './catalogi.js' import { Catalogi } from '../../entities/index.js' -describe('Catalogi Store', () => { - beforeEach(() => { - setActivePinia(createPinia()) - }) - - it('sets catalogi item correctly', () => { - const store = useCatalogiStore() - - store.setCatalogiItem(testData[0]) - - expect(store.catalogiItem).toBeInstanceOf(Catalogi) - expect(store.catalogiItem).toEqual(testData[0]) - - expect(store.catalogiItem.validate()).toBe(true) - }) - - it('sets catalogi list correctly', () => { - const store = useCatalogiStore() - - store.setCatalogiList(testData) - - expect(store.catalogiList).toHaveLength(testData.length) - - // list item 1 - expect(store.catalogiList[0]).toBeInstanceOf(Catalogi) - expect(store.catalogiList[0]).toEqual(testData[0]) - - expect(store.catalogiList[0].validate()).toBe(true) - - // list item 2 - expect(store.catalogiList[1]).toBeInstanceOf(Catalogi) - expect(store.catalogiList[1].id).toBe(testData[1].id) - expect(store.catalogiList[1].title).toBe(testData[1].title) - expect(store.catalogiList[1].summary).toBe(testData[1].summary) - expect(store.catalogiList[1].description).toBe(testData[1].description) - expect(store.catalogiList[1].image).toBe('') - expect(store.catalogiList[1].search).toBe('') - - expect(store.catalogiList[1].validate()).toBe(true) - - // list item 3 - expect(store.catalogiList[2]).toBeInstanceOf(Catalogi) - expect(store.catalogiList[2].id).toBe(testData[2].id) - expect(store.catalogiList[2].title).toBe('') - expect(store.catalogiList[2].summary).toBe(testData[2].summary) - expect(store.catalogiList[2].description).toBe(testData[2].description) - expect(store.catalogiList[2].image).toBe(testData[2].image) - expect(store.catalogiList[2].search).toBe(testData[2].search) - - expect(store.catalogiList[2].validate()).toBe(false) // id, title and summary are required, causing a falsy result - }) -}) +describe( + 'Catalogi Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + } + ) + + it( + 'sets catalogi item correctly', () => { + const store = useCatalogiStore() + + store.setCatalogiItem(testData[0]) + + expect(store.catalogiItem).toBeInstanceOf(Catalogi) + expect(store.catalogiItem).toEqual(testData[0]) + + expect(store.catalogiItem.validate()).toBe(true) + } + ) + + it( + 'sets catalogi list correctly', () => { + const store = useCatalogiStore() + + store.setCatalogiList(testData) + + expect(store.catalogiList).toHaveLength(testData.length) + + // list item 1 + expect(store.catalogiList[0]).toBeInstanceOf(Catalogi) + expect(store.catalogiList[0]).toEqual(testData[0]) + + expect(store.catalogiList[0].validate()).toBe(true) + + // list item 2 + expect(store.catalogiList[1]).toBeInstanceOf(Catalogi) + expect(store.catalogiList[1].id).toBe(testData[1].id) + expect(store.catalogiList[1].title).toBe(testData[1].title) + expect(store.catalogiList[1].summary).toBe(testData[1].summary) + expect(store.catalogiList[1].description).toBe(testData[1].description) + expect(store.catalogiList[1].image).toBe('') + expect(store.catalogiList[1].search).toBe('') + + expect(store.catalogiList[1].validate()).toBe(true) + + // list item 3 + expect(store.catalogiList[2]).toBeInstanceOf(Catalogi) + expect(store.catalogiList[2].id).toBe(testData[2].id) + expect(store.catalogiList[2].title).toBe('') + expect(store.catalogiList[2].summary).toBe(testData[2].summary) + expect(store.catalogiList[2].description).toBe(testData[2].description) + expect(store.catalogiList[2].image).toBe(testData[2].image) + expect(store.catalogiList[2].search).toBe(testData[2].search) + + expect(store.catalogiList[2].validate()).toBe(false) // id, title and summary are required, causing a falsy result + } + ) + } +) const testData = [ - { - id: '1', - title: 'Decat', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, - { - id: '2', - title: 'Woo', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - }, - { - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, -] + { + id: '1', + title: 'Decat', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + search: 'string', + }, + { + id: '2', + title: 'Woo', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + }, + { + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + search: 'string', + }, + ] diff --git a/src/store/modules/directory.js b/src/store/modules/directory.js index 419f614d..7c2044b0 100644 --- a/src/store/modules/directory.js +++ b/src/store/modules/directory.js @@ -2,41 +2,51 @@ import { defineStore } from 'pinia' import { Listing } from '../../entities/index.js' -export const useDirectoryStore = defineStore('directory', { - state: () => ({ - listingItem: false, - listingList: [], - }), - actions: { - setListingItem(listingItem) { - this.listingItem = listingItem && new Listing(listingItem) - console.log('Active directory item set to ' + listingItem && listingItem.id) - }, - setListingList(listingList) { - this.listingList = listingList.map( - (listingItem) => new Listing(listingItem), - ) - console.log('Active directory item set to ' + listingList.length) - }, - async refreshListingList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/directory' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch(endpoint, { - method: 'GET', - }) - .then((response) => { - response.json().then((data) => { - this.listingList = data.results.map( - (listingItem) => new Listing(listingItem), - ) - }) - }) - .catch((err) => { - console.error(err) - }) - }, - }, -}) +export const useDirectoryStore = defineStore( + 'directory', { + state: () => ({ + listingItem: false, + listingList: [], + }), + actions: { + setListingItem(listingItem) { + this.listingItem = listingItem && new Listing(listingItem) + console.log('Active directory item set to ' + listingItem && listingItem.id) + }, + setListingList(listingList) { + this.listingList = listingList.map( + (listingItem) => new Listing(listingItem), + ) + console.log('Active directory item set to ' + listingList.length) + }, + async refreshListingList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/directory' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, { + method: 'GET', + } + ) + .then( + (response) => { + response.json().then( + (data) => { + this.listingList = data.results.map( + (listingItem) => new Listing(listingItem), + ) + } + ) + } + ) + .catch( + (err) => { + console.error(err) + } + ) + }, + }, + } +) diff --git a/src/store/modules/directory.spec.js b/src/store/modules/directory.spec.js index bc18b519..bc52d740 100644 --- a/src/store/modules/directory.spec.js +++ b/src/store/modules/directory.spec.js @@ -4,102 +4,110 @@ import { setActivePinia, createPinia } from 'pinia' import { useDirectoryStore } from './directory.js' import { Listing } from '../../entities/index.js' -describe('Directory Store', () => { - beforeEach(() => { - setActivePinia(createPinia()) - }) +describe( + 'Directory Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + } + ) - it('sets listing item correctly', () => { - const store = useDirectoryStore() + it( + 'sets listing item correctly', () => { + const store = useDirectoryStore() - store.setListingItem(testData[0]) + store.setListingItem(testData[0]) - expect(store.listingItem).toBeInstanceOf(Listing) - expect(store.listingItem).toEqual(testData[0]) - }) + expect(store.listingItem).toBeInstanceOf(Listing) + expect(store.listingItem).toEqual(testData[0]) + } + ) - it('sets listings list correctly', () => { - const store = useDirectoryStore() + it( + 'sets listings list correctly', () => { + const store = useDirectoryStore() - store.setListingList(testData) + store.setListingList(testData) - expect(store.listingList).toHaveLength(testData.length) + expect(store.listingList).toHaveLength(testData.length) - // list item 1 - expect(store.listingList[0]).toBeInstanceOf(Listing) - expect(store.listingList[0]).toEqual(testData[0]) + // list item 1 + expect(store.listingList[0]).toBeInstanceOf(Listing) + expect(store.listingList[0]).toEqual(testData[0]) - expect(store.listingList[0].validate()).toBe(true) + expect(store.listingList[0].validate()).toBe(true) - // list item 2 - expect(store.listingList[1]).toBeInstanceOf(Listing) - expect(store.listingList[1].id).toBe(testData[1].id) - expect(store.listingList[1].title).toBe(testData[1].title) - expect(store.listingList[1].summary).toBe(testData[1].summary) - expect(store.listingList[1].description).toBe(testData[1].description) - expect(store.listingList[1].search).toBe('') - expect(store.listingList[1].directory).toBe(testData[1].directory) - expect(store.listingList[1].metadata).toBe('') - expect(store.listingList[1].status).toBe('') - expect(store.listingList[1].lastSync).toBe(testData[1].lastSync) - expect(store.listingList[1].default).toBe(testData[1].default) - expect(store.listingList[1].available).toBe(testData[1].available) + // list item 2 + expect(store.listingList[1]).toBeInstanceOf(Listing) + expect(store.listingList[1].id).toBe(testData[1].id) + expect(store.listingList[1].title).toBe(testData[1].title) + expect(store.listingList[1].summary).toBe(testData[1].summary) + expect(store.listingList[1].description).toBe(testData[1].description) + expect(store.listingList[1].search).toBe('') + expect(store.listingList[1].directory).toBe(testData[1].directory) + expect(store.listingList[1].metadata).toBe('') + expect(store.listingList[1].status).toBe('') + expect(store.listingList[1].lastSync).toBe(testData[1].lastSync) + expect(store.listingList[1].default).toBe(testData[1].default) + expect(store.listingList[1].available).toBe(testData[1].available) - expect(store.listingList[1].validate()).toBe(true) + expect(store.listingList[1].validate()).toBe(true) - // list item 3 - expect(store.listingList[2]).toBeInstanceOf(Listing) - expect(store.listingList[2].id).toBe(testData[2].id) - expect(store.listingList[2].title).toBe('') - expect(store.listingList[2].summary).toBe(testData[2].summary) - expect(store.listingList[2].description).toBe(testData[2].description) - expect(store.listingList[2].search).toBe(testData[2].search) - expect(store.listingList[2].directory).toBe(testData[2].directory) - expect(store.listingList[2].metadata).toBe(testData[2].metadata) - expect(store.listingList[2].status).toBe(testData[2].status) - expect(store.listingList[2].lastSync).toBe(testData[2].lastSync) - expect(store.listingList[2].default).toBe(testData[2].default) - expect(store.listingList[2].available).toBe(testData[2].available) + // list item 3 + expect(store.listingList[2]).toBeInstanceOf(Listing) + expect(store.listingList[2].id).toBe(testData[2].id) + expect(store.listingList[2].title).toBe('') + expect(store.listingList[2].summary).toBe(testData[2].summary) + expect(store.listingList[2].description).toBe(testData[2].description) + expect(store.listingList[2].search).toBe(testData[2].search) + expect(store.listingList[2].directory).toBe(testData[2].directory) + expect(store.listingList[2].metadata).toBe(testData[2].metadata) + expect(store.listingList[2].status).toBe(testData[2].status) + expect(store.listingList[2].lastSync).toBe(testData[2].lastSync) + expect(store.listingList[2].default).toBe(testData[2].default) + expect(store.listingList[2].available).toBe(testData[2].available) - expect(store.listingList[2].validate()).toBe(false) - }) -}) + expect(store.listingList[2].validate()).toBe(false) + } + ) + } +) const testData = [ - { // full data - id: '1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'active', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, - { // partial data - id: '2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - directory: 'string', - lastSync: '2024-07-25T00:00:00Z', - default: 'yes', - available: 'no', - }, - { // invalid data - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'pending', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, -] + { // full data + id: '1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'string', + directory: 'string', + metadata: 'string', + status: 'active', + lastSync: '2024-07-25T00:00:00Z', + default: 'no', + available: 'yes', + }, + { // partial data + id: '2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + directory: 'string', + lastSync: '2024-07-25T00:00:00Z', + default: 'yes', + available: 'no', + }, + { // invalid data + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'string', + directory: 'string', + metadata: 'string', + status: 'pending', + lastSync: '2024-07-25T00:00:00Z', + default: 'no', + available: 'yes', + }, + ] diff --git a/src/store/modules/metadata.js b/src/store/modules/metadata.js index 89cf9e0b..63a22302 100644 --- a/src/store/modules/metadata.js +++ b/src/store/modules/metadata.js @@ -2,74 +2,82 @@ import { defineStore } from 'pinia' import { Metadata } from '../../entities/index.js' -export const useMetadataStore = defineStore('metadata', { - state: () => ({ - metaDataItem: false, - metaDataList: [], - metadataDataKey: false, - }), - actions: { - setMetaDataItem(metaDataItem) { - this.metaDataItem = metaDataItem && new Metadata(metaDataItem) +export const useMetadataStore = defineStore( + 'metadata', { + state: () => ({ + metaDataItem: false, + metaDataList: [], + metadataDataKey: false, + }), + actions: { + setMetaDataItem(metaDataItem) { + this.metaDataItem = metaDataItem && new Metadata(metaDataItem) - // for backward compatibility - if (typeof this.metaDataItem?.properties === 'string') { - this.metaDataItem.properties = JSON.parse(this.metaDataItem.properties) - } + // for backward compatibility + if (typeof this.metaDataItem?.properties === 'string') { + this.metaDataItem.properties = JSON.parse(this.metaDataItem.properties) + } - console.log('Active metadata object set to ' + metaDataItem && metaDataItem.id) - }, - setMetaDataList(metaDataList) { - this.metaDataList = metaDataList.map( - (metadataItem) => new Metadata(metadataItem), - ) - console.log('Active metadata lest set') - }, - async refreshMetaDataList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/metadata' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, - { - method: 'GET', - }, - ) - .then((response) => { - response.json().then((data) => { - this.metaDataList = data.results.map( - (metadataItem) => new Metadata(metadataItem), - ) - return data - }) - }) - .catch((err) => { - console.error(err) - return err - }) - }, - setMetadataDataKey(metadataDataKey) { - this.metadataDataKey = metadataDataKey - console.log('Active metadata data key set to ' + metadataDataKey) - }, - getMetadataPropertyKeys(property) { - const defaultKeys = { - type: '', - description: '', - format: '', - maxDate: '', - required: false, - default: false, - $ref: '', // $ref should probably be removed as it is not mentioned in the schema - cascadeDelete: false, - exclusiveMinimum: 0, - } + console.log('Active metadata object set to ' + metaDataItem && metaDataItem.id) + }, + setMetaDataList(metaDataList) { + this.metaDataList = metaDataList.map( + (metadataItem) => new Metadata(metadataItem), + ) + console.log('Active metadata lest set') + }, + async refreshMetaDataList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/metadata' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.metaDataList = data.results.map( + (metadataItem) => new Metadata(metadataItem), + ) + return data + } + ) + } + ) + .catch( + (err) => { + console.error(err) + return err + } + ) + }, + setMetadataDataKey(metadataDataKey) { + this.metadataDataKey = metadataDataKey + console.log('Active metadata data key set to ' + metadataDataKey) + }, + getMetadataPropertyKeys(property) { + const defaultKeys = { + type: '', + description: '', + format: '', + maxDate: '', + required: false, + default: false, + $ref: '', // $ref should probably be removed as it is not mentioned in the schema + cascadeDelete: false, + exclusiveMinimum: 0, + } - const propertyKeys = this.metaDataItem.properties[property] + const propertyKeys = this.metaDataItem.properties[property] - return { ...defaultKeys, ...propertyKeys } - }, - }, -}) + return { ...defaultKeys, ...propertyKeys } + }, + }, + } + ) diff --git a/src/store/modules/metadata.spec.js b/src/store/modules/metadata.spec.js index 6eb6d986..84c69214 100644 --- a/src/store/modules/metadata.spec.js +++ b/src/store/modules/metadata.spec.js @@ -3,164 +3,178 @@ import { setActivePinia, createPinia } from 'pinia' import { useMetadataStore } from './metadata.js' -describe('Metadata Store', () => { - beforeEach(() => { - setActivePinia(createPinia()) - }) - - it('sets metadata item correctly', () => { - const store = useMetadataStore() - const metadataItem = { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test listing', - description: 'this is a very long description for test listing', - version: '0.0.1', - properties: { - sasds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - }, - } - - store.setMetaDataItem(metadataItem) - - expect(store.metaDataItem).toEqual(metadataItem) - }) - - it('sets metadata item with string "properties" property', () => { - const store = useMetadataStore() - const metadataItem = { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test listing', - description: 'this is a very long description for test listing', - version: '0.0.1', - properties: '{"sasds":{"type":"string","description":"property description","format":"a format","maxDate":"2025-07-13","required":false,"default":false,"cascadeDelete":false,"exclusiveMinimum":"2"}}', - } - - store.setMetaDataItem(metadataItem) - - expect(store.metaDataItem.id).toBe('1') - expect(store.metaDataItem.name).toBe('Test metadata name') - expect(store.metaDataItem.title).toBe('Test metadata') - expect(store.metaDataItem.summary).toBe('This is a test listing') - expect(store.metaDataItem.description).toBe('this is a very long description for test listing') - expect(store.metaDataItem.version).toBe('0.0.1') - // properties - expect(store.metaDataItem.properties.sasds.type).toBe('string') - expect(store.metaDataItem.properties.sasds.description).toBe('property description') - expect(store.metaDataItem.properties.sasds.format).toBe('a format') - expect(store.metaDataItem.properties.sasds.maxDate).toBe('2025-07-13') - expect(store.metaDataItem.properties.sasds.required).toBe(false) - expect(store.metaDataItem.properties.sasds.default).toBe(false) - expect(store.metaDataItem.properties.sasds.cascadeDelete).toBe(false) - expect(store.metaDataItem.properties.sasds.exclusiveMinimum).toBe('2') - }) - - it('sets metadata list correctly', () => { - const store = useMetadataStore() - const metadataList = [ - { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - properties: { - sasds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - gfdgds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - }, - }, - { - id: '2', - name: 'Test metadata naming', - title: 'Test metadata aaaa', - summary: 'This is a test metadata baaa da daaa', - description: 'this is a very long descriptio-', - version: '0.0.1', - properties: {}, - }, - ] - - store.setMetaDataList(metadataList) - - expect(store.metaDataList).toHaveLength(metadataList.length) - store.metaDataList.forEach((item, index) => { - expect(item).toEqual(metadataList[index]) - }) - }) - - it('get metadata property from key', () => { - const store = useMetadataStore() - const metadataItem = { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - properties: { - sasds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - $ref: '', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - gfdgds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - }, - } - - store.setMetaDataItem(metadataItem) - store.setMetadataDataKey('sasds') - - expect(store.metaDataItem).toEqual(metadataItem) - expect(store.metadataDataKey).toBe('sasds') - - const properties = store.getMetadataPropertyKeys('sasds') - - expect(properties).toEqual(metadataItem.properties.sasds) - }) -}) +describe( + 'Metadata Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + } + ) + + it( + 'sets metadata item correctly', () => { + const store = useMetadataStore() + const metadataItem = { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test listing', + description: 'this is a very long description for test listing', + version: '0.0.1', + properties: { + sasds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + }, + } + + store.setMetaDataItem(metadataItem) + + expect(store.metaDataItem).toEqual(metadataItem) + } + ) + + it( + 'sets metadata item with string "properties" property', () => { + const store = useMetadataStore() + const metadataItem = { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test listing', + description: 'this is a very long description for test listing', + version: '0.0.1', + properties: '{"sasds":{"type":"string","description":"property description","format":"a format","maxDate":"2025-07-13","required":false,"default":false,"cascadeDelete":false,"exclusiveMinimum":"2"}}', + } + + store.setMetaDataItem(metadataItem) + + expect(store.metaDataItem.id).toBe('1') + expect(store.metaDataItem.name).toBe('Test metadata name') + expect(store.metaDataItem.title).toBe('Test metadata') + expect(store.metaDataItem.summary).toBe('This is a test listing') + expect(store.metaDataItem.description).toBe('this is a very long description for test listing') + expect(store.metaDataItem.version).toBe('0.0.1') + // properties + expect(store.metaDataItem.properties.sasds.type).toBe('string') + expect(store.metaDataItem.properties.sasds.description).toBe('property description') + expect(store.metaDataItem.properties.sasds.format).toBe('a format') + expect(store.metaDataItem.properties.sasds.maxDate).toBe('2025-07-13') + expect(store.metaDataItem.properties.sasds.required).toBe(false) + expect(store.metaDataItem.properties.sasds.default).toBe(false) + expect(store.metaDataItem.properties.sasds.cascadeDelete).toBe(false) + expect(store.metaDataItem.properties.sasds.exclusiveMinimum).toBe('2') + } + ) + + it( + 'sets metadata list correctly', () => { + const store = useMetadataStore() + const metadataList = [ + { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + properties: { + sasds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + gfdgds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + }, + }, + { + id: '2', + name: 'Test metadata naming', + title: 'Test metadata aaaa', + summary: 'This is a test metadata baaa da daaa', + description: 'this is a very long descriptio-', + version: '0.0.1', + properties: {}, + }, + ] + + store.setMetaDataList(metadataList) + + expect(store.metaDataList).toHaveLength(metadataList.length) + store.metaDataList.forEach( + (item, index) => { + expect(item).toEqual(metadataList[index]) + } + ) + } + ) + + it( + 'get metadata property from key', () => { + const store = useMetadataStore() + const metadataItem = { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + properties: { + sasds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + $ref: '', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + gfdgds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + }, + } + + store.setMetaDataItem(metadataItem) + store.setMetadataDataKey('sasds') + + expect(store.metaDataItem).toEqual(metadataItem) + expect(store.metadataDataKey).toBe('sasds') + + const properties = store.getMetadataPropertyKeys('sasds') + + expect(properties).toEqual(metadataItem.properties.sasds) + } + ) + } +) diff --git a/src/store/modules/navigation.js b/src/store/modules/navigation.js index 07f55234..c32a2b03 100644 --- a/src/store/modules/navigation.js +++ b/src/store/modules/navigation.js @@ -1,33 +1,35 @@ /* eslint-disable no-console */ import { defineStore } from 'pinia' -export const useNavigationStore = defineStore('ui', { - state: () => ({ - // The currently active menu item, defaults to '' which triggers the dashboard - selected: 'dashboard', - // The currently selected catalogi within 'publications' - selectedCatalogus: false, - // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time - modal: false, - // The currently active dialog - dialog: false, - }), - actions: { - setSelected(selected) { - this.selected = selected - console.log('Active menu item set to ' + selected) - }, - setSelectedCatalogus(selectedCatalogus) { - this.selectedCatalogus = selectedCatalogus - console.log('Active catalogus menu set to ' + selectedCatalogus) - }, - setModal(modal) { - this.modal = modal - console.log('Active modal set to ' + modal) - }, - setDialog(dialog) { - this.dialog = dialog - console.log('Active dialog set to ' + dialog) - }, - }, -}) +export const useNavigationStore = defineStore( + 'ui', { + state: () => ({ + // The currently active menu item, defaults to '' which triggers the dashboard + selected: 'dashboard', + // The currently selected catalogi within 'publications' + selectedCatalogus: false, + // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time + modal: false, + // The currently active dialog + dialog: false, + }), + actions: { + setSelected(selected) { + this.selected = selected + console.log('Active menu item set to ' + selected) + }, + setSelectedCatalogus(selectedCatalogus) { + this.selectedCatalogus = selectedCatalogus + console.log('Active catalogus menu set to ' + selectedCatalogus) + }, + setModal(modal) { + this.modal = modal + console.log('Active modal set to ' + modal) + }, + setDialog(dialog) { + this.dialog = dialog + console.log('Active dialog set to ' + dialog) + }, + }, + } +) diff --git a/src/store/modules/navigation.spec.js b/src/store/modules/navigation.spec.js index 5f252581..4601b809 100644 --- a/src/store/modules/navigation.spec.js +++ b/src/store/modules/navigation.spec.js @@ -3,60 +3,72 @@ import { setActivePinia, createPinia } from 'pinia' import { useNavigationStore } from './navigation.js' -describe('Navigation Store', () => { - beforeEach(() => { - setActivePinia(createPinia()) - }) - - it('set current selected view correctly', () => { - const store = useNavigationStore() - - store.setSelected('publication') - expect(store.selected).toBe('publication') - - store.setSelected('catalogi') - expect(store.selected).toBe('catalogi') - - store.setSelected('metadata') - expect(store.selected).toBe('metadata') - }) - - it('set current selected publication catalogi correctly', () => { - const store = useNavigationStore() - - store.setSelectedCatalogus('7a048bfd-210f-4e93-a1e8-5aa9261740b7') - expect(store.selectedCatalogus).toBe('7a048bfd-210f-4e93-a1e8-5aa9261740b7') - - store.setSelectedCatalogus('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') - expect(store.selectedCatalogus).toBe('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') - - store.setSelectedCatalogus('3b1cbee2-756e-4904-a157-29fb0cbe01d3') - expect(store.selectedCatalogus).toBe('3b1cbee2-756e-4904-a157-29fb0cbe01d3') - }) - - it('set modal correctly', () => { - const store = useNavigationStore() - - store.setModal('editPublication') - expect(store.modal).toBe('editPublication') - - store.setModal('editCatalogi') - expect(store.modal).toBe('editCatalogi') - - store.setModal('editMetadata') - expect(store.modal).toBe('editMetadata') - }) - - it('set modal correctly', () => { - const store = useNavigationStore() - - store.setDialog('deletePublication') - expect(store.dialog).toBe('deletePublication') - - store.setDialog('deleteCatalogi') - expect(store.dialog).toBe('deleteCatalogi') - - store.setDialog('deleteMetadata') - expect(store.dialog).toBe('deleteMetadata') - }) -}) +describe( + 'Navigation Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + } + ) + + it( + 'set current selected view correctly', () => { + const store = useNavigationStore() + + store.setSelected('publication') + expect(store.selected).toBe('publication') + + store.setSelected('catalogi') + expect(store.selected).toBe('catalogi') + + store.setSelected('metadata') + expect(store.selected).toBe('metadata') + } + ) + + it( + 'set current selected publication catalogi correctly', () => { + const store = useNavigationStore() + + store.setSelectedCatalogus('7a048bfd-210f-4e93-a1e8-5aa9261740b7') + expect(store.selectedCatalogus).toBe('7a048bfd-210f-4e93-a1e8-5aa9261740b7') + + store.setSelectedCatalogus('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') + expect(store.selectedCatalogus).toBe('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') + + store.setSelectedCatalogus('3b1cbee2-756e-4904-a157-29fb0cbe01d3') + expect(store.selectedCatalogus).toBe('3b1cbee2-756e-4904-a157-29fb0cbe01d3') + } + ) + + it( + 'set modal correctly', () => { + const store = useNavigationStore() + + store.setModal('editPublication') + expect(store.modal).toBe('editPublication') + + store.setModal('editCatalogi') + expect(store.modal).toBe('editCatalogi') + + store.setModal('editMetadata') + expect(store.modal).toBe('editMetadata') + } + ) + + it( + 'set modal correctly', () => { + const store = useNavigationStore() + + store.setDialog('deletePublication') + expect(store.dialog).toBe('deletePublication') + + store.setDialog('deleteCatalogi') + expect(store.dialog).toBe('deleteCatalogi') + + store.setDialog('deleteMetadata') + expect(store.dialog).toBe('deleteMetadata') + } + ) + } +) diff --git a/src/store/modules/publication.js b/src/store/modules/publication.js index 4c5226e7..b63de4f2 100644 --- a/src/store/modules/publication.js +++ b/src/store/modules/publication.js @@ -2,113 +2,139 @@ import { Attachment, Publication } from '../../entities/index.js' import { defineStore } from 'pinia' -export const usePublicationStore = defineStore('publication', { - state: () => ({ - publicationItem: false, - publicationList: [], - publicationDataKey: false, - attachmentItem: false, - publicationAttachments: [], - conceptPublications: [], - conceptAttachments: [], - }), - actions: { - setPublicationItem(publicationItem) { - // To prevent forms etc from braking we alway use a default/skeleton object - this.publicationItem = publicationItem && new Publication(publicationItem) - console.log('Active publication item set to ' + publicationItem && publicationItem.id) - }, - setPublicationList(publicationList) { - this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) - console.log('Active publication item set to ' + publicationList.length) - }, - async refreshPublicationList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/publications' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, - { - method: 'GET', - }, - ) - .then((response) => { - response.json().then((data) => { - this.setPublicationList(data?.results) - return data - }) - }) - .catch((err) => { - console.error(err) - return err - }) - }, - getPublicationAttachments(publication) { // @todo this might belong in a service? - fetch( - '/index.php/apps/opencatalogi/api/attachments', - { - method: 'GET', - }, - ) - .then((response) => { - response.json().then((data) => { - this.publicationAttachments = data.results.map( - (attachmentItem) => new Attachment(attachmentItem), - ) - return data - }) - }) - .catch((err) => { - console.error(err) - return err - }) - }, - getConceptPublications() { // @todo this might belong in a service? - fetch( - '/index.php/apps/opencatalogi/api/publications?status=concept', - { - method: 'GET', - }, - ) - .then((response) => { - response.json().then((data) => { - this.conceptPublications = data - return data - }) - }) - .catch((err) => { - console.error(err) - return err - }) - }, - getConceptAttachments() { // @todo this might belong in a service? - fetch( - '/index.php/apps/opencatalogi/api/attachments?status=concept', - { - method: 'GET', - }, - ) - .then((response) => { - response.json().then((data) => { - this.conceptAttachments = data - return data - }) - }) - .catch((err) => { - console.error(err) - return err - }) - }, - // @todo why does the following run through the store? -- because its impossible with props, and its vital information for the modal. - setPublicationDataKey(publicationDataKey) { - this.publicationDataKey = publicationDataKey - console.log('Active publication data key set to ' + publicationDataKey) - }, - setAttachmentItem(attachmentItem) { - this.attachmentItem = attachmentItem && new Attachment(attachmentItem) - console.log('Active attachment item set to ' + attachmentItem) - }, - }, -}) +export const usePublicationStore = defineStore( + 'publication', { + state: () => ({ + publicationItem: false, + publicationList: [], + publicationDataKey: false, + attachmentItem: false, + publicationAttachments: [], + conceptPublications: [], + conceptAttachments: [], + }), + actions: { + setPublicationItem(publicationItem) { + // To prevent forms etc from braking we alway use a default/skeleton object + this.publicationItem = publicationItem && new Publication(publicationItem) + console.log('Active publication item set to ' + publicationItem && publicationItem.id) + }, + setPublicationList(publicationList) { + this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) + console.log('Active publication item set to ' + publicationList.length) + }, + async refreshPublicationList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/publications' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.setPublicationList(data?.results) + return data + } + ) + } + ) + .catch( + (err) => { + console.error(err) + return err + } + ) + }, + getPublicationAttachments(publication) { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments', + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.publicationAttachments = data.results.map( + (attachmentItem) => new Attachment(attachmentItem), + ) + return data + } + ) + } + ) + .catch( + (err) => { + console.error(err) + return err + } + ) + }, + getConceptPublications() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/publications?status=concept', + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.conceptPublications = data + return data + } + ) + } + ) + .catch( + (err) => { + console.error(err) + return err + } + ) + }, + getConceptAttachments() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments?status=concept', + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.conceptAttachments = data + return data + } + ) + } + ) + .catch( + (err) => { + console.error(err) + return err + } + ) + }, + // @todo why does the following run through the store? -- because its impossible with props, and its vital information for the modal. + setPublicationDataKey(publicationDataKey) { + this.publicationDataKey = publicationDataKey + console.log('Active publication data key set to ' + publicationDataKey) + }, + setAttachmentItem(attachmentItem) { + this.attachmentItem = attachmentItem && new Attachment(attachmentItem) + console.log('Active attachment item set to ' + attachmentItem) + }, + }, + } +) diff --git a/src/store/modules/publication.spec.js b/src/store/modules/publication.spec.js index 8adee3ba..187eb7e5 100644 --- a/src/store/modules/publication.spec.js +++ b/src/store/modules/publication.spec.js @@ -4,217 +4,229 @@ import { setActivePinia, createPinia } from 'pinia' import { usePublicationStore } from './publication.js' import { Attachment, Publication } from '../../entities/index.js' -describe('Metadata Store', () => { - beforeEach(() => { - setActivePinia(createPinia()) - }) +describe( + 'Metadata Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + } + ) - it('sets publication item correctly', () => { - const store = usePublicationStore() + it( + 'sets publication item correctly', () => { + const store = usePublicationStore() - store.setPublicationItem(testData[0]) + store.setPublicationItem(testData[0]) - expect(store.publicationItem).toBeInstanceOf(Publication) - expect(store.publicationItem).toEqual(testData[0]) - expect(store.publicationItem.validate()).toBe(true) + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[0]) + expect(store.publicationItem.validate()).toBe(true) - store.setPublicationItem(testData[1]) + store.setPublicationItem(testData[1]) - expect(store.publicationItem).toBeInstanceOf(Publication) - expect(store.publicationItem).not.toEqual(testData[1]) - expect(store.publicationItem.validate()).toBe(true) + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).not.toEqual(testData[1]) + expect(store.publicationItem.validate()).toBe(true) - store.setPublicationItem(testData[2]) + store.setPublicationItem(testData[2]) - expect(store.publicationItem).toBeInstanceOf(Publication) - expect(store.publicationItem).toEqual(testData[2]) - expect(store.publicationItem.validate()).toBe(false) - }) + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[2]) + expect(store.publicationItem.validate()).toBe(false) + } + ) - it('sets publication list correctly', () => { - const store = usePublicationStore() + it( + 'sets publication list correctly', () => { + const store = usePublicationStore() - store.setPublicationList(testData) + store.setPublicationList(testData) - expect(store.publicationList).toHaveLength(testData.length) + expect(store.publicationList).toHaveLength(testData.length) - expect(store.publicationList[0]).toBeInstanceOf(Publication) - expect(store.publicationList[0]).toEqual(testData[0]) - expect(store.publicationList[0].validate()).toBe(true) + expect(store.publicationList[0]).toBeInstanceOf(Publication) + expect(store.publicationList[0]).toEqual(testData[0]) + expect(store.publicationList[0].validate()).toBe(true) - expect(store.publicationList[1]).toBeInstanceOf(Publication) - expect(store.publicationList[1]).not.toEqual(testData[1]) - expect(store.publicationList[1].validate()).toBe(true) + expect(store.publicationList[1]).toBeInstanceOf(Publication) + expect(store.publicationList[1]).not.toEqual(testData[1]) + expect(store.publicationList[1].validate()).toBe(true) - expect(store.publicationList[2]).toBeInstanceOf(Publication) - expect(store.publicationList[2]).toEqual(testData[2]) - expect(store.publicationList[2].validate()).toBe(false) - }) + expect(store.publicationList[2]).toBeInstanceOf(Publication) + expect(store.publicationList[2]).toEqual(testData[2]) + expect(store.publicationList[2].validate()).toBe(false) + } + ) - // TODO: fix this - it('set publication data.data property key correctly', () => { - const store = usePublicationStore() + // TODO: fix this + it( + 'set publication data.data property key correctly', () => { + const store = usePublicationStore() - store.setPublicationDataKey('contactPoint') + store.setPublicationDataKey('contactPoint') - expect(store.publicationDataKey).toBe('contactPoint') - }) + expect(store.publicationDataKey).toBe('contactPoint') + } + ) - it('set attachment item correctly', () => { - const store = usePublicationStore() + it( + 'set attachment item correctly', () => { + const store = usePublicationStore() - store.setAttachmentItem(attachmentTestData[0]) + store.setAttachmentItem(attachmentTestData[0]) - expect(store.attachmentItem).toBeInstanceOf(Attachment) - expect(store.attachmentItem).toEqual(attachmentTestData[0]) - expect(store.attachmentItem.validate()).toBe(true) + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[0]) + expect(store.attachmentItem.validate()).toBe(true) - store.setAttachmentItem(attachmentTestData[1]) + store.setAttachmentItem(attachmentTestData[1]) - expect(store.attachmentItem).toBeInstanceOf(Attachment) - expect(store.attachmentItem).not.toEqual(attachmentTestData[1]) - expect(store.attachmentItem.validate()).toBe(true) + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).not.toEqual(attachmentTestData[1]) + expect(store.attachmentItem.validate()).toBe(true) - store.setAttachmentItem(attachmentTestData[2]) + store.setAttachmentItem(attachmentTestData[2]) - expect(store.attachmentItem).toBeInstanceOf(Attachment) - expect(store.attachmentItem).toEqual(attachmentTestData[2]) - expect(store.attachmentItem.validate()).toBe(false) - }) -}) + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[2]) + expect(store.attachmentItem.validate()).toBe(false) + } + ) + } +) const testData = [ - { // full data - id: '1', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category1', - portal: 'portal1', - catalogi: 'catalogi1', - metaData: 'meta1', - publicationDate: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: [{ name: 'Org1' }], - data: [{ key: 'value1' }], - attachments: ['attachment1'], - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: 'theme1', - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - }, - { // partial data - id: '2', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category2', - portal: 'portal2', - catalogi: 'catalogi2', - metaData: 'meta2', - publicationDate: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: [{ name: 'Org1' }], - data: [{ key: 'value1' }], - attachments: ['attachment1'], - attachmentCount: 1, - - themes: 'theme1', - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - }, - { // invalid data - id: '3', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category3', - portal: 'portal3', - catalogi: 'catalogi3', - metaData: 'meta3', - publicationDate: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: [{ name: 'Org1' }], - data: [{ key: 'value1' }], - attachments: ['attachment1'], - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: 'theme1', - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - }, -] - -const attachmentTestData = [ - { // full data - id: '9044ab1e-cf5a-490a-be74-6be7a0c48a5f', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag1' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, - { // partial data - id: 'f849f287-492d-4100-91e1-1c4137f0abb5', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag2' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - license: 'MIT', - }, - { // invalid data - id: 'e193ea6b-1222-44cf-a71c-6ddcc232a79b', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag3' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, -] + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category1', + portal: 'portal1', + catalogi: 'catalogi1', + metaData: 'meta1', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // partial data + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category2', + portal: 'portal2', + catalogi: 'catalogi2', + metaData: 'meta2', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // invalid data + id: '3', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category3', + portal: 'portal3', + catalogi: 'catalogi3', + metaData: 'meta3', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + ] + + const attachmentTestData = [ + { // full data + id: '9044ab1e-cf5a-490a-be74-6be7a0c48a5f', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag1' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, + { // partial data + id: 'f849f287-492d-4100-91e1-1c4137f0abb5', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag2' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + license: 'MIT', + }, + { // invalid data + id: 'e193ea6b-1222-44cf-a71c-6ddcc232a79b', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag3' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, + ] diff --git a/src/store/modules/search.js b/src/store/modules/search.js index 0065ac56..78c393d2 100644 --- a/src/store/modules/search.js +++ b/src/store/modules/search.js @@ -1,38 +1,46 @@ /* eslint-disable no-console */ import { defineStore } from 'pinia' -export const useSearchStore = defineStore('search', { - state: () => ({ - search: '', - searchResults: '', - }), - actions: { - setSearch(search) { - this.search = search - console.log('Active search set to ' + search) - }, - setSearchResults(searchResults) { - this.searchResults = searchResults - console.log('Active search set to ' + searchResults) - }, - getSearchResults() { - fetch( - '/index.php/apps/opencatalogi/api/search?_search=' + this.search, - { - method: 'GET', - }, - ) - .then((response) => { - response.json().then((data) => { - this.searchResults = data - }) - }) - .catch((err) => { - console.error(err) - }) - }, - clearSearch() { - this.search = '' - }, - }, -}) +export const useSearchStore = defineStore( + 'search', { + state: () => ({ + search: '', + searchResults: '', + }), + actions: { + setSearch(search) { + this.search = search + console.log('Active search set to ' + search) + }, + setSearchResults(searchResults) { + this.searchResults = searchResults + console.log('Active search set to ' + searchResults) + }, + getSearchResults() { + fetch( + '/index.php/apps/opencatalogi/api/search?_search=' + this.search, + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.searchResults = data + } + ) + } + ) + .catch( + (err) => { + console.error(err) + } + ) + }, + clearSearch() { + this.search = '' + }, + }, + } +) diff --git a/src/store/modules/search.spec.js b/src/store/modules/search.spec.js index 7e0b6e90..78923ff3 100644 --- a/src/store/modules/search.spec.js +++ b/src/store/modules/search.spec.js @@ -3,39 +3,49 @@ import { setActivePinia, createPinia } from 'pinia' import { useSearchStore } from './search.js' -describe('Search Store', () => { - beforeEach(() => { - setActivePinia(createPinia()) - }) - - it('set search correctly', () => { - const store = useSearchStore() - - store.setSearch('cata') - expect(store.search).toBe('cata') - - store.setSearch('woo') - expect(store.search).toBe('woo') - - store.setSearch('foo bar') - expect(store.search).toBe('foo bar') - }) - - it('set search result correctly', () => { - const store = useSearchStore() - - store.setSearchResults(['foo', 'bar', 'bux']) - expect(store.searchResults).toEqual(['foo', 'bar', 'bux']) - }) - - it('clear search correctly', () => { - const store = useSearchStore() - - store.setSearch('Lorem ipsum dolor sit amet') - expect(store.search).toBe('Lorem ipsum dolor sit amet') - - store.clearSearch() - - expect(store.search).toBe('') - }) -}) +describe( + 'Search Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + } + ) + + it( + 'set search correctly', () => { + const store = useSearchStore() + + store.setSearch('cata') + expect(store.search).toBe('cata') + + store.setSearch('woo') + expect(store.search).toBe('woo') + + store.setSearch('foo bar') + expect(store.search).toBe('foo bar') + } + ) + + it( + 'set search result correctly', () => { + const store = useSearchStore() + + store.setSearchResults(['foo', 'bar', 'bux']) + expect(store.searchResults).toEqual(['foo', 'bar', 'bux']) + } + ) + + it( + 'clear search correctly', () => { + const store = useSearchStore() + + store.setSearch('Lorem ipsum dolor sit amet') + expect(store.search).toBe('Lorem ipsum dolor sit amet') + + store.clearSearch() + + expect(store.search).toBe('') + } + ) + } +) From 3331bb3dbb99073efb40d3bca2f39a1add782435 Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 14:07:01 +0200 Subject: [PATCH 046/145] package-json misery in workflow --- .github/workflows/CI-workflows.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI-workflows.yaml b/.github/workflows/CI-workflows.yaml index 0798f8fd..16874a9a 100644 --- a/.github/workflows/CI-workflows.yaml +++ b/.github/workflows/CI-workflows.yaml @@ -67,7 +67,8 @@ jobs: git config user.name "GitHub Actions" git config user.email "actions@github.com" git add . - git diff --cached --quiet || (git reset package.json && git reset package-lock.json && git reset node_modules && git commit -m "Update src from remark-lint" && git pull origin $(git rev-parse --abbrev-ref HEAD) --rebase --autostash && git push) + git add package.json package-lock.json + git diff --cached --quiet || (git commit -m "Update src from remark-lint" && git pull origin $(git rev-parse --abbrev-ref HEAD) --rebase --autostash && git push) checks: needs: [build, lint] From b86146551da87704b288b9b2cc000dd699d09b43 Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 14:08:39 +0200 Subject: [PATCH 047/145] linting in modules stores --- src/main.js | 8 +- src/store/modules/catalogi.js | 92 +++--- src/store/modules/catalogi.spec.js | 162 +++++------ src/store/modules/directory.js | 92 +++--- src/store/modules/directory.spec.js | 182 ++++++------ src/store/modules/metadata.js | 148 +++++----- src/store/modules/metadata.spec.js | 346 +++++++++++----------- src/store/modules/navigation.js | 60 ++-- src/store/modules/navigation.spec.js | 102 +++---- src/store/modules/publication.js | 268 ++++++++--------- src/store/modules/publication.spec.js | 398 +++++++++++++------------- src/store/modules/search.js | 82 +++--- src/store/modules/search.spec.js | 88 +++--- src/store/store.js | 16 +- 14 files changed, 1022 insertions(+), 1022 deletions(-) diff --git a/src/main.js b/src/main.js index 3be88eff..f6bf3bfc 100644 --- a/src/main.js +++ b/src/main.js @@ -7,8 +7,8 @@ Vue.mixin({ methods: { t, n } }) Vue.use(PiniaVuePlugin) new Vue( - { - pinia, - render: h => h(App), - } + { + pinia, + render: h => h(App), + }, ).$mount('#opencatalogi') diff --git a/src/store/modules/catalogi.js b/src/store/modules/catalogi.js index 80f19aae..67d9bacc 100644 --- a/src/store/modules/catalogi.js +++ b/src/store/modules/catalogi.js @@ -3,50 +3,50 @@ import { defineStore } from 'pinia' import { Catalogi } from '../../entities/index.js' export const useCatalogiStore = defineStore( - 'catalogi', { - state: () => ({ - catalogiItem: false, - catalogiList: [], - }), - actions: { - setCatalogiItem(catalogiItem) { - this.catalogiItem = catalogiItem && new Catalogi(catalogiItem) - console.log('Active catalog item set to ' + catalogiItem && catalogiItem?.id) - }, - setCatalogiList(catalogiList) { - this.catalogiList = catalogiList.map( - (catalogiItem) => new Catalogi(catalogiItem), - ) - console.log('Catalogi list set to ' + catalogiList.length + ' item') - }, - async refreshCatalogiList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/catalogi' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, { - method: 'GET', - } - ) - .then( - (response) => { - response.json().then( - (data) => { - this.catalogiList = data.results.map( - (catalogiItem) => new Catalogi(catalogiItem), - ) - } - ) - } - ) - .catch( - (err) => { - console.error(err) - } - ) - }, - }, - } + 'catalogi', { + state: () => ({ + catalogiItem: false, + catalogiList: [], + }), + actions: { + setCatalogiItem(catalogiItem) { + this.catalogiItem = catalogiItem && new Catalogi(catalogiItem) + console.log('Active catalog item set to ' + catalogiItem && catalogiItem?.id) + }, + setCatalogiList(catalogiList) { + this.catalogiList = catalogiList.map( + (catalogiItem) => new Catalogi(catalogiItem), + ) + console.log('Catalogi list set to ' + catalogiList.length + ' item') + }, + async refreshCatalogiList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/catalogi' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.catalogiList = data.results.map( + (catalogiItem) => new Catalogi(catalogiItem), + ) + }, + ) + }, + ) + .catch( + (err) => { + console.error(err) + }, + ) + }, + }, + }, ) diff --git a/src/store/modules/catalogi.spec.js b/src/store/modules/catalogi.spec.js index bdfd1f67..ea313261 100644 --- a/src/store/modules/catalogi.spec.js +++ b/src/store/modules/catalogi.spec.js @@ -5,87 +5,87 @@ import { useCatalogiStore } from './catalogi.js' import { Catalogi } from '../../entities/index.js' describe( - 'Catalogi Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - } - ) - - it( - 'sets catalogi item correctly', () => { - const store = useCatalogiStore() - - store.setCatalogiItem(testData[0]) - - expect(store.catalogiItem).toBeInstanceOf(Catalogi) - expect(store.catalogiItem).toEqual(testData[0]) - - expect(store.catalogiItem.validate()).toBe(true) - } - ) - - it( - 'sets catalogi list correctly', () => { - const store = useCatalogiStore() - - store.setCatalogiList(testData) - - expect(store.catalogiList).toHaveLength(testData.length) - - // list item 1 - expect(store.catalogiList[0]).toBeInstanceOf(Catalogi) - expect(store.catalogiList[0]).toEqual(testData[0]) - - expect(store.catalogiList[0].validate()).toBe(true) - - // list item 2 - expect(store.catalogiList[1]).toBeInstanceOf(Catalogi) - expect(store.catalogiList[1].id).toBe(testData[1].id) - expect(store.catalogiList[1].title).toBe(testData[1].title) - expect(store.catalogiList[1].summary).toBe(testData[1].summary) - expect(store.catalogiList[1].description).toBe(testData[1].description) - expect(store.catalogiList[1].image).toBe('') - expect(store.catalogiList[1].search).toBe('') - - expect(store.catalogiList[1].validate()).toBe(true) - - // list item 3 - expect(store.catalogiList[2]).toBeInstanceOf(Catalogi) - expect(store.catalogiList[2].id).toBe(testData[2].id) - expect(store.catalogiList[2].title).toBe('') - expect(store.catalogiList[2].summary).toBe(testData[2].summary) - expect(store.catalogiList[2].description).toBe(testData[2].description) - expect(store.catalogiList[2].image).toBe(testData[2].image) - expect(store.catalogiList[2].search).toBe(testData[2].search) - - expect(store.catalogiList[2].validate()).toBe(false) // id, title and summary are required, causing a falsy result - } - ) - } + 'Catalogi Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + }, + ) + + it( + 'sets catalogi item correctly', () => { + const store = useCatalogiStore() + + store.setCatalogiItem(testData[0]) + + expect(store.catalogiItem).toBeInstanceOf(Catalogi) + expect(store.catalogiItem).toEqual(testData[0]) + + expect(store.catalogiItem.validate()).toBe(true) + }, + ) + + it( + 'sets catalogi list correctly', () => { + const store = useCatalogiStore() + + store.setCatalogiList(testData) + + expect(store.catalogiList).toHaveLength(testData.length) + + // list item 1 + expect(store.catalogiList[0]).toBeInstanceOf(Catalogi) + expect(store.catalogiList[0]).toEqual(testData[0]) + + expect(store.catalogiList[0].validate()).toBe(true) + + // list item 2 + expect(store.catalogiList[1]).toBeInstanceOf(Catalogi) + expect(store.catalogiList[1].id).toBe(testData[1].id) + expect(store.catalogiList[1].title).toBe(testData[1].title) + expect(store.catalogiList[1].summary).toBe(testData[1].summary) + expect(store.catalogiList[1].description).toBe(testData[1].description) + expect(store.catalogiList[1].image).toBe('') + expect(store.catalogiList[1].search).toBe('') + + expect(store.catalogiList[1].validate()).toBe(true) + + // list item 3 + expect(store.catalogiList[2]).toBeInstanceOf(Catalogi) + expect(store.catalogiList[2].id).toBe(testData[2].id) + expect(store.catalogiList[2].title).toBe('') + expect(store.catalogiList[2].summary).toBe(testData[2].summary) + expect(store.catalogiList[2].description).toBe(testData[2].description) + expect(store.catalogiList[2].image).toBe(testData[2].image) + expect(store.catalogiList[2].search).toBe(testData[2].search) + + expect(store.catalogiList[2].validate()).toBe(false) // id, title and summary are required, causing a falsy result + }, + ) + }, ) const testData = [ - { - id: '1', - title: 'Decat', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, - { - id: '2', - title: 'Woo', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - }, - { - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, - ] + { + id: '1', + title: 'Decat', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + search: 'string', + }, + { + id: '2', + title: 'Woo', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + }, + { + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + search: 'string', + }, +] diff --git a/src/store/modules/directory.js b/src/store/modules/directory.js index 7c2044b0..eb2a32bd 100644 --- a/src/store/modules/directory.js +++ b/src/store/modules/directory.js @@ -3,50 +3,50 @@ import { defineStore } from 'pinia' import { Listing } from '../../entities/index.js' export const useDirectoryStore = defineStore( - 'directory', { - state: () => ({ - listingItem: false, - listingList: [], - }), - actions: { - setListingItem(listingItem) { - this.listingItem = listingItem && new Listing(listingItem) - console.log('Active directory item set to ' + listingItem && listingItem.id) - }, - setListingList(listingList) { - this.listingList = listingList.map( - (listingItem) => new Listing(listingItem), - ) - console.log('Active directory item set to ' + listingList.length) - }, - async refreshListingList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/directory' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, { - method: 'GET', - } - ) - .then( - (response) => { - response.json().then( - (data) => { - this.listingList = data.results.map( - (listingItem) => new Listing(listingItem), - ) - } - ) - } - ) - .catch( - (err) => { - console.error(err) - } - ) - }, - }, - } + 'directory', { + state: () => ({ + listingItem: false, + listingList: [], + }), + actions: { + setListingItem(listingItem) { + this.listingItem = listingItem && new Listing(listingItem) + console.log('Active directory item set to ' + listingItem && listingItem.id) + }, + setListingList(listingList) { + this.listingList = listingList.map( + (listingItem) => new Listing(listingItem), + ) + console.log('Active directory item set to ' + listingList.length) + }, + async refreshListingList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/directory' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.listingList = data.results.map( + (listingItem) => new Listing(listingItem), + ) + }, + ) + }, + ) + .catch( + (err) => { + console.error(err) + }, + ) + }, + }, + }, ) diff --git a/src/store/modules/directory.spec.js b/src/store/modules/directory.spec.js index bc52d740..a3ca566e 100644 --- a/src/store/modules/directory.spec.js +++ b/src/store/modules/directory.spec.js @@ -5,109 +5,109 @@ import { useDirectoryStore } from './directory.js' import { Listing } from '../../entities/index.js' describe( - 'Directory Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - } - ) + 'Directory Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + }, + ) - it( - 'sets listing item correctly', () => { - const store = useDirectoryStore() + it( + 'sets listing item correctly', () => { + const store = useDirectoryStore() - store.setListingItem(testData[0]) + store.setListingItem(testData[0]) - expect(store.listingItem).toBeInstanceOf(Listing) - expect(store.listingItem).toEqual(testData[0]) - } - ) + expect(store.listingItem).toBeInstanceOf(Listing) + expect(store.listingItem).toEqual(testData[0]) + }, + ) - it( - 'sets listings list correctly', () => { - const store = useDirectoryStore() + it( + 'sets listings list correctly', () => { + const store = useDirectoryStore() - store.setListingList(testData) + store.setListingList(testData) - expect(store.listingList).toHaveLength(testData.length) + expect(store.listingList).toHaveLength(testData.length) - // list item 1 - expect(store.listingList[0]).toBeInstanceOf(Listing) - expect(store.listingList[0]).toEqual(testData[0]) + // list item 1 + expect(store.listingList[0]).toBeInstanceOf(Listing) + expect(store.listingList[0]).toEqual(testData[0]) - expect(store.listingList[0].validate()).toBe(true) + expect(store.listingList[0].validate()).toBe(true) - // list item 2 - expect(store.listingList[1]).toBeInstanceOf(Listing) - expect(store.listingList[1].id).toBe(testData[1].id) - expect(store.listingList[1].title).toBe(testData[1].title) - expect(store.listingList[1].summary).toBe(testData[1].summary) - expect(store.listingList[1].description).toBe(testData[1].description) - expect(store.listingList[1].search).toBe('') - expect(store.listingList[1].directory).toBe(testData[1].directory) - expect(store.listingList[1].metadata).toBe('') - expect(store.listingList[1].status).toBe('') - expect(store.listingList[1].lastSync).toBe(testData[1].lastSync) - expect(store.listingList[1].default).toBe(testData[1].default) - expect(store.listingList[1].available).toBe(testData[1].available) + // list item 2 + expect(store.listingList[1]).toBeInstanceOf(Listing) + expect(store.listingList[1].id).toBe(testData[1].id) + expect(store.listingList[1].title).toBe(testData[1].title) + expect(store.listingList[1].summary).toBe(testData[1].summary) + expect(store.listingList[1].description).toBe(testData[1].description) + expect(store.listingList[1].search).toBe('') + expect(store.listingList[1].directory).toBe(testData[1].directory) + expect(store.listingList[1].metadata).toBe('') + expect(store.listingList[1].status).toBe('') + expect(store.listingList[1].lastSync).toBe(testData[1].lastSync) + expect(store.listingList[1].default).toBe(testData[1].default) + expect(store.listingList[1].available).toBe(testData[1].available) - expect(store.listingList[1].validate()).toBe(true) + expect(store.listingList[1].validate()).toBe(true) - // list item 3 - expect(store.listingList[2]).toBeInstanceOf(Listing) - expect(store.listingList[2].id).toBe(testData[2].id) - expect(store.listingList[2].title).toBe('') - expect(store.listingList[2].summary).toBe(testData[2].summary) - expect(store.listingList[2].description).toBe(testData[2].description) - expect(store.listingList[2].search).toBe(testData[2].search) - expect(store.listingList[2].directory).toBe(testData[2].directory) - expect(store.listingList[2].metadata).toBe(testData[2].metadata) - expect(store.listingList[2].status).toBe(testData[2].status) - expect(store.listingList[2].lastSync).toBe(testData[2].lastSync) - expect(store.listingList[2].default).toBe(testData[2].default) - expect(store.listingList[2].available).toBe(testData[2].available) + // list item 3 + expect(store.listingList[2]).toBeInstanceOf(Listing) + expect(store.listingList[2].id).toBe(testData[2].id) + expect(store.listingList[2].title).toBe('') + expect(store.listingList[2].summary).toBe(testData[2].summary) + expect(store.listingList[2].description).toBe(testData[2].description) + expect(store.listingList[2].search).toBe(testData[2].search) + expect(store.listingList[2].directory).toBe(testData[2].directory) + expect(store.listingList[2].metadata).toBe(testData[2].metadata) + expect(store.listingList[2].status).toBe(testData[2].status) + expect(store.listingList[2].lastSync).toBe(testData[2].lastSync) + expect(store.listingList[2].default).toBe(testData[2].default) + expect(store.listingList[2].available).toBe(testData[2].available) - expect(store.listingList[2].validate()).toBe(false) - } - ) - } + expect(store.listingList[2].validate()).toBe(false) + }, + ) + }, ) const testData = [ - { // full data - id: '1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'active', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, - { // partial data - id: '2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - directory: 'string', - lastSync: '2024-07-25T00:00:00Z', - default: 'yes', - available: 'no', - }, - { // invalid data - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'pending', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, - ] + { // full data + id: '1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'string', + directory: 'string', + metadata: 'string', + status: 'active', + lastSync: '2024-07-25T00:00:00Z', + default: 'no', + available: 'yes', + }, + { // partial data + id: '2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + directory: 'string', + lastSync: '2024-07-25T00:00:00Z', + default: 'yes', + available: 'no', + }, + { // invalid data + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'string', + directory: 'string', + metadata: 'string', + status: 'pending', + lastSync: '2024-07-25T00:00:00Z', + default: 'no', + available: 'yes', + }, +] diff --git a/src/store/modules/metadata.js b/src/store/modules/metadata.js index 63a22302..1426eb4b 100644 --- a/src/store/modules/metadata.js +++ b/src/store/modules/metadata.js @@ -3,81 +3,81 @@ import { defineStore } from 'pinia' import { Metadata } from '../../entities/index.js' export const useMetadataStore = defineStore( - 'metadata', { - state: () => ({ - metaDataItem: false, - metaDataList: [], - metadataDataKey: false, - }), - actions: { - setMetaDataItem(metaDataItem) { - this.metaDataItem = metaDataItem && new Metadata(metaDataItem) + 'metadata', { + state: () => ({ + metaDataItem: false, + metaDataList: [], + metadataDataKey: false, + }), + actions: { + setMetaDataItem(metaDataItem) { + this.metaDataItem = metaDataItem && new Metadata(metaDataItem) - // for backward compatibility - if (typeof this.metaDataItem?.properties === 'string') { - this.metaDataItem.properties = JSON.parse(this.metaDataItem.properties) - } + // for backward compatibility + if (typeof this.metaDataItem?.properties === 'string') { + this.metaDataItem.properties = JSON.parse(this.metaDataItem.properties) + } - console.log('Active metadata object set to ' + metaDataItem && metaDataItem.id) - }, - setMetaDataList(metaDataList) { - this.metaDataList = metaDataList.map( - (metadataItem) => new Metadata(metadataItem), - ) - console.log('Active metadata lest set') - }, - async refreshMetaDataList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/metadata' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.metaDataList = data.results.map( - (metadataItem) => new Metadata(metadataItem), - ) - return data - } - ) - } - ) - .catch( - (err) => { - console.error(err) - return err - } - ) - }, - setMetadataDataKey(metadataDataKey) { - this.metadataDataKey = metadataDataKey - console.log('Active metadata data key set to ' + metadataDataKey) - }, - getMetadataPropertyKeys(property) { - const defaultKeys = { - type: '', - description: '', - format: '', - maxDate: '', - required: false, - default: false, - $ref: '', // $ref should probably be removed as it is not mentioned in the schema - cascadeDelete: false, - exclusiveMinimum: 0, - } + console.log('Active metadata object set to ' + metaDataItem && metaDataItem.id) + }, + setMetaDataList(metaDataList) { + this.metaDataList = metaDataList.map( + (metadataItem) => new Metadata(metadataItem), + ) + console.log('Active metadata lest set') + }, + async refreshMetaDataList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/metadata' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.metaDataList = data.results.map( + (metadataItem) => new Metadata(metadataItem), + ) + return data + }, + ) + }, + ) + .catch( + (err) => { + console.error(err) + return err + }, + ) + }, + setMetadataDataKey(metadataDataKey) { + this.metadataDataKey = metadataDataKey + console.log('Active metadata data key set to ' + metadataDataKey) + }, + getMetadataPropertyKeys(property) { + const defaultKeys = { + type: '', + description: '', + format: '', + maxDate: '', + required: false, + default: false, + $ref: '', // $ref should probably be removed as it is not mentioned in the schema + cascadeDelete: false, + exclusiveMinimum: 0, + } - const propertyKeys = this.metaDataItem.properties[property] + const propertyKeys = this.metaDataItem.properties[property] - return { ...defaultKeys, ...propertyKeys } - }, - }, - } - ) + return { ...defaultKeys, ...propertyKeys } + }, + }, + }, +) diff --git a/src/store/modules/metadata.spec.js b/src/store/modules/metadata.spec.js index 84c69214..0f26eb79 100644 --- a/src/store/modules/metadata.spec.js +++ b/src/store/modules/metadata.spec.js @@ -4,177 +4,177 @@ import { setActivePinia, createPinia } from 'pinia' import { useMetadataStore } from './metadata.js' describe( - 'Metadata Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - } - ) - - it( - 'sets metadata item correctly', () => { - const store = useMetadataStore() - const metadataItem = { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test listing', - description: 'this is a very long description for test listing', - version: '0.0.1', - properties: { - sasds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - }, - } - - store.setMetaDataItem(metadataItem) - - expect(store.metaDataItem).toEqual(metadataItem) - } - ) - - it( - 'sets metadata item with string "properties" property', () => { - const store = useMetadataStore() - const metadataItem = { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test listing', - description: 'this is a very long description for test listing', - version: '0.0.1', - properties: '{"sasds":{"type":"string","description":"property description","format":"a format","maxDate":"2025-07-13","required":false,"default":false,"cascadeDelete":false,"exclusiveMinimum":"2"}}', - } - - store.setMetaDataItem(metadataItem) - - expect(store.metaDataItem.id).toBe('1') - expect(store.metaDataItem.name).toBe('Test metadata name') - expect(store.metaDataItem.title).toBe('Test metadata') - expect(store.metaDataItem.summary).toBe('This is a test listing') - expect(store.metaDataItem.description).toBe('this is a very long description for test listing') - expect(store.metaDataItem.version).toBe('0.0.1') - // properties - expect(store.metaDataItem.properties.sasds.type).toBe('string') - expect(store.metaDataItem.properties.sasds.description).toBe('property description') - expect(store.metaDataItem.properties.sasds.format).toBe('a format') - expect(store.metaDataItem.properties.sasds.maxDate).toBe('2025-07-13') - expect(store.metaDataItem.properties.sasds.required).toBe(false) - expect(store.metaDataItem.properties.sasds.default).toBe(false) - expect(store.metaDataItem.properties.sasds.cascadeDelete).toBe(false) - expect(store.metaDataItem.properties.sasds.exclusiveMinimum).toBe('2') - } - ) - - it( - 'sets metadata list correctly', () => { - const store = useMetadataStore() - const metadataList = [ - { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - properties: { - sasds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - gfdgds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - }, - }, - { - id: '2', - name: 'Test metadata naming', - title: 'Test metadata aaaa', - summary: 'This is a test metadata baaa da daaa', - description: 'this is a very long descriptio-', - version: '0.0.1', - properties: {}, - }, - ] - - store.setMetaDataList(metadataList) - - expect(store.metaDataList).toHaveLength(metadataList.length) - store.metaDataList.forEach( - (item, index) => { - expect(item).toEqual(metadataList[index]) - } - ) - } - ) - - it( - 'get metadata property from key', () => { - const store = useMetadataStore() - const metadataItem = { - id: '1', - name: 'Test metadata name', - title: 'Test metadata', - summary: 'This is a test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - properties: { - sasds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - $ref: '', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - gfdgds: { - type: 'string', - description: 'property description', - format: 'a format', - maxDate: '2025-07-13', - required: false, - default: false, - cascadeDelete: false, - exclusiveMinimum: '2', - }, - }, - } - - store.setMetaDataItem(metadataItem) - store.setMetadataDataKey('sasds') - - expect(store.metaDataItem).toEqual(metadataItem) - expect(store.metadataDataKey).toBe('sasds') - - const properties = store.getMetadataPropertyKeys('sasds') - - expect(properties).toEqual(metadataItem.properties.sasds) - } - ) - } + 'Metadata Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + }, + ) + + it( + 'sets metadata item correctly', () => { + const store = useMetadataStore() + const metadataItem = { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test listing', + description: 'this is a very long description for test listing', + version: '0.0.1', + properties: { + sasds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + }, + } + + store.setMetaDataItem(metadataItem) + + expect(store.metaDataItem).toEqual(metadataItem) + }, + ) + + it( + 'sets metadata item with string "properties" property', () => { + const store = useMetadataStore() + const metadataItem = { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test listing', + description: 'this is a very long description for test listing', + version: '0.0.1', + properties: '{"sasds":{"type":"string","description":"property description","format":"a format","maxDate":"2025-07-13","required":false,"default":false,"cascadeDelete":false,"exclusiveMinimum":"2"}}', + } + + store.setMetaDataItem(metadataItem) + + expect(store.metaDataItem.id).toBe('1') + expect(store.metaDataItem.name).toBe('Test metadata name') + expect(store.metaDataItem.title).toBe('Test metadata') + expect(store.metaDataItem.summary).toBe('This is a test listing') + expect(store.metaDataItem.description).toBe('this is a very long description for test listing') + expect(store.metaDataItem.version).toBe('0.0.1') + // properties + expect(store.metaDataItem.properties.sasds.type).toBe('string') + expect(store.metaDataItem.properties.sasds.description).toBe('property description') + expect(store.metaDataItem.properties.sasds.format).toBe('a format') + expect(store.metaDataItem.properties.sasds.maxDate).toBe('2025-07-13') + expect(store.metaDataItem.properties.sasds.required).toBe(false) + expect(store.metaDataItem.properties.sasds.default).toBe(false) + expect(store.metaDataItem.properties.sasds.cascadeDelete).toBe(false) + expect(store.metaDataItem.properties.sasds.exclusiveMinimum).toBe('2') + }, + ) + + it( + 'sets metadata list correctly', () => { + const store = useMetadataStore() + const metadataList = [ + { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + properties: { + sasds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + gfdgds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + }, + }, + { + id: '2', + name: 'Test metadata naming', + title: 'Test metadata aaaa', + summary: 'This is a test metadata baaa da daaa', + description: 'this is a very long descriptio-', + version: '0.0.1', + properties: {}, + }, + ] + + store.setMetaDataList(metadataList) + + expect(store.metaDataList).toHaveLength(metadataList.length) + store.metaDataList.forEach( + (item, index) => { + expect(item).toEqual(metadataList[index]) + }, + ) + }, + ) + + it( + 'get metadata property from key', () => { + const store = useMetadataStore() + const metadataItem = { + id: '1', + name: 'Test metadata name', + title: 'Test metadata', + summary: 'This is a test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + properties: { + sasds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + $ref: '', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + gfdgds: { + type: 'string', + description: 'property description', + format: 'a format', + maxDate: '2025-07-13', + required: false, + default: false, + cascadeDelete: false, + exclusiveMinimum: '2', + }, + }, + } + + store.setMetaDataItem(metadataItem) + store.setMetadataDataKey('sasds') + + expect(store.metaDataItem).toEqual(metadataItem) + expect(store.metadataDataKey).toBe('sasds') + + const properties = store.getMetadataPropertyKeys('sasds') + + expect(properties).toEqual(metadataItem.properties.sasds) + }, + ) + }, ) diff --git a/src/store/modules/navigation.js b/src/store/modules/navigation.js index c32a2b03..656c26d1 100644 --- a/src/store/modules/navigation.js +++ b/src/store/modules/navigation.js @@ -2,34 +2,34 @@ import { defineStore } from 'pinia' export const useNavigationStore = defineStore( - 'ui', { - state: () => ({ - // The currently active menu item, defaults to '' which triggers the dashboard - selected: 'dashboard', - // The currently selected catalogi within 'publications' - selectedCatalogus: false, - // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time - modal: false, - // The currently active dialog - dialog: false, - }), - actions: { - setSelected(selected) { - this.selected = selected - console.log('Active menu item set to ' + selected) - }, - setSelectedCatalogus(selectedCatalogus) { - this.selectedCatalogus = selectedCatalogus - console.log('Active catalogus menu set to ' + selectedCatalogus) - }, - setModal(modal) { - this.modal = modal - console.log('Active modal set to ' + modal) - }, - setDialog(dialog) { - this.dialog = dialog - console.log('Active dialog set to ' + dialog) - }, - }, - } + 'ui', { + state: () => ({ + // The currently active menu item, defaults to '' which triggers the dashboard + selected: 'dashboard', + // The currently selected catalogi within 'publications' + selectedCatalogus: false, + // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time + modal: false, + // The currently active dialog + dialog: false, + }), + actions: { + setSelected(selected) { + this.selected = selected + console.log('Active menu item set to ' + selected) + }, + setSelectedCatalogus(selectedCatalogus) { + this.selectedCatalogus = selectedCatalogus + console.log('Active catalogus menu set to ' + selectedCatalogus) + }, + setModal(modal) { + this.modal = modal + console.log('Active modal set to ' + modal) + }, + setDialog(dialog) { + this.dialog = dialog + console.log('Active dialog set to ' + dialog) + }, + }, + }, ) diff --git a/src/store/modules/navigation.spec.js b/src/store/modules/navigation.spec.js index 4601b809..73f2e8ff 100644 --- a/src/store/modules/navigation.spec.js +++ b/src/store/modules/navigation.spec.js @@ -4,71 +4,71 @@ import { setActivePinia, createPinia } from 'pinia' import { useNavigationStore } from './navigation.js' describe( - 'Navigation Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - } - ) + 'Navigation Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + }, + ) - it( - 'set current selected view correctly', () => { - const store = useNavigationStore() + it( + 'set current selected view correctly', () => { + const store = useNavigationStore() - store.setSelected('publication') - expect(store.selected).toBe('publication') + store.setSelected('publication') + expect(store.selected).toBe('publication') - store.setSelected('catalogi') - expect(store.selected).toBe('catalogi') + store.setSelected('catalogi') + expect(store.selected).toBe('catalogi') - store.setSelected('metadata') - expect(store.selected).toBe('metadata') - } - ) + store.setSelected('metadata') + expect(store.selected).toBe('metadata') + }, + ) - it( - 'set current selected publication catalogi correctly', () => { - const store = useNavigationStore() + it( + 'set current selected publication catalogi correctly', () => { + const store = useNavigationStore() - store.setSelectedCatalogus('7a048bfd-210f-4e93-a1e8-5aa9261740b7') - expect(store.selectedCatalogus).toBe('7a048bfd-210f-4e93-a1e8-5aa9261740b7') + store.setSelectedCatalogus('7a048bfd-210f-4e93-a1e8-5aa9261740b7') + expect(store.selectedCatalogus).toBe('7a048bfd-210f-4e93-a1e8-5aa9261740b7') - store.setSelectedCatalogus('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') - expect(store.selectedCatalogus).toBe('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') + store.setSelectedCatalogus('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') + expect(store.selectedCatalogus).toBe('dd133c51-89bc-4b06-bdbb-41f4dc07c4f1') - store.setSelectedCatalogus('3b1cbee2-756e-4904-a157-29fb0cbe01d3') - expect(store.selectedCatalogus).toBe('3b1cbee2-756e-4904-a157-29fb0cbe01d3') - } - ) + store.setSelectedCatalogus('3b1cbee2-756e-4904-a157-29fb0cbe01d3') + expect(store.selectedCatalogus).toBe('3b1cbee2-756e-4904-a157-29fb0cbe01d3') + }, + ) - it( - 'set modal correctly', () => { - const store = useNavigationStore() + it( + 'set modal correctly', () => { + const store = useNavigationStore() - store.setModal('editPublication') - expect(store.modal).toBe('editPublication') + store.setModal('editPublication') + expect(store.modal).toBe('editPublication') - store.setModal('editCatalogi') - expect(store.modal).toBe('editCatalogi') + store.setModal('editCatalogi') + expect(store.modal).toBe('editCatalogi') - store.setModal('editMetadata') - expect(store.modal).toBe('editMetadata') - } - ) + store.setModal('editMetadata') + expect(store.modal).toBe('editMetadata') + }, + ) - it( - 'set modal correctly', () => { - const store = useNavigationStore() + it( + 'set modal correctly', () => { + const store = useNavigationStore() - store.setDialog('deletePublication') - expect(store.dialog).toBe('deletePublication') + store.setDialog('deletePublication') + expect(store.dialog).toBe('deletePublication') - store.setDialog('deleteCatalogi') - expect(store.dialog).toBe('deleteCatalogi') + store.setDialog('deleteCatalogi') + expect(store.dialog).toBe('deleteCatalogi') - store.setDialog('deleteMetadata') - expect(store.dialog).toBe('deleteMetadata') - } - ) - } + store.setDialog('deleteMetadata') + expect(store.dialog).toBe('deleteMetadata') + }, + ) + }, ) diff --git a/src/store/modules/publication.js b/src/store/modules/publication.js index b63de4f2..53b0d490 100644 --- a/src/store/modules/publication.js +++ b/src/store/modules/publication.js @@ -3,138 +3,138 @@ import { Attachment, Publication } from '../../entities/index.js' import { defineStore } from 'pinia' export const usePublicationStore = defineStore( - 'publication', { - state: () => ({ - publicationItem: false, - publicationList: [], - publicationDataKey: false, - attachmentItem: false, - publicationAttachments: [], - conceptPublications: [], - conceptAttachments: [], - }), - actions: { - setPublicationItem(publicationItem) { - // To prevent forms etc from braking we alway use a default/skeleton object - this.publicationItem = publicationItem && new Publication(publicationItem) - console.log('Active publication item set to ' + publicationItem && publicationItem.id) - }, - setPublicationList(publicationList) { - this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) - console.log('Active publication item set to ' + publicationList.length) - }, - async refreshPublicationList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/opencatalogi/api/publications' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch( - endpoint, - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.setPublicationList(data?.results) - return data - } - ) - } - ) - .catch( - (err) => { - console.error(err) - return err - } - ) - }, - getPublicationAttachments(publication) { // @todo this might belong in a service? - fetch( - '/index.php/apps/opencatalogi/api/attachments', - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.publicationAttachments = data.results.map( - (attachmentItem) => new Attachment(attachmentItem), - ) - return data - } - ) - } - ) - .catch( - (err) => { - console.error(err) - return err - } - ) - }, - getConceptPublications() { // @todo this might belong in a service? - fetch( - '/index.php/apps/opencatalogi/api/publications?status=concept', - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.conceptPublications = data - return data - } - ) - } - ) - .catch( - (err) => { - console.error(err) - return err - } - ) - }, - getConceptAttachments() { // @todo this might belong in a service? - fetch( - '/index.php/apps/opencatalogi/api/attachments?status=concept', - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.conceptAttachments = data - return data - } - ) - } - ) - .catch( - (err) => { - console.error(err) - return err - } - ) - }, - // @todo why does the following run through the store? -- because its impossible with props, and its vital information for the modal. - setPublicationDataKey(publicationDataKey) { - this.publicationDataKey = publicationDataKey - console.log('Active publication data key set to ' + publicationDataKey) - }, - setAttachmentItem(attachmentItem) { - this.attachmentItem = attachmentItem && new Attachment(attachmentItem) - console.log('Active attachment item set to ' + attachmentItem) - }, - }, - } + 'publication', { + state: () => ({ + publicationItem: false, + publicationList: [], + publicationDataKey: false, + attachmentItem: false, + publicationAttachments: [], + conceptPublications: [], + conceptAttachments: [], + }), + actions: { + setPublicationItem(publicationItem) { + // To prevent forms etc from braking we alway use a default/skeleton object + this.publicationItem = publicationItem && new Publication(publicationItem) + console.log('Active publication item set to ' + publicationItem && publicationItem.id) + }, + setPublicationList(publicationList) { + this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) + console.log('Active publication item set to ' + publicationList.length) + }, + async refreshPublicationList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/publications' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.setPublicationList(data?.results) + return data + }, + ) + }, + ) + .catch( + (err) => { + console.error(err) + return err + }, + ) + }, + getPublicationAttachments(publication) { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments', + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.publicationAttachments = data.results.map( + (attachmentItem) => new Attachment(attachmentItem), + ) + return data + }, + ) + }, + ) + .catch( + (err) => { + console.error(err) + return err + }, + ) + }, + getConceptPublications() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/publications?status=concept', + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.conceptPublications = data + return data + }, + ) + }, + ) + .catch( + (err) => { + console.error(err) + return err + }, + ) + }, + getConceptAttachments() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments?status=concept', + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.conceptAttachments = data + return data + }, + ) + }, + ) + .catch( + (err) => { + console.error(err) + return err + }, + ) + }, + // @todo why does the following run through the store? -- because its impossible with props, and its vital information for the modal. + setPublicationDataKey(publicationDataKey) { + this.publicationDataKey = publicationDataKey + console.log('Active publication data key set to ' + publicationDataKey) + }, + setAttachmentItem(attachmentItem) { + this.attachmentItem = attachmentItem && new Attachment(attachmentItem) + console.log('Active attachment item set to ' + attachmentItem) + }, + }, + }, ) diff --git a/src/store/modules/publication.spec.js b/src/store/modules/publication.spec.js index 187eb7e5..c96c1372 100644 --- a/src/store/modules/publication.spec.js +++ b/src/store/modules/publication.spec.js @@ -5,228 +5,228 @@ import { usePublicationStore } from './publication.js' import { Attachment, Publication } from '../../entities/index.js' describe( - 'Metadata Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - } - ) + 'Metadata Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + }, + ) - it( - 'sets publication item correctly', () => { - const store = usePublicationStore() + it( + 'sets publication item correctly', () => { + const store = usePublicationStore() - store.setPublicationItem(testData[0]) + store.setPublicationItem(testData[0]) - expect(store.publicationItem).toBeInstanceOf(Publication) - expect(store.publicationItem).toEqual(testData[0]) - expect(store.publicationItem.validate()).toBe(true) + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[0]) + expect(store.publicationItem.validate()).toBe(true) - store.setPublicationItem(testData[1]) + store.setPublicationItem(testData[1]) - expect(store.publicationItem).toBeInstanceOf(Publication) - expect(store.publicationItem).not.toEqual(testData[1]) - expect(store.publicationItem.validate()).toBe(true) + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).not.toEqual(testData[1]) + expect(store.publicationItem.validate()).toBe(true) - store.setPublicationItem(testData[2]) + store.setPublicationItem(testData[2]) - expect(store.publicationItem).toBeInstanceOf(Publication) - expect(store.publicationItem).toEqual(testData[2]) - expect(store.publicationItem.validate()).toBe(false) - } - ) + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[2]) + expect(store.publicationItem.validate()).toBe(false) + }, + ) - it( - 'sets publication list correctly', () => { - const store = usePublicationStore() + it( + 'sets publication list correctly', () => { + const store = usePublicationStore() - store.setPublicationList(testData) + store.setPublicationList(testData) - expect(store.publicationList).toHaveLength(testData.length) + expect(store.publicationList).toHaveLength(testData.length) - expect(store.publicationList[0]).toBeInstanceOf(Publication) - expect(store.publicationList[0]).toEqual(testData[0]) - expect(store.publicationList[0].validate()).toBe(true) + expect(store.publicationList[0]).toBeInstanceOf(Publication) + expect(store.publicationList[0]).toEqual(testData[0]) + expect(store.publicationList[0].validate()).toBe(true) - expect(store.publicationList[1]).toBeInstanceOf(Publication) - expect(store.publicationList[1]).not.toEqual(testData[1]) - expect(store.publicationList[1].validate()).toBe(true) + expect(store.publicationList[1]).toBeInstanceOf(Publication) + expect(store.publicationList[1]).not.toEqual(testData[1]) + expect(store.publicationList[1].validate()).toBe(true) - expect(store.publicationList[2]).toBeInstanceOf(Publication) - expect(store.publicationList[2]).toEqual(testData[2]) - expect(store.publicationList[2].validate()).toBe(false) - } - ) + expect(store.publicationList[2]).toBeInstanceOf(Publication) + expect(store.publicationList[2]).toEqual(testData[2]) + expect(store.publicationList[2].validate()).toBe(false) + }, + ) - // TODO: fix this - it( - 'set publication data.data property key correctly', () => { - const store = usePublicationStore() + // TODO: fix this + it( + 'set publication data.data property key correctly', () => { + const store = usePublicationStore() - store.setPublicationDataKey('contactPoint') + store.setPublicationDataKey('contactPoint') - expect(store.publicationDataKey).toBe('contactPoint') - } - ) + expect(store.publicationDataKey).toBe('contactPoint') + }, + ) - it( - 'set attachment item correctly', () => { - const store = usePublicationStore() + it( + 'set attachment item correctly', () => { + const store = usePublicationStore() - store.setAttachmentItem(attachmentTestData[0]) + store.setAttachmentItem(attachmentTestData[0]) - expect(store.attachmentItem).toBeInstanceOf(Attachment) - expect(store.attachmentItem).toEqual(attachmentTestData[0]) - expect(store.attachmentItem.validate()).toBe(true) + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[0]) + expect(store.attachmentItem.validate()).toBe(true) - store.setAttachmentItem(attachmentTestData[1]) + store.setAttachmentItem(attachmentTestData[1]) - expect(store.attachmentItem).toBeInstanceOf(Attachment) - expect(store.attachmentItem).not.toEqual(attachmentTestData[1]) - expect(store.attachmentItem.validate()).toBe(true) + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).not.toEqual(attachmentTestData[1]) + expect(store.attachmentItem.validate()).toBe(true) - store.setAttachmentItem(attachmentTestData[2]) + store.setAttachmentItem(attachmentTestData[2]) - expect(store.attachmentItem).toBeInstanceOf(Attachment) - expect(store.attachmentItem).toEqual(attachmentTestData[2]) - expect(store.attachmentItem.validate()).toBe(false) - } - ) - } + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[2]) + expect(store.attachmentItem.validate()).toBe(false) + }, + ) + }, ) const testData = [ - { // full data - id: '1', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category1', - portal: 'portal1', - catalogi: 'catalogi1', - metaData: 'meta1', - publicationDate: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: [{ name: 'Org1' }], - data: [{ key: 'value1' }], - attachments: ['attachment1'], - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: 'theme1', - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - }, - { // partial data - id: '2', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category2', - portal: 'portal2', - catalogi: 'catalogi2', - metaData: 'meta2', - publicationDate: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: [{ name: 'Org1' }], - data: [{ key: 'value1' }], - attachments: ['attachment1'], - attachmentCount: 1, - - themes: 'theme1', - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - }, - { // invalid data - id: '3', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category3', - portal: 'portal3', - catalogi: 'catalogi3', - metaData: 'meta3', - publicationDate: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: [{ name: 'Org1' }], - data: [{ key: 'value1' }], - attachments: ['attachment1'], - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: 'theme1', - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - }, - ] - - const attachmentTestData = [ - { // full data - id: '9044ab1e-cf5a-490a-be74-6be7a0c48a5f', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag1' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, - { // partial data - id: 'f849f287-492d-4100-91e1-1c4137f0abb5', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag2' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - license: 'MIT', - }, - { // invalid data - id: 'e193ea6b-1222-44cf-a71c-6ddcc232a79b', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag3' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, - ] + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category1', + portal: 'portal1', + catalogi: 'catalogi1', + metaData: 'meta1', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // partial data + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category2', + portal: 'portal2', + catalogi: 'catalogi2', + metaData: 'meta2', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // invalid data + id: '3', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category3', + portal: 'portal3', + catalogi: 'catalogi3', + metaData: 'meta3', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, +] + +const attachmentTestData = [ + { // full data + id: '9044ab1e-cf5a-490a-be74-6be7a0c48a5f', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag1' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, + { // partial data + id: 'f849f287-492d-4100-91e1-1c4137f0abb5', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag2' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + license: 'MIT', + }, + { // invalid data + id: 'e193ea6b-1222-44cf-a71c-6ddcc232a79b', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag3' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, +] diff --git a/src/store/modules/search.js b/src/store/modules/search.js index 78c393d2..0ad14f75 100644 --- a/src/store/modules/search.js +++ b/src/store/modules/search.js @@ -2,45 +2,45 @@ import { defineStore } from 'pinia' export const useSearchStore = defineStore( - 'search', { - state: () => ({ - search: '', - searchResults: '', - }), - actions: { - setSearch(search) { - this.search = search - console.log('Active search set to ' + search) - }, - setSearchResults(searchResults) { - this.searchResults = searchResults - console.log('Active search set to ' + searchResults) - }, - getSearchResults() { - fetch( - '/index.php/apps/opencatalogi/api/search?_search=' + this.search, - { - method: 'GET', - }, - ) - .then( - (response) => { - response.json().then( - (data) => { - this.searchResults = data - } - ) - } - ) - .catch( - (err) => { - console.error(err) - } - ) - }, - clearSearch() { - this.search = '' - }, - }, - } + 'search', { + state: () => ({ + search: '', + searchResults: '', + }), + actions: { + setSearch(search) { + this.search = search + console.log('Active search set to ' + search) + }, + setSearchResults(searchResults) { + this.searchResults = searchResults + console.log('Active search set to ' + searchResults) + }, + getSearchResults() { + fetch( + '/index.php/apps/opencatalogi/api/search?_search=' + this.search, + { + method: 'GET', + }, + ) + .then( + (response) => { + response.json().then( + (data) => { + this.searchResults = data + }, + ) + }, + ) + .catch( + (err) => { + console.error(err) + }, + ) + }, + clearSearch() { + this.search = '' + }, + }, + }, ) diff --git a/src/store/modules/search.spec.js b/src/store/modules/search.spec.js index 78923ff3..6fcf6305 100644 --- a/src/store/modules/search.spec.js +++ b/src/store/modules/search.spec.js @@ -4,48 +4,48 @@ import { setActivePinia, createPinia } from 'pinia' import { useSearchStore } from './search.js' describe( - 'Search Store', () => { - beforeEach( - () => { - setActivePinia(createPinia()) - } - ) - - it( - 'set search correctly', () => { - const store = useSearchStore() - - store.setSearch('cata') - expect(store.search).toBe('cata') - - store.setSearch('woo') - expect(store.search).toBe('woo') - - store.setSearch('foo bar') - expect(store.search).toBe('foo bar') - } - ) - - it( - 'set search result correctly', () => { - const store = useSearchStore() - - store.setSearchResults(['foo', 'bar', 'bux']) - expect(store.searchResults).toEqual(['foo', 'bar', 'bux']) - } - ) - - it( - 'clear search correctly', () => { - const store = useSearchStore() - - store.setSearch('Lorem ipsum dolor sit amet') - expect(store.search).toBe('Lorem ipsum dolor sit amet') - - store.clearSearch() - - expect(store.search).toBe('') - } - ) - } + 'Search Store', () => { + beforeEach( + () => { + setActivePinia(createPinia()) + }, + ) + + it( + 'set search correctly', () => { + const store = useSearchStore() + + store.setSearch('cata') + expect(store.search).toBe('cata') + + store.setSearch('woo') + expect(store.search).toBe('woo') + + store.setSearch('foo bar') + expect(store.search).toBe('foo bar') + }, + ) + + it( + 'set search result correctly', () => { + const store = useSearchStore() + + store.setSearchResults(['foo', 'bar', 'bux']) + expect(store.searchResults).toEqual(['foo', 'bar', 'bux']) + }, + ) + + it( + 'clear search correctly', () => { + const store = useSearchStore() + + store.setSearch('Lorem ipsum dolor sit amet') + expect(store.search).toBe('Lorem ipsum dolor sit amet') + + store.clearSearch() + + expect(store.search).toBe('') + }, + ) + }, ) diff --git a/src/store/store.js b/src/store/store.js index 2c5e1e35..f58c70a2 100644 --- a/src/store/store.js +++ b/src/store/store.js @@ -16,12 +16,12 @@ const metadataStore = useMetadataStore(pinia) const publicationStore = usePublicationStore(pinia) export { - // generic - navigationStore, - searchStore, - // feature-specific - catalogiStore, - directoryStore, - metadataStore, - publicationStore, + // generic + navigationStore, + searchStore, + // feature-specific + catalogiStore, + directoryStore, + metadataStore, + publicationStore, } From 5fb6964c70ad7b38ee965c1fa5fe16917a1d6ea0 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 5 Aug 2024 12:09:16 +0000 Subject: [PATCH 048/145] Update src from remark-lint --- package-lock.json | 3045 +++++++++++++++++++++++++++++++++++++++++---- package.json | 4 + 2 files changed, 2816 insertions(+), 233 deletions(-) diff --git a/package-lock.json b/package-lock.json index 67e081ec..9dbb1897 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,10 @@ "css-loader": "^6.8.1", "lodash": "^4.17.21", "pinia": "^2.1.7", + "remark-cli": "^12.0.1", + "remark-lint-list-item-indent": "^4.0.0", + "remark-preset-lint-consistent": "^6.0.0", + "remark-preset-lint-recommended": "^7.0.0", "style-loader": "^3.3.3", "vue": "^2.7.14", "vue-apexcharts": "^1.6.2", @@ -74,7 +78,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -441,7 +444,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -487,7 +489,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -2198,7 +2199,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -2215,7 +2215,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -2227,7 +2226,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "engines": { "node": ">=12" }, @@ -2238,14 +2236,12 @@ "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -2262,7 +2258,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -2277,7 +2272,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -3600,6 +3594,280 @@ "node": ">= 8" } }, + "node_modules/@npmcli/config": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.3.4.tgz", + "integrity": "sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/package-json": "^5.1.1", + "ci-info": "^4.0.0", + "ini": "^4.1.2", + "nopt": "^7.2.1", + "proc-log": "^4.2.0", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/ci-info": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/@npmcli/config/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/config/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", + "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/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", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/@npmcli/package-json/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, "node_modules/@nuxt/opencollective": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.3.tgz", @@ -3732,7 +4000,6 @@ "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" @@ -3833,6 +4100,14 @@ "@types/node": "*" } }, + "node_modules/@types/concat-stream": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-2.0.3.tgz", + "integrity": "sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -3899,6 +4174,14 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", @@ -3959,6 +4242,11 @@ "@types/node": "*" } }, + "node_modules/@types/is-empty": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/is-empty/-/is-empty-1.2.3.tgz", + "integrity": "sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -4179,6 +4467,16 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "node_modules/@types/supports-color": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz", + "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==" + }, + "node_modules/@types/text-table": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@types/text-table/-/text-table-0.2.5.tgz", + "integrity": "sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA==" + }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", @@ -4940,7 +5238,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -5132,7 +5429,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -5141,7 +5437,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -5153,7 +5448,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5887,8 +6181,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -5929,8 +6222,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "peer": true, "engines": { "node": ">=8" }, @@ -6081,7 +6372,6 @@ "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" } @@ -6090,7 +6380,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -6492,7 +6781,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6519,6 +6807,33 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -6531,8 +6846,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -6556,8 +6869,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -6671,6 +6982,15 @@ "node": ">= 0.12.0" } }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -6681,7 +7001,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -6689,8 +7008,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colord": { "version": "2.9.3", @@ -6814,6 +7132,33 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -7130,7 +7475,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -7886,8 +8230,7 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/editorconfig": { "version": "1.0.4", @@ -8011,8 +8354,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -8068,11 +8410,15 @@ "node": ">=4" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -8240,7 +8586,6 @@ "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" } @@ -9569,7 +9914,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9775,7 +10119,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -9791,7 +10134,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -9849,7 +10191,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -10229,7 +10570,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -10718,7 +11058,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, "engines": { "node": ">= 4" } @@ -10798,6 +11137,15 @@ "node": ">=8" } }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -10834,8 +11182,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -10903,6 +11250,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -10940,8 +11309,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -10960,8 +11328,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -11067,6 +11433,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -11083,11 +11458,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-empty": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", + "integrity": "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -11096,7 +11475,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -11130,7 +11508,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -11138,6 +11515,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -11172,7 +11558,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -11358,8 +11743,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", @@ -11471,7 +11855,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -13326,8 +13709,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -13438,7 +13820,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -13536,6 +13917,19 @@ "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==", "peer": true }, + "node_modules/load-plugin": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.3.tgz", + "integrity": "sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==", + "dependencies": { + "@npmcli/config": "^8.0.0", + "import-meta-resolve": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -13705,6 +14099,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/markdown-table": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", @@ -13752,6 +14157,38 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/mdast-comment-marker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-3.0.0.tgz", + "integrity": "sha512-bt08sLmTNg00/UtVDiqZKocxqvQqqyQZAg1uaRuO/4ysXV5motg7RolF5o5yy/sY1rG0v2XgZEqFWho1+2UquA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-mdx-expression": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", @@ -13896,6 +14333,35 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-heading-style": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-3.0.0.tgz", + "integrity": "sha512-tsUfM9Kj9msjlemA/38Z3pvraQay880E3zP2NgIthMoGcpU9bcPX9oSM6QC/+eFXGGB4ba+VCB1dKAPHB7Veug==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-newline-to-break": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz", @@ -14727,7 +15193,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -14765,7 +15230,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -14970,7 +15434,6 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, "dependencies": { "abbrev": "^2.0.0" }, @@ -15014,11 +15477,106 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.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==", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "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-pick-manifest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -15335,8 +15893,7 @@ "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, "node_modules/pako": { "version": "1.0.11", @@ -15376,6 +15933,30 @@ "node": ">= 0.10" } }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -15445,7 +16026,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -15460,7 +16040,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -15475,8 +16054,7 @@ "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -15520,7 +16098,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -15691,6 +16268,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, "node_modules/popper.js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", @@ -15895,6 +16480,14 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "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==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -15912,6 +16505,31 @@ "dev": true, "peer": true }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 4" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -16153,6 +16771,26 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/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", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/read-pkg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", @@ -16286,8 +16924,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -16555,6 +17191,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", + "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", + "dependencies": { + "@types/mdast": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-breaks": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz", @@ -16569,6 +17220,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-cli": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-12.0.1.tgz", + "integrity": "sha512-2NAEOACoTgo+e+YAaCTODqbrWyhMVmlUyjxNCkTrDRHHQvH6+NbrnqVvQaLH/Q8Ket3v90A43dgAJmXv8y5Tkw==", + "dependencies": { + "import-meta-resolve": "^4.0.0", + "markdown-extensions": "^2.0.0", + "remark": "^15.0.0", + "unified-args": "^11.0.0" + }, + "bin": { + "remark": "cli.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-gfm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", @@ -16586,6 +17255,456 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-lint": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-10.0.0.tgz", + "integrity": "sha512-E8yHHDOJ8b+qI0G49BRu24pe8t0fNNBWv8ENQJpCGNrVeTeyBIGEbaUe1yuF7OG8faA6PVpcN/pqWjzW9fcBWQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "remark-message-control": "^8.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-blockquote-indentation": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-4.0.0.tgz", + "integrity": "sha512-hdUvn+KsJbBKpY9jLY01PmfpJ/WGhLu9GJMXQGU8ADXJc+F5DWSgKAr6GQ1IUKqvGYdEML/KZ61WomWFUuecVA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-checkbox-character-style": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-checkbox-character-style/-/remark-lint-checkbox-character-style-5.0.0.tgz", + "integrity": "sha512-K0G/Nok59fb2q5KUxcemBVt+ymnhTkDVLJAatZ4PAh9At8y0DGctHdU27jWsuvO0Fs7Zy62Usk7IJE2VO89p1w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-code-block-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-code-block-style/-/remark-lint-code-block-style-4.0.0.tgz", + "integrity": "sha512-LKBKMVruEO0tzDnnnqi1TfUcnwY6Mo7cVtZM4E4pKt3KMhtvgU2wD68/MxDOEJd0pmnLrEgIadv74bY0gWhZpg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-emphasis-marker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-emphasis-marker/-/remark-lint-emphasis-marker-4.0.0.tgz", + "integrity": "sha512-xIRiB4PFWUOyIslN/UOPL6Lh+J0VD4R11+jo+W4hpGMNsg58l+2SgtdbinlXzDeoBxmaaka9n/sYpJ7cJWEIPQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-fenced-code-marker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-marker/-/remark-lint-fenced-code-marker-4.0.0.tgz", + "integrity": "sha512-WFN88Rx78m4/HSbW3Kx2XAYbVfzYns4bJd9qpwDD90DA3nc59zciYd01xi6Bk3n9vSs5gIlmG7xkwxVHHJ8KCA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-final-newline/-/remark-lint-final-newline-3.0.0.tgz", + "integrity": "sha512-NaPyn6FiOn3IV/6gIcwWfJmgraPT2IaVLjhakfPglZkKVfn/FrOfETyY8Bp+HLoSRI9967OH0yRDnK7/pPIWeQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "unified-lint-rule": "^3.0.0", + "vfile-location": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-hard-break-spaces": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-4.0.0.tgz", + "integrity": "sha512-zCTq7/xfM0ZL3bMopXse9DH2nk38wE1LrxmYwnTrqASBLnEAJWE2U2//tRGVMEBfSAnNvmIo96twz6zkLWjbGA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-heading-style/-/remark-lint-heading-style-4.0.0.tgz", + "integrity": "sha512-dQ6Jul5K0+aNUvrq4W7H0+osSoC9hsmwHZqBFq000+eMP/hWJqI8tuudw1rap8HHYuOsKLRbB5q+Fr7G+3Vw+Q==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-heading-style": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-link-title-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-link-title-style/-/remark-lint-link-title-style-4.0.0.tgz", + "integrity": "sha512-cihTO5dkhjMj/evYIDAvRdQHD82OQeF4fNAq8FLb81HmFKo77VlSF6CK55H1bvlZogfJG58uN/5d1tSsOdcEbg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-list-item-bullet-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-list-item-bullet-indent/-/remark-lint-list-item-bullet-indent-5.0.0.tgz", + "integrity": "sha512-qq22QaxsDjfsL7aWGIPmP3P0N99CJBQQW1+iSrhYAMCDzqVlw6I3wPNAeR6s8mcoeHT8YlT6eQH3V8xJ0SlW6w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-list-item-content-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-list-item-content-indent/-/remark-lint-list-item-content-indent-4.0.0.tgz", + "integrity": "sha512-L4GZgWQQ54qWKbnDle3dbEOtnq+qdmZJ70lpM3yMFEMHs4xejqPKsIoiYeUtIV0rYHHCWS7IlLzcgYUK9vENQw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-list-item-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-list-item-indent/-/remark-lint-list-item-indent-4.0.0.tgz", + "integrity": "sha512-Yd6/g8CH9e4vlPAPNgl7F575uKhP+pTo/qwGkE61GOcgEVNJ/529hjumUhyQ4sOAX0YAPAjxvq6fJvb4AhVOOA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-blockquote-without-marker": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-6.0.0.tgz", + "integrity": "sha512-fBhoTpkWcl5tG4FdwPdJIyb8XLrdr6MdLk1+K2BQ6Rom3rRsIYvuox4ohxOunNrXuth8xyw8kC6wDmODR44oFw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-directive": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-location": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-duplicate-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-duplicate-definitions/-/remark-lint-no-duplicate-definitions-4.0.0.tgz", + "integrity": "sha512-21fcOACkCyhNsHkedKlpvqIywYx+5zGR507bW8e59gzdGhTbnBwQ9du4ACmN9jxPTfIBhUVMz0bWezkGrHE7Bg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-heading-content-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-heading-content-indent/-/remark-lint-no-heading-content-indent-5.0.0.tgz", + "integrity": "sha512-psYSlD2BjcVkgpeXOLwPcYFBrbtJWp8E8JX1J4vSfoHPeY6aIxgYxXkf57cjGTApfRL8xawBmMDiF1FgQvpZYg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-literal-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-4.0.0.tgz", + "integrity": "sha512-rl/3Ai4Ax9IH/fRpOJZuXk1HgYX6oFTauhmBOilpqbq/YT2kN3FuXaneXdRfKv1bgMdHaLKxHWxGj/mDyA2n8w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-character": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-shortcut-reference-image": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-4.0.0.tgz", + "integrity": "sha512-YEiCpW5F/8/LZyxlOuVK2L/n0NJ1AB0AJK7oP39OVyEk3Xl7w+JQi6nZ3KiH6REh+PWGqKn6M0KEPL9cT/iAOw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-shortcut-reference-link": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-4.0.0.tgz", + "integrity": "sha512-6jka2Zz3I6G2MvDcKrwADYhTOxHMFMK854u1cfBEIH5/XnCCXROtoqiiDtbZw+NJqbmwsBKvGL4t2gnmEJUmgg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-undefined-references": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-undefined-references/-/remark-lint-no-undefined-references-5.0.0.tgz", + "integrity": "sha512-O0q8bHpRHK1T85oqO+uep4BkvQnZZp3y+wahDeeLLq9dCJfF56sq6Tt5OOTt1BAOZlpobS3OPQHUiJWYP6hX1w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-location": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-unused-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-unused-definitions/-/remark-lint-no-unused-definitions-4.0.0.tgz", + "integrity": "sha512-YCZ6k575NCTx7mnN+9ls0G6YgMsZHi0LYQqfLW8MNVHBtbpTBvfmk8I39bmsvuKWeBD98weZoXSDqIiIGg+Q/g==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-4.0.0.tgz", + "integrity": "sha512-xZ7Xppy5fzACH4b9h1b4lTzVtNY2AlUkNTfl1Oe6cIKN8tk3juFxN0wL2RpktPtSZ7iRIabzFmg6l8WPhlASJA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "micromark-util-character": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-value/-/remark-lint-ordered-list-marker-value-4.0.0.tgz", + "integrity": "sha512-7UjNU2Nv9LGEONTU9GPmTVoNoGKD5aL1X2xHzMbSJiTc50bfcazYqZawO+qj1pQ04WPhto1qHnl0HRB5wwSVwA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-phrasing": "^4.0.0", + "micromark-util-character": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-rule-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-rule-style/-/remark-lint-rule-style-4.0.0.tgz", + "integrity": "sha512-Kt7IHMB5IbLgRFKaFUmB895sV3PTD0MBgN9CvXKxr1wHFF43S6tabjFIBSoQqyJRlhH0S3rK6Lvopofa009gLg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-strong-marker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-strong-marker/-/remark-lint-strong-marker-4.0.0.tgz", + "integrity": "sha512-YcvuzakYhQWdCH+1E30sUY+wyvq+PNa77NZAMAYO/cS/pZczFB+q4Ccttw4Q+No/chX8oMfe0GYtm8dDWLei/g==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-table-cell-padding": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-table-cell-padding/-/remark-lint-table-cell-padding-5.0.0.tgz", + "integrity": "sha512-LNyiHDQZBIOqcQGG1tYsZHW7g0v8OyRmRgDrD5WEsMaAYfM6EiECUokN/Q4py9h4oM/2KUSrdZbtfuZmy87/kA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-message-control": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-8.0.0.tgz", + "integrity": "sha512-brpzOO+jdyE/mLqvqqvbogmhGxKygjpCUCG/PwSCU43+JZQ+RM+sSzkCWBcYvgF3KIAVNIoPsvXjBkzO7EdsYQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-comment-marker": "^3.0.0", + "unified-message-control": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -16601,6 +17720,58 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-preset-lint-consistent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/remark-preset-lint-consistent/-/remark-preset-lint-consistent-6.0.0.tgz", + "integrity": "sha512-W3fwxajdietwjnFyTH5x2le63hxWGVOXxIs7KjRqU+5wkkN6ZQyuwPeeomblmS9wQr50fkidhXNHNDyCXtqgxQ==", + "dependencies": { + "remark-lint": "^10.0.0", + "remark-lint-blockquote-indentation": "^4.0.0", + "remark-lint-checkbox-character-style": "^5.0.0", + "remark-lint-code-block-style": "^4.0.0", + "remark-lint-emphasis-marker": "^4.0.0", + "remark-lint-fenced-code-marker": "^4.0.0", + "remark-lint-heading-style": "^4.0.0", + "remark-lint-link-title-style": "^4.0.0", + "remark-lint-list-item-content-indent": "^4.0.0", + "remark-lint-ordered-list-marker-style": "^4.0.0", + "remark-lint-ordered-list-marker-value": "^4.0.0", + "remark-lint-rule-style": "^4.0.0", + "remark-lint-strong-marker": "^4.0.0", + "remark-lint-table-cell-padding": "^5.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-preset-lint-recommended": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/remark-preset-lint-recommended/-/remark-preset-lint-recommended-7.0.0.tgz", + "integrity": "sha512-A9aPDL78OO12xG2a83DVd+M2QzdBMjn545fbXj40BFJdpt9t//MADkPAwRfpMCBkKi+iECPUTFCb3Jm8SsFG2w==", + "dependencies": { + "remark-lint": "^10.0.0", + "remark-lint-final-newline": "^3.0.0", + "remark-lint-hard-break-spaces": "^4.0.0", + "remark-lint-list-item-bullet-indent": "^5.0.0", + "remark-lint-list-item-indent": "^4.0.0", + "remark-lint-no-blockquote-without-marker": "^6.0.0", + "remark-lint-no-duplicate-definitions": "^4.0.0", + "remark-lint-no-heading-content-indent": "^5.0.0", + "remark-lint-no-literal-urls": "^4.0.0", + "remark-lint-no-shortcut-reference-image": "^4.0.0", + "remark-lint-no-shortcut-reference-link": "^4.0.0", + "remark-lint-no-undefined-references": "^5.0.0", + "remark-lint-no-unused-definitions": "^4.0.0", + "remark-lint-ordered-list-marker-style": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-rehype": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", @@ -16836,8 +18007,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/safe-regex-test": { "version": "1.0.3", @@ -17253,7 +18423,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -17265,7 +18434,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -17428,8 +18596,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -17439,8 +18605,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -17449,9 +18613,7 @@ "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "peer": true + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" }, "node_modules/spdx-expression-parse": { "version": "4.0.0", @@ -17467,9 +18629,7 @@ "node_modules/spdx-license-ids": { "version": "3.0.18", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true, - "peer": true + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==" }, "node_modules/spdy": { "version": "4.0.2", @@ -17618,8 +18778,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -17668,7 +18826,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17683,7 +18840,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17745,11 +18901,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -17762,7 +18930,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -18112,7 +19279,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -18491,9 +19657,7 @@ "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, - "peer": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/thunky": { "version": "1.1.0", @@ -18539,7 +19703,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -19015,6 +20178,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "node_modules/typescript": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", @@ -19107,6 +20275,203 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unified-args": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/unified-args/-/unified-args-11.0.1.tgz", + "integrity": "sha512-WEQghE91+0s3xPVs0YW6a5zUduNLjmANswX7YbBfksHNDGMjHxaWCql4SR7c9q0yov/XiIEdk6r/LqfPjaYGcw==", + "dependencies": { + "@types/text-table": "^0.2.0", + "chalk": "^5.0.0", + "chokidar": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "json5": "^2.0.0", + "minimist": "^1.0.0", + "strip-ansi": "^7.0.0", + "text-table": "^0.2.0", + "unified-engine": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-args/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/unified-args/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/unified-args/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/unified-engine": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-11.2.1.tgz", + "integrity": "sha512-xBAdZ8UY2X4R9Hm6X6kMne4Nz0PlpOc1oE6DPeqJnewr5Imkb8uT5Eyvy1h7xNekPL3PSWh3ZJyNrMW6jnNQBg==", + "dependencies": { + "@types/concat-stream": "^2.0.0", + "@types/debug": "^4.0.0", + "@types/is-empty": "^1.0.0", + "@types/node": "^20.0.0", + "@types/unist": "^3.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.0.0", + "extend": "^3.0.0", + "glob": "^10.0.0", + "ignore": "^5.0.0", + "is-empty": "^1.0.0", + "is-plain-obj": "^4.0.0", + "load-plugin": "^6.0.0", + "parse-json": "^7.0.0", + "trough": "^2.0.0", + "unist-util-inspect": "^8.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0", + "vfile-reporter": "^8.0.0", + "vfile-statistics": "^3.0.0", + "yaml": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-engine/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/unified-engine/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified-engine/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", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unified-engine/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==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/unified-engine/node_modules/parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "dependencies": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified-engine/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified-lint-rule": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz", + "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==", + "dependencies": { + "@types/unist": "^3.0.0", + "trough": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-message-control": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-5.0.0.tgz", + "integrity": "sha512-B2cSAkpuMVVmPP90KCfKdBhm1e9KYJ+zK3x5BCa0N65zpq1Ybkc9C77+M5qwR8FWO7RF3LM5QRRPZtgjW6DUCw==", + "dependencies": { + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unified/node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -19130,6 +20495,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-inspect": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-8.1.0.tgz", + "integrity": "sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -19342,8 +20719,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -19353,13 +20728,19 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -19384,6 +20765,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vfile-message": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", @@ -19397,6 +20791,108 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vfile-reporter": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-8.1.1.tgz", + "integrity": "sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==", + "dependencies": { + "@types/supports-color": "^8.0.0", + "string-width": "^6.0.0", + "supports-color": "^9.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0", + "vfile-sort": "^4.0.0", + "vfile-statistics": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-reporter/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/vfile-reporter/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "node_modules/vfile-reporter/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vfile-reporter/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/vfile-reporter/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/vfile-sort": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-4.0.0.tgz", + "integrity": "sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==", + "dependencies": { + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-statistics": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-3.0.0.tgz", + "integrity": "sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==", + "dependencies": { + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -19663,6 +21159,11 @@ "node": ">=14" } }, + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==" + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -20007,7 +21508,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -20094,7 +21594,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -20111,7 +21610,6 @@ "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" }, @@ -20126,7 +21624,6 @@ "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" }, @@ -20137,8 +21634,7 @@ "node_modules/wrap-ansi-cjs/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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", @@ -20253,6 +21749,17 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -20335,7 +21842,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, "requires": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -20603,8 +22109,7 @@ "@babel/helper-validator-identifier": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==" }, "@babel/helper-validator-option": { "version": "7.24.8", @@ -20638,7 +22143,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -21792,7 +23296,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "requires": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -21805,26 +23308,22 @@ "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" }, "ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "requires": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -21835,7 +23334,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "requires": { "ansi-regex": "^6.0.1" } @@ -21844,7 +23342,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "requires": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -22819,6 +24316,200 @@ "fastq": "^1.6.0" } }, + "@npmcli/config": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.3.4.tgz", + "integrity": "sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==", + "requires": { + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/package-json": "^5.1.1", + "ci-info": "^4.0.0", + "ini": "^4.1.2", + "nopt": "^7.2.1", + "proc-log": "^4.2.0", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "dependencies": { + "ci-info": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==" + }, + "ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==" + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + } + } + }, + "@npmcli/git": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "requires": { + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "dependencies": { + "ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==" + }, + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" + }, + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + }, + "which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "requires": { + "isexe": "^3.1.1" + } + } + } + }, + "@npmcli/map-workspaces": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", + "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", + "requires": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "dependencies": { + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + } + } + }, + "@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==" + }, + "@npmcli/package-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", + "requires": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "dependencies": { + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "requires": { + "lru-cache": "^10.0.1" + } + }, + "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", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==" + }, + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "requires": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + } + } + }, + "@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "requires": { + "which": "^4.0.0" + }, + "dependencies": { + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" + }, + "which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "requires": { + "isexe": "^3.1.1" + } + } + } + }, "@nuxt/opencollective": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.3.tgz", @@ -22902,7 +24593,6 @@ "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 }, "@sinclair/typebox": { @@ -22997,6 +24687,14 @@ "@types/node": "*" } }, + "@types/concat-stream": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-2.0.3.tgz", + "integrity": "sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==", + "requires": { + "@types/node": "*" + } + }, "@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -23063,6 +24761,14 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, + "@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "requires": { + "@types/estree": "*" + } + }, "@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", @@ -23123,6 +24829,11 @@ "@types/node": "*" } }, + "@types/is-empty": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/is-empty/-/is-empty-1.2.3.tgz", + "integrity": "sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==" + }, "@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -23343,6 +25054,16 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "@types/supports-color": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz", + "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==" + }, + "@types/text-table": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@types/text-table/-/text-table-0.2.5.tgz", + "integrity": "sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA==" + }, "@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", @@ -23880,8 +25601,7 @@ "abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==" }, "abort-controller": { "version": "3.0.0", @@ -24019,14 +25739,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -24035,7 +25753,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -24625,8 +26342,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -24648,9 +26364,7 @@ "binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "peer": true + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" }, "bindings": { "version": "1.5.0", @@ -24770,7 +26484,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "requires": { "balanced-match": "^1.0.0" } @@ -24779,7 +26492,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "requires": { "fill-range": "^7.1.1" } @@ -25085,7 +26797,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -25102,6 +26813,21 @@ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" }, + "character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" + }, + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" + }, + "character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" + }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -25111,8 +26837,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "peer": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -25128,8 +26852,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "peer": true, "requires": { "is-glob": "^4.0.1" } @@ -25216,6 +26938,11 @@ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, + "collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==" + }, "collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -25226,7 +26953,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -25234,8 +26960,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "colord": { "version": "2.9.3", @@ -25342,6 +27067,29 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -25595,7 +27343,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -26129,8 +27876,7 @@ "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "editorconfig": { "version": "1.0.4", @@ -26225,8 +27971,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "emojis-list": { "version": "3.0.0" @@ -26260,11 +28005,15 @@ "dev": true, "peer": true }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -26404,8 +28153,7 @@ "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 + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "escodegen": { "version": "2.1.0", @@ -27382,7 +29130,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -27547,7 +29294,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dev": true, "requires": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -27556,8 +29302,7 @@ "signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" } } }, @@ -27602,7 +29347,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "optional": true }, "function-bind": { @@ -27885,8 +29629,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-property-descriptors": { "version": "1.0.2", @@ -28256,8 +29999,7 @@ "ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==" }, "immutable": { "version": "4.3.7", @@ -28314,6 +30056,11 @@ } } }, + "import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==" + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -28340,8 +30087,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -28394,6 +30140,20 @@ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==" }, + "is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==" + }, + "is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "requires": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + } + }, "is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -28419,8 +30179,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", @@ -28436,8 +30195,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "peer": true, "requires": { "binary-extensions": "^2.0.0" } @@ -28504,6 +30261,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==" + }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -28511,17 +30273,20 @@ "dev": true, "peer": true }, + "is-empty": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", + "integrity": "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -28543,11 +30308,15 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } }, + "is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" + }, "is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -28569,8 +30338,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.7", @@ -28696,8 +30464,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { "version": "3.0.1", @@ -28786,7 +30553,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", "@pkgjs/parseargs": "^0.11.0" @@ -30152,8 +31918,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.14.1", @@ -30240,8 +32005,7 @@ "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "keyv": { "version": "4.5.4", @@ -30319,6 +32083,15 @@ "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==", "peer": true }, + "load-plugin": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.3.tgz", + "integrity": "sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==", + "requires": { + "@npmcli/config": "^8.0.0", + "import-meta-resolve": "^4.0.0" + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -30453,6 +32226,11 @@ "dev": true, "peer": true }, + "markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==" + }, "markdown-table": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", @@ -30492,6 +32270,30 @@ "safe-buffer": "^5.1.2" } }, + "mdast-comment-marker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-3.0.0.tgz", + "integrity": "sha512-bt08sLmTNg00/UtVDiqZKocxqvQqqyQZAg1uaRuO/4ysXV5motg7RolF5o5yy/sY1rG0v2XgZEqFWho1+2UquA==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-mdx-expression": "^2.0.0" + } + }, + "mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "requires": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + } + }, "mdast-util-find-and-replace": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", @@ -30600,6 +32402,27 @@ "mdast-util-to-markdown": "^2.0.0" } }, + "mdast-util-heading-style": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-3.0.0.tgz", + "integrity": "sha512-tsUfM9Kj9msjlemA/38Z3pvraQay880E3zP2NgIthMoGcpU9bcPX9oSM6QC/+eFXGGB4ba+VCB1dKAPHB7Veug==", + "requires": { + "@types/mdast": "^4.0.0" + } + }, + "mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + } + }, "mdast-util-newline-to-break": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz", @@ -31128,7 +32951,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "requires": { "brace-expansion": "^2.0.1" } @@ -31153,8 +32975,7 @@ "minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" }, "ms": { "version": "2.1.2", @@ -31313,7 +33134,6 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, "requires": { "abbrev": "^2.0.0" } @@ -31343,8 +33163,76 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "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==", + "requires": { + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + } + } + }, + "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==" + }, + "npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "requires": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "requires": { + "lru-cache": "^10.0.1" + } + }, + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + } + } + }, + "npm-pick-manifest": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "requires": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + } + } }, "npm-run-path": { "version": "4.0.1", @@ -31577,8 +33465,7 @@ "package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, "pako": { "version": "1.0.11", @@ -31612,6 +33499,28 @@ "safe-buffer": "^5.2.1" } }, + "parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "requires": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "dependencies": { + "@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + } + } + }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -31662,8 +33571,7 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -31675,7 +33583,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "requires": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -31684,8 +33591,7 @@ "lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" } } }, @@ -31724,8 +33630,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pinia": { "version": "2.1.7", @@ -31817,6 +33722,11 @@ } } }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" + }, "popper.js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", @@ -31943,6 +33853,11 @@ } } }, + "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==" + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -31957,6 +33872,27 @@ "dev": true, "peer": true }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + } + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -32140,6 +34076,22 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, + "read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "requires": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "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", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==" + } + } + }, "read-pkg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", @@ -32232,8 +34184,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "peer": true, "requires": { "picomatch": "^2.2.1" } @@ -32425,6 +34375,17 @@ } } }, + "remark": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", + "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", + "requires": { + "@types/mdast": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + } + }, "remark-breaks": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz", @@ -32435,6 +34396,17 @@ "unified": "^11.0.0" } }, + "remark-cli": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-12.0.1.tgz", + "integrity": "sha512-2NAEOACoTgo+e+YAaCTODqbrWyhMVmlUyjxNCkTrDRHHQvH6+NbrnqVvQaLH/Q8Ket3v90A43dgAJmXv8y5Tkw==", + "requires": { + "import-meta-resolve": "^4.0.0", + "markdown-extensions": "^2.0.0", + "remark": "^15.0.0", + "unified-args": "^11.0.0" + } + }, "remark-gfm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", @@ -32448,6 +34420,348 @@ "unified": "^11.0.0" } }, + "remark-lint": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-10.0.0.tgz", + "integrity": "sha512-E8yHHDOJ8b+qI0G49BRu24pe8t0fNNBWv8ENQJpCGNrVeTeyBIGEbaUe1yuF7OG8faA6PVpcN/pqWjzW9fcBWQ==", + "requires": { + "@types/mdast": "^4.0.0", + "remark-message-control": "^8.0.0", + "unified": "^11.0.0" + } + }, + "remark-lint-blockquote-indentation": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-4.0.0.tgz", + "integrity": "sha512-hdUvn+KsJbBKpY9jLY01PmfpJ/WGhLu9GJMXQGU8ADXJc+F5DWSgKAr6GQ1IUKqvGYdEML/KZ61WomWFUuecVA==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0" + } + }, + "remark-lint-checkbox-character-style": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-checkbox-character-style/-/remark-lint-checkbox-character-style-5.0.0.tgz", + "integrity": "sha512-K0G/Nok59fb2q5KUxcemBVt+ymnhTkDVLJAatZ4PAh9At8y0DGctHdU27jWsuvO0Fs7Zy62Usk7IJE2VO89p1w==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-code-block-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-code-block-style/-/remark-lint-code-block-style-4.0.0.tgz", + "integrity": "sha512-LKBKMVruEO0tzDnnnqi1TfUcnwY6Mo7cVtZM4E4pKt3KMhtvgU2wD68/MxDOEJd0pmnLrEgIadv74bY0gWhZpg==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-emphasis-marker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-emphasis-marker/-/remark-lint-emphasis-marker-4.0.0.tgz", + "integrity": "sha512-xIRiB4PFWUOyIslN/UOPL6Lh+J0VD4R11+jo+W4hpGMNsg58l+2SgtdbinlXzDeoBxmaaka9n/sYpJ7cJWEIPQ==", + "requires": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-fenced-code-marker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-marker/-/remark-lint-fenced-code-marker-4.0.0.tgz", + "integrity": "sha512-WFN88Rx78m4/HSbW3Kx2XAYbVfzYns4bJd9qpwDD90DA3nc59zciYd01xi6Bk3n9vSs5gIlmG7xkwxVHHJ8KCA==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-final-newline/-/remark-lint-final-newline-3.0.0.tgz", + "integrity": "sha512-NaPyn6FiOn3IV/6gIcwWfJmgraPT2IaVLjhakfPglZkKVfn/FrOfETyY8Bp+HLoSRI9967OH0yRDnK7/pPIWeQ==", + "requires": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "unified-lint-rule": "^3.0.0", + "vfile-location": "^5.0.0" + } + }, + "remark-lint-hard-break-spaces": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-hard-break-spaces/-/remark-lint-hard-break-spaces-4.0.0.tgz", + "integrity": "sha512-zCTq7/xfM0ZL3bMopXse9DH2nk38wE1LrxmYwnTrqASBLnEAJWE2U2//tRGVMEBfSAnNvmIo96twz6zkLWjbGA==", + "requires": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + } + }, + "remark-lint-heading-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-heading-style/-/remark-lint-heading-style-4.0.0.tgz", + "integrity": "sha512-dQ6Jul5K0+aNUvrq4W7H0+osSoC9hsmwHZqBFq000+eMP/hWJqI8tuudw1rap8HHYuOsKLRbB5q+Fr7G+3Vw+Q==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-heading-style": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-link-title-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-link-title-style/-/remark-lint-link-title-style-4.0.0.tgz", + "integrity": "sha512-cihTO5dkhjMj/evYIDAvRdQHD82OQeF4fNAq8FLb81HmFKo77VlSF6CK55H1bvlZogfJG58uN/5d1tSsOdcEbg==", + "requires": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-list-item-bullet-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-list-item-bullet-indent/-/remark-lint-list-item-bullet-indent-5.0.0.tgz", + "integrity": "sha512-qq22QaxsDjfsL7aWGIPmP3P0N99CJBQQW1+iSrhYAMCDzqVlw6I3wPNAeR6s8mcoeHT8YlT6eQH3V8xJ0SlW6w==", + "requires": { + "@types/mdast": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0" + } + }, + "remark-lint-list-item-content-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-list-item-content-indent/-/remark-lint-list-item-content-indent-4.0.0.tgz", + "integrity": "sha512-L4GZgWQQ54qWKbnDle3dbEOtnq+qdmZJ70lpM3yMFEMHs4xejqPKsIoiYeUtIV0rYHHCWS7IlLzcgYUK9vENQw==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-list-item-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-list-item-indent/-/remark-lint-list-item-indent-4.0.0.tgz", + "integrity": "sha512-Yd6/g8CH9e4vlPAPNgl7F575uKhP+pTo/qwGkE61GOcgEVNJ/529hjumUhyQ4sOAX0YAPAjxvq6fJvb4AhVOOA==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0" + } + }, + "remark-lint-no-blockquote-without-marker": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-blockquote-without-marker/-/remark-lint-no-blockquote-without-marker-6.0.0.tgz", + "integrity": "sha512-fBhoTpkWcl5tG4FdwPdJIyb8XLrdr6MdLk1+K2BQ6Rom3rRsIYvuox4ohxOunNrXuth8xyw8kC6wDmODR44oFw==", + "requires": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-directive": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-location": "^5.0.0" + } + }, + "remark-lint-no-duplicate-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-duplicate-definitions/-/remark-lint-no-duplicate-definitions-4.0.0.tgz", + "integrity": "sha512-21fcOACkCyhNsHkedKlpvqIywYx+5zGR507bW8e59gzdGhTbnBwQ9du4ACmN9jxPTfIBhUVMz0bWezkGrHE7Bg==", + "requires": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-no-heading-content-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-heading-content-indent/-/remark-lint-no-heading-content-indent-5.0.0.tgz", + "integrity": "sha512-psYSlD2BjcVkgpeXOLwPcYFBrbtJWp8E8JX1J4vSfoHPeY6aIxgYxXkf57cjGTApfRL8xawBmMDiF1FgQvpZYg==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0" + } + }, + "remark-lint-no-literal-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-literal-urls/-/remark-lint-no-literal-urls-4.0.0.tgz", + "integrity": "sha512-rl/3Ai4Ax9IH/fRpOJZuXk1HgYX6oFTauhmBOilpqbq/YT2kN3FuXaneXdRfKv1bgMdHaLKxHWxGj/mDyA2n8w==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-character": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0" + } + }, + "remark-lint-no-shortcut-reference-image": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-image/-/remark-lint-no-shortcut-reference-image-4.0.0.tgz", + "integrity": "sha512-YEiCpW5F/8/LZyxlOuVK2L/n0NJ1AB0AJK7oP39OVyEk3Xl7w+JQi6nZ3KiH6REh+PWGqKn6M0KEPL9cT/iAOw==", + "requires": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + } + }, + "remark-lint-no-shortcut-reference-link": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-shortcut-reference-link/-/remark-lint-no-shortcut-reference-link-4.0.0.tgz", + "integrity": "sha512-6jka2Zz3I6G2MvDcKrwADYhTOxHMFMK854u1cfBEIH5/XnCCXROtoqiiDtbZw+NJqbmwsBKvGL4t2gnmEJUmgg==", + "requires": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + } + }, + "remark-lint-no-undefined-references": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-undefined-references/-/remark-lint-no-undefined-references-5.0.0.tgz", + "integrity": "sha512-O0q8bHpRHK1T85oqO+uep4BkvQnZZp3y+wahDeeLLq9dCJfF56sq6Tt5OOTt1BAOZlpobS3OPQHUiJWYP6hX1w==", + "requires": { + "@types/mdast": "^4.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-location": "^5.0.0" + } + }, + "remark-lint-no-unused-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-unused-definitions/-/remark-lint-no-unused-definitions-4.0.0.tgz", + "integrity": "sha512-YCZ6k575NCTx7mnN+9ls0G6YgMsZHi0LYQqfLW8MNVHBtbpTBvfmk8I39bmsvuKWeBD98weZoXSDqIiIGg+Q/g==", + "requires": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit": "^5.0.0" + } + }, + "remark-lint-ordered-list-marker-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-4.0.0.tgz", + "integrity": "sha512-xZ7Xppy5fzACH4b9h1b4lTzVtNY2AlUkNTfl1Oe6cIKN8tk3juFxN0wL2RpktPtSZ7iRIabzFmg6l8WPhlASJA==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "micromark-util-character": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-ordered-list-marker-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-value/-/remark-lint-ordered-list-marker-value-4.0.0.tgz", + "integrity": "sha512-7UjNU2Nv9LGEONTU9GPmTVoNoGKD5aL1X2xHzMbSJiTc50bfcazYqZawO+qj1pQ04WPhto1qHnl0HRB5wwSVwA==", + "requires": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-phrasing": "^4.0.0", + "micromark-util-character": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-rule-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-rule-style/-/remark-lint-rule-style-4.0.0.tgz", + "integrity": "sha512-Kt7IHMB5IbLgRFKaFUmB895sV3PTD0MBgN9CvXKxr1wHFF43S6tabjFIBSoQqyJRlhH0S3rK6Lvopofa009gLg==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-strong-marker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-strong-marker/-/remark-lint-strong-marker-4.0.0.tgz", + "integrity": "sha512-YcvuzakYhQWdCH+1E30sUY+wyvq+PNa77NZAMAYO/cS/pZczFB+q4Ccttw4Q+No/chX8oMfe0GYtm8dDWLei/g==", + "requires": { + "@types/mdast": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-lint-table-cell-padding": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-table-cell-padding/-/remark-lint-table-cell-padding-5.0.0.tgz", + "integrity": "sha512-LNyiHDQZBIOqcQGG1tYsZHW7g0v8OyRmRgDrD5WEsMaAYfM6EiECUokN/Q4py9h4oM/2KUSrdZbtfuZmy87/kA==", + "requires": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-phrasing": "^4.0.0", + "pluralize": "^8.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "remark-message-control": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-8.0.0.tgz", + "integrity": "sha512-brpzOO+jdyE/mLqvqqvbogmhGxKygjpCUCG/PwSCU43+JZQ+RM+sSzkCWBcYvgF3KIAVNIoPsvXjBkzO7EdsYQ==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-comment-marker": "^3.0.0", + "unified-message-control": "^5.0.0", + "vfile": "^6.0.0" + } + }, "remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -32459,6 +34773,50 @@ "unified": "^11.0.0" } }, + "remark-preset-lint-consistent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/remark-preset-lint-consistent/-/remark-preset-lint-consistent-6.0.0.tgz", + "integrity": "sha512-W3fwxajdietwjnFyTH5x2le63hxWGVOXxIs7KjRqU+5wkkN6ZQyuwPeeomblmS9wQr50fkidhXNHNDyCXtqgxQ==", + "requires": { + "remark-lint": "^10.0.0", + "remark-lint-blockquote-indentation": "^4.0.0", + "remark-lint-checkbox-character-style": "^5.0.0", + "remark-lint-code-block-style": "^4.0.0", + "remark-lint-emphasis-marker": "^4.0.0", + "remark-lint-fenced-code-marker": "^4.0.0", + "remark-lint-heading-style": "^4.0.0", + "remark-lint-link-title-style": "^4.0.0", + "remark-lint-list-item-content-indent": "^4.0.0", + "remark-lint-ordered-list-marker-style": "^4.0.0", + "remark-lint-ordered-list-marker-value": "^4.0.0", + "remark-lint-rule-style": "^4.0.0", + "remark-lint-strong-marker": "^4.0.0", + "remark-lint-table-cell-padding": "^5.0.0", + "unified": "^11.0.0" + } + }, + "remark-preset-lint-recommended": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/remark-preset-lint-recommended/-/remark-preset-lint-recommended-7.0.0.tgz", + "integrity": "sha512-A9aPDL78OO12xG2a83DVd+M2QzdBMjn545fbXj40BFJdpt9t//MADkPAwRfpMCBkKi+iECPUTFCb3Jm8SsFG2w==", + "requires": { + "remark-lint": "^10.0.0", + "remark-lint-final-newline": "^3.0.0", + "remark-lint-hard-break-spaces": "^4.0.0", + "remark-lint-list-item-bullet-indent": "^5.0.0", + "remark-lint-list-item-indent": "^4.0.0", + "remark-lint-no-blockquote-without-marker": "^6.0.0", + "remark-lint-no-duplicate-definitions": "^4.0.0", + "remark-lint-no-heading-content-indent": "^5.0.0", + "remark-lint-no-literal-urls": "^4.0.0", + "remark-lint-no-shortcut-reference-image": "^4.0.0", + "remark-lint-no-shortcut-reference-link": "^4.0.0", + "remark-lint-no-undefined-references": "^5.0.0", + "remark-lint-no-unused-definitions": "^4.0.0", + "remark-lint-ordered-list-marker-style": "^4.0.0", + "unified": "^11.0.0" + } + }, "remark-rehype": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", @@ -32610,8 +34968,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "peer": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex-test": { "version": "1.0.3", @@ -32942,7 +35299,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -32950,8 +35306,7 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shell-quote": { "version": "1.8.1", @@ -33077,8 +35432,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "peer": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -33088,8 +35441,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "peer": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -33100,9 +35451,7 @@ "spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "peer": true + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" }, "spdx-expression-parse": { "version": "4.0.0", @@ -33118,9 +35467,7 @@ "spdx-license-ids": { "version": "3.0.18", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true, - "peer": true + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==" }, "spdy": { "version": "4.0.2", @@ -33256,8 +35603,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "peer": true, "requires": { "safe-buffer": "~5.2.0" } @@ -33290,7 +35635,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -33301,7 +35645,6 @@ "version": "npm:string-width@4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -33345,11 +35688,19 @@ "es-object-atoms": "^1.0.0" } }, + "stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "requires": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -33358,7 +35709,6 @@ "version": "npm:strip-ansi@6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -33598,7 +35948,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -33885,9 +36234,7 @@ "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, - "peer": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "thunky": { "version": "1.1.0", @@ -33927,7 +36274,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -34254,6 +36600,11 @@ "possible-typed-array-names": "^1.0.0" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "typescript": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", @@ -34327,6 +36678,143 @@ } } }, + "unified-args": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/unified-args/-/unified-args-11.0.1.tgz", + "integrity": "sha512-WEQghE91+0s3xPVs0YW6a5zUduNLjmANswX7YbBfksHNDGMjHxaWCql4SR7c9q0yov/XiIEdk6r/LqfPjaYGcw==", + "requires": { + "@types/text-table": "^0.2.0", + "chalk": "^5.0.0", + "chokidar": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "json5": "^2.0.0", + "minimist": "^1.0.0", + "strip-ansi": "^7.0.0", + "text-table": "^0.2.0", + "unified-engine": "^11.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "unified-engine": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-11.2.1.tgz", + "integrity": "sha512-xBAdZ8UY2X4R9Hm6X6kMne4Nz0PlpOc1oE6DPeqJnewr5Imkb8uT5Eyvy1h7xNekPL3PSWh3ZJyNrMW6jnNQBg==", + "requires": { + "@types/concat-stream": "^2.0.0", + "@types/debug": "^4.0.0", + "@types/is-empty": "^1.0.0", + "@types/node": "^20.0.0", + "@types/unist": "^3.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.0.0", + "extend": "^3.0.0", + "glob": "^10.0.0", + "ignore": "^5.0.0", + "is-empty": "^1.0.0", + "is-plain-obj": "^4.0.0", + "load-plugin": "^6.0.0", + "parse-json": "^7.0.0", + "trough": "^2.0.0", + "unist-util-inspect": "^8.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0", + "vfile-reporter": "^8.0.0", + "vfile-statistics": "^3.0.0", + "yaml": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + }, + "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", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==" + }, + "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==" + }, + "parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "requires": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + } + }, + "type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==" + } + } + }, + "unified-lint-rule": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz", + "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==", + "requires": { + "@types/unist": "^3.0.0", + "trough": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + } + }, + "unified-message-control": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-5.0.0.tgz", + "integrity": "sha512-B2cSAkpuMVVmPP90KCfKdBhm1e9KYJ+zK3x5BCa0N65zpq1Ybkc9C77+M5qwR8FWO7RF3LM5QRRPZtgjW6DUCw==", + "requires": { + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "vfile-message": "^4.0.0" + } + }, "unist-builder": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", @@ -34335,6 +36823,14 @@ "@types/unist": "^3.0.0" } }, + "unist-util-inspect": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-8.1.0.tgz", + "integrity": "sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==", + "requires": { + "@types/unist": "^3.0.0" + } + }, "unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -34493,8 +36989,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "peer": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -34504,8 +36998,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "peer": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -34513,6 +37005,11 @@ } } }, + "validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -34530,6 +37027,15 @@ "vfile-message": "^4.0.0" } }, + "vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "requires": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + } + }, "vfile-message": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", @@ -34539,6 +37045,74 @@ "unist-util-stringify-position": "^4.0.0" } }, + "vfile-reporter": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-8.1.1.tgz", + "integrity": "sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==", + "requires": { + "@types/supports-color": "^8.0.0", + "string-width": "^6.0.0", + "supports-color": "^9.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0", + "vfile-sort": "^4.0.0", + "vfile-statistics": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==" + } + } + }, + "vfile-sort": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-4.0.0.tgz", + "integrity": "sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==", + "requires": { + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, + "vfile-statistics": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-3.0.0.tgz", + "integrity": "sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==", + "requires": { + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -34731,6 +37305,11 @@ "xml-name-validator": "^4.0.0" } }, + "walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==" + }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -34968,7 +37547,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -35056,7 +37634,6 @@ "version": "npm:wrap-ansi@7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -35067,7 +37644,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -35076,7 +37652,6 @@ "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, "requires": { "color-name": "~1.1.4" } @@ -35084,8 +37659,7 @@ "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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" } } }, @@ -35143,6 +37717,11 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==" + }, "yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index a81bc78b..fa2dc072 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,10 @@ "css-loader": "^6.8.1", "lodash": "^4.17.21", "pinia": "^2.1.7", + "remark-cli": "^12.0.1", + "remark-lint-list-item-indent": "^4.0.0", + "remark-preset-lint-consistent": "^6.0.0", + "remark-preset-lint-recommended": "^7.0.0", "style-loader": "^3.3.3", "vue": "^2.7.14", "vue-apexcharts": "^1.6.2", From c151849cedec6556fe21e936d0963ec5530d6b10 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 5 Aug 2024 12:09:36 +0000 Subject: [PATCH 049/145] Update src from PHP Codesniffer --- src/main.js | 8 ++--- src/store/modules/navigation.js | 60 ++++++++++++++++----------------- src/store/store.js | 16 ++++----- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/main.js b/src/main.js index f6bf3bfc..2c5ec62a 100644 --- a/src/main.js +++ b/src/main.js @@ -7,8 +7,8 @@ Vue.mixin({ methods: { t, n } }) Vue.use(PiniaVuePlugin) new Vue( - { - pinia, - render: h => h(App), - }, + { + pinia, + render: h => h(App), + }, ).$mount('#opencatalogi') diff --git a/src/store/modules/navigation.js b/src/store/modules/navigation.js index 656c26d1..494aaa39 100644 --- a/src/store/modules/navigation.js +++ b/src/store/modules/navigation.js @@ -2,34 +2,34 @@ import { defineStore } from 'pinia' export const useNavigationStore = defineStore( - 'ui', { - state: () => ({ - // The currently active menu item, defaults to '' which triggers the dashboard - selected: 'dashboard', - // The currently selected catalogi within 'publications' - selectedCatalogus: false, - // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time - modal: false, - // The currently active dialog - dialog: false, - }), - actions: { - setSelected(selected) { - this.selected = selected - console.log('Active menu item set to ' + selected) - }, - setSelectedCatalogus(selectedCatalogus) { - this.selectedCatalogus = selectedCatalogus - console.log('Active catalogus menu set to ' + selectedCatalogus) - }, - setModal(modal) { - this.modal = modal - console.log('Active modal set to ' + modal) - }, - setDialog(dialog) { - this.dialog = dialog - console.log('Active dialog set to ' + dialog) - }, - }, - }, + 'ui', { + state: () => ({ + // The currently active menu item, defaults to '' which triggers the dashboard + selected: 'dashboard', + // The currently selected catalogi within 'publications' + selectedCatalogus: false, + // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time + modal: false, + // The currently active dialog + dialog: false, + }), + actions: { + setSelected(selected) { + this.selected = selected + console.log('Active menu item set to ' + selected) + }, + setSelectedCatalogus(selectedCatalogus) { + this.selectedCatalogus = selectedCatalogus + console.log('Active catalogus menu set to ' + selectedCatalogus) + }, + setModal(modal) { + this.modal = modal + console.log('Active modal set to ' + modal) + }, + setDialog(dialog) { + this.dialog = dialog + console.log('Active dialog set to ' + dialog) + }, + }, + }, ) diff --git a/src/store/store.js b/src/store/store.js index f58c70a2..2c5e1e35 100644 --- a/src/store/store.js +++ b/src/store/store.js @@ -16,12 +16,12 @@ const metadataStore = useMetadataStore(pinia) const publicationStore = usePublicationStore(pinia) export { - // generic - navigationStore, - searchStore, - // feature-specific - catalogiStore, - directoryStore, - metadataStore, - publicationStore, + // generic + navigationStore, + searchStore, + // feature-specific + catalogiStore, + directoryStore, + metadataStore, + publicationStore, } From e0ddbdf616384c0eca8460f99eab39af8d398538 Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 14:14:59 +0200 Subject: [PATCH 050/145] tests bootstrap crap --- .github/workflows/CI-workflows.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/CI-workflows.yaml b/.github/workflows/CI-workflows.yaml index 16874a9a..755181f9 100644 --- a/.github/workflows/CI-workflows.yaml +++ b/.github/workflows/CI-workflows.yaml @@ -78,8 +78,22 @@ jobs: - name: Checkout code uses: actions/checkout@v3 + - name: Setup PHP (for checks) + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + tools: cs2pr, phpcs, phpmd, phpunit + - name: Run Checks run: | + if ! command -v phpcs &> /dev/null; then + echo "phpcs could not be found. Please ensure it's installed." + exit 1 + fi + if ! command -v phpmd &> /dev/null; then + echo "phpmd could not be found. Please ensure it's installed." + exit 1 + fi if grep -q "ERROR" <(phpcs -q --report=checkstyle src); then echo "PHP CodeSniffer found issues. Please fix them before merging." exit 1 From dceba4d02f714250c8166bafc0276bb62f670b80 Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 14:19:23 +0200 Subject: [PATCH 051/145] workflow to make sure plugins installed --- .github/workflows/CI-workflows.yaml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/CI-workflows.yaml b/.github/workflows/CI-workflows.yaml index 755181f9..50cb1cc4 100644 --- a/.github/workflows/CI-workflows.yaml +++ b/.github/workflows/CI-workflows.yaml @@ -8,11 +8,12 @@ jobs: steps: - uses: actions/checkout@v3 - + - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.2' + extensions: mbstring, zip, xml, curl, intl, sqlite, gd, pdo_mysql tools: cs2pr, phpcbf, phpcs, phpmd, phpunit - name: Run phpcbf @@ -32,15 +33,11 @@ jobs: continue-on-error: ${{ github.ref != 'refs/heads/main' }} - name: Run phpmd - run: phpmd src github phpmd.xml --not-strict + run: phpmd src text phpmd.xml --not-strict continue-on-error: ${{ github.ref != 'refs/heads/main' }} - name: Install Composer dependencies - uses: php-actions/composer@v6 - with: - php_version: "8.2" - php_extensions: redis exif mongodb intl pdo_pgsql zip mysqli pdo_mysql pcntl gd gmp - command: install + run: composer install - name: Run PHPUnit tests env: @@ -82,6 +79,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: '8.2' + extensions: mbstring, zip, xml, curl, intl, sqlite, gd, pdo_mysql tools: cs2pr, phpcs, phpmd, phpunit - name: Run Checks From b62b7b9bba98d7c9d792b37f20daacc8347d8eeb Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 14:27:11 +0200 Subject: [PATCH 052/145] phpmd.xml added for mess detection rules --- .github/workflows/CI-workflows.yaml | 2 +- phpmd.xml | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 phpmd.xml diff --git a/.github/workflows/CI-workflows.yaml b/.github/workflows/CI-workflows.yaml index 50cb1cc4..8f9046a0 100644 --- a/.github/workflows/CI-workflows.yaml +++ b/.github/workflows/CI-workflows.yaml @@ -33,7 +33,7 @@ jobs: continue-on-error: ${{ github.ref != 'refs/heads/main' }} - name: Run phpmd - run: phpmd src text phpmd.xml --not-strict + run: phpmd src xml phpmd.xml --not-strict continue-on-error: ${{ github.ref != 'refs/heads/main' }} - name: Install Composer dependencies diff --git a/phpmd.xml b/phpmd.xml new file mode 100644 index 00000000..7c1724fc --- /dev/null +++ b/phpmd.xml @@ -0,0 +1,25 @@ + + + + + This is a custom ruleset for OpenCatalogi Nextcloud. + + + + + + + + + + + + + + + From 70ef4076bfef72b3c60011f6723d830386326471 Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 14:39:44 +0200 Subject: [PATCH 053/145] bootstrap.php --- tests/bootstrap.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/bootstrap.php b/tests/bootstrap.php index bd3c0ba4..3a78f87d 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -2,7 +2,6 @@ declare(strict_types=1); -require_once __DIR__ . '/../../../tests/bootstrap.php'; require_once __DIR__ . '/../vendor/autoload.php'; \OC_App::loadApp(OCA\OpenCatalogi\AppInfo\Application::APP_ID); From 795eb1568d02a6373c66baddef2ab96787aa5280 Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 14:50:42 +0200 Subject: [PATCH 054/145] added composer install --- .github/workflows/CI-workflows.yaml | 3 +++ tests/bootstrap.php | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI-workflows.yaml b/.github/workflows/CI-workflows.yaml index 8f9046a0..7aa21df0 100644 --- a/.github/workflows/CI-workflows.yaml +++ b/.github/workflows/CI-workflows.yaml @@ -16,6 +16,9 @@ jobs: extensions: mbstring, zip, xml, curl, intl, sqlite, gd, pdo_mysql tools: cs2pr, phpcbf, phpcs, phpmd, phpunit + - name: Install Composer + run: composer install + - name: Run phpcbf run: phpcbf . continue-on-error: ${{ github.ref != 'refs/heads/main' }} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 3a78f87d..27a1828a 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -2,7 +2,7 @@ declare(strict_types=1); -require_once __DIR__ . '/../vendor/autoload.php'; +// require_once __DIR__ . '/../vendor/autoload.php'; \OC_App::loadApp(OCA\OpenCatalogi\AppInfo\Application::APP_ID); OC_Hook::clear(); From dd73cccb7e9dfbf8aedf0756421f31c0e7296e16 Mon Sep 17 00:00:00 2001 From: Remko Date: Mon, 5 Aug 2024 14:53:52 +0200 Subject: [PATCH 055/145] updated package-lock --- package-lock.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 67e081ec..e81968bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9462,9 +9462,9 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", - "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", "dev": true, "funding": [ { @@ -9476,6 +9476,7 @@ "url": "https://paypal.me/naturalintelligence" } ], + "license": "MIT", "peer": true, "dependencies": { "strnum": "^1.0.5" @@ -27298,9 +27299,9 @@ "dev": true }, "fast-xml-parser": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", - "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", "dev": true, "peer": true, "requires": { From a9cda34e2aee8e445c684e3a536a238de22a11c9 Mon Sep 17 00:00:00 2001 From: Thijn Date: Mon, 5 Aug 2024 14:59:11 +0200 Subject: [PATCH 056/145] fixed publication spec and entity --- src/entities/publication/publication.mock.ts | 125 ++++++++++++ src/entities/publication/publication.spec.ts | 125 ++---------- src/entities/publication/publication.ts | 191 ++++++++++-------- src/entities/publication/publication.types.ts | 68 +++---- 4 files changed, 287 insertions(+), 222 deletions(-) create mode 100644 src/entities/publication/publication.mock.ts diff --git a/src/entities/publication/publication.mock.ts b/src/entities/publication/publication.mock.ts new file mode 100644 index 00000000..dbde9e09 --- /dev/null +++ b/src/entities/publication/publication.mock.ts @@ -0,0 +1,125 @@ +import { Publication } from './publication' +import { TPublication } from './publication.types' + +const mockPublicationsData = (): TPublication[] => [ + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category1', + portal: 'https://google.com', + catalogi: 'catalogi1', + metaData: 'meta1', + published: '2024-01-01', + modified: '2024-01-02', + featured: true, + data: { + type: '', + }, + attachments: [], + attachmentCount: 1, + schema: 'https://schema.org', + status: 'Concept', + license: 'MIT', + themes: ['theme1'], + anonymization: { + anonymized: true, + results: '', + }, + language: { + code: 'en-us', + level: 'A1', + }, + archive: { + date: new Date(2023, 2, 24).toISOString(), + }, + geo: { + type: 'Point', + coordinates: [2, 23], + }, + }, + { // partial data + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: '', + image: 'https://example.com/image.jpg', + category: 'category2', + portal: 'https://google.com', + catalogi: '', + metaData: '', + published: '2024-01-01', + modified: '2024-01-02', + featured: true, + data: { + type: '', + }, + attachments: [], + attachmentCount: 1, + schema: 'https://schema.org', + status: 'Concept', + license: 'MIT', + themes: ['theme1'], + anonymization: { + anonymized: true, + results: '', + }, + language: { + code: 'en-us', + level: 'A1', + }, + archive: { + date: new Date(2023, 2, 24).toISOString(), + }, + geo: { + type: 'Point', + coordinates: [2, 23], + }, + }, + { // invalid data + id: '3', + reference: 'ref3', + title: 'test 3', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category3', + portal: 'https://google.com', + catalogi: 'catalogi3', + metaData: 'meta1', + published: '2024-01-01', + modified: '2024-01-02', + featured: true, + data: { + type: '', + }, + attachments: [], + attachmentCount: 1, + schema: 'https://schema.org', + // @ts-expect-error -- invalid data for testing + status: true, + license: 'MIT', + themes: ['theme1'], + anonymization: { + anonymized: true, + results: '', + }, + language: { + code: 'en-us', + level: 'A1', + }, + archive: { + date: new Date(2023, 2, 24).toISOString(), + }, + geo: { + type: 'Point', + coordinates: [2, 23], + }, + }, +] + +export const mockPublications = (data: TPublication[] = mockPublicationsData()): TPublication[] => data.map(item => new Publication(item)) diff --git a/src/entities/publication/publication.spec.ts b/src/entities/publication/publication.spec.ts index fe84aa9a..05ffed7a 100644 --- a/src/entities/publication/publication.spec.ts +++ b/src/entities/publication/publication.spec.ts @@ -1,127 +1,42 @@ /* eslint-disable no-console */ import { Publication } from './publication' -import { TPublication } from './publication.types' +import { mockPublications } from './publication.mock' describe('Directory Store', () => { it('create Publication entity with full data', () => { - const publication = new Publication(testData[0]) + const publication = new Publication(mockPublications()[0]) expect(publication).toBeInstanceOf(Publication) - expect(publication).toEqual(testData[0]) + expect(publication).toEqual(mockPublications()[0]) - expect(publication.validate()).toBe(true) + // log any errors + !publication.validate().success && console.error(publication.validate().error) + + expect(publication.validate().success).toBe(true) }) it('create Publication entity with partial data', () => { - const publication = new Publication(testData[1]) + const publication = new Publication(mockPublications()[1]) expect(publication).toBeInstanceOf(Publication) - expect(publication.id).toBe(testData[1].id) - expect(publication.title).toBe(testData[1].title) - expect(publication.summary).toBe(testData[1].summary) - expect(publication.reference).toBe(testData[1].reference) - expect(publication.description).toBe(testData[1].description) - expect(publication.image).toBe(testData[1].image) - expect(publication.category).toBe(testData[1].category) - expect(publication.portal).toBe(testData[1].portal) - expect(publication.catalogi).toBe(testData[1].catalogi) - expect(publication.metaData).toBe(testData[1].metaData) - expect(publication.published).toBe(testData[1].published) - expect(publication.modified).toBe(testData[1].modified) - expect(publication.featured).toBe(testData[1].featured) - expect(publication.organization).toEqual(testData[1].organization) - expect(publication.data).toEqual(testData[1].data) - expect(publication.attachments).toEqual(testData[1].attachments) - expect(publication.attachmentCount).toBe(testData[1].attachmentCount) - expect(publication.schema).toBe('') - expect(publication.status).toBe('') - expect(publication.license).toBe('') - expect(publication.themes).toBe(testData[1].themes) - expect(publication.anonymization).toEqual(testData[1].anonymization) + expect(publication).not.toBe(mockPublications()[1]) + expect(publication.status).toBe('Concept') + + // log any errors + !publication.validate().success && console.error(publication.validate().error) - expect(publication.validate()).toBe(true) + expect(publication.validate().success).toBe(true) }) it('create Publication entity with falsy data', () => { - const publication = new Publication(testData[2]) + const publication = new Publication(mockPublications()[2]) expect(publication).toBeInstanceOf(Publication) - expect(publication).toEqual(testData[2]) + expect(publication).toEqual(mockPublications()[2]) - expect(publication.validate()).toBe(false) + // log any errors + !publication.validate().success && console.error(publication.validate().error) + + expect(publication.validate().success).toBe(false) }) }) - -const testData: TPublication[] = [ - { // full data - id: '1', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category1', - portal: 'portal1', - catalogi: 'catalogi1', - metaData: 'meta1', - published: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: { - type: 'string', - }, - data: {}, - attachments: {}, - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: ['theme1'], - anonymization: {}, - }, - { // partial data - id: '2', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category2', - portal: 'portal2', - catalogi: 'catalogi2', - metaData: 'meta2', - published: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: {}, - data: {}, - attachments: {}, - attachmentCount: 1, - themes: ['theme1'], - anonymization: {}, - }, - { // invalid data - id: '3', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'https://example.com/image.jpg', - category: 'category3', - portal: 'portal3', - catalogi: 'catalogi3', - metaData: 'meta3', - published: '2024-01-01', - modified: '2024-01-02', - featured: true, - organization: {}, - data: {}, - attachments: {}, - attachmentCount: 1, - schema: 'schema1', - status: 'status1', - license: 'MIT', - themes: ['theme1'], - anonymization: {}, - }, -] diff --git a/src/entities/publication/publication.ts b/src/entities/publication/publication.ts index bde994c7..2165a65d 100644 --- a/src/entities/publication/publication.ts +++ b/src/entities/publication/publication.ts @@ -1,59 +1,51 @@ +import { TAttachment } from '../' import { TPublication } from './publication.types' +import { SafeParseReturnType, z } from 'zod' export class Publication implements TPublication { public id: string public title: string public summary: string - public description?: string - public reference?: string - public image?: string + public description: string + public reference: string + public image: string public category: string - public catalogi: string - public metaData: string - public portal?: string - public featured?: boolean - public organization?: { - type?: string - $ref?: string - format?: string - description?: string + public portal: string + public featured: boolean + public schema: string + public status: 'Concept' | 'Published' | 'Withdrawn' | 'Archived' | 'revised' | 'Rejected' + public attachments: TAttachment[] + public attachmentCount: number + public themes: string[] + public data: { + type: string } - public schema?: string - public status?: string - public attachments?: { - type?: string - items?: { - $ref?: string - } - format?: string + public anonymization: { + anonymized: boolean + results: string } - public attachmentCount?: number - public themes?: string[] - public data?: { - type?: string - required?: boolean + public language: { + code: string + level: string } - public anonymization?: { - type?: string - $ref?: string - format?: string - description?: string + public published: string | Date + public modified: string | Date + public license: string + public archive: { + date: string | Date } - public languageObject?: { - type?: string - $ref?: string - format?: string - description?: string + public geo: { + type: 'Point' | 'LineString' | 'Polygon' | 'MultiPoint' | 'MultiLineString' | 'MultiPolygon' + coordinates: [number, number] } - public published?: string | Date - public modified?: string | Date - public license?: string + public catalogi: string + public metaData: string constructor(data: TPublication) { this.hydrate(data) @@ -61,64 +53,105 @@ export class Publication implements TPublication { /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods private hydrate(data: TPublication) { - this.id = data.id?.toString() || '' + this.id = data.id?.toString() this.title = data.title || '' this.summary = data.summary || '' - this.reference = data.reference || '' this.description = data.description || '' + this.reference = data.reference || '' this.image = data.image || '' this.category = data.category || '' - this.catalogi = data.catalogi || '' - // @ts-expect-error -- for backwards compatibility metaData will be used if metadata cannot be found - this.metaData = (data.metadata ?? data.metaData) || '' this.portal = data.portal || '' this.featured = (typeof data.featured === 'boolean' && data.featured) // backend can send true and false back as "1" and "" (yes. not "0") // FIXME: remove once bug is fixed || (typeof data.featured === 'string' && !!parseInt(data.featured)) || false - this.organization = (!Array.isArray(data.organization) && data.organization) || {} this.schema = data.schema || '' - this.status = data.status || '' - this.attachments = (!Array.isArray(data.attachments) && data.attachments) || {} - this.attachmentCount = data.attachmentCount || 0 + this.status = data.status || 'Concept' + this.attachments = data.attachments || [] + this.attachmentCount = this.attachmentCount || data.attachments.length || 0 this.themes = data.themes || [] - this.data = (!Array.isArray(data.data) && data.data) || {} - this.anonymization = (!Array.isArray(data.anonymization) && data.anonymization) || {} - this.languageObject = (!Array.isArray(data.languageObject) && data.languageObject) || {} - this.published = new Date(data.published) || '' - this.modified = new Date(data.modified) || '' + this.data = data.data || { + type: '', + } + + this.anonymization = data.anonymization || { + anonymized: false, + results: '', + } + + this.language = data.language || { + code: '', + level: '', + } + + this.published = data.published || '' + this.modified = data.modified || '' this.license = data.license || '' + this.archive = data.archive || { + date: '', + } + + this.geo = data.geo || { + type: 'Point', + coordinates: [0, 0], + } + + this.catalogi = data.catalogi || '' + // @ts-expect-error -- for backwards compatibility metadata will be used if metaData cannot be found + this.metaData = (data.metaData ?? data.metadata) || '' } /* istanbul ignore next */ - public validate(): boolean { - // TODO: change this over to Zod schema, already exists on 'feature/DIMOC-101/entities' (requires slight modification) - // these have to exist - if (!this.id || typeof this.id !== 'string') return false - if (!this.title || typeof this.title !== 'string') return false - if (!this.summary || typeof this.summary !== 'string') return false - // these can be optional but if they exist, they must be of the right type - if (!this.reference && typeof this.reference !== 'string') return false - if (!this.description && typeof this.description !== 'string') return false - if (!this.image && typeof this.image !== 'string') return false - if (!this.category && typeof this.category !== 'string') return false - if (!this.portal && typeof this.portal !== 'string') return false - if (!this.catalogi && typeof this.catalogi !== 'string') return false - if (!this.metaData && typeof this.metaData !== 'string') return false - if (!this.published && typeof this.published !== 'string') return false - if (!this.modified && typeof this.modified !== 'string') return false - if (!this.featured && typeof this.featured !== 'boolean') return false - if (!this.organization && !Array.isArray(this.organization)) return false - if (!this.data && !Array.isArray(this.data)) return false - if (!this.attachments && !Array.isArray(this.attachments)) return false - if (!this.attachmentCount && typeof this.attachmentCount !== 'number') return false - if (!this.schema && typeof this.schema !== 'string') return false - if (!this.status && typeof this.status !== 'string') return false - if (!this.license && typeof this.license !== 'string') return false - if (!this.themes && typeof this.themes !== 'string') return false - if (!this.anonymization && typeof this.anonymization !== 'object') return false - return true + public validate(): SafeParseReturnType { + // https://conduction.stoplight.io/docs/open-catalogi/jcrqsdtnjtx8v-create-publication + const schema = z.object({ + title: z.string().min(1), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) + summary: z.string().min(1), + description: z.string(), + reference: z.string(), + image: z.string().url().or(z.literal('')), // its either a URL or empty + category: z.string(), + portal: z.string().url().or(z.literal('')), + featured: z.boolean(), + schema: z.string().url().min(1), + status: z.enum(['Concept', 'Published', 'Withdrawn', 'Archived', 'Revised', 'Rejected']), + // FIXME z.object({}) here is dangerous since it will strip everything out of attachments if data is parsed + // It will not cause an issue for validation only + attachments: z.object({}).array(), + attachmentCount: z.number(), + themes: z.string().array(), + data: z.object({ + type: z.string(), + }), + anonymization: z.object({ + anonymized: z.boolean(), + results: z.string().max(2500), + }), + language: z.object({ + // this regex checks if the code has either 2 or 3 characters per group, and the -aaa after the first is optional + code: z.string() + .max(7) + .regex(/([a-z]{2,3})(-[a-z]{2,3})?/g, 'language code is not a valid ISO 639-1 code (e.g. en-us)'), + level: z.string().min(1), + }), + published: z.string(), + modified: z.string(), + license: z.string(), + archive: z.object({ + date: z.string().datetime().or(z.literal('')), + }), + geo: z.object({ + type: z.enum(['Point', 'LineString', 'Polygon', 'MultiPoint', 'MultiLineString', 'MultiPolygon']), + coordinates: z.number().array().min(2).max(2), + }), + }) + + const result = schema.safeParse({ + ...this, + }) + + return result } } diff --git a/src/entities/publication/publication.types.ts b/src/entities/publication/publication.types.ts index a9877ef7..b8ae4a29 100644 --- a/src/entities/publication/publication.types.ts +++ b/src/entities/publication/publication.types.ts @@ -1,51 +1,43 @@ // TODO: double check this type for correct properties and optionals when stoplight updates - https://conduction.stoplight.io/docs/open-catalogi/fee989a9c8e3f-publication +import { TAttachment } from '../attachment' + export type TPublication = { id: string title: string summary: string - description?: string - reference?: string - image?: string + description: string + reference: string + image: string category: string - catalogi: string - metaData: string - portal?: string - featured?: boolean - organization?: { - type?: string - $ref?: string - format?: string - description?: string + portal: string + featured: boolean + schema: string + status: 'Concept' | 'Published' | 'Withdrawn' | 'Archived' | 'revised' | 'Rejected' + attachments: TAttachment[] + attachmentCount: number + themes: string[] + data: { + type: string } - schema?: string - status?: string - attachments?: { - type?: string - items?: { - $ref?: string - } - format?: string + anonymization: { + anonymized: boolean + results: string } - attachmentCount?: number - themes?: string[] - data?: { - type?: string - required?: boolean + language: { + code: string + level: string } - anonymization?: { - type?: string - $ref?: string - format?: string - description?: string + published: string | Date + modified: string | Date + license: string + archive: { + date: string | Date } - languageObject?: { - type?: string - $ref?: string - format?: string - description?: string + geo: { + type: 'Point' | 'LineString' | 'Polygon' | 'MultiPoint' | 'MultiLineString' | 'MultiPolygon' + coordinates: [number, number] } - published?: string | Date - modified?: string | Date - license?: string + catalogi: string + metaData: string } From 424e29662a0c1d73f8db8782f8ab2e8da43fb76d Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 14:59:32 +0200 Subject: [PATCH 057/145] OC app visible --- .github/workflows/CI-workflows.yaml | 16 ++-- composer.json | 124 ++++++++++++++-------------- tests/bootstrap.php | 2 +- 3 files changed, 74 insertions(+), 68 deletions(-) diff --git a/.github/workflows/CI-workflows.yaml b/.github/workflows/CI-workflows.yaml index 7aa21df0..e668c03d 100644 --- a/.github/workflows/CI-workflows.yaml +++ b/.github/workflows/CI-workflows.yaml @@ -16,7 +16,7 @@ jobs: extensions: mbstring, zip, xml, curl, intl, sqlite, gd, pdo_mysql tools: cs2pr, phpcbf, phpcs, phpmd, phpunit - - name: Install Composer + - name: Install Composer dependencies run: composer install - name: Run phpcbf @@ -39,8 +39,14 @@ jobs: run: phpmd src xml phpmd.xml --not-strict continue-on-error: ${{ github.ref != 'refs/heads/main' }} - - name: Install Composer dependencies - run: composer install + - name: List files in repository root + run: ls -alh + + - name: List files in tests directory + run: ls -alh ./tests + + - name: List files in vendor directory + run: ls -alh ./vendor - name: Run PHPUnit tests env: @@ -99,11 +105,11 @@ jobs: echo "PHP CodeSniffer found issues. Please fix them before merging." exit 1 fi - if grep -q "ERROR" <(phpmd src text phpmd.xml --strict); then + if grep -q "ERROR" <(phpmd src xml phpmd.xml --strict); then echo "PHP Mess Detector found issues. Please fix them before merging." exit 1 fi - if ! phpunit --configuration phpunit.xml; then + if ! phpunit --bootstrap ./tests/bootstrap.php --configuration phpunit.xml; then echo "PHPUnit tests failed. Please fix them before merging." exit 1 fi diff --git a/composer.json b/composer.json index 3dae809d..192a472d 100644 --- a/composer.json +++ b/composer.json @@ -1,64 +1,64 @@ { - "name": "conductionnl/opencatalogi", - "description": "This is a DSO Nextcloud project for the municipality Buren and is done by ConductionNL", - "license": "AGPL-3.0-or-later", - "authors": [ - { - "name": "Conduction b.v.", - "email": "info@conduction.nl", - "homepage": "https://conduction.nl" - }, - { - "name": "Remko Huisman (Conduction)", - "email": "remko@conduction.nl", - "homepage": "https://conduction.nl" - }, - { - "name": "Ruben van der Linde (Conduction)", - "email": "ruben@conduction.nl", - "homepage": "https://conduction.nl" - } - ], - "autoload": { - "psr-4": { - "OCA\\OpenCatalogi\\": "lib/" - } - }, - "scripts": { - "post-install-cmd": [ - "@composer bin all install --ansi" - ], - "post-update-cmd": [ - "@composer bin all update --ansi" - ], - "lint": "find . -name \\*.php -not -path './vendor/*' -not -path './vendor-bin/*' -not -path './build/*' -print0 | xargs -0 -n1 php -l", - "cs:check": "php-cs-fixer fix --dry-run --diff", - "cs:fix": "php-cs-fixer fix", - "psalm": "psalm --threads=1 --no-cache", - "test:unit": "phpunit tests -c tests/phpunit.xml --colors=always --fail-on-warning --fail-on-risky", - "openapi": "generate-spec" - }, - "require": { - "php": "^8.1", - "adbario/php-dot-notation": "^3.3.0", - "bamarni/composer-bin-plugin": "^1.8", - "elasticsearch/elasticsearch": "^v8.14.0", - "guzzlehttp/guzzle": "^7.0", - "symfony/uid": "^6.4" - }, - "require-dev": { - "nextcloud/ocp": "dev-stable29", - "roave/security-advisories": "dev-latest" - }, - "config": { - "allow-plugins": { - "bamarni/composer-bin-plugin": true, - "php-http/discovery": true - }, - "optimize-autoloader": true, - "sort-packages": true, - "platform": { - "php": "8.1" - } - } + "name": "conductionnl/opencatalogi", + "description": "This is a DSO Nextcloud project for the municipality Buren and is done by ConductionNL", + "license": "AGPL-3.0-or-later", + "authors": [ + { + "name": "Conduction b.v.", + "email": "info@conduction.nl", + "homepage": "https://conduction.nl" + }, + { + "name": "Remko Huisman (Conduction)", + "email": "remko@conduction.nl", + "homepage": "https://conduction.nl" + }, + { + "name": "Ruben van der Linde (Conduction)", + "email": "ruben@conduction.nl", + "homepage": "https://conduction.nl" + } + ], + "autoload": { + "psr-4": { + "OCA\\OpenCatalogi\\": "lib/" + } + }, + "scripts": { + "post-install-cmd": [ + "@composer bin all install --ansi" + ], + "post-update-cmd": [ + "@composer bin all update --ansi" + ], + "lint": "find . -name \\*.php -not -path './vendor/*' -not -path './vendor-bin/*' -not -path './build/*' -print0 | xargs -0 -n1 php -l", + "cs:check": "php-cs-fixer fix --dry-run --diff", + "cs:fix": "php-cs-fixer fix", + "psalm": "psalm --threads=1 --no-cache", + "test:unit": "phpunit tests -c tests/phpunit.xml --colors=always --fail-on-warning --fail-on-risky", + "openapi": "generate-spec" + }, + "require": { + "php": "^8.1", + "adbario/php-dot-notation": "^3.3.0", + "bamarni/composer-bin-plugin": "^1.8", + "elasticsearch/elasticsearch": "^v8.14.0", + "guzzlehttp/guzzle": "^7.0", + "symfony/uid": "^6.4" + }, + "require-dev": { + "nextcloud/ocp": "dev-stable29", + "roave/security-advisories": "dev-latest" + }, + "config": { + "allow-plugins": { + "bamarni/composer-bin-plugin": true, + "php-http/discovery": true + }, + "optimize-autoloader": true, + "sort-packages": true, + "platform": { + "php": "8.1" + } + } } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 27a1828a..3a78f87d 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -2,7 +2,7 @@ declare(strict_types=1); -// require_once __DIR__ . '/../vendor/autoload.php'; +require_once __DIR__ . '/../vendor/autoload.php'; \OC_App::loadApp(OCA\OpenCatalogi\AppInfo\Application::APP_ID); OC_Hook::clear(); From 12487264103885185ae3327fea691edb93a315c2 Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 15:08:52 +0200 Subject: [PATCH 058/145] workflow checks and order --- .github/workflows/CI-workflows.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/CI-workflows.yaml b/.github/workflows/CI-workflows.yaml index e668c03d..c59aee68 100644 --- a/.github/workflows/CI-workflows.yaml +++ b/.github/workflows/CI-workflows.yaml @@ -8,7 +8,7 @@ jobs: steps: - uses: actions/checkout@v3 - + - name: Setup PHP uses: shivammathur/setup-php@v2 with: @@ -101,11 +101,11 @@ jobs: echo "phpmd could not be found. Please ensure it's installed." exit 1 fi - if grep -q "ERROR" <(phpcs -q --report=checkstyle src); then + if phpcs -q --report=checkstyle src | grep -q "ERROR"; then echo "PHP CodeSniffer found issues. Please fix them before merging." exit 1 fi - if grep -q "ERROR" <(phpmd src xml phpmd.xml --strict); then + if phpmd src xml phpmd.xml --strict | grep -q "ERROR"; then echo "PHP Mess Detector found issues. Please fix them before merging." exit 1 fi From eff0416aa4aa59a58d6fd5728d7eb7936bf52991 Mon Sep 17 00:00:00 2001 From: Wilco Louwerse Date: Mon, 5 Aug 2024 15:22:37 +0200 Subject: [PATCH 059/145] small fix for Attachment $labels --- lib/Db/Attachment.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Db/Attachment.php b/lib/Db/Attachment.php index 68793e71..ed1c2847 100644 --- a/lib/Db/Attachment.php +++ b/lib/Db/Attachment.php @@ -13,12 +13,12 @@ class Attachment extends Entity implements JsonSerializable protected ?string $title = null; protected ?string $summary = null; protected ?string $description = null; - protected array $labels = []; + protected ?array $labels = null; protected ?string $accessUrl = null; protected ?string $downloadUrl = null; protected ?string $type = null; protected ?string $extension = null; - protected int $size = 0; + protected ?int $size = null; protected ?array $anonymization = null; protected ?array $language = null; protected ?string $versionOf = null; @@ -63,7 +63,7 @@ public function hydrate(array $object): self foreach($object as $key => $value) { if (in_array($key, $jsonFields) === true && $value === []) { - $value = []; + $value = null; } $method = 'set'.ucfirst($key); From 2be6d09fabd7147618af0f395dc92c0a3ba57bde Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 15:29:51 +0200 Subject: [PATCH 060/145] docs spellechekc and workflow --- .github/workflows/CI-workflows.yaml | 6 +-- phpmd.xml | 65 ++++++++++++++++++++++++----- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/.github/workflows/CI-workflows.yaml b/.github/workflows/CI-workflows.yaml index c59aee68..c49c3c7b 100644 --- a/.github/workflows/CI-workflows.yaml +++ b/.github/workflows/CI-workflows.yaml @@ -109,9 +109,9 @@ jobs: echo "PHP Mess Detector found issues. Please fix them before merging." exit 1 fi - if ! phpunit --bootstrap ./tests/bootstrap.php --configuration phpunit.xml; then - echo "PHPUnit tests failed. Please fix them before merging." - exit 1 + # if ! phpunit --bootstrap ./tests/bootstrap.php --configuration phpunit.xml; then + # echo "PHPUnit tests failed. Please fix them before merging." + # exit 1 fi if ! npx remark . --use remark-preset-lint-consistent --use remark-preset-lint-recommended --use remark-lint-list-item-indent; then echo "Markdown linting failed. Please fix them before merging." diff --git a/phpmd.xml b/phpmd.xml index 7c1724fc..32f69362 100644 --- a/phpmd.xml +++ b/phpmd.xml @@ -1,25 +1,68 @@ - + http://pmd.sourceforge.net/ruleset_xml_schema.xsd"> This is a custom ruleset for OpenCatalogi Nextcloud. - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bcbafd16c4a343e97124e0e9e304aef6c9dab41e Mon Sep 17 00:00:00 2001 From: Thijn Date: Mon, 5 Aug 2024 15:31:05 +0200 Subject: [PATCH 061/145] fixed metadata entity spec --- src/entities/metadata/metadata.mock.ts | 130 ++++++++++++++++ src/entities/metadata/metadata.spec.ts | 149 ++----------------- src/entities/metadata/metadata.ts | 118 ++++++++------- src/entities/metadata/metadata.types.ts | 46 +++--- src/entities/publication/publication.mock.ts | 2 +- src/entities/publication/publication.spec.ts | 9 -- 6 files changed, 230 insertions(+), 224 deletions(-) create mode 100644 src/entities/metadata/metadata.mock.ts diff --git a/src/entities/metadata/metadata.mock.ts b/src/entities/metadata/metadata.mock.ts new file mode 100644 index 00000000..b154be3c --- /dev/null +++ b/src/entities/metadata/metadata.mock.ts @@ -0,0 +1,130 @@ +import { Metadata } from './metadata' +import { TMetadata } from './metadata.types' + +export const mockMetadataData = (): TMetadata[] => [ + { // full data + id: '1', + title: 'Test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + required: ['test'], + properties: { + test: { + title: 'test prop', + description: 'a long description', + type: 'string', + format: 'date', + pattern: 1, + default: 'true', + behavior: 'silly', + required: false, + deprecated: false, + minLength: 5, + maxLength: 6, + example: 'gooby example', + minimum: 1, + maximum: 3, + multipleOf: 1, + exclusiveMin: false, + exclusiveMax: false, + minItems: 0, + maxItems: 6, + }, + gfdgds: { + title: 'gfdgds prop', + description: 'property description', + type: 'string', + format: 'uuid', + pattern: 2, + default: 'false', + behavior: 'goofy perchance', + required: false, + deprecated: false, + minLength: 5.5, + maxLength: 5.11, + example: 'bazinga', + minimum: 1, + maximum: 2, + multipleOf: 1, + exclusiveMin: true, + exclusiveMax: false, + minItems: 1, + maxItems: 7, + }, + }, + archive: { + valuation: 'b', + class: 1, + }, + }, + { // partial data + id: '2', + title: 'Test metadata', + description: 'this is a very long description for test metadata', + version: '', + required: [], + properties: {}, + archive: { + valuation: 'b', + class: 1, + }, + }, + { // invalid data + id: '1', + title: 'Test metadata', + description: 'this is a very long description for test metadata', + version: '0.0.1', + // @ts-expect-error -- required is array + required: 'test', + properties: { + test: { + title: 'test prop', + description: 'a long description', + type: 'string', + format: 'date', + pattern: 1, + default: 'true', + behavior: 'silly', + required: false, + deprecated: false, + minLength: 5, + maxLength: 6, + example: 'gooby example', + minimum: 1, + maximum: 3, + multipleOf: 1, + exclusiveMin: false, + exclusiveMax: false, + minItems: 0, + maxItems: 6, + }, + gfdgds: { + title: 'gfdgds prop', + description: 'property description', + type: 'string', + format: 'uuid', + pattern: 2, + default: 'false', + behavior: 'goofy perchance', + required: false, + deprecated: false, + minLength: 5.5, + maxLength: 5.11, + example: 'bazinga', + minimum: 1, + maximum: 2, + multipleOf: 1, + exclusiveMin: true, + exclusiveMax: false, + minItems: 1, + maxItems: 7, + }, + }, + archive: { + valuation: 'b', + class: 1, + }, + }, +] + +export const mockMetadata = (data: TMetadata[] = mockMetadataData()): TMetadata[] => data.map(item => new Metadata(item)) diff --git a/src/entities/metadata/metadata.spec.ts b/src/entities/metadata/metadata.spec.ts index 08d19ee4..d60fe4c3 100644 --- a/src/entities/metadata/metadata.spec.ts +++ b/src/entities/metadata/metadata.spec.ts @@ -1,161 +1,32 @@ /* eslint-disable no-console */ import { Metadata } from './metadata' -import { TMetadata } from './metadata.types' +import { mockMetadata } from './metadata.mock' describe('Metadata entity', () => { it('create Metadata entity with full data', () => { - const metadata = new Metadata(testData[0]) + const metadata = new Metadata(mockMetadata()[0]) expect(metadata).toBeInstanceOf(Metadata) - expect(metadata).toEqual(testData[0]) + expect(metadata).toEqual(mockMetadata()[0]) - expect(metadata.validate()).toBe(true) + expect(metadata.validate().success).toBe(true) }) it('create Metadata entity with partial data', () => { - const metadata = new Metadata(testData[1]) + const metadata = new Metadata(mockMetadata()[1]) expect(metadata).toBeInstanceOf(Metadata) - expect(metadata.id).toBe(testData[1].id) - expect(metadata.title).toBe('') - expect(metadata.description).toBe(testData[1].description) - expect(metadata.required).toEqual(testData[1].required) - expect(metadata.version).toBe(testData[1].version) - expect(metadata.properties).toEqual(testData[1].properties) + expect(metadata).not.toBe(mockMetadata()[1]) - expect(metadata.validate()).toBe(true) + expect(metadata.validate().success).toBe(true) }) it('create Metadata entity with falsy data', () => { - const metadata = new Metadata(testData[2]) + const metadata = new Metadata(mockMetadata()[2]) expect(metadata).toBeInstanceOf(Metadata) - expect(metadata).toEqual(testData[2]) + expect(metadata).toEqual(mockMetadata()[2]) - expect(metadata.validate()).toBe(false) + expect(metadata.validate().success).toBe(false) }) }) - -const testData: TMetadata[] = [ - { // full data - id: '1', - title: 'Test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - required: ['test'], - properties: { - test: { - title: 'test prop', - description: 'a long description', - type: 'string', - format: 'date', - pattern: 1, - default: 'true', - behavior: 'silly', - required: false, - deprecated: false, - minLength: 5, - maxLength: 6, - example: 'gooby example', - minimum: 1, - maximum: 3, - multipleOf: 1, - exclusiveMin: false, - exclusiveMax: false, - minItems: 0, - maxItems: 6, - }, - gfdgds: { - title: 'gfdgds prop', - description: 'property description', - type: 'string', - format: 'uuid', - pattern: 2, - default: 'false', - behavior: 'goofy perchance', - required: false, - deprecated: false, - minLength: 5.5, - maxLength: 5.11, - example: 'bazinga', - minimum: 1, - maximum: 2, - multipleOf: 1, - exclusiveMin: true, - exclusiveMax: false, - minItems: 1, - maxItems: 7, - }, - }, - }, - { // partial data - id: '1', - title: 'Test metadata', - description: 'this is a very long description for test metadata', - version: '0.0.1', - properties: { - test: { - title: 'test prop', - description: 'a long description', - type: 'string', - behavior: 'silly', - required: false, - exclusiveMin: false, - exclusiveMax: false, - minItems: 0, - maxItems: 6, - }, - }, - }, - { // invalid data - id: '1', - title: '', // cannot be empty - description: 'this is a very long description for test metadata', - version: '0.0.1', - required: ['test'], - properties: { - test: { - title: 'test prop', - description: 'a long description', - type: 'string', - format: 'date', - pattern: 1, - default: 'true', - behavior: 'silly', - required: false, - deprecated: false, - minLength: 5, - maxLength: 6, - example: 'gooby example', - minimum: 1, - maximum: 3, - multipleOf: 1, - exclusiveMin: false, - exclusiveMax: false, - minItems: 0, - maxItems: 6, - }, - gfdgds: { - title: 'gfdgds prop', - description: 'property description', - type: 'string', - format: 'uuid', - pattern: 2, - default: 'false', - behavior: 'goofy perchance', - required: false, - deprecated: false, - minLength: 5.5, - maxLength: 5.11, - example: 'bazinga', - minimum: 1, - maximum: 2, - multipleOf: 1, - exclusiveMin: true, - exclusiveMax: false, - minItems: 1, - maxItems: 7, - }, - }, - }, -] diff --git a/src/entities/metadata/metadata.ts b/src/entities/metadata/metadata.ts index 06c96863..3c38cf58 100644 --- a/src/entities/metadata/metadata.ts +++ b/src/entities/metadata/metadata.ts @@ -1,36 +1,40 @@ import { TMetadata } from './metadata.types' -import { z } from 'zod' +import { SafeParseReturnType, z } from 'zod' export class Metadata implements TMetadata { public id: string public title: string - public description?: string - public version?: string - public required?: string[] - + public description: string + public version: string + public required: string[] public properties: Record + public archive: { + valuation: 'b' | 'v' | 'n' + class: 1 | 2 | 3 | 4 | 5 + } + constructor(data: TMetadata) { this.hydrate(data) } @@ -44,51 +48,57 @@ export class Metadata implements TMetadata { this.required = data?.required || [] // backend (PHP) doesn't know objects so it will return an array if empty this.properties = (!Array.isArray(data?.properties) && data?.properties) || {} + this.archive = (!Array.isArray(data?.archive) && data?.archive) || { + valuation: 'n', + class: 1, + } } /* istanbul ignore next */ - public validate(): boolean { - // https://conduction.stoplight.io/docs/open-catalogi/92e81a078982b-metadata + public validate(): SafeParseReturnType { + // https://conduction.stoplight.io/docs/open-catalogi/5og7tj13bkzj5-create-metadata const propertiesDataSchema = z.object({ title: z.string().min(1), - description: z.string().optional(), - type: z.string().min(1), - format: z.string().optional(), - pattern: z.number().optional(), - default: z.string().optional(), - behavior: z.string().optional(), - required: z.boolean().optional(), - deprecated: z.boolean().optional(), - minLength: z.number().optional(), - maxLength: z.number().optional(), - example: z.string().optional(), - minimum: z.number().optional(), - maximum: z.number().optional(), - multipleOf: z.number().optional(), - exclusiveMin: z.boolean().optional(), - exclusiveMax: z.boolean().optional(), - minItems: z.number().optional(), - maxItems: z.number().optional(), + description: z.string(), + type: z.enum(['string', 'number', 'integer', 'object', 'array', 'boolean', 'dictionary']), + format: z.enum(['date', 'time', 'duration', 'date-time', 'url', 'uri', 'uuid', 'email', 'idn-email', 'hostname', 'idn-hostname', 'ipv4', 'ipv6', 'uri-reference', 'iri', 'iri-reference', 'uri-template', 'json-pointer', 'regex', 'binary', 'byte', 'password', 'rsin', 'kvk', 'bsn', 'oidn', 'telephone']) + .or(z.literal('')), + pattern: z.number(), + default: z.string(), + behavior: z.string(), + required: z.boolean(), + deprecated: z.boolean(), + minLength: z.number(), + maxLength: z.number(), + example: z.string(), + minimum: z.number(), + maximum: z.number(), + multipleOf: z.number(), + exclusiveMin: z.boolean(), + exclusiveMax: z.boolean(), + minItems: z.number(), + maxItems: z.number(), }) const schema = z.object({ title: z.string().min(1), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) - description: z.string().optional(), - version: z.string().optional(), - required: z.string().array().optional(), - properties: z.record(propertiesDataSchema).optional(), // z.record allows for any amount of any keys, with specific type for value validation + description: z.string(), + version: z.string(), + required: z.string().array(), + properties: z.record(propertiesDataSchema), // z.record allows for any amount of any keys, with specific type for value validation + archive: z.object({ + valuation: z.enum(['b', 'v', 'n']), + class: z.number().refine((data: number) => { + return [1, 2, 3, 4, 5].includes(data) + }), + }), }) const result = schema.safeParse({ - id: this.id, - title: this.title, - description: this.description, - version: this.version, - required: this.required, - properties: this.properties, + ...this, }) - return result.success + return result } } diff --git a/src/entities/metadata/metadata.types.ts b/src/entities/metadata/metadata.types.ts index 12488f2d..507e27df 100644 --- a/src/entities/metadata/metadata.types.ts +++ b/src/entities/metadata/metadata.types.ts @@ -1,28 +1,32 @@ export type TMetadata = { id: string title: string - description?: string - version?: string - required?: string[] + description: string + version: string + required: string[] properties: Record + archive: { + valuation: 'b' | 'v' | 'n' + class: 1 | 2 | 3 | 4 | 5 + } } diff --git a/src/entities/publication/publication.mock.ts b/src/entities/publication/publication.mock.ts index dbde9e09..b6294142 100644 --- a/src/entities/publication/publication.mock.ts +++ b/src/entities/publication/publication.mock.ts @@ -1,7 +1,7 @@ import { Publication } from './publication' import { TPublication } from './publication.types' -const mockPublicationsData = (): TPublication[] => [ +export const mockPublicationsData = (): TPublication[] => [ { // full data id: '1', reference: 'ref1', diff --git a/src/entities/publication/publication.spec.ts b/src/entities/publication/publication.spec.ts index 05ffed7a..928acd8d 100644 --- a/src/entities/publication/publication.spec.ts +++ b/src/entities/publication/publication.spec.ts @@ -9,9 +9,6 @@ describe('Directory Store', () => { expect(publication).toBeInstanceOf(Publication) expect(publication).toEqual(mockPublications()[0]) - // log any errors - !publication.validate().success && console.error(publication.validate().error) - expect(publication.validate().success).toBe(true) }) @@ -22,9 +19,6 @@ describe('Directory Store', () => { expect(publication).not.toBe(mockPublications()[1]) expect(publication.status).toBe('Concept') - // log any errors - !publication.validate().success && console.error(publication.validate().error) - expect(publication.validate().success).toBe(true) }) @@ -34,9 +28,6 @@ describe('Directory Store', () => { expect(publication).toBeInstanceOf(Publication) expect(publication).toEqual(mockPublications()[2]) - // log any errors - !publication.validate().success && console.error(publication.validate().error) - expect(publication.validate().success).toBe(false) }) }) From 6352dd1ba9b1093fccf44e2b73a33d9ac6b586c4 Mon Sep 17 00:00:00 2001 From: Mwest2020 Date: Mon, 5 Aug 2024 15:34:20 +0200 Subject: [PATCH 062/145] added # for comment fi --- .github/workflows/CI-workflows.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI-workflows.yaml b/.github/workflows/CI-workflows.yaml index c49c3c7b..fb0ea421 100644 --- a/.github/workflows/CI-workflows.yaml +++ b/.github/workflows/CI-workflows.yaml @@ -112,7 +112,7 @@ jobs: # if ! phpunit --bootstrap ./tests/bootstrap.php --configuration phpunit.xml; then # echo "PHPUnit tests failed. Please fix them before merging." # exit 1 - fi + #fi if ! npx remark . --use remark-preset-lint-consistent --use remark-preset-lint-recommended --use remark-lint-list-item-indent; then echo "Markdown linting failed. Please fix them before merging." exit 1 From eead63c5c038903596846559ff3b49d770350175 Mon Sep 17 00:00:00 2001 From: Thijn Date: Mon, 5 Aug 2024 16:11:27 +0200 Subject: [PATCH 063/145] fixed listing spec --- src/entities/listing/listing.mock.ts | 55 +++++++++++++ src/entities/listing/listing.spec.ts | 69 +++-------------- src/entities/listing/listing.ts | 81 ++++++++++++-------- src/entities/listing/listing.types.ts | 18 +++-- src/entities/publication/publication.mock.ts | 4 +- 5 files changed, 124 insertions(+), 103 deletions(-) create mode 100644 src/entities/listing/listing.mock.ts diff --git a/src/entities/listing/listing.mock.ts b/src/entities/listing/listing.mock.ts new file mode 100644 index 00000000..b2132ba5 --- /dev/null +++ b/src/entities/listing/listing.mock.ts @@ -0,0 +1,55 @@ +import { Listing } from './listing' +import { TListing } from './listing.types' + +export const mockListingsData = (): TListing[] => [ + { + id: '1', + catalogusId: '24', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'https://google.com', + directory: 'https://google.com', + metadata: ['string'], + status: 'active', + statusCode: 200, + lastSync: '2024-07-25T00:00:00Z', + default: true, + available: false, + }, + { + id: '2', + catalogusId: '24', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: '', + directory: '', + metadata: ['string'], + status: 'active', + statusCode: 200, + lastSync: '', + default: true, + available: false, + }, + { + id: '1', + catalogusId: '24', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + search: 'https://google.com', + // directory is supposed to be an URL + directory: 'string', + // @ts-expect-error -- metadata is supposed to be a array, this is invalid for testing reasons + metadata: 'string', + status: 'active', + // statusCode cannot be below 200 + statusCode: 199, + lastSync: '2024-07-25T00:00:00Z', + default: true, + available: false, + }, +] + +export const mockListings = (data: TListing[] = mockListingsData()): TListing[] => data.map(item => new Listing(item)) diff --git a/src/entities/listing/listing.spec.ts b/src/entities/listing/listing.spec.ts index 9efb63c9..c708c38a 100644 --- a/src/entities/listing/listing.spec.ts +++ b/src/entities/listing/listing.spec.ts @@ -1,81 +1,32 @@ /* eslint-disable no-console */ import { Listing } from './listing' -import { TListing } from './listing.types' +import { mockListings } from './listing.mock' describe('Listing Store', () => { it('create Listing entity with full data', () => { - const listing = new Listing(testData[0]) + const listing = new Listing(mockListings()[0]) expect(listing).toBeInstanceOf(Listing) - expect(listing).toEqual(testData[0]) + expect(listing).toEqual(mockListings()[0]) - expect(listing.validate()).toBe(true) + expect(listing.validate().success).toBe(true) }) it('create Listing entity with partial data', () => { - const listing = new Listing(testData[1]) + const listing = new Listing(mockListings()[1]) expect(listing).toBeInstanceOf(Listing) - expect(listing.id).toBe(testData[1].id) - expect(listing.title).toBe(testData[1].title) - expect(listing.summary).toBe(testData[1].summary) - expect(listing.description).toBe(testData[1].description) - expect(listing.search).toBe('') - expect(listing.directory).toBe(testData[1].directory) - expect(listing.metadata).toBe('') - expect(listing.status).toBe('') - expect(listing.lastSync).toBe(testData[1].lastSync) - expect(listing.default).toBe(testData[1].default) - expect(listing.available).toBe(testData[1].available) + expect(listing).not.toBe(mockListings()[1]) - expect(listing.validate()).toBe(true) + expect(listing.validate().success).toBe(true) }) it('create Listing entity with falsy data', () => { - const listing = new Listing(testData[2]) + const listing = new Listing(mockListings()[2]) expect(listing).toBeInstanceOf(Listing) - expect(listing).toEqual(testData[2]) + expect(listing).toEqual(mockListings()[2]) - expect(listing.validate()).toBe(false) + expect(listing.validate().success).toBe(false) }) }) - -const testData: TListing[] = [ - { // full data - id: '1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'active', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, - { // partial data - id: '2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - directory: 'string', - lastSync: '2024-07-25T00:00:00Z', - default: 'yes', - available: 'no', - }, - { // invalid data - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - search: 'string', - directory: 'string', - metadata: 'string', - status: 'pending', - lastSync: '2024-07-25T00:00:00Z', - default: 'no', - available: 'yes', - }, -] diff --git a/src/entities/listing/listing.ts b/src/entities/listing/listing.ts index eb6f4f63..66d5a42e 100644 --- a/src/entities/listing/listing.ts +++ b/src/entities/listing/listing.ts @@ -1,18 +1,21 @@ import { TListing } from './listing.types' +import { SafeParseReturnType, z } from 'zod' export class Listing implements TListing { public id: string + public catalogusId: string public title: string public summary: string - public description?: string - public search?: string - public directory?: string - public metadata?: string - public status?: string - public lastSync?: string - public default?: string - public available?: string + public description: string + public search: string + public directory: string + public metadata: string[] + public status: string + public statusCode: number + public lastSync: string | Date + public available: boolean + public default: boolean constructor(data: TListing) { this.hydrate(data) @@ -20,35 +23,45 @@ export class Listing implements TListing { /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods private hydrate(data: TListing) { - this.id = data?.id?.toString() || '' - this.title = data?.title || '' - this.summary = data?.summary || '' - this.description = data?.description || '' - this.search = data?.search || '' - this.directory = data?.directory || '' - this.metadata = data?.metadata || '' - this.status = data?.status || '' - this.lastSync = data?.lastSync || '' - this.default = data?.default || '' - this.available = data?.available || '' + this.id = data.id?.toString() + this.catalogusId = data.catalogusId || '' + this.title = data.title || '' + this.summary = data.summary || '' + this.description = data.description || '' + this.search = data.search || '' + this.directory = data.directory || '' + this.metadata = data.metadata || [] + this.status = data.status || '' + this.statusCode = data.statusCode || 0 + this.lastSync = data.lastSync || '' + this.available = data.available || true + this.default = data.default || false + } /* istanbul ignore next */ - public validate(): boolean { - // these have to exist - if (!this.id || typeof this.id !== 'string') return false - if (!this.title || typeof this.title !== 'string') return false - if (!this.summary || typeof this.summary !== 'string') return false - // these can be optional - if (typeof this.description !== 'string') return false - if (typeof this.search !== 'string') return false - if (typeof this.directory !== 'string') return false - if (typeof this.metadata !== 'string') return false - if (typeof this.status !== 'string') return false - if (typeof this.lastSync !== 'string') return false - if (typeof this.default !== 'string') return false - if (typeof this.available !== 'string') return false - return true + public validate(): SafeParseReturnType { + // https://conduction.stoplight.io/docs/open-catalogi/8azwyic71djee-create-listing + const schema = z.object({ + catalogusId: z.string(), + title: z.string().min(1), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) + summary: z.string().min(1), + description: z.string(), + search: z.string().url().or(z.literal('')), + directory: z.string().url().or(z.literal('')), + metadata: z.string().array(), + status: z.string(), + statusCode: z.number().min(200), + lastSync: z.string().datetime().or(z.literal('')), + available: z.boolean(), + default: z.boolean(), + }) + + const result = schema.safeParse({ + ...this, + }) + + return result } } diff --git a/src/entities/listing/listing.types.ts b/src/entities/listing/listing.types.ts index b057632f..140f7b60 100644 --- a/src/entities/listing/listing.types.ts +++ b/src/entities/listing/listing.types.ts @@ -1,13 +1,15 @@ export type TListing = { id: string + catalogusId: string title: string summary: string - description?: string - search?: string - directory?: string - metadata?: string - status?: string - lastSync?: string - default?: string - available?: string + description: string + search: string + directory: string + metadata: string[] + status: string + statusCode: number + lastSync: string | Date + available: boolean + default: boolean } diff --git a/src/entities/publication/publication.mock.ts b/src/entities/publication/publication.mock.ts index b6294142..ad88bb11 100644 --- a/src/entities/publication/publication.mock.ts +++ b/src/entities/publication/publication.mock.ts @@ -47,9 +47,9 @@ export const mockPublicationsData = (): TPublication[] => [ title: 'test 2', summary: 'a short form summary', description: '', - image: 'https://example.com/image.jpg', + image: '', category: 'category2', - portal: 'https://google.com', + portal: '', catalogi: '', metaData: '', published: '2024-01-01', From 24f39d2453658551ef681c9c38e870ee4f442457 Mon Sep 17 00:00:00 2001 From: Thijn Date: Mon, 5 Aug 2024 16:35:10 +0200 Subject: [PATCH 064/145] catalogi spec works now --- src/entities/catalogi/catalogi.mock.ts | 62 +++++++++++++++++++++++ src/entities/catalogi/catalogi.spec.ts | 52 +++++-------------- src/entities/catalogi/catalogi.ts | 66 +++++++++++++++++++------ src/entities/catalogi/catalogi.types.ts | 16 ++++-- 4 files changed, 136 insertions(+), 60 deletions(-) create mode 100644 src/entities/catalogi/catalogi.mock.ts diff --git a/src/entities/catalogi/catalogi.mock.ts b/src/entities/catalogi/catalogi.mock.ts new file mode 100644 index 00000000..3eecdc2e --- /dev/null +++ b/src/entities/catalogi/catalogi.mock.ts @@ -0,0 +1,62 @@ +import { Catalogi } from './catalogi' +import { TCatalogi } from './catalogi.types' + +export const mockCatalogiData = (): TCatalogi[] => [ + { + id: '1', + title: 'Decat', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + listed: false, + organization: { + id: '2', + title: 'gogle', + summary: 'consultant services', + description: 'a very long description about the consultant company called gogle', + oin: '0012345678', + tooi: 'TECH001', + rsin: '987654321', + pki: 'PKI-12345-67890', + }, + }, + { + id: '2', + title: 'Woo', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: '', + listed: false, + organization: { + id: '2', + title: 'gogle', + summary: 'consultant services', + description: 'a very long description about the consultant company called gogle', + oin: '0012345678', + tooi: 'TECH001', + rsin: '987654321', + pki: 'PKI-12345-67890', + }, + }, + { + id: '3', + title: 'Foo', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'string', + // @ts-expect-error -- listed needs to be a boolean + listed: 0.2, + organization: { + id: '2', + title: 'gogle', + summary: 'consultant services', + description: 'a very long description about the consultant company called gogle', + oin: '0012345678', + tooi: 'TECH001', + rsin: '987654321', + pki: 'PKI-12345-67890', + }, + }, +] + +export const mockCatalogi = (data: TCatalogi[] = mockCatalogiData()): TCatalogi[] => data.map(item => new Catalogi(item)) diff --git a/src/entities/catalogi/catalogi.spec.ts b/src/entities/catalogi/catalogi.spec.ts index 635c1c76..898a03d2 100644 --- a/src/entities/catalogi/catalogi.spec.ts +++ b/src/entities/catalogi/catalogi.spec.ts @@ -1,62 +1,32 @@ /* eslint-disable no-console */ import { Catalogi } from './catalogi' -import { TCatalogi } from './catalogi.types' +import { mockCatalogi } from './catalogi.mock' describe('Catalogi Store', () => { it('create Catalogi entity with full data', () => { - const catalogi = new Catalogi(testData[0]) + const catalogi = new Catalogi(mockCatalogi()[0]) expect(catalogi).toBeInstanceOf(Catalogi) - expect(catalogi).toEqual(testData[0]) + expect(catalogi).toEqual(mockCatalogi()[0]) - expect(catalogi.validate()).toBe(true) + expect(catalogi.validate().success).toBe(true) }) it('create Catalogi entity with partial data', () => { - const catalogi = new Catalogi(testData[1]) + const catalogi = new Catalogi(mockCatalogi()[1]) expect(catalogi).toBeInstanceOf(Catalogi) - expect(catalogi.id).toBe(testData[1].id) - expect(catalogi.title).toBe(testData[1].title) - expect(catalogi.summary).toBe(testData[1].summary) - expect(catalogi.description).toBe(testData[1].description) - expect(catalogi.image).toBe('') - expect(catalogi.search).toBe('') - - expect(catalogi.validate()).toBe(true) + expect(catalogi).not.toBe(mockCatalogi()[1]) + + expect(catalogi.validate().success).toBe(true) }) it('create Catalogi entity with falsy data', () => { - const catalogi = new Catalogi(testData[2]) + const catalogi = new Catalogi(mockCatalogi()[2]) expect(catalogi).toBeInstanceOf(Catalogi) - expect(catalogi).toEqual(testData[2]) + expect(catalogi).toEqual(mockCatalogi()[2]) - expect(catalogi.validate()).toBe(false) + expect(catalogi.validate().success).toBe(false) }) }) - -const testData: TCatalogi[] = [ - { // full data - id: '1', - title: 'Decat', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, - { // partial data - id: '2', - title: 'Woo', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - }, - { // invalid data - id: '3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - image: 'string', - search: 'string', - }, -] diff --git a/src/entities/catalogi/catalogi.ts b/src/entities/catalogi/catalogi.ts index 9bfae9ae..76a89a00 100644 --- a/src/entities/catalogi/catalogi.ts +++ b/src/entities/catalogi/catalogi.ts @@ -1,13 +1,24 @@ import { TCatalogi } from './catalogi.types' +import { SafeParseReturnType, z } from 'zod' export class Catalogi implements TCatalogi { public id: string public title: string public summary: string - public description?: string - public image?: string - public search?: string + public description: string + public image: string + public listed: boolean + public organization: { + id: string + title: string + summary: string + description: string + oin: string + tooi: string + rsin: string + pki: string + } constructor(data: TCatalogi) { this.hydrate(data) @@ -16,25 +27,48 @@ export class Catalogi implements TCatalogi { /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods private hydrate(data: TCatalogi) { this.id = data?.id?.toString() || '' - // @ts-expect-error data.name is not supposed to exist but you can still get it from the backend, so this is just backwards compatibility - this.title = data?.title || data?.name || '' + this.title = data?.title || '' this.summary = data?.summary || '' this.description = data?.description || '' this.image = data?.image || '' - this.search = data?.search || '' + this.listed = data?.listed || false + this.organization = data.organization || { + id: '', + title: '', + summary: '', + description: '', + oin: '', + tooi: '', + rsin: '', + pki: '', + } } /* istanbul ignore next */ - public validate(): boolean { - // these have to exist - if (!this.id || typeof this.id !== 'string') return false - if (!this.title || typeof this.title !== 'string') return false - if (!this.summary || typeof this.summary !== 'string') return false - // these can be optional - if (typeof this.description !== 'string') return false - if (typeof this.image !== 'string') return false - if (typeof this.search !== 'string') return false - return true + public validate(): SafeParseReturnType { + // https://conduction.stoplight.io/docs/open-catalogi/8azwyic71djee-create-listing + const schema = z.object({ + title: z.string().min(1).max(255), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) + summary: z.string().min(1).max(255), + description: z.string().max(2555), + image: z.string().max(255), + listed: z.boolean(), + organization: z.object({ + title: z.string(), + summary: z.string(), + description: z.string(), + oin: z.string(), + tooi: z.string(), + rsin: z.string(), + pki: z.string(), + }), + }) + + const result = schema.safeParse({ + ...this, + }) + + return result } } diff --git a/src/entities/catalogi/catalogi.types.ts b/src/entities/catalogi/catalogi.types.ts index bf10f04d..ddad046d 100644 --- a/src/entities/catalogi/catalogi.types.ts +++ b/src/entities/catalogi/catalogi.types.ts @@ -2,7 +2,17 @@ export type TCatalogi = { id: string title: string summary: string - description?: string - image?: string - search?: string + description: string + image: string + listed: boolean + organization: { + id: string + title: string + summary: string + description: string + oin: string + tooi: string + rsin: string + pki: string + } } From e1937c43ef99d6975d12bc42ca3276d38320dfb7 Mon Sep 17 00:00:00 2001 From: Remko Date: Mon, 5 Aug 2024 18:39:47 +0200 Subject: [PATCH 065/145] WIP on feature/DIMOC-129/Organisation-page --- appinfo/routes.php | 1 + lib/Controller/OrganizationsController.php | 347 + package-lock.json | 14886 +--------------- src/store/modules/organization.js | 114 + src/store/modules/organization.spec.js | 220 + src/store/store.js | 3 + .../organizations/OrganizationDetail.vue | 592 + src/views/organizations/OrganizationIndex.vue | 51 + src/views/organizations/OrganizationList.vue | 233 + templates/OrganizationsIndex.php | 9 + 10 files changed, 1571 insertions(+), 14885 deletions(-) create mode 100644 lib/Controller/OrganizationsController.php create mode 100644 src/store/modules/organization.js create mode 100644 src/store/modules/organization.spec.js create mode 100644 src/views/organizations/OrganizationDetail.vue create mode 100644 src/views/organizations/OrganizationIndex.vue create mode 100644 src/views/organizations/OrganizationList.vue create mode 100644 templates/OrganizationsIndex.php diff --git a/appinfo/routes.php b/appinfo/routes.php index 7aadd29c..1cb90aca 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -4,6 +4,7 @@ 'resources' => [ 'metadata' => ['url' => '/api/metadata'], 'publications' => ['url' => '/api/publications'], + 'organizations' => ['url' => '/api/organizations'], 'attachments' => ['url' => '/api/attachments'], 'catalogi' => ['url' => '/api/catalogi'], 'directory' => ['url' => '/api/directory'] diff --git a/lib/Controller/OrganizationsController.php b/lib/Controller/OrganizationsController.php new file mode 100644 index 00000000..357ff731 --- /dev/null +++ b/lib/Controller/OrganizationsController.php @@ -0,0 +1,347 @@ + [ + "id" => "354980e5-c967-4ba5-989b-65c2b0cd2ff4", + "name" => "Input voor OpenCatalogi", + "summary" => "Dit is een selectie van high-value datasets in DCAT-AP 2.0 standaard x" + ], + "2ab0011e-9b4c-4c50-a50d-a16fc0be0178" => [ + "id" => "2ab0011e-9b4c-4c50-a50d-a16fc0be0178", + "title" => "Publication two", + "description" => "summary for two" + ] + ]; + + public function __construct + ( + $appName, + IRequest $request, + private readonly PublicationMapper $publicationMapper, + private readonly IAppConfig $config + ) + { + parent::__construct($appName, $request); + } + + private function insertNestedObjects(array $object, ObjectService $objectService, array $config): array + { + //@TODO keep in mind that unpublished objects should not be inserted, and that objects should be updated if a subobject is updated. + foreach($object as $key => $value) { + try { + if( + is_string(value: $value) + && $key !== 'id' + && Uuid::isValid(uuid: $value) === true + && $subObject = $objectService->findObject(filters: ['_id' => $value], config: $config) + ) { + $object[$key] = $subObject; + } + + if( + is_array(value: $value) === true + && array_is_list(array: $value) === true + ) { + $object[$key] = $this->insertNestedObjects(object: $value, objectService: $objectService, config: $config); + } + } catch (GuzzleException $exception) { + continue; + } + } + + return $object; + } + + + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function page(?string $getParameter) + { + // The TemplateResponse loads the 'main.php' + // defined in our app's 'templates' folder. + // We pass the $getParameter variable to the template + // so that the value is accessible in the template. + return new TemplateResponse( + $this->appName, + 'OrganizationsIndex', + [] + ); + } + + /** + * Taking it from a catalogue point of view is just adding a filter + * + * @NoAdminRequired + * @NoCSRFRequired + */ + public function catalog(string|int $id): TemplateResponse + { + // The TemplateResponse loads the 'main.php' + // defined in our app's 'templates' folder. + // We pass the $getParameter variable to the template + // so that the value is accessible in the template. + return new TemplateResponse( + $this->appName, + 'OrganizationsIndex', + [] + ); + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function index(ObjectService $objectService): JSONResponse + { + $filters = $this->request->getParams(); + + $searchConditions = []; + $searchParams = []; + $fieldsToSearch = ['title', 'description', 'summary']; + + foreach ($filters as $key => $value) { + if ($key === '_search') { + // MongoDB + $searchRegex = ['$regex' => $value, '$options' => 'i']; + $filters['$or'] = []; + + // MySQL + $searchParams['search'] = '%' . strtolower($value) . '%'; + + foreach ($fieldsToSearch as $field) { + // MongoDB + $filters['$or'][] = [$field => $searchRegex]; + + // MySQL + $searchConditions[] = "LOWER($field) LIKE :search"; + } + } + + if (str_starts_with($key, '_')) { + unset($filters[$key]); + } + } + + if($this->config->hasKey($this->appName, 'mongoStorage') === false + || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' + ) { + // Unset mongodb filter + unset($filters['$or']); + + return new JSONResponse(['results' => $this->publicationMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); + } + + $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); + $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); + $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); + + $filters['_schema'] = 'publication'; + + $result = $objectService->findObjects(filters: $filters, config: $dbConfig); + + $results = ["results" => $result['documents']]; + return new JSONResponse($results); + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function show(string|int $id, ObjectService $objectService): JSONResponse + { + if($this->config->hasKey($this->appName, 'mongoStorage') === false + || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' + ) { + return new JSONResponse($this->publicationMapper->find(id: (int) $id)); + } + + $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); + $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); + $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); + + $filters['_id'] = (string) $id; + + $result = $objectService->findObject(filters: $filters, config: $dbConfig); + + return new JSONResponse($result); + } + + + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function create(ObjectService $objectService, ElasticSearchService $elasticSearchService): JSONResponse + { + $data = $this->request->getParams(); + + foreach($data as $key => $value) { + if(str_starts_with($key, '_')) { + unset($data[$key]); + } + } + + if($this->config->hasKey($this->appName, 'mongoStorage') === false + || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' + ) { + $returnData = $this->publicationMapper->createFromArray($data); + $returnData = $returnData->jsonSerialize(); + $dbConfig = []; + } else { + $data['_schema'] = 'publication'; + + $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); + $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); + $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); + $returnData = $objectService->saveObject( + data: $data, + config: $dbConfig + ); + } + if( + $this->config->hasKey(app: $this->appName, key: 'elasticLocation') === true + && $this->config->getValueString(app: $this->appName, key: 'elasticLocation') !== '' + && $this->config->hasKey(app: $this->appName, key: 'elasticKey') === true + && $this->config->getValueString(app: $this->appName, key: 'elasticKey') !== '' + && $this->config->hasKey(app: $this->appName, key: 'elasticIndex') === true + && $this->config->getValueString(app: $this->appName, key: 'elasticIndex') !== '' + && $returnData['status'] === 'published' + ) { + $elasticConfig['location'] = $this->config->getValueString(app: $this->appName, key: 'elasticLocation'); + $elasticConfig['key'] = $this->config->getValueString(app: $this->appName, key: 'elasticKey'); + $elasticConfig['index'] = $this->config->getValueString(app: $this->appName, key: 'elasticIndex'); + + $returnData = $this->insertNestedObjects($returnData, $objectService, $dbConfig); + + $returnData = $elasticSearchService->addObject(object: $returnData, config: $elasticConfig); + + } + // get post from requests + return new JSONResponse($returnData); + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function update(string|int $id, ObjectService $objectService, ElasticSearchService $elasticSearchService): JSONResponse + { + + $data = $this->request->getParams(); + + foreach($data as $key => $value) { + if(str_starts_with($key, '_')) { + unset($data[$key]); + } + } + if (isset($data['id'])) { + unset( $data['id']); + } + + if($this->config->hasKey($this->appName, 'mongoStorage') === false + || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' + ) { + $returnData = $this->publicationMapper->updateFromArray(id: (int) $id, object: $data); + $returnData = $returnData->jsonSerialize(); + + $dbConfig = []; + } else { + $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); + $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); + $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); + + $filters['_id'] = (string) $id; + $returnData = $objectService->updateObject( + filters: $filters, + update: $data, + config: $dbConfig + ); + } + + if( + $this->config->hasKey(app: $this->appName, key: 'elasticLocation') === true + && $this->config->getValueString(app: $this->appName, key: 'elasticLocation') !== '' + && $this->config->hasKey(app: $this->appName, key: 'elasticKey') === true + && $this->config->getValueString(app: $this->appName, key: 'elasticKey') !== '' + && $this->config->hasKey(app: $this->appName, key: 'elasticIndex') === true + && $this->config->getValueString(app: $this->appName, key: 'elasticIndex') !== '' + && $returnData['status'] === 'published' + ) { + $elasticConfig['location'] = $this->config->getValueString(app: $this->appName, key: 'elasticLocation'); + $elasticConfig['key'] = $this->config->getValueString(app: $this->appName, key: 'elasticKey'); + $elasticConfig['index'] = $this->config->getValueString(app: $this->appName, key: 'elasticIndex'); + + $returnData = $this->insertNestedObjects($returnData, $objectService, $dbConfig); + + $returnData = $elasticSearchService->updateObject(id: $id, object: $returnData, config: $elasticConfig); + + } + + // get post from requests + return new JSONResponse($returnData); + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function destroy(string|int $id, ObjectService $objectService, ElasticSearchService $elasticSearchService): JSONResponse + { + if($this->config->hasKey($this->appName, 'mongoStorage') === false + || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' + ) { + $this->publicationMapper->delete($this->publicationMapper->find(id: (int) $id)); + + $returnData = []; + } else { + $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); + $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); + $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); + + $filters['_id'] = (string) $id; + $returnData = $objectService->deleteObject( + filters: $filters, + config: $dbConfig + ); + } + + if( + $this->config->hasKey(app: $this->appName, key: 'elasticLocation') === true + && $this->config->getValueString(app: $this->appName, key: 'elasticLocation') !== '' + && $this->config->hasKey(app: $this->appName, key: 'elasticKey') === true + && $this->config->getValueString(app: $this->appName, key: 'elasticKey') !== '' + && $this->config->hasKey(app: $this->appName, key: 'elasticIndex') === true + && $this->config->getValueString(app: $this->appName, key: 'elasticIndex') !== '' + && $returnData['status'] === 'published' + ) { + $elasticConfig['location'] = $this->config->getValueString(app: $this->appName, key: 'elasticLocation'); + $elasticConfig['key'] = $this->config->getValueString(app: $this->appName, key: 'elasticKey'); + $elasticConfig['index'] = $this->config->getValueString(app: $this->appName, key: 'elasticIndex'); + + $returnData = $elasticSearchService->removeObject(id: $id, config: $elasticConfig); + + } + + // get post from requests + return new JSONResponse($returnData); + } +} diff --git a/package-lock.json b/package-lock.json index e81968bd..c62b94eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "opencatalogi", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9846,20 +9846,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -20320,14875 +20306,5 @@ "url": "https://github.com/sponsors/wooorm" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - } - }, - "@babel/compat-data": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", - "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", - "dev": true - }, - "@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - } - }, - "@babel/eslint-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.8.tgz", - "integrity": "sha512-nYAikI4XTGokU2QX7Jx+v4rxZKhKivaQaREZjuW3mrJrbdWJ5yUfohnoUULge+zEEaKjPYNxhoRgUKktjXtbwA==", - "dev": true, - "peer": true, - "requires": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - } - }, - "@babel/generator": { - "version": "7.24.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", - "dev": true, - "requires": { - "@babel/types": "^7.24.9", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz", - "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" - } - }, - "@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" - } - }, - "@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "dev": true, - "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", - "dev": true, - "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" - } - }, - "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, - "@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==" - }, - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz", - "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.8" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.8" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/preset-env": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz", - "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.24.8", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.8", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", - "semver": "^6.3.1" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", - "requires": { - "regenerator-runtime": "^0.14.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - } - } - }, - "@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@csstools/css-parser-algorithms": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", - "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", - "dev": true, - "peer": true, - "requires": {} - }, - "@csstools/css-tokenizer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", - "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", - "dev": true, - "peer": true - }, - "@csstools/media-query-list-parser": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz", - "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==", - "dev": true, - "peer": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", - "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", - "dev": true, - "peer": true, - "requires": {} - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "peer": true - }, - "@es-joy/jsdoccomment": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", - "integrity": "sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==", - "dev": true, - "peer": true, - "requires": { - "comment-parser": "1.4.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" - } - }, - "@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, - "peer": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "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, - "peer": true - } - } - }, - "@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "peer": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "peer": true, - "requires": { - "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" - }, - "dependencies": { - "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, - "peer": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "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, - "peer": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "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, - "peer": true - } - } - }, - "@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, - "peer": true - }, - "@floating-ui/core": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.5.tgz", - "integrity": "sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==", - "requires": { - "@floating-ui/utils": "^0.2.5" - } - }, - "@floating-ui/dom": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.8.tgz", - "integrity": "sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==", - "requires": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.5" - } - }, - "@floating-ui/utils": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.5.tgz", - "integrity": "sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==" - }, - "@fortawesome/fontawesome-common-types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", - "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==" - }, - "@fortawesome/fontawesome-svg-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz", - "integrity": "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.6.0" - } - }, - "@fortawesome/free-solid-svg-icons": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.6.0.tgz", - "integrity": "sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.6.0" - } - }, - "@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, - "peer": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@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, - "peer": true - }, - "@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, - "peer": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "requires": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@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, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" - }, - "@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true, - "peer": true - }, - "@linusborg/vue-simple-portal": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@linusborg/vue-simple-portal/-/vue-simple-portal-0.1.5.tgz", - "integrity": "sha512-dq+oubEVW4UabBoQxmH97GiDa+F6sTomw4KcXFHnXEpw69rdkXFCxo1WzwuvWjoLiUVYJTyN1dtlUvTa50VcXg==", - "requires": { - "nanoid": "^3.1.20" - } - }, - "@mapbox/hast-util-table-cell-style": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.1.tgz", - "integrity": "sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==", - "requires": { - "unist-util-visit": "^1.4.1" - }, - "dependencies": { - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" - }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "requires": { - "unist-util-is": "^3.0.0" - } - } - } - }, - "@nextcloud/auth": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@nextcloud/auth/-/auth-2.3.0.tgz", - "integrity": "sha512-PCkRJbML9sXvBENY43vTIERIZJFk2azu08IK6zYOnOZ7cFkD1QlFJtdTCZTImQLg01IXhIm0j0ExEdatHoqz7g==", - "requires": { - "@nextcloud/event-bus": "^3.2.0" - } - }, - "@nextcloud/axios": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-2.5.0.tgz", - "integrity": "sha512-82LQ5PZA0ZVUnS8QiGoAGOR5kE7EKD84qEEgeZJ+Y7p5iljwi3AT6niQuP7YuHjt3MKM+6jQiyghZk5SquiszQ==", - "requires": { - "@nextcloud/auth": "^2.3.0", - "@nextcloud/router": "^3.0.1", - "axios": "^1.6.8" - }, - "dependencies": { - "@nextcloud/router": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-3.0.1.tgz", - "integrity": "sha512-Ci/uD3x8OKHdxSqXL6gRJ+mGJOEXjeiHjj7hqsZqVTsT7kOrCjDf0/J8z5RyLlokKZ0IpSe+hGxgi3YB7Gpw3Q==", - "requires": { - "@nextcloud/typings": "^1.7.0" - } - } - } - }, - "@nextcloud/browser-storage": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@nextcloud/browser-storage/-/browser-storage-0.4.0.tgz", - "integrity": "sha512-D6XxznxCYmJ3oBCC3p0JB6GZJ2RZ9dgbB1UqtTePXrIvHUMBAeF/YkiGKYxLAVZCZb+NSNZXgAYHm/3LnIUbDg==", - "requires": { - "core-js": "3.37.0" - }, - "dependencies": { - "core-js": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", - "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==" - } - } - }, - "@nextcloud/browserslist-config": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nextcloud/browserslist-config/-/browserslist-config-3.0.1.tgz", - "integrity": "sha512-GZTxL5fsDgmFoot/qnRurjHCuHjSfOg+A6t4+P2TySXua2Q1Ex0lecZYlSnRuOR/W5BGOZ06ITTA/hbkSh1Ypg==", - "dev": true - }, - "@nextcloud/capabilities": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@nextcloud/capabilities/-/capabilities-1.2.0.tgz", - "integrity": "sha512-L1NQtOfHWzkfj0Ple1MEJt6HmOHWAi3y4qs+OnwSWexqJT0DtXTVPyRxi7ADyITwRxS5H9R/HMl6USAj4Nr1nQ==", - "requires": { - "@nextcloud/initial-state": "^2.1.0" - } - }, - "@nextcloud/dialogs": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-3.2.0.tgz", - "integrity": "sha512-notaHF8LXPJINBbILCbRe+dgXnJPe7NQTIrN1vwfaGUSG9GUfEf+v367yyg2brCgV6ulE/HmNhYjTQwW5AqSJA==", - "requires": { - "@nextcloud/l10n": "^1.3.0", - "@nextcloud/typings": "^1.0.0", - "core-js": "^3.6.4", - "toastify-js": "^1.12.0" - }, - "dependencies": { - "@nextcloud/l10n": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@nextcloud/l10n/-/l10n-1.6.0.tgz", - "integrity": "sha512-aKGlgrwN9OiafN791sYus0shfwNeU3PlrH6Oi9ISma6iJSvN6a8aJM8WGKCJ9pqBaTR5PrDuckuM/WnybBWb6A==", - "requires": { - "core-js": "^3.6.4", - "node-gettext": "^3.0.0" - } - } - } - }, - "@nextcloud/eslint-config": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@nextcloud/eslint-config/-/eslint-config-8.4.1.tgz", - "integrity": "sha512-ilrPxOnfVkB4dAddtkhbJmbYK9FwEVZ5oIJ2ipiE97rQz82TUZxmfEHE1tr87FbIvz0drIcREgGil3zuNWHjrg==", - "dev": true, - "requires": {} - }, - "@nextcloud/eslint-plugin": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@nextcloud/eslint-plugin/-/eslint-plugin-2.2.1.tgz", - "integrity": "sha512-RX+0FxpL1h2EzjNLeW0VSGTkbyWIq7WgV7QAjtyUmDbSGwf1ds9Zy5OcRkgXRHRIu/W0gB0DhS2iz9qXHphCzA==", - "dev": true, - "peer": true, - "requires": { - "fast-xml-parser": "^4.2.5", - "requireindex": "^1.2.0", - "semver": "^7.5.3" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - } - } - }, - "@nextcloud/event-bus": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@nextcloud/event-bus/-/event-bus-3.3.1.tgz", - "integrity": "sha512-VBYJspOVk5aZopgZwCUoMKFqcTLCNel2TLvtu0HMPV2gR5ZLPiPAKbkyKkYTh+Sd5QB1gR6l3STTv1gyal0soQ==", - "requires": { - "@types/node": "^20.12.12", - "semver": "^7.6.2" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" - } - } - }, - "@nextcloud/initial-state": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@nextcloud/initial-state/-/initial-state-2.2.0.tgz", - "integrity": "sha512-cDW98L5KGGgpS8pzd+05304/p80cyu8U2xSDQGa+kGPTpUFmCbv2qnO5WrwwGTauyjYijCal2bmw82VddSH+Pg==" - }, - "@nextcloud/l10n": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nextcloud/l10n/-/l10n-2.1.0.tgz", - "integrity": "sha512-rToqXwxcsDTcijvSdgyJAKuOuW7XggDYH00/t3GN5HzO1lNNnVtOj7cc5WmiTknciM+En2oVSMFIUPs6HehjVQ==", - "requires": { - "@nextcloud/router": "^2.0.0", - "dompurify": "^2.4.1", - "escape-html": "^1.0.3", - "node-gettext": "^3.0.0" - } - }, - "@nextcloud/logger": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nextcloud/logger/-/logger-3.0.2.tgz", - "integrity": "sha512-wByt0R0/6QC44RBpaJr1MWghjjOxk/pRbACHo/ZWWKht1qYbJRHB4GtEi+35KEIHY07ZpqxiDk6dIRuN7sXYWQ==", - "requires": { - "@nextcloud/auth": "^2.3.0" - } - }, - "@nextcloud/router": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-2.1.2.tgz", - "integrity": "sha512-Jj5fgjeHT1vVIgOyUGOeHfwk2KgaO77QGfqZAT6GWXvpAsN0mkqwljkg4FkHrQRouYqCE4VnJ5o8/w0DAN89tA==", - "requires": { - "@nextcloud/typings": "^1.0.0", - "core-js": "^3.6.4" - } - }, - "@nextcloud/sharing": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.2.3.tgz", - "integrity": "sha512-hxQFOBBahbJkcmAGZFVS3943pQGSafNF6LMHmgcj0JPqExu1DWKuZvsCXZnGkaRJVcewHnZFcLAhpOf+VfcZmA==", - "requires": { - "@nextcloud/initial-state": "^2.2.0" - } - }, - "@nextcloud/stylelint-config": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@nextcloud/stylelint-config/-/stylelint-config-2.4.0.tgz", - "integrity": "sha512-S/q/offcs9pwnkjSrnfvsONryCOe6e1lfK2sszN6ZtkYyXvaqi8EbQuuhaGlxCstn9oXwbXfAI6O3Y8lGrjdFg==", - "dev": true, - "requires": {} - }, - "@nextcloud/timezones": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nextcloud/timezones/-/timezones-0.1.1.tgz", - "integrity": "sha512-ldLuLyz605sszetnp6jy6mtlThu4ICKsZThxHIZwn6t4QzjQH3xr+k8mRU7GIvKq9egUFDqBp4gBjxm3/ROZig==", - "requires": { - "ical.js": "^2.0.1" - } - }, - "@nextcloud/typings": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.9.1.tgz", - "integrity": "sha512-i0l/L5gKW8EACbXHVxXM6wn3sUhY2qmnL2OijppzU4dENC7/hqySMQDer7/+cJbNSNG7uHF/Z+9JmHtDfRfuGg==", - "requires": { - "@types/jquery": "3.5.16" - } - }, - "@nextcloud/vue": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.15.0.tgz", - "integrity": "sha512-Yxf7bIzKV3vCDJDZo99dSLpfe9wMh0hTvmlov5B8V+ZX/foq+O/EcvPivbJmesjIi6LKg+z4K53d7tU2izAPSg==", - "requires": { - "@floating-ui/dom": "^1.1.0", - "@linusborg/vue-simple-portal": "^0.1.5", - "@nextcloud/auth": "^2.2.1", - "@nextcloud/axios": "^2.4.0", - "@nextcloud/browser-storage": "^0.4.0", - "@nextcloud/capabilities": "^1.1.0", - "@nextcloud/event-bus": "^3.1.0", - "@nextcloud/initial-state": "^2.1.0", - "@nextcloud/l10n": "^3.0.1", - "@nextcloud/logger": "^3.0.1", - "@nextcloud/router": "^3.0.0", - "@nextcloud/sharing": "^0.2.2", - "@nextcloud/timezones": "^0.1.1", - "@nextcloud/vue-select": "^3.25.0", - "@vueuse/components": "^10.9.0", - "@vueuse/core": "^10.9.0", - "clone": "^2.1.2", - "debounce": "2.1.0", - "dompurify": "^3.0.5", - "emoji-mart-vue-fast": "^15.0.1", - "escape-html": "^1.0.3", - "floating-vue": "^1.0.0-beta.19", - "focus-trap": "^7.4.3", - "linkify-string": "^4.0.0", - "md5": "^2.3.0", - "rehype-external-links": "^3.0.0", - "rehype-react": "^7.1.2", - "remark-breaks": "^4.0.0", - "remark-gfm": "^4.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "splitpanes": "^2.4.1", - "string-length": "^5.0.1", - "striptags": "^3.2.0", - "tributejs": "^5.1.3", - "unified": "^11.0.1", - "unist-builder": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vue": "^2.7.16", - "vue-color": "^2.8.1", - "vue-frag": "^1.4.3", - "vue-router": "^3.6.5", - "vue2-datepicker": "^3.11.0" - }, - "dependencies": { - "@nextcloud/l10n": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@nextcloud/l10n/-/l10n-3.1.0.tgz", - "integrity": "sha512-unciqr8QSJ29vFBw9S1bquyoj1PTWHszNL8tcUNuxUAYpq0hX+8o7rpB5gimELA4sj4m9+VCJwgLtBZd1Yj0lg==", - "requires": { - "@nextcloud/router": "^3.0.1", - "@nextcloud/typings": "^1.8.0", - "@types/dompurify": "^3.0.5", - "@types/escape-html": "^1.0.4", - "dompurify": "^3.1.2", - "escape-html": "^1.0.3", - "node-gettext": "^3.0.0" - } - }, - "@nextcloud/router": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-3.0.1.tgz", - "integrity": "sha512-Ci/uD3x8OKHdxSqXL6gRJ+mGJOEXjeiHjj7hqsZqVTsT7kOrCjDf0/J8z5RyLlokKZ0IpSe+hGxgi3YB7Gpw3Q==", - "requires": { - "@nextcloud/typings": "^1.7.0" - } - }, - "dompurify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", - "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" - } - } - }, - "@nextcloud/vue-select": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/@nextcloud/vue-select/-/vue-select-3.25.1.tgz", - "integrity": "sha512-jqCi4G+Q0H6+Hm8wSN3vRX2+eXG2jXR2bwBX/sErVEsH5UaxT4Nb7KqgdeIjVfeF7ccIdRqpmIb4Pkf0lao67w==", - "requires": {} - }, - "@nextcloud/webpack-vue-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@nextcloud/webpack-vue-config/-/webpack-vue-config-6.0.1.tgz", - "integrity": "sha512-NE+U52ih35QGmtcKbp0f2ZAL7ZA3CJEJarp62aveyQ6eIIt5LZ8lcihAKcbNWkGFwyc5O40iTjIg/NHJYAG7xQ==", - "dev": true, - "requires": {} - }, - "@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "peer": true, - "requires": { - "eslint-scope": "5.1.1" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@nuxt/opencollective": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.3.tgz", - "integrity": "sha512-6IKCd+gP0HliixqZT/p8nW3tucD6Sv/u/eR2A9X4rxT/6hXlMzA4GZQzq4d2qnBAwSwGpmKyzkyTjNjrhaA25A==", - "requires": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.7" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@one-ini/wasm": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", - "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", - "dev": true - }, - "@pinia/testing": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@pinia/testing/-/testing-0.1.3.tgz", - "integrity": "sha512-D2Ds2s69kKFaRf2KCcP1NhNZEg5+we59aRyQalwRm7ygWfLM25nDH66267U3hNvRUOTx8ofL24GzodZkOmB5xw==", - "dev": true, - "requires": { - "vue-demi": ">=0.14.5" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.9.tgz", - "integrity": "sha512-dC1TJMODGM8lxhP6wLToncaDPPNB3biVxxRDuNCYpuXwi70ou7NsGd97KVTJ2omepGId429JZt8oaZKeXbqxwg==", - "dev": true, - "requires": {} - } - } - }, - "@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 - }, - "@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 - }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "peer": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "peer": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "requires": { - "@types/ms": "*" - } - }, - "@types/dompurify": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", - "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", - "requires": { - "@types/trusted-types": "*" - } - }, - "@types/escape-html": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.4.tgz", - "integrity": "sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==" - }, - "@types/eslint": { - "version": "8.56.11", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz", - "integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "peer": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "peer": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "requires": { - "@types/unist": "*" - } - }, - "@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "peer": true - }, - "@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/jquery": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", - "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", - "requires": { - "@types/sizzle": "*" - } - }, - "@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "peer": true - }, - "@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "requires": { - "@types/unist": "*" - } - }, - "@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "peer": true - }, - "@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "peer": true - }, - "@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "@types/node": { - "version": "20.14.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", - "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "peer": true - }, - "@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "peer": true - }, - "@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true, - "peer": true - }, - "@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "peer": true - }, - "@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "peer": true, - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true, - "peer": true - }, - "@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "peer": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "peer": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "peer": true, - "requires": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "@types/sizzle": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", - "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==" - }, - "@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true - }, - "@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true - }, - "@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" - }, - "@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" - }, - "@types/ws": { - "version": "8.5.11", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.11.tgz", - "integrity": "sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.17.0.tgz", - "integrity": "sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==", - "dev": true, - "peer": true, - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/type-utils": "7.17.0", - "@typescript-eslint/utils": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.17.0.tgz", - "integrity": "sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/typescript-estree": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz", - "integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.17.0.tgz", - "integrity": "sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/typescript-estree": "7.17.0", - "@typescript-eslint/utils": "7.17.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz", - "integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==", - "dev": true, - "peer": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz", - "integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.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" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - } - } - }, - "@typescript-eslint/utils": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz", - "integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==", - "dev": true, - "peer": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/typescript-estree": "7.17.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz", - "integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/types": "7.17.0", - "eslint-visitor-keys": "^3.4.3" - }, - "dependencies": { - "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, - "peer": true - } - } - }, - "@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==" - }, - "@vue/compiler-sfc": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", - "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", - "requires": { - "@babel/parser": "^7.23.5", - "postcss": "^8.4.14", - "prettier": "^1.18.2 || ^2.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "@vue/component-compiler-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", - "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", - "requires": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.36", - "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2 || ^2.0.0", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - } - } - }, - "@vue/devtools-api": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", - "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" - }, - "@vue/eslint-config-typescript": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", - "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^7.1.1", - "@typescript-eslint/parser": "^7.1.1", - "vue-eslint-parser": "^9.3.1" - } - }, - "@vue/test-utils": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz", - "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==", - "dev": true, - "requires": { - "js-beautify": "^1.14.9", - "vue-component-type-helpers": "^2.0.0" - } - }, - "@vue/vue2-jest": { - "version": "29.2.6", - "resolved": "https://registry.npmjs.org/@vue/vue2-jest/-/vue2-jest-29.2.6.tgz", - "integrity": "sha512-nPu9IvnEkP0AEpo9ETOAk50uqyBa0QMJ9GnPYkC7EukFN1z29QKjyucICayMt8KuHJ9oYBca2TDMH40HowY9mQ==", - "dev": true, - "requires": { - "@babel/plugin-transform-modules-commonjs": "^7.2.0", - "@vue/component-compiler-utils": "^3.1.0", - "chalk": "^2.1.0", - "css-tree": "^2.0.1", - "source-map": "0.5.6", - "tsconfig": "^7.0.0" - } - }, - "@vueuse/components": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.11.0.tgz", - "integrity": "sha512-ZvLZI23d5ZAtva5fGyYh/jQtZO8l+zJ5tAXyYNqHJZkq1o5yWyqZhENvSv5mfDmN5IuAOp4tq02mRmX/ipFGcg==", - "requires": { - "@vueuse/core": "10.11.0", - "@vueuse/shared": "10.11.0", - "vue-demi": ">=0.14.8" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.9.tgz", - "integrity": "sha512-dC1TJMODGM8lxhP6wLToncaDPPNB3biVxxRDuNCYpuXwi70ou7NsGd97KVTJ2omepGId429JZt8oaZKeXbqxwg==", - "requires": {} - } - } - }, - "@vueuse/core": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.0.tgz", - "integrity": "sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==", - "requires": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.0", - "@vueuse/shared": "10.11.0", - "vue-demi": ">=0.14.8" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.9.tgz", - "integrity": "sha512-dC1TJMODGM8lxhP6wLToncaDPPNB3biVxxRDuNCYpuXwi70ou7NsGd97KVTJ2omepGId429JZt8oaZKeXbqxwg==", - "requires": {} - } - } - }, - "@vueuse/metadata": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.0.tgz", - "integrity": "sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==" - }, - "@vueuse/shared": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.0.tgz", - "integrity": "sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==", - "requires": { - "vue-demi": ">=0.14.8" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.9.tgz", - "integrity": "sha512-dC1TJMODGM8lxhP6wLToncaDPPNB3biVxxRDuNCYpuXwi70ou7NsGd97KVTJ2omepGId429JZt8oaZKeXbqxwg==", - "requires": {} - } - } - }, - "@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "peer": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@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==", - "peer": true - }, - "@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==", - "peer": true - }, - "@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==", - "peer": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "peer": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@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==", - "peer": true - }, - "@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==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "peer": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "peer": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "peer": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "peer": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "peer": true, - "requires": {} - }, - "@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "peer": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "peer": true - }, - "@yr/monotone-cubic-spline": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", - "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==" - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "peer": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "peer": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==" - }, - "acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "requires": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peer": true, - "requires": {} - }, - "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, - "peer": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dev": true, - "requires": { - "acorn": "^8.11.0" - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peer": true, - "requires": {} - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "peer": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "apexcharts": { - "version": "3.51.0", - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.51.0.tgz", - "integrity": "sha512-WpCdVdGiJjf9SAyEeg2rl3q5OqCcNqiEmH0+filMraUiH6Vqyn5GFeMMyH0pon44xjNr1G0xzIRERKRmsGEuRA==", - "requires": { - "@yr/monotone-cubic-spline": "^1.0.3", - "svg.draggable.js": "^2.2.2", - "svg.easing.js": "^2.0.0", - "svg.filter.js": "^2.0.2", - "svg.pathmorphing.js": "^0.1.3", - "svg.resize.js": "^1.4.3", - "svg.select.js": "^3.0.1" - } - }, - "are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "peer": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "peer": true - }, - "array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - } - }, - "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 - }, - "array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "peer": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "peer": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - } - } - }, - "assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "peer": true - }, - "async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "peer": true, - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - } - } - }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true, - "peer": true, - "requires": {} - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "peer": true, - "requires": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "peer": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true, - "peer": true - }, - "big.js": { - "version": "5.2.2" - }, - "binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "peer": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "peer": true - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "peer": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "peer": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "peer": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dev": true, - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "peer": true - }, - "bootstrap": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", - "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", - "requires": {} - }, - "bootstrap-vue": { - "version": "2.23.1", - "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.23.1.tgz", - "integrity": "sha512-SEWkG4LzmMuWjQdSYmAQk1G/oOKm37dtNfjB5kxq0YafnL2W6qUAmeDTcIZVbPiQd2OQlIkWOMPBRGySk/zGsg==", - "requires": { - "@nuxt/opencollective": "^0.3.2", - "bootstrap": "^4.6.1", - "popper.js": "^1.16.1", - "portal-vue": "^2.1.7", - "vue-functional-data-merge": "^3.1.0" - } - }, - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true, - "peer": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "peer": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "peer": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "peer": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - } - } - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "peer": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", - "requires": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.1.0" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "peer": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true, - "peer": true - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "peer": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true, - "peer": true - }, - "builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", - "dev": true, - "peer": true, - "requires": { - "semver": "^7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - } - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "peer": true - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "peer": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "peer": true, - "requires": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "peer": true - } - } - }, - "caniuse-lite": { - "version": "1.0.30001643", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", - "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==" - }, - "ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==" - }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "peer": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "peer": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "peer": true - }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true - }, - "clamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", - "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==" - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "peer": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "peer": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true, - "peer": true - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "peer": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" - }, - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true - }, - "comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", - "dev": true, - "peer": true - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "peer": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "peer": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "peer": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "peer": true - }, - "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true, - "peer": true - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "requires": { - "bluebird": "^3.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true, - "peer": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "peer": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "peer": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "peer": true - }, - "core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==" - }, - "core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", - "dev": true, - "requires": { - "browserslist": "^4.23.0" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "peer": true - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "peer": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "dependencies": { - "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, - "peer": true - }, - "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, - "peer": true, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "peer": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "peer": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "peer": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", - "dev": true, - "peer": true - }, - "css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "dependencies": { - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} - }, - "postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "requires": { - "icss-utils": "^5.0.0" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" - } - } - }, - "css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "requires": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - } - }, - "data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "date-format-parse": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/date-format-parse/-/date-format-parse-0.2.7.tgz", - "integrity": "sha512-/+lyMUKoRogMuTeOVii6lUwjbVlesN9YRYLzZT/g3TEZ3uD9QnpjResujeEqUW+OSNbT7T1+SYdyEkTcRv+KDQ==" - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" - }, - "deasync": { - "version": "0.1.30", - "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.30.tgz", - "integrity": "sha512-OaAjvEQuQ9tJsKG4oHO9nV1UHTwb2Qc2+fadB0VeVtD0Z9wiG1XPGLJ4W3aLhAoQSYTaLROFRbd5X20Dkzf7MQ==", - "dev": true, - "requires": { - "bindings": "^1.5.0", - "node-addon-api": "^1.7.1" - } - }, - "debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.1.0.tgz", - "integrity": "sha512-OkL3+0pPWCqoBc/nhO9u6TIQNTK44fnBnzuVtJAbp13Naxw9R6u21x+8tVTka87AhDZ3htqZ2pSSsZl9fqL2Wg==" - }, - "debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true, - "peer": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "peer": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "peer": true - } - } - }, - "decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "requires": { - "character-entities": "^2.0.0" - } - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "requires": {} - }, - "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, - "peer": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "peer": true, - "requires": { - "execa": "^5.0.0" - } - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "peer": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "peer": true - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "peer": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "peer": true - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - }, - "des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "peer": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "peer": true - }, - "devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "requires": { - "dequal": "^2.0.0" - } - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "peer": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "peer": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "peer": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domain-browser": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", - "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", - "dev": true, - "peer": true - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "peer": true - }, - "domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "peer": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "dompurify": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.6.tgz", - "integrity": "sha512-zUTaUBO8pY4+iJMPE1B9XlO2tXVYIcEA4SNGtvDELzTSCQO7RzH+j7S180BmhmJId78lqGU2z19vgVx2Sxs/PQ==" - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "peer": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", - "dev": true, - "requires": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" - }, - "dependencies": { - "minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "peer": true - }, - "ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, - "electron-to-chromium": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.1.tgz", - "integrity": "sha512-FKbOCOQ5QRB3VlIbl1LZQefWIYwszlBloaXcY2rbfpu9ioJnNh3TK03YtIDKDo3WKBi8u+YV4+Fn2CkEozgf4w==" - }, - "elliptic": { - "version": "6.5.6", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.6.tgz", - "integrity": "sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - } - } - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "emoji-mart-vue-fast": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-15.0.2.tgz", - "integrity": "sha512-q7VaE6yRrlQd+jpHPToh1XnIatgACkQjBj0vQ7uNaWrbVsKlhZaOsqZVoegT5IZt5XkYoR2x4MHMNep/BJP9rw==", - "requires": { - "@babel/runtime": "^7.18.6", - "core-js": "^3.23.5" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "peer": true - }, - "enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, - "envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", - "dev": true, - "peer": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "peer": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - } - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "peer": true, - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "peer": true - }, - "es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "peer": true - }, - "es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "peer": true, - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "peer": true, - "requires": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - } - }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "peer": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "peer": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" - }, - "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==" - }, - "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 - }, - "escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "peer": true, - "requires": { - "@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" - }, - "dependencies": { - "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, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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, - "peer": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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, - "peer": true - }, - "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, - "peer": true - }, - "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, - "peer": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "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, - "peer": true - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true - }, - "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, - "peer": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "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, - "peer": true - }, - "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, - "peer": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "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, - "peer": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "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, - "peer": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "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, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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, - "peer": true - } - } - }, - "eslint-compat-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", - "dev": true, - "peer": true, - "requires": { - "semver": "^7.5.4" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - } - } - }, - "eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "peer": true, - "requires": {} - }, - "eslint-import-resolver-exports": { - "version": "1.0.0-beta.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-exports/-/eslint-import-resolver-exports-1.0.0-beta.5.tgz", - "integrity": "sha512-o6t0w7muUpXr7MkUVzD5igQoDfAQvTmcPp8HEAJdNF8eOuAO+yn6I/TTyMxz9ecCwzX7e02vzlkHURoScUuidg==", - "dev": true, - "peer": true, - "requires": { - "resolve.exports": "^2.0.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "peer": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "peer": true, - "requires": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - } - }, - "eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "peer": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-es-x": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", - "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", - "dev": true, - "peer": true, - "requires": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.11.0", - "eslint-compat-utils": "^0.5.1" - } - }, - "eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "peer": true, - "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "peer": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "eslint-plugin-jsdoc": { - "version": "46.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.10.1.tgz", - "integrity": "sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==", - "dev": true, - "peer": true, - "requires": { - "@es-joy/jsdoccomment": "~0.41.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.4", - "spdx-expression-parse": "^4.0.0" - }, - "dependencies": { - "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, - "peer": true - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - } - } - }, - "eslint-plugin-n": { - "version": "16.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", - "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", - "dev": true, - "peer": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^13.24.0", - "ignore": "^5.2.4", - "is-builtin-module": "^3.2.1", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - }, - "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, - "peer": true - } - } - }, - "eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "eslint-plugin-vue": { - "version": "9.27.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz", - "integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==", - "dev": true, - "peer": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "globals": "^13.24.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.0", - "vue-eslint-parser": "^9.4.3", - "xml-name-validator": "^4.0.0" - }, - "dependencies": { - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - }, - "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, - "peer": true - } - } - }, - "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==", - "peer": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "peer": true - }, - "eslint-webpack-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA==", - "dev": true, - "requires": { - "@types/eslint": "^8.56.10", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0" - } - }, - "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, - "peer": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "dependencies": { - "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, - "peer": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "peer": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "peer": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "peer": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "peer": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "peer": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "peer": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "peer": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "peer": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "peer": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "peer": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "peer": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extract-from-css": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/extract-from-css/-/extract-from-css-0.4.4.tgz", - "integrity": "sha512-41qWGBdtKp9U7sgBxAQ7vonYqSXzgW/SiAYzq4tdWSVhAShvpVCH1nyvPQgjse6EdgbW7Y7ERdT3674/lKr65A==", - "dev": true, - "requires": { - "css": "^2.1.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "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, - "peer": true - }, - "fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true - }, - "fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "dev": true, - "peer": true, - "requires": { - "strnum": "^1.0.5" - } - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "peer": true - }, - "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "peer": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "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, - "peer": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, - "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, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "peer": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - } - } - }, - "find-babel-config": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.2.tgz", - "integrity": "sha512-oK59njMyw2y3yxto1BCfVK7MQp/OYf4FleHu0RgosH3riFJ1aOuo/7naLDLAObfrgn3ueFhw5sAT/cp0QuJI3Q==", - "dev": true, - "requires": { - "json5": "^1.0.2", - "path-exists": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "peer": true, - "requires": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "peer": true - }, - "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, - "peer": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "peer": true - }, - "floating-vue": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/floating-vue/-/floating-vue-1.0.0-beta.19.tgz", - "integrity": "sha512-OcM7z5Ua4XAykqolmvPj3l1s+KqUKj6Xz2t66eqjgaWfNBjtuifmxO5+4rRXakIch/Crt8IH+vKdKcR3jOUaoQ==", - "requires": { - "@floating-ui/dom": "^0.1.10", - "vue-resize": "^1.0.0" - }, - "dependencies": { - "@floating-ui/core": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.3.1.tgz", - "integrity": "sha512-ensKY7Ub59u16qsVIFEo2hwTCqZ/r9oZZFh51ivcLGHfUwTn8l1Xzng8RJUe91H/UP8PeqeBronAGx0qmzwk2g==" - }, - "@floating-ui/dom": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.1.10.tgz", - "integrity": "sha512-4kAVoogvQm2N0XE0G6APQJuCNuErjOfPW8Ux7DFxh8+AfugWflwVJ5LDlHOwrwut7z/30NUvdtHzQ3zSip4EzQ==", - "requires": { - "@floating-ui/core": "^0.3.0" - } - } - } - }, - "focus-trap": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", - "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", - "requires": { - "tabbable": "^6.2.0" - } - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "peer": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "peer": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "peer": true - }, - "fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "dev": true, - "peer": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "peer": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "peer": true, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - } - }, - "get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", - "dev": true, - "peer": true, - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "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, - "peer": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "peer": true - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "peer": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "peer": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "peer": true, - "requires": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true, - "peer": true - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "peer": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "peer": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true, - "peer": true - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "peer": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - } - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "peer": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "peer": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "peer": true - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "peer": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==" - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "hast-to-hyperscript": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-10.0.3.tgz", - "integrity": "sha512-NuBoUStp4fRwmvlfbidlEiRSTk0gSHm+97q4Xn9CJ10HO+Py7nlTuDi6RhM1qLOureukGrCXLG7AAxaGqqyslQ==", - "requires": { - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.1", - "web-namespaces": "^2.0.0" - }, - "dependencies": { - "@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - } - } - }, - "hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "requires": { - "@types/hast": "^3.0.0" - } - }, - "hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==" - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "peer": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - } - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "peer": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true, - "peer": true - }, - "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "peer": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true, - "peer": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "peer": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true, - "peer": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "peer": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "peer": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "peer": true - } - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true, - "peer": true - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "ical.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.0.1.tgz", - "integrity": "sha512-uYYb1CwTXbd9NP/xTtgQZ5ivv6bpUjQu9VM98s3X78L3XRu00uJW5ZtmnLwyxhztpf5fSiRyDpFW7ZNCePlaPw==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "peer": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "peer": true - }, - "ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true - }, - "immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "dev": true, - "peer": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "peer": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true - } - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "peer": true - }, - "import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "dependencies": { - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "peer": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "peer": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "peer": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "dev": true, - "peer": true - }, - "is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==" - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "peer": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "peer": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "peer": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "peer": true - }, - "is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "peer": true, - "requires": { - "is-typed-array": "^1.1.13" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "peer": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "peer": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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, - "peer": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "peer": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "peer": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "peer": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "peer": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "peer": true, - "requires": { - "which-typed-array": "^1.1.14" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "peer": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "peer": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "peer": true - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "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, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "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 - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-transform-stub": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz", - "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==", - "dev": true - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "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 - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "peer": true - }, - "js-beautify": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", - "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", - "dev": true, - "requires": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.4", - "glob": "^10.3.3", - "js-cookie": "^3.0.5", - "nopt": "^7.2.0" - }, - "dependencies": { - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - } - } - }, - "js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", - "dev": true, - "peer": true - }, - "jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "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, - "peer": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "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==", - "peer": true - }, - "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, - "peer": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "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, - "peer": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "peer": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", - "dev": true, - "peer": true - }, - "launch-editor": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", - "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", - "dev": true, - "peer": true, - "requires": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "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, - "peer": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "linkify-string": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/linkify-string/-/linkify-string-4.1.3.tgz", - "integrity": "sha512-6dAgx4MiTcvEX87OS5aNpAioO7cSELUXp61k7azOvMYOLSmREx0w4yM1Uf0+O3JLC08YdkUyZhAX+YkasRt/mw==", - "requires": {} - }, - "linkifyjs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz", - "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==", - "peer": true - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "peer": true - }, - "loader-utils": { - "version": "1.4.2", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "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, - "peer": true - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "peer": true - }, - "longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "peer": true - }, - "markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==" - }, - "material-colors": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", - "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" - }, - "mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true, - "peer": true - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "peer": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "requires": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - } - } - }, - "mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", - "requires": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - } - }, - "mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "requires": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", - "requires": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - } - }, - "mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "requires": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - } - }, - "mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "requires": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "requires": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - } - }, - "mdast-util-newline-to-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz", - "integrity": "sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-find-and-replace": "^3.0.0" - } - }, - "mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "requires": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - } - }, - "mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "requires": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - } - }, - "mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "requires": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "requires": { - "@types/mdast": "^4.0.0" - } - }, - "mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "peer": true - }, - "memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "peer": true, - "requires": { - "fs-monkey": "^1.0.4" - } - }, - "meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "peer": true, - "requires": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "peer": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true, - "peer": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "peer": true - }, - "micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "requires": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "requires": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "requires": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", - "requires": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "requires": { - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "requires": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "requires": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "requires": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "requires": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "requires": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "requires": { - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "requires": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "requires": { - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==" - }, - "micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==" - }, - "micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "requires": { - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "requires": { - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", - "requires": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" - }, - "micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==" - }, - "micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "peer": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "peer": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "peer": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true, - "peer": true - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "peer": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "peer": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "peer": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": true - }, - "node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true - }, - "node-cache": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.1.tgz", - "integrity": "sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A==", - "dev": true, - "requires": { - "clone": "2.x", - "lodash": "^4.17.15" - } - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "peer": true - }, - "node-gettext": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/node-gettext/-/node-gettext-3.0.0.tgz", - "integrity": "sha512-/VRYibXmVoN6tnSAY2JWhNRhWYJ8Cd844jrZU/DwLVoI4vBI6ceYbd8i42sYZ9uOgDH3S7vslIKOWV/ZrT2YBA==", - "requires": { - "lodash.get": "^4.4.2" - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-polyfill-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-QpG496dDBiaelQZu9wDcVvpLbtk7h9Ctz693RaUMZBgl8DUoFToO90ZTLKq57gP7rwKqYtGbMBXkcEgLSag2jQ==", - "dev": true, - "peer": true, - "requires": { - "assert": "^2.1.0", - "browserify-zlib": "^0.2.0", - "buffer": "^6.0.3", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.22.0", - "events": "^3.3.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "punycode": "^2.3.0", - "querystring-es3": "^0.2.1", - "readable-stream": "^4.4.2", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "^0.0.1", - "type-fest": "^4.4.0", - "url": "^0.11.3", - "util": "^0.12.5", - "vm-browserify": "^1.1.2" - }, - "dependencies": { - "type-fest": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", - "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", - "dev": true, - "peer": true - } - } - }, - "node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" - }, - "nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "requires": { - "abbrev": "^2.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "peer": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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, - "requires": { - "path-key": "^3.0.0" - } - }, - "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, - "peer": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "peer": true - }, - "object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "peer": true - }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - } - }, - "object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - } - }, - "object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true, - "peer": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "peer": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "peer": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "peer": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "peer": true, - "requires": { - "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" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true, - "peer": true - }, - "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, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "peer": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true, - "peer": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "peer": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", - "dev": true, - "peer": true, - "requires": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "requires": { - "entities": "^4.4.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "peer": true - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "peer": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - } - } - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true, - "peer": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "peer": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pinia": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", - "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", - "requires": { - "@vue/devtools-api": "^6.5.0", - "vue-demi": ">=0.14.5" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.9.tgz", - "integrity": "sha512-dC1TJMODGM8lxhP6wLToncaDPPNB3biVxxRDuNCYpuXwi70ou7NsGd97KVTJ2omepGId429JZt8oaZKeXbqxwg==", - "requires": {} - } - } - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true - }, - "pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "peer": true, - "requires": { - "find-up": "^6.3.0" - }, - "dependencies": { - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "peer": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "peer": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "peer": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "peer": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "peer": true - }, - "yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "dev": true, - "peer": true - } - } - }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" - }, - "portal-vue": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.7.tgz", - "integrity": "sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==", - "requires": {} - }, - "possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "peer": true - }, - "postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - } - }, - "postcss-html": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.7.0.tgz", - "integrity": "sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==", - "dev": true, - "peer": true, - "requires": { - "htmlparser2": "^8.0.0", - "js-tokens": "^9.0.0", - "postcss": "^8.4.0", - "postcss-safe-parser": "^6.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true, - "peer": true - }, - "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true, - "peer": true - }, - "postcss-resolve-nested-selector": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.4.tgz", - "integrity": "sha512-R6vHqZWgVnTAPq0C+xjyHfEZqfIYboCBVSy24MjxEDm+tIh1BU4O6o7DP7AA7kHzf136d+Qc5duI4tlpHjixDw==", - "dev": true, - "peer": true - }, - "postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, - "peer": true, - "requires": {} - }, - "postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "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, - "peer": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "optional": true - }, - "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, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "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 - } - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "peer": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "peer": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "peer": true - } - } - }, - "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==" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "peer": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - } - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" - }, - "pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true - }, - "qs": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", - "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", - "dev": true, - "peer": true, - "requires": { - "side-channel": "^1.0.6" - } - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, - "peer": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "peer": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "peer": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "peer": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "peer": true - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "peer": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "peer": true - } - } - }, - "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 - }, - "read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "peer": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "peer": true - } - } - }, - "read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "peer": true, - "requires": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "dependencies": { - "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, - "peer": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "peer": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "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, - "peer": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "peer": true - } - } - }, - "readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dev": true, - "peer": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "peer": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "peer": true, - "requires": { - "resolve": "^1.20.0" - } - }, - "redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "peer": true, - "requires": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "rehype-external-links": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", - "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", - "requires": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-is-element": "^3.0.0", - "is-absolute-url": "^4.0.0", - "space-separated-tokens": "^2.0.0", - "unist-util-visit": "^5.0.0" - } - }, - "rehype-react": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-7.2.0.tgz", - "integrity": "sha512-MHYyCHka+3TtzBMKtcuvVOBAbI1HrfoYA+XH9m7/rlrQQATCPwtJnPdkxKKcIGF8vc9mxqQja9r9f+FHItQeWg==", - "requires": { - "@mapbox/hast-util-table-cell-style": "^0.2.0", - "@types/hast": "^2.0.0", - "hast-to-hyperscript": "^10.0.0", - "hast-util-whitespace": "^2.0.0", - "unified": "^10.0.0" - }, - "dependencies": { - "@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "requires": { - "@types/unist": "^2" - } - }, - "@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" - }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - } - }, - "unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "requires": { - "@types/unist": "^2.0.0" - } - }, - "vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } - } - } - }, - "remark-breaks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz", - "integrity": "sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-newline-to-break": "^2.0.0", - "unified": "^11.0.0" - } - }, - "remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - } - }, - "remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - } - }, - "remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", - "requires": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - } - }, - "remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "requires": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true, - "peer": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "peer": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "dev": true - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "peer": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "peer": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "peer": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "peer": true - }, - "safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", - "dev": true, - "peer": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", - "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", - "dev": true, - "peer": true, - "requires": { - "neo-async": "^2.6.2" - } - }, - "saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true, - "peer": true - }, - "selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "peer": true, - "requires": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "peer": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true - } - } - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "peer": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "peer": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "peer": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "peer": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "peer": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "peer": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "peer": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "peer": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "peer": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "peer": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true, - "peer": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "peer": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "peer": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "peer": true - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "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, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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, - "peer": true - } - } - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "peer": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", - "dev": true - }, - "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "peer": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - }, - "dependencies": { - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "peer": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - } - } - }, - "spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "peer": true - }, - "spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "dev": true, - "peer": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true, - "peer": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "peer": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "peer": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "splitpanes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-2.4.1.tgz", - "integrity": "sha512-kpEo1WuMXuc6QfdQdO2V/fl/trONlkUKp+pputsLTiW9RMtwEvjb4/aYGm2m3+KAzjmb+zLwr4A4SYZu74+pgQ==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "peer": true - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "peer": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "requires": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "peer": true, - "requires": { - "min-indent": "^1.0.1" - } - }, - "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 - }, - "striptags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", - "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==" - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true, - "peer": true - }, - "style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", - "requires": {} - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true, - "peer": true - }, - "style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "stylelint": { - "version": "15.11.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", - "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", - "dev": true, - "peer": true, - "requires": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/media-query-list-parser": "^2.1.4", - "@csstools/selector-specificity": "^3.0.0", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^8.2.0", - "css-functions-list": "^3.2.1", - "css-tree": "^2.3.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.1", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^7.0.0", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.3.1", - "ignore": "^5.2.4", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.29.0", - "mathml-tag-names": "^2.1.3", - "meow": "^10.1.5", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.28", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.13", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^3.0.0", - "svg-tags": "^1.0.0", - "table": "^6.8.1", - "write-file-atomic": "^5.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true, - "peer": true - }, - "file-entry-cache": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", - "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", - "dev": true, - "peer": true, - "requires": { - "flat-cache": "^3.2.0" - } - }, - "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "peer": true - }, - "write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "peer": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - } - } - } - }, - "stylelint-config-html": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-html/-/stylelint-config-html-1.1.0.tgz", - "integrity": "sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "stylelint-config-recommended": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz", - "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "stylelint-config-recommended-scss": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.1.0.tgz", - "integrity": "sha512-8L5nDfd+YH6AOoBGKmhH8pLWF1dpfY816JtGMePcBqqSsLU+Ysawx44fQSlMOJ2xTfI9yTGpup5JU77c17w1Ww==", - "dev": true, - "peer": true, - "requires": { - "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^13.0.0", - "stylelint-scss": "^5.3.0" - } - }, - "stylelint-config-recommended-vue": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.5.0.tgz", - "integrity": "sha512-65TAK/clUqkNtkZLcuytoxU0URQYlml+30Nhop7sRkCZ/mtWdXt7T+spPSB3KMKlb+82aEVJ4OrcstyDBdbosg==", - "dev": true, - "peer": true, - "requires": { - "semver": "^7.3.5", - "stylelint-config-html": ">=1.0.0", - "stylelint-config-recommended": ">=6.0.0" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - } - } - }, - "stylelint-scss": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.3.2.tgz", - "integrity": "sha512-4LzLaayFhFyneJwLo0IUa8knuIvj+zF0vBFueQs4e3tEaAMIQX8q5th8ziKkgOavr6y/y9yoBe+RXN/edwLzsQ==", - "dev": true, - "peer": true, - "requires": { - "known-css-properties": "^0.29.0", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.0.13", - "postcss-value-parser": "^4.2.0" - } - }, - "stylelint-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylelint-webpack-plugin/-/stylelint-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-07lpo1uVoFctKv0EOOg/YSrUppcLMjNBSMRqgooNnlbfAOgQfMzvLK+EbXz0HQiEgZobr+XQX9md/TgwTGdzbw==", - "dev": true, - "requires": { - "globby": "^11.1.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", - "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "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, - "peer": true - }, - "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, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true, - "peer": true - }, - "svg.draggable.js": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", - "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", - "requires": { - "svg.js": "^2.0.1" - } - }, - "svg.easing.js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", - "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", - "requires": { - "svg.js": ">=2.3.x" - } - }, - "svg.filter.js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", - "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", - "requires": { - "svg.js": "^2.2.5" - } - }, - "svg.js": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", - "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" - }, - "svg.pathmorphing.js": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", - "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", - "requires": { - "svg.js": "^2.4.0" - } - }, - "svg.resize.js": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", - "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", - "requires": { - "svg.js": "^2.6.5", - "svg.select.js": "^2.1.2" - }, - "dependencies": { - "svg.select.js": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", - "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", - "requires": { - "svg.js": "^2.2.5" - } - } - } - }, - "svg.select.js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", - "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", - "requires": { - "svg.js": "^2.6.5" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" - }, - "table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", - "dev": true, - "peer": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - }, - "terser": { - "version": "5.31.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", - "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", - "peer": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "peer": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "peer": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "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, - "peer": true - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true, - "peer": true - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "peer": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toastify-js": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", - "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "peer": true - }, - "tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tributejs": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/tributejs/-/tributejs-5.1.3.tgz", - "integrity": "sha512-B5CXihaVzXw+1UHhNFyAwUTMDk1EfoLP5Tj1VhD9yybZ1I8DZJEv8tZ1l0RJo0t0tk9ZhR8eG5tEsaCvRigmdQ==" - }, - "trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" - }, - "trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "dev": true, - "peer": true - }, - "trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" - }, - "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, - "peer": true, - "requires": {} - }, - "ts-jest": { - "version": "29.2.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.3.tgz", - "integrity": "sha512-yCcfVdiBFngVz9/keHin9EnsrQtQtEu3nRykNy9RVp+FiPFFbPJ3Sg6Qg4+TkmH0vMP5qsTKgXSsk80HRwvdgQ==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "ejs": "^3.1.10", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "ts-loader": { - "version": "9.5.1", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "requires": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - }, - "dependencies": { - "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 - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "peer": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "peer": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "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, - "peer": true - } - } - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true, - "peer": true - }, - "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, - "peer": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "peer": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "peer": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - } - }, - "typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "devOptional": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "peer": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "requires": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" - } - } - }, - "unist-builder": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", - "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==", - "requires": { - "@types/unist": "^3.0.0" - } - }, - "unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "requires": { - "@types/unist": "^3.0.0" - } - }, - "unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "requires": { - "@types/unist": "^3.0.0" - } - }, - "unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "requires": { - "@types/unist": "^3.0.0" - } - }, - "unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "requires": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - } - }, - "unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "requires": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - } - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "peer": true - }, - "update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "peer": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "dev": true - }, - "url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "dev": true, - "peer": true, - "requires": { - "punycode": "^1.4.1", - "qs": "^6.11.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "peer": true - } - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "peer": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "peer": true - }, - "v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "peer": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - }, - "dependencies": { - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "peer": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - } - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "peer": true - }, - "vfile": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", - "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", - "requires": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - } - }, - "vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "requires": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true, - "peer": true - }, - "vue": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", - "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", - "requires": { - "@vue/compiler-sfc": "2.7.16", - "csstype": "^3.1.0" - } - }, - "vue-apexcharts": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/vue-apexcharts/-/vue-apexcharts-1.6.2.tgz", - "integrity": "sha512-9HS3scJwWgKjmkcWIf+ndNDR0WytUJD8Ju0V2ZYcjYtlTLwJAf2SKUlBZaQTkDmwje/zMgulvZRi+MXmi+WkKw==", - "requires": {} - }, - "vue-color": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/vue-color/-/vue-color-2.8.1.tgz", - "integrity": "sha512-BoLCEHisXi2QgwlhZBg9UepvzZZmi4176vbr+31Shen5WWZwSLVgdScEPcB+yrAtuHAz42309C0A4+WiL9lNBw==", - "requires": { - "clamp": "^1.0.1", - "lodash.throttle": "^4.0.0", - "material-colors": "^1.0.0", - "tinycolor2": "^1.1.2" - } - }, - "vue-component-type-helpers": { - "version": "2.0.29", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.29.tgz", - "integrity": "sha512-58i+ZhUAUpwQ+9h5Hck0D+jr1qbYl4voRt5KffBx8qzELViQ4XdT/Tuo+mzq8u63teAG8K0lLaOiL5ofqW38rg==", - "dev": true - }, - "vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", - "dev": true, - "peer": true, - "requires": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "dependencies": { - "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, - "peer": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "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, - "peer": true - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "peer": true - } - } - }, - "vue-frag": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/vue-frag/-/vue-frag-1.4.3.tgz", - "integrity": "sha512-pQZj03f/j9LRhzz9vKaXTCXUHVYHuAXicshFv76VFqwz4MG3bcb+sPZMAbd0wmw7THjkrTPuoM0EG9TbG8CgMQ==", - "requires": {} - }, - "vue-functional-data-merge": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz", - "integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==" - }, - "vue-hot-reload-api": { - "version": "2.3.4" - }, - "vue-jest": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-3.0.7.tgz", - "integrity": "sha512-PIOxFM+wsBMry26ZpfBvUQ/DGH2hvp5khDQ1n51g3bN0TwFwTy4J85XVfxTRMukqHji/GnAoGUnlZ5Ao73K62w==", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", - "chalk": "^2.1.0", - "deasync": "^0.1.15", - "extract-from-css": "^0.4.4", - "find-babel-config": "^1.1.0", - "js-beautify": "^1.6.14", - "node-cache": "^4.1.1", - "object-assign": "^4.1.1", - "source-map": "^0.5.6", - "tsconfig": "^7.0.0", - "vue-template-es2015-compiler": "^1.6.0" - } - }, - "vue-loader": { - "version": "15.11.1", - "requires": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" - } - }, - "vue-loading-overlay": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/vue-loading-overlay/-/vue-loading-overlay-3.4.3.tgz", - "integrity": "sha512-Q4+RNnI6+szylJ98Abnp9CUDagKphZMt7okznGu1m7tidZX5b9u+a+De6uktWa5WULu/as+IsrWVR8lpmbDDOA==", - "requires": {} - }, - "vue-material-design-icons": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/vue-material-design-icons/-/vue-material-design-icons-5.3.0.tgz", - "integrity": "sha512-wnbRh+48RwX/Gt+iqwCSdWpm0hPBwwv9F7MSouUzZ2PsphYVMJB9KkG9iGs+tgBiT57ZiurFEK07Y/rFKx+Ekg==" - }, - "vue-resize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", - "integrity": "sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==", - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "vue-router": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", - "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==" - }, - "vue-style-loader": { - "version": "4.1.3", - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "vue-template-compiler": { - "version": "2.7.16", - "requires": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==" - }, - "vue2-datepicker": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/vue2-datepicker/-/vue2-datepicker-3.11.1.tgz", - "integrity": "sha512-6PU/+pnp2mgZAfnSXmbdwj9516XsEvTiw61Q5SNrvvdy8W/FCxk1GAe9UZn/m9YfS5A47yK6XkcjMHbp7aFApA==", - "requires": { - "date-format-parse": "^0.2.7" - } - }, - "w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "requires": { - "xml-name-validator": "^4.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "peer": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "peer": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", - "peer": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "peer": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "peer": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - } - }, - "webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dev": true, - "peer": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - } - }, - "webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "dev": true, - "peer": true, - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" - } - }, - "webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "peer": true, - "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "peer": true - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "peer": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "peer": true - }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "peer": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "peer": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - } - }, - "wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true, - "peer": true - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "peer": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - } - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "peer": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "peer": true - }, - "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 - }, - "zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" - }, - "zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" - } } } diff --git a/src/store/modules/organization.js b/src/store/modules/organization.js new file mode 100644 index 00000000..6901345a --- /dev/null +++ b/src/store/modules/organization.js @@ -0,0 +1,114 @@ +/* eslint-disable no-console */ +import { Attachment, Publication } from '../../entities/index.js' +import { defineStore } from 'pinia' + +export const useOrganizationStore = defineStore('organization', { + state: () => ({ + publicationItem: false, + publicationList: [], + publicationDataKey: false, + attachmentItem: false, + publicationAttachments: [], + conceptPublications: [], + conceptAttachments: [], + }), + actions: { + setPublicationItem(publicationItem) { + // To prevent forms etc from braking we alway use a default/skeleton object + this.publicationItem = publicationItem && new Publication(publicationItem) + console.log('Active publication item set to ' + publicationItem && publicationItem.id) + }, + setPublicationList(publicationList) { + this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) + console.log('Active publication item set to ' + publicationList.length) + }, + async refreshPublicationList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/publications' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.setPublicationList(data?.results) + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getPublicationAttachments(publication) { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.publicationAttachments = data.results.map( + (attachmentItem) => new Attachment(attachmentItem), + ) + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getConceptPublications() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/publications?status=concept', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.conceptPublications = data + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getConceptAttachments() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments?status=concept', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.conceptAttachments = data + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + // @todo why does the following run through the store? -- because its impossible with props, and its vital information for the modal. + setPublicationDataKey(publicationDataKey) { + this.publicationDataKey = publicationDataKey + console.log('Active publication data key set to ' + publicationDataKey) + }, + setAttachmentItem(attachmentItem) { + this.attachmentItem = attachmentItem && new Attachment(attachmentItem) + console.log('Active attachment item set to ' + attachmentItem) + }, + }, +}) diff --git a/src/store/modules/organization.spec.js b/src/store/modules/organization.spec.js new file mode 100644 index 00000000..8adee3ba --- /dev/null +++ b/src/store/modules/organization.spec.js @@ -0,0 +1,220 @@ +/* eslint-disable no-console */ +import { setActivePinia, createPinia } from 'pinia' + +import { usePublicationStore } from './publication.js' +import { Attachment, Publication } from '../../entities/index.js' + +describe('Metadata Store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('sets publication item correctly', () => { + const store = usePublicationStore() + + store.setPublicationItem(testData[0]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[0]) + expect(store.publicationItem.validate()).toBe(true) + + store.setPublicationItem(testData[1]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).not.toEqual(testData[1]) + expect(store.publicationItem.validate()).toBe(true) + + store.setPublicationItem(testData[2]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[2]) + expect(store.publicationItem.validate()).toBe(false) + }) + + it('sets publication list correctly', () => { + const store = usePublicationStore() + + store.setPublicationList(testData) + + expect(store.publicationList).toHaveLength(testData.length) + + expect(store.publicationList[0]).toBeInstanceOf(Publication) + expect(store.publicationList[0]).toEqual(testData[0]) + expect(store.publicationList[0].validate()).toBe(true) + + expect(store.publicationList[1]).toBeInstanceOf(Publication) + expect(store.publicationList[1]).not.toEqual(testData[1]) + expect(store.publicationList[1].validate()).toBe(true) + + expect(store.publicationList[2]).toBeInstanceOf(Publication) + expect(store.publicationList[2]).toEqual(testData[2]) + expect(store.publicationList[2].validate()).toBe(false) + }) + + // TODO: fix this + it('set publication data.data property key correctly', () => { + const store = usePublicationStore() + + store.setPublicationDataKey('contactPoint') + + expect(store.publicationDataKey).toBe('contactPoint') + }) + + it('set attachment item correctly', () => { + const store = usePublicationStore() + + store.setAttachmentItem(attachmentTestData[0]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[0]) + expect(store.attachmentItem.validate()).toBe(true) + + store.setAttachmentItem(attachmentTestData[1]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).not.toEqual(attachmentTestData[1]) + expect(store.attachmentItem.validate()).toBe(true) + + store.setAttachmentItem(attachmentTestData[2]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[2]) + expect(store.attachmentItem.validate()).toBe(false) + }) +}) + +const testData = [ + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category1', + portal: 'portal1', + catalogi: 'catalogi1', + metaData: 'meta1', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // partial data + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category2', + portal: 'portal2', + catalogi: 'catalogi2', + metaData: 'meta2', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // invalid data + id: '3', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category3', + portal: 'portal3', + catalogi: 'catalogi3', + metaData: 'meta3', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, +] + +const attachmentTestData = [ + { // full data + id: '9044ab1e-cf5a-490a-be74-6be7a0c48a5f', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag1' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, + { // partial data + id: 'f849f287-492d-4100-91e1-1c4137f0abb5', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag2' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + license: 'MIT', + }, + { // invalid data + id: 'e193ea6b-1222-44cf-a71c-6ddcc232a79b', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag3' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, +] diff --git a/src/store/store.js b/src/store/store.js index f58c70a2..31a4a839 100644 --- a/src/store/store.js +++ b/src/store/store.js @@ -7,6 +7,7 @@ import { useCatalogiStore } from './modules/catalogi.js' import { useDirectoryStore } from './modules/directory.js' import { useMetadataStore } from './modules/metadata.js' import { usePublicationStore } from './modules/publication.js' +import { useOrganizationStore } from './modules/organization.js' const navigationStore = useNavigationStore(pinia) const searchStore = useSearchStore(pinia) @@ -14,6 +15,7 @@ const catalogiStore = useCatalogiStore(pinia) const directoryStore = useDirectoryStore(pinia) const metadataStore = useMetadataStore(pinia) const publicationStore = usePublicationStore(pinia) +const organizationStore = useOrganizationStore(pinia) export { // generic @@ -24,4 +26,5 @@ export { directoryStore, metadataStore, publicationStore, + organizationStore, } diff --git a/src/views/organizations/OrganizationDetail.vue b/src/views/organizations/OrganizationDetail.vue new file mode 100644 index 00000000..e80d1747 --- /dev/null +++ b/src/views/organizations/OrganizationDetail.vue @@ -0,0 +1,592 @@ + + + + + + + diff --git a/src/views/organizations/OrganizationIndex.vue b/src/views/organizations/OrganizationIndex.vue new file mode 100644 index 00000000..4cb314e1 --- /dev/null +++ b/src/views/organizations/OrganizationIndex.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/views/organizations/OrganizationList.vue b/src/views/organizations/OrganizationList.vue new file mode 100644 index 00000000..a68c5b09 --- /dev/null +++ b/src/views/organizations/OrganizationList.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/templates/OrganizationsIndex.php b/templates/OrganizationsIndex.php new file mode 100644 index 00000000..77531997 --- /dev/null +++ b/templates/OrganizationsIndex.php @@ -0,0 +1,9 @@ + +
\ No newline at end of file From c1d1d16eacf0f53f0cfc3a407c559281b8ac1f57 Mon Sep 17 00:00:00 2001 From: Barry Brands Date: Mon, 5 Aug 2024 19:26:20 +0200 Subject: [PATCH 066/145] Added local search to SearchController --- lib/Controller/SearchController.php | 19 ++++++- lib/Service/SearchService.php | 85 +++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) diff --git a/lib/Controller/SearchController.php b/lib/Controller/SearchController.php index eb5572bc..7fc12b75 100644 --- a/lib/Controller/SearchController.php +++ b/lib/Controller/SearchController.php @@ -3,6 +3,7 @@ namespace OCA\OpenCatalogi\Controller; use OCA\OpenCatalogi\Service\ElasticSearchService; +use OCA\OpenCatalogi\Db\PublicationMapper; use OCA\OpenCatalogi\Service\SearchService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; @@ -25,7 +26,11 @@ class SearchController extends Controller ] ]; - public function __construct($appName, IRequest $request, private readonly IAppConfig $config) + public function __construct( + $appName, + IRequest $request, + private readonly PublicationMapper $publicationMapper, + private readonly IAppConfig $config) { parent::__construct($appName, $request); } @@ -64,6 +69,18 @@ public function index(SearchService $searchService): JSONResponse $filters = $this->request->getParams(); unset($filters['_route']); + $fieldsToSearch = ['title', 'description', 'summary']; + + if($this->config->hasKey($this->appName, 'mongoStorage') === false + || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' + ) { + $searchParams = $searchService->createMySQLSearchParams($filters, $fieldsToSearch); + $searchConditions = $searchService->createMySQLSearchConditions($filters, $fieldsToSearch); + $filters = $searchService->unsetSpecialQueryParams($filters); + + return new JSONResponse(['results' => $this->publicationMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); + } + //@TODO: find a better way to get query params. This fixes it for now. $keys = array_keys(array: $filters); $values = array_values(array: $filters); diff --git a/lib/Service/SearchService.php b/lib/Service/SearchService.php index 4d0ca09f..08817ffa 100644 --- a/lib/Service/SearchService.php +++ b/lib/Service/SearchService.php @@ -174,6 +174,91 @@ private function recursiveRequestQueryKey(array &$vars, string $name, string $na }//end recursiveRequestQueryKey() + /** + * This function creates a mongodb filter array. + * + * Also unsets _search in filters ! + * + * @param array $filters Query parameters from request. + * @param array $fieldsToSearch Database field names to filter/search on. + * + * @return array $filters + */ + public function createMongoDBSearchFilter(array $filters, array $fieldsToSearch): array + { + if (isset($filters['_search']) === true) { + $searchRegex = ['$regex' => $filters['_search'], '$options' => 'i']; + $filters['$or'] = []; + + foreach ($fieldsToSearch as $field) { + $filters['$or'][] = [$field => $searchRegex]; + } + + unset($filters['_search']); + } + + return $filters; + + }//end createMongoDBSearchFilter() + + /** + * This function creates mysql search conditions based on given filters from request. + * + * @param array $filters Query parameters from request. + * @param array $fieldsToSearch Fields to search on in sql. + * + * @return array $searchConditions + */ + public function createMySQLSearchConditions(array $filters, array $fieldsToSearch): array + { + $searchConditions = []; + if (isset($filters['_search']) === true) { + foreach ($fieldsToSearch as $field) { + $searchConditions[] = "LOWER($field) LIKE :search"; + } + } + + return $searchConditions; + + }//end createMongoDBSearchFilter() + + /** + * This function unsets all keys starting with _ from filters. + * + * @param array $filters Query parameters from request. + * + * @return array $filters + */ + public function unsetSpecialQueryParams(array $filters): array + { + foreach ($filters as $key => $value) { + if (str_starts_with($key, '_')) { + unset($filters[$key]); + } + } + + return $filters; + + }//end createMongoDBSearchFilter() + + /** + * This function creates mysql search parameters based on given filters from request. + * + * @param array $filters Query parameters from request. + * + * @return array $searchParams + */ + public function createMySQLSearchParams(array $filters): array + { + $searchParams = []; + if (isset($filters['_search']) === true) { + $searchParams['search'] = '%' . strtolower($filters['_search']) . '%'; + } + + return $searchParams; + + }//end createMongoDBSearchFilter() + /** * Parses the request query string and returns it as an array of queries. * From a708afd91947cdfd2b7651bceb87183a35beaedd Mon Sep 17 00:00:00 2001 From: Barry Brands Date: Mon, 5 Aug 2024 19:26:35 +0200 Subject: [PATCH 067/145] Cleanup/refactor --- lib/Controller/CatalogiController.php | 39 +++++---------------- lib/Controller/DirectoryController.php | 39 +++++---------------- lib/Controller/MetaDataController.php | 37 +++++-------------- lib/Controller/PublicationsController.php | 39 +++++---------------- src/sidebars/dashboard/DashboardSideBar.vue | 2 +- src/sidebars/search/SearchSideBar.vue | 2 +- 6 files changed, 37 insertions(+), 121 deletions(-) diff --git a/lib/Controller/CatalogiController.php b/lib/Controller/CatalogiController.php index 299c23e7..5f5b1e5e 100644 --- a/lib/Controller/CatalogiController.php +++ b/lib/Controller/CatalogiController.php @@ -4,6 +4,7 @@ use OCA\OpenCatalogi\Db\CatalogMapper; use OCA\OpenCatalogi\Service\ObjectService; +use OCA\OpenCatalogi\Service\SearchService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\JSONResponse; @@ -35,46 +36,24 @@ public function page(?string $getParameter): TemplateResponse * @NoAdminRequired * @NoCSRFRequired */ - public function index(ObjectService $objectService): JSONResponse + public function index(ObjectService $objectService, SearchService $searchService): JSONResponse { $filters = $this->request->getParams(); - - $searchConditions = []; - $searchParams = []; $fieldsToSearch = ['title', 'description', 'summary']; - foreach ($filters as $key => $value) { - if ($key === '_search') { - // MongoDB - $searchRegex = ['$regex' => $value, '$options' => 'i']; - $filters['$or'] = []; - - // MySQL - $searchParams['search'] = '%' . strtolower($value) . '%'; - - foreach ($fieldsToSearch as $field) { - // MongoDB - $filters['$or'][] = [$field => $searchRegex]; - - // MySQL - $searchConditions[] = "LOWER($field) LIKE :search"; - } - } - - if (str_starts_with($key, '_')) { - unset($filters[$key]); - } - } - if($this->config->hasKey($this->appName, 'mongoStorage') === false || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' ) { - // Unset mongodb filter - unset($filters['$or']); + $searchParams = $searchService->createMySQLSearchParams($filters, $fieldsToSearch); + $searchConditions = $searchService->createMySQLSearchConditions($filters, $fieldsToSearch); + $filters = $searchService->unsetSpecialQueryParams($filters); return new JSONResponse(['results' => $this->catalogMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); } - + + $filters = $searchService->createMongoDBSearchFilter($filters, $fieldsToSearch); + $filters = $searchService->unsetSpecialQueryParams($filters, $fieldsToSearch); + try { $dbConfig = [ 'base_uri' => $this->config->getValueString($this->appName, 'mongodbLocation'), diff --git a/lib/Controller/DirectoryController.php b/lib/Controller/DirectoryController.php index 2e60a53a..556fe126 100644 --- a/lib/Controller/DirectoryController.php +++ b/lib/Controller/DirectoryController.php @@ -5,6 +5,7 @@ use OCA\OpenCatalogi\Db\ListingMapper; use OCA\OpenCatalogi\Service\DirectoryService; use OCA\OpenCatalogi\Service\ObjectService; +use OCA\OpenCatalogi\Service\SearchService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\JSONResponse; @@ -82,46 +83,24 @@ public function add(?string $url, DirectoryService $directoryService): JSONRespo * @PublicPage * @NoCSRFRequired */ - public function index(ObjectService $objectService): JSONResponse + public function index(ObjectService $objectService, SearchService $searchService): JSONResponse { $filters = $this->request->getParams(); - - $searchConditions = []; - $searchParams = []; $fieldsToSearch = ['summary']; - foreach ($filters as $key => $value) { - if ($key === '_search') { - // MongoDB - $searchRegex = ['$regex' => $value, '$options' => 'i']; - $filters['$or'] = []; - - // MySQL - $searchParams['search'] = '%' . strtolower($value) . '%'; - - foreach ($fieldsToSearch as $field) { - // MongoDB - $filters['$or'][] = [$field => $searchRegex]; - - // MySQL - $searchConditions[] = "LOWER($field) LIKE :search"; - } - } - - if (str_starts_with($key, '_')) { - unset($filters[$key]); - } - } - if($this->config->hasKey($this->appName, 'mongoStorage') === false || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' ) { - // Unset mongodb filter - unset($filters['$or']); + $searchParams = $searchService->createMySQLSearchParams($filters, $fieldsToSearch); + $searchConditions = $searchService->createMySQLSearchConditions($filters, $fieldsToSearch); + $filters = $searchService->unsetSpecialQueryParams($filters, $fieldsToSearch); return new JSONResponse(['results' => $this->listingMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); } - + + $filters = $searchService->createMongoDBSearchFilter($filters, $fieldsToSearch); + $filters = $searchService->unsetSpecialQueryParams($filters, $fieldsToSearch); + $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); diff --git a/lib/Controller/MetaDataController.php b/lib/Controller/MetaDataController.php index 0001149b..b2f9cdf8 100644 --- a/lib/Controller/MetaDataController.php +++ b/lib/Controller/MetaDataController.php @@ -4,6 +4,7 @@ use OCA\OpenCatalogi\Db\MetaDataMapper; use OCA\OpenCatalogi\Service\ObjectService; +use OCA\OpenCatalogi\Service\SearchService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\JSONResponse; @@ -44,46 +45,24 @@ public function page(?string $getParameter) * @NoAdminRequired * @NoCSRFRequired */ - public function index(ObjectService $objectService): JSONResponse + public function index(ObjectService $objectService, SearchService $searchService): JSONResponse { $filters = $this->request->getParams(); - - $searchConditions = []; - $searchParams = []; $fieldsToSearch = ['title', 'description']; - foreach ($filters as $key => $value) { - if ($key === '_search') { - // MongoDB - $searchRegex = ['$regex' => $value, '$options' => 'i']; - $filters['$or'] = []; - - // MySQL - $searchParams['search'] = '%' . strtolower($value) . '%'; - - foreach ($fieldsToSearch as $field) { - // MongoDB - $filters['$or'][] = [$field => $searchRegex]; - - // MySQL - $searchConditions[] = "LOWER($field) LIKE :search"; - } - } - - if (str_starts_with($key, '_')) { - unset($filters[$key]); - } - } - if($this->config->hasKey($this->appName, 'mongoStorage') === false || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' ) { - // Unset mongodb filter - unset($filters['$or']); + $searchParams = $searchService->createMySQLSearchParams($filters, $fieldsToSearch); + $searchConditions = $searchService->createMySQLSearchConditions($filters, $fieldsToSearch); + $filters = $searchService->unsetSpecialQueryParams($filters, $fieldsToSearch); return new JSONResponse(['results' =>$this->metaDataMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); } + $filters = $searchService->createMongoDBSearchFilter($filters, $fieldsToSearch); + $filters = $searchService->unsetSpecialQueryParams($filters, $fieldsToSearch); + $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); diff --git a/lib/Controller/PublicationsController.php b/lib/Controller/PublicationsController.php index 9095c371..05f9dd67 100644 --- a/lib/Controller/PublicationsController.php +++ b/lib/Controller/PublicationsController.php @@ -8,6 +8,7 @@ use OCA\OpenCatalogi\Db\PublicationMapper; use OCA\OpenCatalogi\Service\ElasticSearchService; use OCA\OpenCatalogi\Service\ObjectService; +use OCA\OpenCatalogi\Service\SearchService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\JSONResponse; @@ -110,50 +111,28 @@ public function catalog(string|int $id): TemplateResponse * @NoAdminRequired * @NoCSRFRequired */ - public function index(ObjectService $objectService): JSONResponse + public function index(ObjectService $objectService, SearchService $searchService): JSONResponse { $filters = $this->request->getParams(); - - $searchConditions = []; - $searchParams = []; $fieldsToSearch = ['title', 'description', 'summary']; - foreach ($filters as $key => $value) { - if ($key === '_search') { - // MongoDB - $searchRegex = ['$regex' => $value, '$options' => 'i']; - $filters['$or'] = []; - - // MySQL - $searchParams['search'] = '%' . strtolower($value) . '%'; - - foreach ($fieldsToSearch as $field) { - // MongoDB - $filters['$or'][] = [$field => $searchRegex]; - - // MySQL - $searchConditions[] = "LOWER($field) LIKE :search"; - } - } - - if (str_starts_with($key, '_')) { - unset($filters[$key]); - } - } - if($this->config->hasKey($this->appName, 'mongoStorage') === false || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' ) { - // Unset mongodb filter - unset($filters['$or']); + $searchParams = $searchService->createMySQLSearchParams($filters, $fieldsToSearch); + $searchConditions = $searchService->createMySQLSearchConditions($filters, $fieldsToSearch); + $filters = $searchService->unsetSpecialQueryParams($filters, $fieldsToSearch); return new JSONResponse(['results' => $this->publicationMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); } + $filters = $searchService->createMongoDBSearchFilter($filters, $fieldsToSearch); + $filters = $searchService->unsetSpecialQueryParams($filters, $fieldsToSearch); + $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); - + $filters['_schema'] = 'publication'; $result = $objectService->findObjects(filters: $filters, config: $dbConfig); diff --git a/src/sidebars/dashboard/DashboardSideBar.vue b/src/sidebars/dashboard/DashboardSideBar.vue index 481c7db9..95dbcf3c 100644 --- a/src/sidebars/dashboard/DashboardSideBar.vue +++ b/src/sidebars/dashboard/DashboardSideBar.vue @@ -9,7 +9,7 @@ import { navigationStore, searchStore, publicationStore } from '../../store/stor test2 + Zoek snel in het voor uw beschikbare federatieve netwerk
test1 + Zoek snel in het voor uw beschikbare federatieve netwerk
Date: Mon, 5 Aug 2024 21:48:26 +0200 Subject: [PATCH 068/145] Themes meegenomen en controller voor het gemak even omgezet naar mock data --- appinfo/routes.php | 1 + 1 file changed, 1 insertion(+) diff --git a/appinfo/routes.php b/appinfo/routes.php index 1cb90aca..dfbe2df9 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -5,6 +5,7 @@ 'metadata' => ['url' => '/api/metadata'], 'publications' => ['url' => '/api/publications'], 'organizations' => ['url' => '/api/organizations'], + 'themes' => ['url' => '/api/themes'], 'attachments' => ['url' => '/api/attachments'], 'catalogi' => ['url' => '/api/catalogi'], 'directory' => ['url' => '/api/directory'] From 2132aa1e13b1dd367cbd0733861708b69130d748 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 5 Aug 2024 22:37:48 +0200 Subject: [PATCH 069/145] A bit of entity managment --- lib/Controller/OrganizationsController.php | 374 +++-------- lib/Controller/ThemesController.php | 143 +++++ src/entities/organisation/index.js | 2 + .../organisation/organisation.spec.ts | 68 ++ src/entities/organisation/organisation.ts | 46 ++ .../organisation/organisation.types.ts | 10 + src/entities/theme/index.js | 2 + src/entities/theme/theme.spec.ts | 59 ++ src/entities/theme/theme.ts | 37 ++ src/entities/theme/theme.types.ts | 7 + src/store/modules/configuration.js | 114 ++++ src/store/modules/configuration.specs.js | 220 +++++++ src/store/modules/theme.js | 114 ++++ src/store/modules/theme.spec copy.js | 220 +++++++ src/store/store.js | 6 + src/views/Views.vue | 7 + src/views/organizations/OrganizationIndex.vue | 27 +- src/views/themes/ThemeDetail.vue | 592 ++++++++++++++++++ src/views/themes/ThemeIndex.vue | 52 ++ src/views/themes/ThemeList.vue | 233 +++++++ 20 files changed, 2031 insertions(+), 302 deletions(-) create mode 100644 lib/Controller/ThemesController.php create mode 100644 src/entities/organisation/index.js create mode 100644 src/entities/organisation/organisation.spec.ts create mode 100644 src/entities/organisation/organisation.ts create mode 100644 src/entities/organisation/organisation.types.ts create mode 100644 src/entities/theme/index.js create mode 100644 src/entities/theme/theme.spec.ts create mode 100644 src/entities/theme/theme.ts create mode 100644 src/entities/theme/theme.types.ts create mode 100644 src/store/modules/configuration.js create mode 100644 src/store/modules/configuration.specs.js create mode 100644 src/store/modules/theme.js create mode 100644 src/store/modules/theme.spec copy.js create mode 100644 src/views/themes/ThemeDetail.vue create mode 100644 src/views/themes/ThemeIndex.vue create mode 100644 src/views/themes/ThemeList.vue diff --git a/lib/Controller/OrganizationsController.php b/lib/Controller/OrganizationsController.php index 357ff731..e36fa64e 100644 --- a/lib/Controller/OrganizationsController.php +++ b/lib/Controller/OrganizationsController.php @@ -41,307 +41,103 @@ public function __construct parent::__construct($appName, $request); } - private function insertNestedObjects(array $object, ObjectService $objectService, array $config): array - { - //@TODO keep in mind that unpublished objects should not be inserted, and that objects should be updated if a subobject is updated. - foreach($object as $key => $value) { - try { - if( - is_string(value: $value) - && $key !== 'id' - && Uuid::isValid(uuid: $value) === true - && $subObject = $objectService->findObject(filters: ['_id' => $value], config: $config) - ) { - $object[$key] = $subObject; - } - - if( - is_array(value: $value) === true - && array_is_list(array: $value) === true - ) { - $object[$key] = $this->insertNestedObjects(object: $value, objectService: $objectService, config: $config); - } - } catch (GuzzleException $exception) { - continue; - } - } - - return $object; - } - - /** - * @NoAdminRequired - * @NoCSRFRequired - */ - public function page(?string $getParameter) - { - // The TemplateResponse loads the 'main.php' - // defined in our app's 'templates' folder. - // We pass the $getParameter variable to the template - // so that the value is accessible in the template. - return new TemplateResponse( - $this->appName, - 'OrganizationsIndex', - [] - ); - } - - /** - * Taking it from a catalogue point of view is just adding a filter - * - * @NoAdminRequired - * @NoCSRFRequired - */ - public function catalog(string|int $id): TemplateResponse - { - // The TemplateResponse loads the 'main.php' - // defined in our app's 'templates' folder. - // We pass the $getParameter variable to the template - // so that the value is accessible in the template. + * This returns the template of the main app's page + * It adds some data to the template (app version) + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return TemplateResponse + */ + public function page(): TemplateResponse + { return new TemplateResponse( - $this->appName, - 'OrganizationsIndex', + //Application::APP_ID, + 'zaakafhandelapp', + 'index', [] ); - } - - /** - * @NoAdminRequired - * @NoCSRFRequired - */ - public function index(ObjectService $objectService): JSONResponse - { - $filters = $this->request->getParams(); - - $searchConditions = []; - $searchParams = []; - $fieldsToSearch = ['title', 'description', 'summary']; - - foreach ($filters as $key => $value) { - if ($key === '_search') { - // MongoDB - $searchRegex = ['$regex' => $value, '$options' => 'i']; - $filters['$or'] = []; - - // MySQL - $searchParams['search'] = '%' . strtolower($value) . '%'; - - foreach ($fieldsToSearch as $field) { - // MongoDB - $filters['$or'][] = [$field => $searchRegex]; - - // MySQL - $searchConditions[] = "LOWER($field) LIKE :search"; - } - } - - if (str_starts_with($key, '_')) { - unset($filters[$key]); - } - } - - if($this->config->hasKey($this->appName, 'mongoStorage') === false - || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' - ) { - // Unset mongodb filter - unset($filters['$or']); - - return new JSONResponse(['results' => $this->publicationMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); - } - - $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); - $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); - $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); - - $filters['_schema'] = 'publication'; - - $result = $objectService->findObjects(filters: $filters, config: $dbConfig); - - $results = ["results" => $result['documents']]; - return new JSONResponse($results); - } - - /** - * @NoAdminRequired - * @NoCSRFRequired - */ - public function show(string|int $id, ObjectService $objectService): JSONResponse - { - if($this->config->hasKey($this->appName, 'mongoStorage') === false - || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' - ) { - return new JSONResponse($this->publicationMapper->find(id: (int) $id)); - } - - $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); - $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); - $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); - - $filters['_id'] = (string) $id; - - $result = $objectService->findObject(filters: $filters, config: $dbConfig); - - return new JSONResponse($result); - } - - - /** - * @NoAdminRequired - * @NoCSRFRequired - */ - public function create(ObjectService $objectService, ElasticSearchService $elasticSearchService): JSONResponse - { - $data = $this->request->getParams(); - - foreach($data as $key => $value) { - if(str_starts_with($key, '_')) { - unset($data[$key]); - } - } - - if($this->config->hasKey($this->appName, 'mongoStorage') === false - || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' - ) { - $returnData = $this->publicationMapper->createFromArray($data); - $returnData = $returnData->jsonSerialize(); - $dbConfig = []; - } else { - $data['_schema'] = 'publication'; - - $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); - $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); - $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); - $returnData = $objectService->saveObject( - data: $data, - config: $dbConfig - ); - } - if( - $this->config->hasKey(app: $this->appName, key: 'elasticLocation') === true - && $this->config->getValueString(app: $this->appName, key: 'elasticLocation') !== '' - && $this->config->hasKey(app: $this->appName, key: 'elasticKey') === true - && $this->config->getValueString(app: $this->appName, key: 'elasticKey') !== '' - && $this->config->hasKey(app: $this->appName, key: 'elasticIndex') === true - && $this->config->getValueString(app: $this->appName, key: 'elasticIndex') !== '' - && $returnData['status'] === 'published' - ) { - $elasticConfig['location'] = $this->config->getValueString(app: $this->appName, key: 'elasticLocation'); - $elasticConfig['key'] = $this->config->getValueString(app: $this->appName, key: 'elasticKey'); - $elasticConfig['index'] = $this->config->getValueString(app: $this->appName, key: 'elasticIndex'); - - $returnData = $this->insertNestedObjects($returnData, $objectService, $dbConfig); - - $returnData = $elasticSearchService->addObject(object: $returnData, config: $elasticConfig); - - } - // get post from requests - return new JSONResponse($returnData); - } - - /** - * @NoAdminRequired - * @NoCSRFRequired - */ - public function update(string|int $id, ObjectService $objectService, ElasticSearchService $elasticSearchService): JSONResponse - { - - $data = $this->request->getParams(); - - foreach($data as $key => $value) { - if(str_starts_with($key, '_')) { - unset($data[$key]); - } - } - if (isset($data['id'])) { - unset( $data['id']); - } - - if($this->config->hasKey($this->appName, 'mongoStorage') === false - || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' - ) { - $returnData = $this->publicationMapper->updateFromArray(id: (int) $id, object: $data); - $returnData = $returnData->jsonSerialize(); - - $dbConfig = []; - } else { - $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); - $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); - $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); + } - $filters['_id'] = (string) $id; - $returnData = $objectService->updateObject( - filters: $filters, - update: $data, - config: $dbConfig - ); - } + /** + * Return (and serach) all objects + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function index(CallService $callService): JSONResponse + { + // Latere zorg + $query= $this->request->getParams(); - if( - $this->config->hasKey(app: $this->appName, key: 'elasticLocation') === true - && $this->config->getValueString(app: $this->appName, key: 'elasticLocation') !== '' - && $this->config->hasKey(app: $this->appName, key: 'elasticKey') === true - && $this->config->getValueString(app: $this->appName, key: 'elasticKey') !== '' - && $this->config->hasKey(app: $this->appName, key: 'elasticIndex') === true - && $this->config->getValueString(app: $this->appName, key: 'elasticIndex') !== '' - && $returnData['status'] === 'published' - ) { - $elasticConfig['location'] = $this->config->getValueString(app: $this->appName, key: 'elasticLocation'); - $elasticConfig['key'] = $this->config->getValueString(app: $this->appName, key: 'elasticKey'); - $elasticConfig['index'] = $this->config->getValueString(app: $this->appName, key: 'elasticIndex'); + $results = $callService->index(source: 'brc', endpoint: 'besluiten'); + return new JSONResponse($results); + } - $returnData = $this->insertNestedObjects($returnData, $objectService, $dbConfig); + /** + * Read a single object + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function show(string $id, CallService $callService): JSONResponse + { + // Latere zorg + $query= $this->request->getParams(); - $returnData = $elasticSearchService->updateObject(id: $id, object: $returnData, config: $elasticConfig); + $results = $callService->show(source: 'brc', endpoint: 'besluiten', id: $id); + return new JSONResponse($results); + } - } + /** + * Creatue an object + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function create(CallService $callService): JSONResponse + { // get post from requests - return new JSONResponse($returnData); - } - - /** - * @NoAdminRequired - * @NoCSRFRequired - */ - public function destroy(string|int $id, ObjectService $objectService, ElasticSearchService $elasticSearchService): JSONResponse - { - if($this->config->hasKey($this->appName, 'mongoStorage') === false - || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' - ) { - $this->publicationMapper->delete($this->publicationMapper->find(id: (int) $id)); - - $returnData = []; - } else { - $dbConfig['base_uri'] = $this->config->getValueString(app: $this->appName, key: 'mongodbLocation'); - $dbConfig['headers']['api-key'] = $this->config->getValueString(app: $this->appName, key: 'mongodbKey'); - $dbConfig['mongodbCluster'] = $this->config->getValueString(app: $this->appName, key: 'mongodbCluster'); - - $filters['_id'] = (string) $id; - $returnData = $objectService->deleteObject( - filters: $filters, - config: $dbConfig - ); - } - - if( - $this->config->hasKey(app: $this->appName, key: 'elasticLocation') === true - && $this->config->getValueString(app: $this->appName, key: 'elasticLocation') !== '' - && $this->config->hasKey(app: $this->appName, key: 'elasticKey') === true - && $this->config->getValueString(app: $this->appName, key: 'elasticKey') !== '' - && $this->config->hasKey(app: $this->appName, key: 'elasticIndex') === true - && $this->config->getValueString(app: $this->appName, key: 'elasticIndex') !== '' - && $returnData['status'] === 'published' - ) { - $elasticConfig['location'] = $this->config->getValueString(app: $this->appName, key: 'elasticLocation'); - $elasticConfig['key'] = $this->config->getValueString(app: $this->appName, key: 'elasticKey'); - $elasticConfig['index'] = $this->config->getValueString(app: $this->appName, key: 'elasticIndex'); + $body = $this->request->getParams(); + $results = $callService->create(source: 'brc', endpoint: 'besluiten', data: $body); + return new JSONResponse($results); + } - $returnData = $elasticSearchService->removeObject(id: $id, config: $elasticConfig); + /** + * Update an object + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function update(string $id, CallService $callService): JSONResponse + { + $body = $this->request->getParams(); + $results = $callService->update(source: 'brc', endpoint: 'besluiten', data: $body, id: $id); + return new JSONResponse($results); + } - } + /** + * Delate an object + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function destroy(string $id, CallService $callService): JSONResponse + { + $callService->destroy(source: 'brc', endpoint: 'besluiten', id: $id); - // get post from requests - return new JSONResponse($returnData); - } + return new JsonResponse([]); + } } diff --git a/lib/Controller/ThemesController.php b/lib/Controller/ThemesController.php new file mode 100644 index 00000000..960aaeaa --- /dev/null +++ b/lib/Controller/ThemesController.php @@ -0,0 +1,143 @@ + [ + "id" => "354980e5-c967-4ba5-989b-65c2b0cd2ff4", + "name" => "Input voor OpenCatalogi", + "summary" => "Dit is een selectie van high-value datasets in DCAT-AP 2.0 standaard x" + ], + "2ab0011e-9b4c-4c50-a50d-a16fc0be0178" => [ + "id" => "2ab0011e-9b4c-4c50-a50d-a16fc0be0178", + "title" => "Publication two", + "description" => "summary for two" + ] + ]; + + public function __construct + ( + $appName, + IRequest $request, + private readonly PublicationMapper $publicationMapper, + private readonly IAppConfig $config, + ) + { + parent::__construct($appName, $request); + } + + /** + * This returns the template of the main app's page + * It adds some data to the template (app version) + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return TemplateResponse + */ + public function page(): TemplateResponse + { + return new TemplateResponse( + //Application::APP_ID, + 'zaakafhandelapp', + 'index', + [] + ); + } + + /** + * Return (and serach) all objects + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function index(CallService $callService): JSONResponse + { + // Latere zorg + $query= $this->request->getParams(); + + $results = $callService->index(source: 'brc', endpoint: 'besluiten'); + return new JSONResponse($results); + } + + /** + * Read a single object + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function show(string $id, CallService $callService): JSONResponse + { + // Latere zorg + $query= $this->request->getParams(); + + $results = $callService->show(source: 'brc', endpoint: 'besluiten', id: $id); + return new JSONResponse($results); + } + + + /** + * Creatue an object + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function create(CallService $callService): JSONResponse + { + // get post from requests + $body = $this->request->getParams(); + $results = $callService->create(source: 'brc', endpoint: 'besluiten', data: $body); + return new JSONResponse($results); + } + + /** + * Update an object + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function update(string $id, CallService $callService): JSONResponse + { + $body = $this->request->getParams(); + $results = $callService->update(source: 'brc', endpoint: 'besluiten', data: $body, id: $id); + return new JSONResponse($results); + } + + /** + * Delate an object + * + * @NoAdminRequired + * @NoCSRFRequired + * + * @return JSONResponse + */ + public function destroy(string $id, CallService $callService): JSONResponse + { + $callService->destroy(source: 'brc', endpoint: 'besluiten', id: $id); + + return new JsonResponse([]); + } +} diff --git a/src/entities/organisation/index.js b/src/entities/organisation/index.js new file mode 100644 index 00000000..17f72d4a --- /dev/null +++ b/src/entities/organisation/index.js @@ -0,0 +1,2 @@ +export * from './organisation.ts' +export * from './organisation.types.ts' diff --git a/src/entities/organisation/organisation.spec.ts b/src/entities/organisation/organisation.spec.ts new file mode 100644 index 00000000..695dcfc6 --- /dev/null +++ b/src/entities/organisation/organisation.spec.ts @@ -0,0 +1,68 @@ +/* eslint-disable no-console */ +import { Organisation } from './organisation' +import { TOrganisation } from './organisation.types' + +describe('Organisation Store', () => { + it('create Organisation entity with full data', () => { + const organisation = new Organisation(testData[0]) + + expect(organisation).toBeInstanceOf(Organisation) + expect(organisation).toEqual(testData[0]) + + expect(organisation.validate()).toBe(true) + }) + + it('create Organisation entity with partial data', () => { + const organisation = new Organisation(testData[1]) + + expect(organisation).toBeInstanceOf(Organisation) + expect(organisation.id).toBe(testData[1].id) + expect(organisation.title).toBe(testData[1].title) + expect(organisation.summary).toBe(testData[1].summary) + expect(organisation.description).toBe(testData[1].description) + expect(organisation.oin).toBe('') + expect(organisation.tooi).toBe('') + expect(organisation.rsin).toBe('') + expect(organisation.pki).toBe('') + + expect(organisation.validate()).toBe(true) + }) + + it('create Catalogi entity with falsy data', () => { + const organisation = new Organisation(testData[2]) + + expect(organisation).toBeInstanceOf(Organisation) + expect(organisation).toEqual(testData[2]) + + expect(organisation.validate()).toBe(false) + }) +}) + +const testData: TOrganisation[] = [ + { // full data + id: '1', + title: 'Decat', + summary: 'a short form summary', + description: 'a really really long description about this organisation', + oin: 'string', + tooi: 'string', + rsin: 'string', + pki: 'string', + }, + { // partial data + id: '2', + title: 'Woo', + summary: 'a short form summary', + description: 'a really really long description about this organisation', + }, + { // invalid data + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this organisation', + oin: 'string', + tooi: 'string', + rsin: 'string', + pki: 'string', + }, +] diff --git a/src/entities/organisation/organisation.ts b/src/entities/organisation/organisation.ts new file mode 100644 index 00000000..618bd832 --- /dev/null +++ b/src/entities/organisation/organisation.ts @@ -0,0 +1,46 @@ +import { TOrganisation } from './organisation.types' + +export class Organisation implements TOrganisation { + + public id: string + public title: string + public summary: string + public description?: string + public oin?: string + public tooi?: string + public rsin?: string + public pki?: string + + constructor(data: TOrganisation) { + this.hydrate(data) + } + + /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods + private hydrate(data: TOrganisation) { + this.id = data?.id?.toString() || '' + // @ts-expect-error data.name is not supposed to exist but you can still get it from the backend, so this is just backwards compatibility + this.title = data?.title || data?.name || '' + this.summary = data?.summary || '' + this.description = data?.description || '' + this.oin = data?.oin || '' + this.tooi = data?.tooi || '' + this.rsin = data?.rsin || '' + this.pki = data?.pki || '' + } + + /* istanbul ignore next */ + public validate(): boolean { + // these have to exist + if (!this.id || typeof this.id !== 'string') return false + if (!this.title || typeof this.title !== 'string') return false + if (!this.summary || typeof this.summary !== 'string') return false + // these can be optional + if (typeof this.description !== 'string') return false + if (typeof this.oin !== 'string') return false + if (typeof this.tooi !== 'string') return false + if (typeof this.rsin !== 'string') return false + if (typeof this.pki !== 'string') return false + return true + } + +} diff --git a/src/entities/organisation/organisation.types.ts b/src/entities/organisation/organisation.types.ts new file mode 100644 index 00000000..449aa687 --- /dev/null +++ b/src/entities/organisation/organisation.types.ts @@ -0,0 +1,10 @@ +export type TOrganisation = { + id: string + title: string + summary: string + description?: string + oin?: string + tooi?: string + rsin?: string + pki?: string +} diff --git a/src/entities/theme/index.js b/src/entities/theme/index.js new file mode 100644 index 00000000..d2f310fc --- /dev/null +++ b/src/entities/theme/index.js @@ -0,0 +1,2 @@ +export * from './theme.ts' +export * from './theme.types.ts' diff --git a/src/entities/theme/theme.spec.ts b/src/entities/theme/theme.spec.ts new file mode 100644 index 00000000..a59449dd --- /dev/null +++ b/src/entities/theme/theme.spec.ts @@ -0,0 +1,59 @@ +/* eslint-disable no-console */ +import { Theme } from './theme' +import { TTheme } from './theme.types' + +describe('Theme Store', () => { + it('create Theme entity with full data', () => { + const theme = new Theme(testData[0]) + + expect(theme).toBeInstanceOf(Theme) + expect(theme).toEqual(testData[0]) + + expect(theme.validate()).toBe(true) + }) + + it('create Theme entity with partial data', () => { + const theme = new Theme(testData[1]) + + expect(theme).toBeInstanceOf(Theme) + expect(theme.id).toBe(testData[1].id) + expect(theme.title).toBe(testData[1].title) + expect(theme.summary).toBe(testData[1].summary) + expect(theme.description).toBe(testData[1].description) + expect(theme.image).toBe('') + + expect(theme.validate()).toBe(true) + }) + + it('create Theme entity with falsy data', () => { + const theme = new Theme(testData[2]) + + expect(theme).toBeInstanceOf(Theme) + expect(theme).toEqual(testData[2]) + + expect(theme.validate()).toBe(false) + }) +}) + +const testData: TTheme[] = [ + { // full data + id: '1', + title: 'Decat', + summary: 'a short form summary', + description: 'a really really long description about this Theme', + image: 'string', + }, + { // partial data + id: '2', + title: 'Woo', + summary: 'a short form summary', + description: 'a really really long description about this Theme', + }, + { // invalid data + id: '3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this Theme', + image: 'string', + }, +] diff --git a/src/entities/theme/theme.ts b/src/entities/theme/theme.ts new file mode 100644 index 00000000..eac7f103 --- /dev/null +++ b/src/entities/theme/theme.ts @@ -0,0 +1,37 @@ +import { TTheme } from './theme.types' + +export class Theme implements TTheme { + + public id: string + public title: string + public summary: string + public description?: string + public image?: string + + constructor(data: TTheme) { + this.hydrate(data) + } + + /* istanbul ignore next */ // Jest does not recognize the code coverage of these 2 methods + private hydrate(data: TTheme) { + this.id = data?.id?.toString() || '' + // @ts-expect-error data.name is not supposed to exist but you can still get it from the backend, so this is just backwards compatibility + this.title = data?.title || data?.name || '' + this.summary = data?.summary || '' + this.description = data?.description || '' + this.image = data?.image || '' + } + + /* istanbul ignore next */ + public validate(): boolean { + // these have to exist + if (!this.id || typeof this.id !== 'string') return false + if (!this.title || typeof this.title !== 'string') return false + if (!this.summary || typeof this.summary !== 'string') return false + // these can be optional + if (typeof this.description !== 'string') return false + if (typeof this.image !== 'string') return false + return true + } + +} diff --git a/src/entities/theme/theme.types.ts b/src/entities/theme/theme.types.ts new file mode 100644 index 00000000..aa248935 --- /dev/null +++ b/src/entities/theme/theme.types.ts @@ -0,0 +1,7 @@ +export type TTheme = { + id: string + title: string + summary: string + description?: string + image?: string +} diff --git a/src/store/modules/configuration.js b/src/store/modules/configuration.js new file mode 100644 index 00000000..6901345a --- /dev/null +++ b/src/store/modules/configuration.js @@ -0,0 +1,114 @@ +/* eslint-disable no-console */ +import { Attachment, Publication } from '../../entities/index.js' +import { defineStore } from 'pinia' + +export const useOrganizationStore = defineStore('organization', { + state: () => ({ + publicationItem: false, + publicationList: [], + publicationDataKey: false, + attachmentItem: false, + publicationAttachments: [], + conceptPublications: [], + conceptAttachments: [], + }), + actions: { + setPublicationItem(publicationItem) { + // To prevent forms etc from braking we alway use a default/skeleton object + this.publicationItem = publicationItem && new Publication(publicationItem) + console.log('Active publication item set to ' + publicationItem && publicationItem.id) + }, + setPublicationList(publicationList) { + this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) + console.log('Active publication item set to ' + publicationList.length) + }, + async refreshPublicationList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/publications' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.setPublicationList(data?.results) + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getPublicationAttachments(publication) { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.publicationAttachments = data.results.map( + (attachmentItem) => new Attachment(attachmentItem), + ) + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getConceptPublications() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/publications?status=concept', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.conceptPublications = data + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getConceptAttachments() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments?status=concept', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.conceptAttachments = data + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + // @todo why does the following run through the store? -- because its impossible with props, and its vital information for the modal. + setPublicationDataKey(publicationDataKey) { + this.publicationDataKey = publicationDataKey + console.log('Active publication data key set to ' + publicationDataKey) + }, + setAttachmentItem(attachmentItem) { + this.attachmentItem = attachmentItem && new Attachment(attachmentItem) + console.log('Active attachment item set to ' + attachmentItem) + }, + }, +}) diff --git a/src/store/modules/configuration.specs.js b/src/store/modules/configuration.specs.js new file mode 100644 index 00000000..8adee3ba --- /dev/null +++ b/src/store/modules/configuration.specs.js @@ -0,0 +1,220 @@ +/* eslint-disable no-console */ +import { setActivePinia, createPinia } from 'pinia' + +import { usePublicationStore } from './publication.js' +import { Attachment, Publication } from '../../entities/index.js' + +describe('Metadata Store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('sets publication item correctly', () => { + const store = usePublicationStore() + + store.setPublicationItem(testData[0]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[0]) + expect(store.publicationItem.validate()).toBe(true) + + store.setPublicationItem(testData[1]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).not.toEqual(testData[1]) + expect(store.publicationItem.validate()).toBe(true) + + store.setPublicationItem(testData[2]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[2]) + expect(store.publicationItem.validate()).toBe(false) + }) + + it('sets publication list correctly', () => { + const store = usePublicationStore() + + store.setPublicationList(testData) + + expect(store.publicationList).toHaveLength(testData.length) + + expect(store.publicationList[0]).toBeInstanceOf(Publication) + expect(store.publicationList[0]).toEqual(testData[0]) + expect(store.publicationList[0].validate()).toBe(true) + + expect(store.publicationList[1]).toBeInstanceOf(Publication) + expect(store.publicationList[1]).not.toEqual(testData[1]) + expect(store.publicationList[1].validate()).toBe(true) + + expect(store.publicationList[2]).toBeInstanceOf(Publication) + expect(store.publicationList[2]).toEqual(testData[2]) + expect(store.publicationList[2].validate()).toBe(false) + }) + + // TODO: fix this + it('set publication data.data property key correctly', () => { + const store = usePublicationStore() + + store.setPublicationDataKey('contactPoint') + + expect(store.publicationDataKey).toBe('contactPoint') + }) + + it('set attachment item correctly', () => { + const store = usePublicationStore() + + store.setAttachmentItem(attachmentTestData[0]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[0]) + expect(store.attachmentItem.validate()).toBe(true) + + store.setAttachmentItem(attachmentTestData[1]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).not.toEqual(attachmentTestData[1]) + expect(store.attachmentItem.validate()).toBe(true) + + store.setAttachmentItem(attachmentTestData[2]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[2]) + expect(store.attachmentItem.validate()).toBe(false) + }) +}) + +const testData = [ + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category1', + portal: 'portal1', + catalogi: 'catalogi1', + metaData: 'meta1', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // partial data + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category2', + portal: 'portal2', + catalogi: 'catalogi2', + metaData: 'meta2', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // invalid data + id: '3', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category3', + portal: 'portal3', + catalogi: 'catalogi3', + metaData: 'meta3', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, +] + +const attachmentTestData = [ + { // full data + id: '9044ab1e-cf5a-490a-be74-6be7a0c48a5f', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag1' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, + { // partial data + id: 'f849f287-492d-4100-91e1-1c4137f0abb5', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag2' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + license: 'MIT', + }, + { // invalid data + id: 'e193ea6b-1222-44cf-a71c-6ddcc232a79b', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag3' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, +] diff --git a/src/store/modules/theme.js b/src/store/modules/theme.js new file mode 100644 index 00000000..6901345a --- /dev/null +++ b/src/store/modules/theme.js @@ -0,0 +1,114 @@ +/* eslint-disable no-console */ +import { Attachment, Publication } from '../../entities/index.js' +import { defineStore } from 'pinia' + +export const useOrganizationStore = defineStore('organization', { + state: () => ({ + publicationItem: false, + publicationList: [], + publicationDataKey: false, + attachmentItem: false, + publicationAttachments: [], + conceptPublications: [], + conceptAttachments: [], + }), + actions: { + setPublicationItem(publicationItem) { + // To prevent forms etc from braking we alway use a default/skeleton object + this.publicationItem = publicationItem && new Publication(publicationItem) + console.log('Active publication item set to ' + publicationItem && publicationItem.id) + }, + setPublicationList(publicationList) { + this.publicationList = publicationList.map((publicationItem) => new Publication(publicationItem)) + console.log('Active publication item set to ' + publicationList.length) + }, + async refreshPublicationList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/opencatalogi/api/publications' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch( + endpoint, + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.setPublicationList(data?.results) + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getPublicationAttachments(publication) { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.publicationAttachments = data.results.map( + (attachmentItem) => new Attachment(attachmentItem), + ) + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getConceptPublications() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/publications?status=concept', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.conceptPublications = data + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + getConceptAttachments() { // @todo this might belong in a service? + fetch( + '/index.php/apps/opencatalogi/api/attachments?status=concept', + { + method: 'GET', + }, + ) + .then((response) => { + response.json().then((data) => { + this.conceptAttachments = data + return data + }) + }) + .catch((err) => { + console.error(err) + return err + }) + }, + // @todo why does the following run through the store? -- because its impossible with props, and its vital information for the modal. + setPublicationDataKey(publicationDataKey) { + this.publicationDataKey = publicationDataKey + console.log('Active publication data key set to ' + publicationDataKey) + }, + setAttachmentItem(attachmentItem) { + this.attachmentItem = attachmentItem && new Attachment(attachmentItem) + console.log('Active attachment item set to ' + attachmentItem) + }, + }, +}) diff --git a/src/store/modules/theme.spec copy.js b/src/store/modules/theme.spec copy.js new file mode 100644 index 00000000..8adee3ba --- /dev/null +++ b/src/store/modules/theme.spec copy.js @@ -0,0 +1,220 @@ +/* eslint-disable no-console */ +import { setActivePinia, createPinia } from 'pinia' + +import { usePublicationStore } from './publication.js' +import { Attachment, Publication } from '../../entities/index.js' + +describe('Metadata Store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('sets publication item correctly', () => { + const store = usePublicationStore() + + store.setPublicationItem(testData[0]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[0]) + expect(store.publicationItem.validate()).toBe(true) + + store.setPublicationItem(testData[1]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).not.toEqual(testData[1]) + expect(store.publicationItem.validate()).toBe(true) + + store.setPublicationItem(testData[2]) + + expect(store.publicationItem).toBeInstanceOf(Publication) + expect(store.publicationItem).toEqual(testData[2]) + expect(store.publicationItem.validate()).toBe(false) + }) + + it('sets publication list correctly', () => { + const store = usePublicationStore() + + store.setPublicationList(testData) + + expect(store.publicationList).toHaveLength(testData.length) + + expect(store.publicationList[0]).toBeInstanceOf(Publication) + expect(store.publicationList[0]).toEqual(testData[0]) + expect(store.publicationList[0].validate()).toBe(true) + + expect(store.publicationList[1]).toBeInstanceOf(Publication) + expect(store.publicationList[1]).not.toEqual(testData[1]) + expect(store.publicationList[1].validate()).toBe(true) + + expect(store.publicationList[2]).toBeInstanceOf(Publication) + expect(store.publicationList[2]).toEqual(testData[2]) + expect(store.publicationList[2].validate()).toBe(false) + }) + + // TODO: fix this + it('set publication data.data property key correctly', () => { + const store = usePublicationStore() + + store.setPublicationDataKey('contactPoint') + + expect(store.publicationDataKey).toBe('contactPoint') + }) + + it('set attachment item correctly', () => { + const store = usePublicationStore() + + store.setAttachmentItem(attachmentTestData[0]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[0]) + expect(store.attachmentItem.validate()).toBe(true) + + store.setAttachmentItem(attachmentTestData[1]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).not.toEqual(attachmentTestData[1]) + expect(store.attachmentItem.validate()).toBe(true) + + store.setAttachmentItem(attachmentTestData[2]) + + expect(store.attachmentItem).toBeInstanceOf(Attachment) + expect(store.attachmentItem).toEqual(attachmentTestData[2]) + expect(store.attachmentItem.validate()).toBe(false) + }) +}) + +const testData = [ + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category1', + portal: 'portal1', + catalogi: 'catalogi1', + metaData: 'meta1', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // partial data + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category2', + portal: 'portal2', + catalogi: 'catalogi2', + metaData: 'meta2', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, + { // invalid data + id: '3', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + image: 'https://example.com/image.jpg', + category: 'category3', + portal: 'portal3', + catalogi: 'catalogi3', + metaData: 'meta3', + publicationDate: '2024-01-01', + modified: '2024-01-02', + featured: true, + organization: [{ name: 'Org1' }], + data: [{ key: 'value1' }], + attachments: ['attachment1'], + attachmentCount: 1, + schema: 'schema1', + status: 'status1', + license: 'MIT', + themes: 'theme1', + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + }, +] + +const attachmentTestData = [ + { // full data + id: '9044ab1e-cf5a-490a-be74-6be7a0c48a5f', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag1' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, + { // partial data + id: 'f849f287-492d-4100-91e1-1c4137f0abb5', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag2' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + license: 'MIT', + }, + { // invalid data + id: 'e193ea6b-1222-44cf-a71c-6ddcc232a79b', + reference: 'ref3', + title: '', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [{ tag: 'tag3' }], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: 1024, + anonymization: { anonymized: 'yes', results: 'success' }, + language: { code: 'en', level: 'native' }, + versionOf: 'v1.0', + hash: 'abc123', + published: '2024-01-01', + modified: '2024-01-02', + license: 'MIT', + }, +] diff --git a/src/store/store.js b/src/store/store.js index 31a4a839..e65a2676 100644 --- a/src/store/store.js +++ b/src/store/store.js @@ -8,6 +8,8 @@ import { useDirectoryStore } from './modules/directory.js' import { useMetadataStore } from './modules/metadata.js' import { usePublicationStore } from './modules/publication.js' import { useOrganizationStore } from './modules/organization.js' +import { useThemeStore } from './modules/theme.js' +import { useConfigurationStore } from './modules/configuration.js' const navigationStore = useNavigationStore(pinia) const searchStore = useSearchStore(pinia) @@ -16,6 +18,8 @@ const directoryStore = useDirectoryStore(pinia) const metadataStore = useMetadataStore(pinia) const publicationStore = usePublicationStore(pinia) const organizationStore = useOrganizationStore(pinia) +const themeStore = useThemeStore(pinia) +const configurationStore = useConfigurationStore(pinia) export { // generic @@ -27,4 +31,6 @@ export { metadataStore, publicationStore, organizationStore, + themeStore, + configurationStore, } diff --git a/src/views/Views.vue b/src/views/Views.vue index ae5905ed..aa31b576 100644 --- a/src/views/Views.vue +++ b/src/views/Views.vue @@ -6,6 +6,9 @@ import { navigationStore, searchStore } from '../store/store.js' diff --git a/src/views/themes/ThemeList.vue b/src/views/themes/ThemeList.vue index 4d5b3290..ca9d415a 100644 --- a/src/views/themes/ThemeList.vue +++ b/src/views/themes/ThemeList.vue @@ -1,5 +1,5 @@ Ververs - + - Publicatie toevoegen + Theme toevoegen
- + :active="themeStore.themeItem.id === theme.id" + :details="theme?.status" + :counter-number="theme?.attachmentCount.toString()" + @click="themeStore.setThemeItem(theme)"> @@ -124,13 +94,8 @@ import Refresh from 'vue-material-design-icons/Refresh.vue' import Plus from 'vue-material-design-icons/Plus.vue' import Pencil from 'vue-material-design-icons/Pencil.vue' import Delete from 'vue-material-design-icons/Delete.vue' -import PublishOff from 'vue-material-design-icons/PublishOff.vue' -import FilePlusOutline from 'vue-material-design-icons/FilePlusOutline.vue' -import FileTreeOutline from 'vue-material-design-icons/FileTreeOutline.vue' import ContentCopy from 'vue-material-design-icons/ContentCopy.vue' import ShapeOutline from 'vue-material-design-icons/ShapeOutline.vue' -import Publish from 'vue-material-design-icons/Publish.vue' -import ArchivePlusOutline from 'vue-material-design-icons/ArchivePlusOutline.vue' import HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue' export default { @@ -146,13 +111,9 @@ export default { // Icons Refresh, Plus, - FilePlusOutline, - FileTreeOutline, ContentCopy, ShapeOutline, Pencil, - Publish, - ArchivePlusOutline, HelpCircleOutline, }, beforeRouteLeave(to, from, next) { @@ -171,10 +132,10 @@ export default { } }, computed: { - filteredPublications() { - if (!publicationStore?.publicationList) return [] - return publicationStore.publicationList.filter((publication) => { - return publication.catalogi.toString() === navigationStore.selectedCatalogus.toString() + filteredThemes() { + if (!themeStore?.themeList) return [] + return themeStore.themeList.filter((theme) => { + return theme.catalogi.toString() === navigationStore.selectedCatalogus.toString() }) }, }, @@ -191,7 +152,7 @@ export default { methods: { fetchData(search = null) { this.loading = true - publicationStore.refreshPublicationList(search) + themeStore.refreshThemeList(search) .then(() => { this.loading = false }) @@ -213,10 +174,10 @@ export default { margin-inline-end: 10px; } -.active.publicationDetails-actionsDelete { +.active.themeDetails-actionsDelete { background-color: var(--color-error) !important; } -.active.publicationDetails-actionsDelete button { +.active.themeDetails-actionsDelete button { color: #EBEBEB !important; } From 2257717e6588636e7f67486440ea9b47e8dde00f Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 6 Aug 2024 07:29:35 +0200 Subject: [PATCH 075/145] Connecting it al together --- lib/Controller/OrganisationsController.php | 83 ++++++++++++++++------ lib/Controller/ThemesController.php | 83 ++++++++++++++++------ 2 files changed, 122 insertions(+), 44 deletions(-) diff --git a/lib/Controller/OrganisationsController.php b/lib/Controller/OrganisationsController.php index 8c0d2d28..6f57da25 100644 --- a/lib/Controller/OrganisationsController.php +++ b/lib/Controller/OrganisationsController.php @@ -2,18 +2,13 @@ namespace OCA\OpenCatalogi\Controller; -use Elastic\Elasticsearch\Client; -use GuzzleHttp\Exception\GuzzleException; -use OCA\opencatalogi\lib\Db\Organisation; -use OCA\OpenCatalogi\Db\PublicationMapper; -use OCA\OpenCatalogi\Service\ElasticSearchService; +use OCA\OpenCatalogi\Db\OrganisationMapper; use OCA\OpenCatalogi\Service\ObjectService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\JSONResponse; use OCP\IAppConfig; use OCP\IRequest; -use Symfony\Component\Uid\Uuid; class OrganisationsController extends Controller { @@ -34,7 +29,7 @@ public function __construct ( $appName, IRequest $request, - private readonly PublicationMapper $publicationMapper, + private readonly OrganisationMapper $organisationMapper, private readonly IAppConfig $config ) { @@ -52,12 +47,7 @@ public function __construct */ public function page(): TemplateResponse { - return new TemplateResponse( - //Application::APP_ID, - 'zaakafhandelapp', - 'index', - [] - ); + return new TemplateResponse($this->appName, 'OrganisationIndex', []); } /** @@ -68,13 +58,62 @@ public function page(): TemplateResponse * * @return JSONResponse */ - public function index(CallService $callService): JSONResponse + public function index(ObjectService $objectService): JSONResponse { - // Latere zorg - $query= $this->request->getParams(); + + $filters = $this->request->getParams(); - $results = $callService->index(source: 'brc', endpoint: 'besluiten'); - return new JSONResponse($results); + $searchConditions = []; + $searchParams = []; + $fieldsToSearch = ['title', 'description', 'summary']; + + foreach ($filters as $key => $value) { + if ($key === '_search') { + // MongoDB + $searchRegex = ['$regex' => $value, '$options' => 'i']; + $filters['$or'] = []; + + // MySQL + $searchParams['search'] = '%' . strtolower($value) . '%'; + + foreach ($fieldsToSearch as $field) { + // MongoDB + $filters['$or'][] = [$field => $searchRegex]; + + // MySQL + $searchConditions[] = "LOWER($field) LIKE :search"; + } + } + + if (str_starts_with($key, '_')) { + unset($filters[$key]); + } + } + + if($this->config->hasKey($this->appName, 'mongoStorage') === false + || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' + ) { + // Unset mongodb filter + unset($filters['$or']); + + return new JSONResponse(['results' => $this->organisationMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); + } + + try { + $dbConfig = [ + 'base_uri' => $this->config->getValueString($this->appName, 'mongodbLocation'), + 'headers' => ['api-key' => $this->config->getValueString($this->appName, 'mongodbKey')], + 'mongodbCluster' => $this->config->getValueString($this->appName, 'mongodbCluster') + ]; + + $filters['_schema'] = 'organisation'; + + $result = $objectService->findObjects(filters: $filters, config: $dbConfig); + + return new JSONResponse(["results" => $result['documents']]); + } catch (\Exception $e) { + return new JSONResponse(['error' => $e->getMessage()], 500); + } } /** @@ -85,7 +124,7 @@ public function index(CallService $callService): JSONResponse * * @return JSONResponse */ - public function show(string $id, CallService $callService): JSONResponse + public function show(string $id, ObjectService $objectService): JSONResponse { // Latere zorg $query= $this->request->getParams(); @@ -103,7 +142,7 @@ public function show(string $id, CallService $callService): JSONResponse * * @return JSONResponse */ - public function create(CallService $callService): JSONResponse + public function create(ObjectService $objectService): JSONResponse { // get post from requests $body = $this->request->getParams(); @@ -119,7 +158,7 @@ public function create(CallService $callService): JSONResponse * * @return JSONResponse */ - public function update(string $id, CallService $callService): JSONResponse + public function update(string $id, ObjectService $objectService): JSONResponse { $body = $this->request->getParams(); $results = $callService->update(source: 'brc', endpoint: 'besluiten', data: $body, id: $id); @@ -134,7 +173,7 @@ public function update(string $id, CallService $callService): JSONResponse * * @return JSONResponse */ - public function destroy(string $id, CallService $callService): JSONResponse + public function destroy(string $id, ObjectService $objectService): JSONResponse { $callService->destroy(source: 'brc', endpoint: 'besluiten', id: $id); diff --git a/lib/Controller/ThemesController.php b/lib/Controller/ThemesController.php index fa2e7e9b..31738788 100644 --- a/lib/Controller/ThemesController.php +++ b/lib/Controller/ThemesController.php @@ -2,18 +2,13 @@ namespace OCA\OpenCatalogi\Controller; -use Elastic\Elasticsearch\Client; -use GuzzleHttp\Exception\GuzzleException; -use OCA\opencatalogi\lib\Db\Theme; -use OCA\OpenCatalogi\Db\PublicationMapper; -use OCA\OpenCatalogi\Service\ElasticSearchService; +use OCA\OpenCatalogi\Db\ThemesMapper; use OCA\OpenCatalogi\Service\ObjectService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\JSONResponse; use OCP\IAppConfig; use OCP\IRequest; -use Symfony\Component\Uid\Uuid; class ThemesController extends Controller { @@ -34,7 +29,7 @@ public function __construct ( $appName, IRequest $request, - private readonly PublicationMapper $publicationMapper, + private readonly ThemesMapper $themesMapper, private readonly IAppConfig $config, ) { @@ -52,12 +47,7 @@ public function __construct */ public function page(): TemplateResponse { - return new TemplateResponse( - //Application::APP_ID, - 'zaakafhandelapp', - 'index', - [] - ); + return new TemplateResponse($this->appName, 'ThemesIndex', []); } /** @@ -68,13 +58,62 @@ public function page(): TemplateResponse * * @return JSONResponse */ - public function index(CallService $callService): JSONResponse + public function index(ObjectService $objectService): JSONResponse { - // Latere zorg - $query= $this->request->getParams(); + + $filters = $this->request->getParams(); - $results = $callService->index(source: 'brc', endpoint: 'besluiten'); - return new JSONResponse($results); + $searchConditions = []; + $searchParams = []; + $fieldsToSearch = ['title', 'description', 'summary']; + + foreach ($filters as $key => $value) { + if ($key === '_search') { + // MongoDB + $searchRegex = ['$regex' => $value, '$options' => 'i']; + $filters['$or'] = []; + + // MySQL + $searchParams['search'] = '%' . strtolower($value) . '%'; + + foreach ($fieldsToSearch as $field) { + // MongoDB + $filters['$or'][] = [$field => $searchRegex]; + + // MySQL + $searchConditions[] = "LOWER($field) LIKE :search"; + } + } + + if (str_starts_with($key, '_')) { + unset($filters[$key]); + } + } + + if($this->config->hasKey($this->appName, 'mongoStorage') === false + || $this->config->getValueString($this->appName, 'mongoStorage') !== '1' + ) { + // Unset mongodb filter + unset($filters['$or']); + + return new JSONResponse(['results' => $this->themesMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); + } + + try { + $dbConfig = [ + 'base_uri' => $this->config->getValueString($this->appName, 'mongodbLocation'), + 'headers' => ['api-key' => $this->config->getValueString($this->appName, 'mongodbKey')], + 'mongodbCluster' => $this->config->getValueString($this->appName, 'mongodbCluster') + ]; + + $filters['_schema'] = 'theme'; + + $result = $objectService->findObjects(filters: $filters, config: $dbConfig); + + return new JSONResponse(["results" => $result['documents']]); + } catch (\Exception $e) { + return new JSONResponse(['error' => $e->getMessage()], 500); + } } /** @@ -85,7 +124,7 @@ public function index(CallService $callService): JSONResponse * * @return JSONResponse */ - public function show(string $id, CallService $callService): JSONResponse + public function show(string $id, ObjectService $objectService): JSONResponse { // Latere zorg $query= $this->request->getParams(); @@ -103,7 +142,7 @@ public function show(string $id, CallService $callService): JSONResponse * * @return JSONResponse */ - public function create(CallService $callService): JSONResponse + public function create(ObjectService $objectService): JSONResponse { // get post from requests $body = $this->request->getParams(); @@ -119,7 +158,7 @@ public function create(CallService $callService): JSONResponse * * @return JSONResponse */ - public function update(string $id, CallService $callService): JSONResponse + public function update(string $id, ObjectService $objectService): JSONResponse { $body = $this->request->getParams(); $results = $callService->update(source: 'brc', endpoint: 'besluiten', data: $body, id: $id); @@ -134,7 +173,7 @@ public function update(string $id, CallService $callService): JSONResponse * * @return JSONResponse */ - public function destroy(string $id, CallService $callService): JSONResponse + public function destroy(string $id, ObjectService $objectService): JSONResponse { $callService->destroy(source: 'brc', endpoint: 'besluiten', id: $id); From e6a06ed7473c68027a1e5d6c5b9c432d5ef1dcda Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 6 Aug 2024 09:05:18 +0200 Subject: [PATCH 076/145] Fix for the reflection errors --- lib/Controller/ThemesController.php | 6 +++--- lib/Db/{Organization.php => Organisation.php} | 2 +- lib/Db/{OrganizationMapper.php => OrganisationMapper.php} | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename lib/Db/{Organization.php => Organisation.php} (97%) rename lib/Db/{OrganizationMapper.php => OrganisationMapper.php} (96%) diff --git a/lib/Controller/ThemesController.php b/lib/Controller/ThemesController.php index 31738788..bbd024be 100644 --- a/lib/Controller/ThemesController.php +++ b/lib/Controller/ThemesController.php @@ -2,7 +2,7 @@ namespace OCA\OpenCatalogi\Controller; -use OCA\OpenCatalogi\Db\ThemesMapper; +use OCA\OpenCatalogi\Db\ThemeMapper; use OCA\OpenCatalogi\Service\ObjectService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; @@ -29,7 +29,7 @@ public function __construct ( $appName, IRequest $request, - private readonly ThemesMapper $themesMapper, + private readonly ThemeMapper $themeMapper, private readonly IAppConfig $config, ) { @@ -96,7 +96,7 @@ public function index(ObjectService $objectService): JSONResponse // Unset mongodb filter unset($filters['$or']); - return new JSONResponse(['results' => $this->themesMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); + return new JSONResponse(['results' => $this->themeMapper->findAll(filters: $filters, searchParams: $searchParams, searchConditions: $searchConditions)]); } try { diff --git a/lib/Db/Organization.php b/lib/Db/Organisation.php similarity index 97% rename from lib/Db/Organization.php rename to lib/Db/Organisation.php index 3695a277..4818a144 100644 --- a/lib/Db/Organization.php +++ b/lib/Db/Organisation.php @@ -6,7 +6,7 @@ use JsonSerializable; use OCP\AppFramework\Db\Entity; -class Organization extends Entity implements JsonSerializable +class Organisation extends Entity implements JsonSerializable { protected ?string $title = null; diff --git a/lib/Db/OrganizationMapper.php b/lib/Db/OrganisationMapper.php similarity index 96% rename from lib/Db/OrganizationMapper.php rename to lib/Db/OrganisationMapper.php index 74c0e153..c99b1f2a 100644 --- a/lib/Db/OrganizationMapper.php +++ b/lib/Db/OrganisationMapper.php @@ -8,7 +8,7 @@ use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; -class OrganizationMapper extends QBMapper +class OrganisationMapper extends QBMapper { public function __construct(IDBConnection $db) { From 2d92dfbf3d6dc487776351f9b9ef8a989c59ef2e Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 6 Aug 2024 09:08:45 +0200 Subject: [PATCH 077/145] Added filters to organisations --- lib/Db/OrganisationMapper.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/Db/OrganisationMapper.php b/lib/Db/OrganisationMapper.php index c99b1f2a..26dcc784 100644 --- a/lib/Db/OrganisationMapper.php +++ b/lib/Db/OrganisationMapper.php @@ -28,15 +28,26 @@ public function find(int $id): Organization return $this->findEntity(query: $qb); } - public function findAll($limit = null, $offset = null): array + public function findAll(?int $limit = null, ?int $offset = null, ?array $filters = [], ?array $searchConditions = [], ?array $searchParams = []): array { $qb = $this->db->getQueryBuilder(); $qb->select('*') - ->from('organizations') + ->from('organisations') ->setMaxResults($limit) ->setFirstResult($offset); + foreach($filters as $filter => $value) { + $qb->andWhere($qb->expr()->eq($filter, $qb->createNamedParameter($value))); + } + + if (!empty($searchConditions)) { + $qb->andWhere('(' . implode(' OR ', $searchConditions) . ')'); + foreach ($searchParams as $param => $value) { + $qb->setParameter($param, $value); + } + } + return $this->findEntities(query: $qb); } From b59ab7a98a783a7e092c48552210b56189cfc981 Mon Sep 17 00:00:00 2001 From: Thijn Date: Tue, 6 Aug 2024 09:43:57 +0200 Subject: [PATCH 078/145] fixed attachment entity spec --- src/entities/attachment/attachment.mock.ts | 78 +++++++++++++++ src/entities/attachment/attachment.spec.ts | 97 ++---------------- src/entities/attachment/attachment.ts | 103 +++++++++++--------- src/entities/attachment/attachment.types.ts | 38 ++++---- 4 files changed, 162 insertions(+), 154 deletions(-) create mode 100644 src/entities/attachment/attachment.mock.ts diff --git a/src/entities/attachment/attachment.mock.ts b/src/entities/attachment/attachment.mock.ts new file mode 100644 index 00000000..fe1bd260 --- /dev/null +++ b/src/entities/attachment/attachment.mock.ts @@ -0,0 +1,78 @@ +import { Attachment } from './attachment' +import { TAttachment } from './attachment.types' + +export const mockAttachmentsData = (): TAttachment[] => [ + { // full data + id: '1', + reference: 'ref1', + title: 'test 1', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: ['label1'], + accessURL: 'https://example.com/access', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: '1024', + anonymization: { + anonymized: true, + results: 'success', + }, + language: { code: 'en-us', level: 'C1' }, + versionOf: 'v1.0', + hash: 'abc123', + published: new Date(2022, 9, 14).toISOString(), + modified: new Date(2022, 11, 2).toISOString(), + license: 'MIT', + }, + { + id: '2', + reference: 'ref2', + title: 'test 2', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: [], + accessURL: '', + downloadURL: '', + type: 'document', + extension: 'pdf', + size: '1024', + anonymization: { + anonymized: true, + results: 'success', + }, + language: { code: '', level: '' }, + versionOf: 'v1.0', + hash: 'hash', + published: '', + modified: '', + license: 'MIT', + }, + { // invalid data + id: '3', + reference: 'ref3', + title: 'test 3', + summary: 'a short form summary', + description: 'a really really long description about this catalogus', + labels: ['label3'], + // this is supposed to be a URL + accessURL: 'non url', + downloadURL: 'https://example.com/download', + type: 'document', + extension: 'pdf', + size: '1024', + anonymization: { + anonymized: true, + results: 'success', + }, + // invalid code and level + language: { code: 'foo bar', level: 'funny' }, + versionOf: 'v1.0', + hash: 'abc123', + published: new Date(2022, 9, 14).toISOString(), + modified: new Date(2022, 11, 2).toISOString(), + license: 'MIT', + }, +] + +export const mockAttachments = (data: TAttachment[] = mockAttachmentsData()): TAttachment[] => data.map(item => new Attachment(item)) diff --git a/src/entities/attachment/attachment.spec.ts b/src/entities/attachment/attachment.spec.ts index d315e81c..b14a5977 100644 --- a/src/entities/attachment/attachment.spec.ts +++ b/src/entities/attachment/attachment.spec.ts @@ -1,109 +1,32 @@ /* eslint-disable no-console */ import { Attachment } from './attachment' -import { TAttachment } from './attachment.types' +import { mockAttachments } from './attachment.mock' describe('Attachment Store', () => { it('create Attachment entity with full data', () => { - const attachment = new Attachment(testData[0]) + const attachment = new Attachment(mockAttachments()[0]) expect(attachment).toBeInstanceOf(Attachment) - expect(attachment).toEqual(testData[0]) + expect(attachment).toEqual(mockAttachments()[0]) - expect(attachment.validate()).toBe(true) + expect(attachment.validate().success).toBe(true) }) it('create Attachment entity with partial data', () => { - const attachment = new Attachment(testData[1]) + const attachment = new Attachment(mockAttachments()[1]) expect(attachment).toBeInstanceOf(Attachment) - expect(attachment.id).toBe(testData[1].id) - expect(attachment.reference).toBe(testData[1].reference) - expect(attachment.title).toBe(testData[1].title) - expect(attachment.summary).toBe(testData[1].summary) - expect(attachment.description).toBe(testData[1].description) - expect(attachment.labels).toBe(testData[1].labels) - expect(attachment.accessURL).toBe(testData[1].accessURL) - expect(attachment.downloadURL).toBe(testData[1].downloadURL) - expect(attachment.type).toBe(testData[1].type) - expect(attachment.extension).toBe(testData[1].extension) - expect(attachment.size).toBe(testData[1].size) - expect(attachment.anonymization).toBe(testData[1].anonymization) - expect(attachment.language).toBe(testData[1].language) - expect(attachment.versionOf).toBe(testData[1].versionOf) - expect(attachment.hash).toBe('') - expect(attachment.published).toBe('') - expect(attachment.modified).toBe('') - expect(attachment.license).toBe(testData[1].license) + expect(attachment).not.toBe(mockAttachments()[1]) - expect(attachment.validate()).toBe(true) + expect(attachment.validate().success).toBe(true) }) it('create Attachment entity with falsy data', () => { - const attachment = new Attachment(testData[2]) + const attachment = new Attachment(mockAttachments()[2]) expect(attachment).toBeInstanceOf(Attachment) - expect(attachment).toEqual(testData[2]) + expect(attachment).toEqual(mockAttachments()[2]) - expect(attachment.validate()).toBe(false) + expect(attachment.validate().success).toBe(false) }) }) - -const testData: TAttachment[] = [ - { // full data - id: '1', - reference: 'ref1', - title: 'test 1', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag1' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, - { // partial data - id: '2', - reference: 'ref2', - title: 'test 2', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag2' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - license: 'MIT', - }, - { // invalid data - id: '3', - reference: 'ref3', - title: '', - summary: 'a short form summary', - description: 'a really really long description about this catalogus', - labels: [{ tag: 'tag3' }], - accessURL: 'https://example.com/access', - downloadURL: 'https://example.com/download', - type: 'document', - extension: 'pdf', - size: 1024, - anonymization: { anonymized: 'yes', results: 'success' }, - language: { code: 'en', level: 'native' }, - versionOf: 'v1.0', - hash: 'abc123', - published: '2024-01-01', - modified: '2024-01-02', - license: 'MIT', - }, -] diff --git a/src/entities/attachment/attachment.ts b/src/entities/attachment/attachment.ts index 04f12928..dcca058d 100644 --- a/src/entities/attachment/attachment.ts +++ b/src/entities/attachment/attachment.ts @@ -1,34 +1,34 @@ import { TAttachment } from './attachment.types' -import { z } from 'zod' +import { SafeParseReturnType, z } from 'zod' export class Attachment implements TAttachment { public id: string - public reference?: string + public reference: string public title: string public summary: string - public description?: string - public labels?: object[] - public accessURL?: string - public downloadURL?: string - public type?: string - public extension?: string - public size?: number - public anonymization?: { - anonymized?: string - results?: string + public description: string + public labels: string[] + public accessURL: string + public downloadURL: string + public type: string + public extension: string + public size: string + public anonymization: { + anonymized: boolean + results: string } - public language?: { - code?: string - level?: string + public language: { + code: string + level: string } - public versionOf?: string - public hash?: string - public published?: string - public modified?: string - public license?: string + public versionOf: string + public hash: string + public published: string | Date + public modified: string | Date + public license: string constructor(data: TAttachment) { this.hydrate(data) @@ -46,9 +46,17 @@ export class Attachment implements TAttachment { this.downloadURL = data.downloadURL || '' this.type = data.type || '' this.extension = data.extension || '' - this.size = data.size || 0 - this.anonymization = (!Array.isArray(data.anonymization) && data.anonymization) || {} - this.language = (!Array.isArray(data.language) && data.language) || {} + this.size = data.size || '' + this.anonymization = (!Array.isArray(data.anonymization) && data.anonymization) || { + anonymized: false, + results: '', + } + + this.language = (!Array.isArray(data.language) && data.language) || { + code: '', + level: '', + } + this.versionOf = data.versionOf || '' this.hash = data.hash || '' this.published = data.published || '' @@ -57,43 +65,42 @@ export class Attachment implements TAttachment { } /* istanbul ignore next */ - public validate(): boolean { - // https://conduction.stoplight.io/docs/open-catalogi/9zm7p6fnazuod-attachment + public validate(): SafeParseReturnType { + // https://conduction.stoplight.io/docs/open-catalogi/lsigtx7cafbr7-create-attachment const schema = z.object({ - title: z.string().min(25).max(255), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) - summary: z.string().min(50).max(2500), - description: z.string().max(2500).optional(), - reference: z.string().max(255).optional(), - labels: z.string().array().optional(), - accessURL: z.string().url().optional(), - downloadURL: z.string().url().optional(), - type: z.string().optional(), - extension: z.string().optional(), - size: z.number().optional(), + reference: z.string().max(255), + title: z.string().max(255), // .min(1) on a string functionally works the same as a nonEmpty check (SHOULD NOT BE COMBINED WITH .OPTIONAL()) + summary: z.string().max(255), + description: z.string().max(2555), + labels: z.string().array(), + accessURL: z.string().url().or(z.literal('')), + downloadURL: z.string().url().or(z.literal('')), + type: z.string(), anonymization: z.object({ - anonymized: z.boolean().optional(), - results: z.string().max(2500).optional(), - }).optional(), + anonymized: z.boolean(), + results: z.string().max(2500), + }), language: z.object({ // this regex checks if the code has either 2 or 3 characters per group, and the -aaa after the first is optional code: z.string() .max(7) .regex(/([a-z]{2,3})(-[a-z]{2,3})?/g, 'language code is not a valid ISO 639-1 code (e.g. en-us)') - .optional(), - title: z.string().min(1), - }).optional(), + .or(z.literal('')), + level: z.string() + .max(2) + .regex(/(A|B|C)(1|2)/g, 'language level is not a valid CEFRL level (e.g. A1)') + .or(z.literal('')), + }), + versionOf: z.string(), + published: z.string().datetime().or(z.literal('')), + license: z.string(), }) const result = schema.safeParse({ - id: this.id, - title: this.title, - description: this.description, - // version: this.version, - // required: this.required, - // properties: this.properties, + ...this, }) - return result.success + return result } } diff --git a/src/entities/attachment/attachment.types.ts b/src/entities/attachment/attachment.types.ts index 2861e1d1..7e462660 100644 --- a/src/entities/attachment/attachment.types.ts +++ b/src/entities/attachment/attachment.types.ts @@ -1,26 +1,26 @@ export type TAttachment = { id: string - reference?: string + reference: string title: string summary: string - description?: string - labels?: object[] - accessURL?: string - downloadURL?: string - type?: string - extension?: string - size?: number - anonymization?: { - anonymized?: string - results?: string + description: string + labels: string[] + accessURL: string + downloadURL: string + type: string + extension: string + size: string + anonymization: { + anonymized: boolean + results: string } - language?: { - code?: string - level?: string + language: { + code: string + level: string } - versionOf?: string - hash?: string - published?: string - modified?: string - license?: string + versionOf: string + hash: string + published: string | Date + modified: string | Date + license: string } From 2eb41494dc29da1e6f18e7c2761e15e0d4546c6e Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 6 Aug 2024 09:45:48 +0200 Subject: [PATCH 079/145] Database fix en migration --- lib/Db/OrganisationMapper.php | 2 +- lib/Db/ThemeMapper.php | 2 +- lib/Migration/Version6Date20240806073229.php | 84 ++++++++++++++++++++ 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 lib/Migration/Version6Date20240806073229.php diff --git a/lib/Db/OrganisationMapper.php b/lib/Db/OrganisationMapper.php index 26dcc784..51a738e1 100644 --- a/lib/Db/OrganisationMapper.php +++ b/lib/Db/OrganisationMapper.php @@ -33,7 +33,7 @@ public function findAll(?int $limit = null, ?int $offset = null, ?array $filters $qb = $this->db->getQueryBuilder(); $qb->select('*') - ->from('organisations') + ->from('organizations') ->setMaxResults($limit) ->setFirstResult($offset); diff --git a/lib/Db/ThemeMapper.php b/lib/Db/ThemeMapper.php index ae01cdfb..9b35d682 100644 --- a/lib/Db/ThemeMapper.php +++ b/lib/Db/ThemeMapper.php @@ -33,7 +33,7 @@ public function findAll(?int $limit = null, ?int $offset = null, ?array $filters $qb = $this->db->getQueryBuilder(); $qb->select('*') - ->from('themes') + ->from('themas') ->setMaxResults($limit) ->setFirstResult($offset); diff --git a/lib/Migration/Version6Date20240806073229.php b/lib/Migration/Version6Date20240806073229.php new file mode 100644 index 00000000..2a522019 --- /dev/null +++ b/lib/Migration/Version6Date20240806073229.php @@ -0,0 +1,84 @@ +hasTable(tableName: 'themas') === false) { + $table = $schema->createTable(tableName: 'themas'); + + $table->addColumn(name: 'id', typeName: Types::BIGINT, options: [ + 'autoincrement' => true, + 'notnull' => true, + 'length' => 4, + ]); + $table->addColumn(name: 'title', typeName: TYPES::STRING, options: [ + 'notnull' => true, + 'length' => 255, + ]); + $table->addColumn(name: 'summary', typeName: TYPES::STRING, options: [ + 'notnull' => true, + 'length' => 255 + ]); + $table->addColumn(name: 'description', typeName: TYPES::STRING, options: [ + 'length' => 255, + 'notnull' => false, + ]); + $table->addColumn(name: 'image', typeName: TYPES::STRING, options: [ + 'notnull' => false, + ]); + + + $table->setPrimaryKey(columnNames: ['id']); + } + + + return $schema; + } + + /** + * @param IOutput $output + * @param Closure(): ISchemaWrapper $schemaClosure + * @param array $options + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + } +} From f91e329c1a7b213947d8f4cc33abe83d81373255 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 6 Aug 2024 09:52:44 +0200 Subject: [PATCH 080/145] Fix for the migrations --- lib/Migration/Version6Date20240806073229.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Migration/Version6Date20240806073229.php b/lib/Migration/Version6Date20240806073229.php index 2a522019..93cf243e 100644 --- a/lib/Migration/Version6Date20240806073229.php +++ b/lib/Migration/Version6Date20240806073229.php @@ -11,6 +11,7 @@ use Closure; use OCP\DB\ISchemaWrapper; +use OCP\DB\Types; use OCP\Migration\IOutput; use OCP\Migration\SimpleMigrationStep; From 7eb6ff3b6ea48b71349af6297972384d2f11cee9 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Tue, 6 Aug 2024 09:58:47 +0200 Subject: [PATCH 081/145] Typo fix --- lib/Db/Catalog.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Db/Catalog.php b/lib/Db/Catalog.php index fa2bc2aa..cb0ab06e 100644 --- a/lib/Db/Catalog.php +++ b/lib/Db/Catalog.php @@ -19,7 +19,7 @@ public function __construct() { $this->addType(fieldName: 'title', type: 'string'); $this->addType(fieldName: 'summary', type: 'string'); $this->addType(fieldName: 'description', type: 'string'); - $this->addType(fieldName: 'image', type: 'image'); + $this->addType(fieldName: 'image', type: 'string'); $this->addType(fieldName: 'search', type: 'string'); } From 8b297c23ff21a1d6215dcc2d4f6bd39b88f102f9 Mon Sep 17 00:00:00 2001 From: Remko Date: Tue, 6 Aug 2024 10:39:36 +0200 Subject: [PATCH 082/145] Added better headings to dashboard and search --- css/main.css | 9 +++++++++ package.json | 2 +- .../configuration/configuration.spec.ts | 2 +- src/store/modules/configuration.specs.js | 2 +- src/views/dashboard/DashboardIndex.vue | 13 +++---------- src/views/search/SearchIndex.vue | 17 ++++------------- 6 files changed, 19 insertions(+), 26 deletions(-) diff --git a/css/main.css b/css/main.css index 36dd36e1..3b7d7694 100644 --- a/css/main.css +++ b/css/main.css @@ -4,6 +4,15 @@ --OC-margin-50: 50px; } +/* Pages */ + +.pageHeader { + margin-block-start: var(--app-navigation-padding); + margin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding)* 2); + min-height: var(--default-clickable-area); + line-height: var(--default-clickable-area); +} + /* Lists */ .listHeader { diff --git a/package.json b/package.json index a81bc78b..906b249b 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@babel/preset-env": "^7.24.8", + "@babel/preset-env": "^7.25.3", "@nextcloud/browserslist-config": "^3.0.1", "@nextcloud/eslint-config": "^8.4.1", "@nextcloud/stylelint-config": "^2.4.0", diff --git a/src/entities/configuration/configuration.spec.ts b/src/entities/configuration/configuration.spec.ts index 64bdfb05..73b244cd 100644 --- a/src/entities/configuration/configuration.spec.ts +++ b/src/entities/configuration/configuration.spec.ts @@ -40,6 +40,6 @@ const testData: TConfiguration[] = [ useElastic: true, }, { // invalid data - useElastic: 'string', + useElastic: false, }, ] diff --git a/src/store/modules/configuration.specs.js b/src/store/modules/configuration.specs.js index b9e9fd1f..4b441784 100644 --- a/src/store/modules/configuration.specs.js +++ b/src/store/modules/configuration.specs.js @@ -2,7 +2,7 @@ import { setActivePinia, createPinia } from 'pinia' import { useConfigurationStore } from './configuration.js' -import { Configuration} from '../../entities/index.js' +import { Configuration } from '../../entities/index.js' describe('Metadata Store', () => { beforeEach(() => { diff --git a/src/views/dashboard/DashboardIndex.vue b/src/views/dashboard/DashboardIndex.vue index e4adff06..09e9b8e5 100644 --- a/src/views/dashboard/DashboardIndex.vue +++ b/src/views/dashboard/DashboardIndex.vue @@ -1,8 +1,8 @@ Kies een eigenschap - Oplopend - Aflopend + + Oplopend + + + Aflopend + -
\ No newline at end of file +
\ No newline at end of file From 7921238de266ea2a21647ff77571e28791958e28 Mon Sep 17 00:00:00 2001 From: Barry Brands Date: Tue, 6 Aug 2024 12:55:13 +0200 Subject: [PATCH 088/145] Small cleanup --- src/views/catalogi/CatalogiList.vue | 11 +++++------ src/views/directory/DirectoryList.vue | 11 +++++------ src/views/metaData/MetaDataList.vue | 11 +++++------ src/views/publications/PublicationList.vue | 15 +++++++-------- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/views/catalogi/CatalogiList.vue b/src/views/catalogi/CatalogiList.vue index eb11bb68..980f1b80 100644 --- a/src/views/catalogi/CatalogiList.vue +++ b/src/views/catalogi/CatalogiList.vue @@ -108,6 +108,10 @@ export default { Pencil, Delete, }, + beforeRouteLeave(to, from, next) { + search = ''; + next(); + }, props: { search: { type: String, @@ -118,7 +122,6 @@ export default { return { loading: false, catalogi: [], - search: '', } }, watch: { @@ -141,12 +144,8 @@ export default { }, debouncedFetchData: debounce(function(search) { this.fetchData(search); - }, 500), + }, 500), }, - beforeRouteLeave(to, from, next) { - search = ''; - next(); - }, } diff --git a/src/dialogs/organisation/DeleteOrganisationDialog.vue b/src/dialogs/organisation/DeleteOrganisationDialog.vue new file mode 100644 index 00000000..674cac42 --- /dev/null +++ b/src/dialogs/organisation/DeleteOrganisationDialog.vue @@ -0,0 +1,116 @@ + + + + + + + diff --git a/src/dialogs/theme/CopyThemeDialog.vue b/src/dialogs/theme/CopyThemeDialog.vue new file mode 100644 index 00000000..dd8c7198 --- /dev/null +++ b/src/dialogs/theme/CopyThemeDialog.vue @@ -0,0 +1,123 @@ + + + + + + + diff --git a/src/dialogs/theme/DeleteThemeDialog.vue b/src/dialogs/theme/DeleteThemeDialog.vue new file mode 100644 index 00000000..83564a86 --- /dev/null +++ b/src/dialogs/theme/DeleteThemeDialog.vue @@ -0,0 +1,116 @@ + + + + + + + diff --git a/src/modals/Modals.vue b/src/modals/Modals.vue index 528aad33..b6b86ac8 100644 --- a/src/modals/Modals.vue +++ b/src/modals/Modals.vue @@ -16,6 +16,9 @@ + + +
@@ -24,10 +27,10 @@ import AddAttachmentModal from './attachment/AddAttachmentModal.vue' import EditAttachmentModal from './attachment/EditAttachmentModal.vue' -import AddPublicationModal from './publication/AddPublicationModal.vue' -import EditPublicationModal from './publication/EditPublicationModal.vue' import AddMetaDataModal from './metaData/AddMetaDataModal.vue' import EditMetaDataModal from './metaData/EditMetaDataModal.vue' +import AddPublicationModal from './publication/AddPublicationModal.vue' +import EditPublicationModal from './publication/EditPublicationModal.vue' import AddMetaDataPropertyModal from './metaData/AddMetaDataPropertyModal.vue' import EditMetaDataPropertyModal from './metaData/EditMetaDataPropertyModal.vue' @@ -36,9 +39,12 @@ import AddCatalogModal from './catalog/AddCatalogModal.vue' import EditCatalogModal from './catalog/EditCatalogModal.vue' import AddListingModal from './directory/AddListingModal.vue' import EditListingModal from './directory/EditListingModal.vue' -import EditPublicationDataModal from './publicationData/EditPublicationDataModal.vue' -import AddPublicationDataModal from './publicationData/AddPublicationDataModal.vue' import AddOrganisationModal from './organisation/AddOrganisationModal.vue' +import EditOrganisatioModal from './organisation/EditOrganisationModal.vue' +import AddPublicationDataModal from './publicationData/AddPublicationDataModal.vue' +import EditPublicationDataModal from './publicationData/EditPublicationDataModal.vue' +import AddThemeModal from './theme/AddThemeModal.vue' +import EditThemeModal from './theme/EditThemeModal.vue' export default { name: 'Modals', @@ -58,6 +64,9 @@ export default { AddPublicationDataModal, EditPublicationDataModal, AddOrganisationModal, + EditOrganisatioModal, + AddThemeModal, + EditThemeModal, // EditOrganisationModal, }, } diff --git a/src/modals/organisation/AddOrganisationModal.vue b/src/modals/organisation/AddOrganisationModal.vue index 76150c9a..45251bb3 100644 --- a/src/modals/organisation/AddOrganisationModal.vue +++ b/src/modals/organisation/AddOrganisationModal.vue @@ -144,7 +144,7 @@ export default { response.json().then((data) => { organisationStore.setOrganisationList(data) }) - navigationStore.setSelected('organisation') + navigationStore.setSelected('organisations') // Wait for the user to read the feedback then close the model const self = this setTimeout(function() { diff --git a/src/modals/organisation/EditOrganisationModal.vue b/src/modals/organisation/EditOrganisationModal.vue new file mode 100644 index 00000000..a13ea1ae --- /dev/null +++ b/src/modals/organisation/EditOrganisationModal.vue @@ -0,0 +1,227 @@ + + + + + + diff --git a/src/modals/theme/AddThemeModal.vue b/src/modals/theme/AddThemeModal.vue new file mode 100644 index 00000000..ee1024ae --- /dev/null +++ b/src/modals/theme/AddThemeModal.vue @@ -0,0 +1,187 @@ + + + + + + diff --git a/src/modals/theme/EditThemeModal.vue b/src/modals/theme/EditThemeModal.vue new file mode 100644 index 00000000..dccaaf97 --- /dev/null +++ b/src/modals/theme/EditThemeModal.vue @@ -0,0 +1,207 @@ + + + + + + diff --git a/src/views/organisations/OrganisationDetail.vue b/src/views/organisations/OrganisationDetail.vue index fe685920..5ce0e28a 100644 --- a/src/views/organisations/OrganisationDetail.vue +++ b/src/views/organisations/OrganisationDetail.vue @@ -1,12 +1,12 @@ Kopiëren - - - Publiceren - - - - Depubliceren - - - - Archiveren - - - - Eigenschap toevoegen - - - - Bijlage toevoegen - diff --git a/src/views/directory/DirectoryIndex.vue b/src/views/directory/DirectoryIndex.vue index 80101273..9113240f 100644 --- a/src/views/directory/DirectoryIndex.vue +++ b/src/views/directory/DirectoryIndex.vue @@ -4,25 +4,10 @@ import { navigationStore, searchStore, directoryStore } from '../../store/store. @@ -31,7 +16,9 @@ import { NcAppContent, NcEmptyContent, NcButton } from '@nextcloud/vue' import DirectoryList from './DirectoryList.vue' import ListingDetails from './ListingDetails.vue' // eslint-disable-next-line n/no-missing-import -import LayersOutline from 'vue-material-design-icons/LayersOutline' +import LayersOutline from 'vue-material-design-icons/LayersOutline.vue' +import Plus from 'vue-material-design-icons/Plus.vue' +import HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue' export default { name: 'DirectoryIndex', @@ -41,12 +28,20 @@ export default { NcButton, DirectoryList, ListingDetails, + // Icons LayersOutline, + Plus, + HelpCircleOutline, }, data() { return { } }, + methods: { + openLink(url, type = '') { + window.open(url, type) + }, + }, } diff --git a/src/views/directory/DirectoryList.vue b/src/views/directory/DirectoryList.vue index a1088332..e735afcb 100644 --- a/src/views/directory/DirectoryList.vue +++ b/src/views/directory/DirectoryList.vue @@ -3,84 +3,106 @@ import { navigationStore, directoryStore } from '../../store/store.js'