From f5ff84affa1ed4a20b1e5c6b118ed33613343e57 Mon Sep 17 00:00:00 2001 From: vburlachenko Date: Tue, 31 Oct 2023 15:36:14 +0200 Subject: [PATCH 01/14] 1484 - Implementation of Data Quality Dashboard. Specification update --- odd-platform-specification/components.yaml | 27 ++++++++++++++++++++++ odd-platform-specification/openapi.yaml | 16 +++++++++++++ 2 files changed, 43 insertions(+) diff --git a/odd-platform-specification/components.yaml b/odd-platform-specification/components.yaml index 3b43a3249..dd6470b8f 100644 --- a/odd-platform-specification/components.yaml +++ b/odd-platform-specification/components.yaml @@ -3475,6 +3475,33 @@ components: - entities - data_source + DataQualityCategoryResultsList: + type: object + properties: + testResults: + type: array + items: + $ref: '#/components/schemas/DataQualityCategoryResults' + + DataQualityCategoryResults: + type: object + properties: + category: + type: string + results: + type: array + items: + $ref: '#/components/schemas/DataQualityRunStatusCount' + + DataQualityRunStatusCount: + type: object + properties: + status: + $ref: '#/components/schemas/DataEntityRunStatus' + count: + type: integer + format: int64 + parameters: PageParam: name: page diff --git a/odd-platform-specification/openapi.yaml b/odd-platform-specification/openapi.yaml index e6fad1587..784ecdab0 100644 --- a/odd-platform-specification/openapi.yaml +++ b/odd-platform-specification/openapi.yaml @@ -41,6 +41,7 @@ tags: - name: integration - name: dataEntityAttachment - name: directory + - name: dataQualityRuns paths: /api/integrations: @@ -1910,6 +1911,21 @@ paths: tags: - dataQuality + /api/dataqatests/runs: + get: + summary: Get Data Quality tests runs + description: Get Data Quality tests runs + operationId: getDataQualityTestsRuns + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: './components.yaml/#/components/schemas/DataQualityCategoryResultsList' + tags: + - dataQualityRuns + /api/dataentitygroups/domains: get: summary: Get domains info From 16f9e9c2c6de0c96ff25e341ba7658166c35a5f1 Mon Sep 17 00:00:00 2001 From: vburlachenko Date: Thu, 2 Nov 2023 15:22:16 +0200 Subject: [PATCH 02/14] 1484 - Implementation of Data Quality Dashboard. Created API for Dashboard --- .../controller/DataQualityRunsController.java | 23 +++++++ .../oddplatform/dto/DataQualityCategory.java | 32 ++++++++++ .../mapper/DataQualityCategoryMapper.java | 12 ++++ .../mapper/DataQualityCategoryMapperImpl.java | 64 +++++++++++++++++++ .../mapper/FacetStateMapperImpl.java | 4 -- .../ReactiveDataQualityRunsRepository.java | 9 +++ ...ReactiveDataQualityRunsRepositoryImpl.java | 52 +++++++++++++++ .../service/DataQualityRunsService.java | 8 +++ .../service/DataQualityRunsServiceImpl.java | 24 +++++++ ..._category_field_to_dataset_expectation.sql | 9 +++ odd-platform-specification/components.yaml | 2 - 11 files changed, 233 insertions(+), 6 deletions(-) create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/controller/DataQualityRunsController.java create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataQualityCategory.java create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapper.java create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapperImpl.java create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepository.java create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepositoryImpl.java create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsService.java create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsServiceImpl.java create mode 100644 odd-platform-api/src/main/resources/db/migration/V0_0_83__added_category_field_to_dataset_expectation.sql diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/controller/DataQualityRunsController.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/controller/DataQualityRunsController.java new file mode 100644 index 000000000..2a06bf93a --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/controller/DataQualityRunsController.java @@ -0,0 +1,23 @@ +package org.opendatadiscovery.oddplatform.controller; + +import lombok.RequiredArgsConstructor; +import org.opendatadiscovery.oddplatform.api.contract.api.DataQualityRunsApi; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; +import org.opendatadiscovery.oddplatform.service.DataQualityRunsService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +@RestController +@RequiredArgsConstructor +public class DataQualityRunsController implements DataQualityRunsApi { + private final DataQualityRunsService service; + + @Override + public Mono> getDataQualityTestsRuns( + final ServerWebExchange exchange) { + return service.getDataQualityTestsRuns() + .map(ResponseEntity::ok); + } +} diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataQualityCategory.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataQualityCategory.java new file mode 100644 index 000000000..56d31f252 --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataQualityCategory.java @@ -0,0 +1,32 @@ +package org.opendatadiscovery.oddplatform.dto; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.Getter; + +import static java.util.function.Function.identity; + +@Getter +public enum DataQualityCategory { + ASSERTION("Assertion Tests"), + VOLUME_ANOMALY("Volume Anomalies"), + FRESHNESS_ANOMALY("Freshness Anomalies"), + COLUMN_VALUES_ANOMALY("Column Values Anomalies"), + SCHEMA_CHANGE("Schema Changes"), + UNKNOWN("Unknown category"); + + private final String description; + + DataQualityCategory(final String description) { + this.description = description; + } + + private static final Map DICT = Arrays + .stream(values()) + .collect(Collectors.toMap(DataQualityCategory::name, identity())); + + public static DataQualityCategory resolveByName(final String name) { + return DICT.getOrDefault(name, UNKNOWN); + } +} diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapper.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapper.java new file mode 100644 index 000000000..684800ef2 --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapper.java @@ -0,0 +1,12 @@ +package org.opendatadiscovery.oddplatform.mapper; + +import java.util.List; +import org.jooq.Record3; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; + +public interface DataQualityCategoryMapper { + String TASK_RUNS_COUNT = "TASK_RUNS_COUNT"; + String TASK_RUN_CATEGORY = "TASK_RUN_CATEGORY"; + + DataQualityCategoryResultsList mapToDto(List> items); +} diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapperImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapperImpl.java new file mode 100644 index 000000000..2d3179bb7 --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapperImpl.java @@ -0,0 +1,64 @@ +package org.opendatadiscovery.oddplatform.mapper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import org.jooq.Record3; +import org.opendatadiscovery.oddplatform.api.contract.model.DataEntityRunStatus; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResults; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityRunStatusCount; +import org.opendatadiscovery.oddplatform.dto.DataQualityCategory; +import org.springframework.stereotype.Component; + +import static org.opendatadiscovery.oddplatform.model.tables.DataEntityTaskLastRun.DATA_ENTITY_TASK_LAST_RUN; + +@Component +public class DataQualityCategoryMapperImpl implements DataQualityCategoryMapper { + private static final String TASK_RUNS_COUNT = "TASK_RUNS_COUNT"; + private static final String TASK_RUN_CATEGORY = "TASK_RUN_CATEGORY"; + + @Override + public DataQualityCategoryResultsList mapToDto(final List> items) { + final Map categoryResults = + Arrays.stream(DataQualityCategory.values()) + .collect(Collectors.toMap(Function.identity(), + value -> + new DataQualityCategoryResults() + .category(value.getDescription()) + .results(new ArrayList<>()))); + + items.forEach(row -> categoryResults.get(DataQualityCategory + .resolveByName(row.get(TASK_RUN_CATEGORY, String.class))) + .getResults().add(new DataQualityRunStatusCount() + .status(DataEntityRunStatus + .fromValue(row.getValue(DATA_ENTITY_TASK_LAST_RUN.STATUS))) + .count(Long.valueOf(row.get(TASK_RUNS_COUNT, Integer.class))))); + + return new DataQualityCategoryResultsList() + .testResults(addMissingStatuses(categoryResults.values() + .stream() + .toList())); + } + + private List addMissingStatuses(final List resultsList) { + for (final DataQualityCategoryResults dataQualityCategoryResults : resultsList) { + final Set existedElements = dataQualityCategoryResults.getResults() + .stream().map(DataQualityRunStatusCount::getStatus) + .collect(Collectors.toSet()); + + Arrays.stream(DataEntityRunStatus.values()) + .filter(value -> !existedElements.contains(value)) + .forEach(value -> dataQualityCategoryResults.getResults() + .add(new DataQualityRunStatusCount() + .status(value) + .count(0L))); + } + + return resultsList; + } +} diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/FacetStateMapperImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/FacetStateMapperImpl.java index ca048ff2f..2c8948af2 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/FacetStateMapperImpl.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/FacetStateMapperImpl.java @@ -1,7 +1,6 @@ package org.opendatadiscovery.oddplatform.mapper; import com.fasterxml.jackson.core.type.TypeReference; -import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.util.List; @@ -104,9 +103,6 @@ public FacetStateDto mapForm(final SearchFormData formData) { @Override public FacetStateDto mapForm(final TermSearchFormData formData) { final TermSearchFormDataFilters filters = formData.getFilters(); - if (filters == null) { - return FacetStateDto.empty(); - } final Map> state = TERM_FORM_MAPPINGS.entrySet().stream() .map(e -> { diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepository.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepository.java new file mode 100644 index 000000000..fbe82602b --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepository.java @@ -0,0 +1,9 @@ +package org.opendatadiscovery.oddplatform.repository.reactive; + +import org.jooq.Record3; +import org.jooq.SelectSeekStep1; + +public interface ReactiveDataQualityRunsRepository { + + SelectSeekStep1, String> getLatestDataQualityRunsResults(); +} diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepositoryImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepositoryImpl.java new file mode 100644 index 000000000..b65f345ac --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepositoryImpl.java @@ -0,0 +1,52 @@ +package org.opendatadiscovery.oddplatform.repository.reactive; + +import lombok.RequiredArgsConstructor; +import org.jooq.Record3; +import org.jooq.Select; +import org.jooq.SelectSeekStep1; +import org.jooq.Table; +import org.jooq.impl.DSL; +import org.opendatadiscovery.oddplatform.dto.DataEntityTypeDto; +import org.opendatadiscovery.oddplatform.mapper.DataQualityCategoryMapper; +import org.springframework.stereotype.Repository; + +import static org.jooq.impl.DSL.field; +import static org.opendatadiscovery.oddplatform.model.Tables.DATA_ENTITY; +import static org.opendatadiscovery.oddplatform.model.tables.DataEntityTaskLastRun.DATA_ENTITY_TASK_LAST_RUN; + +@Repository +@RequiredArgsConstructor +public class ReactiveDataQualityRunsRepositoryImpl implements ReactiveDataQualityRunsRepository { + public static final String DATA_QUALITY_TEST_TYPE = + "specific_attributes->'DATA_QUALITY_TEST'->'expectation'->>'category'"; + public static final String ID = "id"; + public static final String ODDRN = "oddrn"; + public static final String CATEGORY = "category"; + public static final String CATEGORIES_CTE = "categories_cte"; + + @Override + public SelectSeekStep1, String> getLatestDataQualityRunsResults() { + final Select> deCategoryCTE = + DSL.select(DATA_ENTITY.ID.as(ID), DATA_ENTITY.ODDRN.as(ODDRN), + field(DATA_QUALITY_TEST_TYPE, + String.class) + .as(CATEGORY)) + .from(DATA_ENTITY) + .where(DATA_ENTITY.TYPE_ID.eq(DataEntityTypeDto.JOB.getId()) + .and(field(DATA_QUALITY_TEST_TYPE, + String.class) + .isNotNull())); + + final Table> categoriesSubTable = deCategoryCTE.asTable(CATEGORIES_CTE); + + return DSL.select(categoriesSubTable.field(CATEGORY, String.class) + .as(DataQualityCategoryMapper.TASK_RUN_CATEGORY), + DATA_ENTITY_TASK_LAST_RUN.STATUS, + DSL.count(categoriesSubTable.field(ID, Integer.class)) + .as(DataQualityCategoryMapper.TASK_RUNS_COUNT)) + .from(categoriesSubTable, DATA_ENTITY_TASK_LAST_RUN) + .where(categoriesSubTable.field(ODDRN, String.class).eq(DATA_ENTITY_TASK_LAST_RUN.TASK_ODDRN)) + .groupBy(categoriesSubTable.field(CATEGORY), DATA_ENTITY_TASK_LAST_RUN.STATUS) + .orderBy(categoriesSubTable.field(CATEGORY, String.class)); + } +} diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsService.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsService.java new file mode 100644 index 000000000..340e47c6a --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsService.java @@ -0,0 +1,8 @@ +package org.opendatadiscovery.oddplatform.service; + +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; +import reactor.core.publisher.Mono; + +public interface DataQualityRunsService { + Mono getDataQualityTestsRuns(); +} diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsServiceImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsServiceImpl.java new file mode 100644 index 000000000..4fb2ea040 --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsServiceImpl.java @@ -0,0 +1,24 @@ +package org.opendatadiscovery.oddplatform.service; + +import lombok.RequiredArgsConstructor; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; +import org.opendatadiscovery.oddplatform.mapper.DataQualityCategoryMapper; +import org.opendatadiscovery.oddplatform.repository.reactive.ReactiveDataQualityRunsRepository; +import org.opendatadiscovery.oddplatform.repository.util.JooqReactiveOperations; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +@Service +@RequiredArgsConstructor +public class DataQualityRunsServiceImpl implements DataQualityRunsService { + private final JooqReactiveOperations jooqReactiveOperations; + private final DataQualityCategoryMapper mapper; + private final ReactiveDataQualityRunsRepository dataQualityRunsRepository; + + @Override + public Mono getDataQualityTestsRuns() { + return jooqReactiveOperations.flux(dataQualityRunsRepository.getLatestDataQualityRunsResults()) + .collectList() + .map(mapper::mapToDto); + } +} diff --git a/odd-platform-api/src/main/resources/db/migration/V0_0_83__added_category_field_to_dataset_expectation.sql b/odd-platform-api/src/main/resources/db/migration/V0_0_83__added_category_field_to_dataset_expectation.sql new file mode 100644 index 000000000..1393f6d91 --- /dev/null +++ b/odd-platform-api/src/main/resources/db/migration/V0_0_83__added_category_field_to_dataset_expectation.sql @@ -0,0 +1,9 @@ +UPDATE data_entity +SET specific_attributes = jsonb_set( + specific_attributes, + '{DATA_QUALITY_TEST,expectation,category}', + '"ASSERTION"', + true +) +WHERE type_id = 5 +and specific_attributes->'DATA_QUALITY_TEST'->'expectation' is not null; \ No newline at end of file diff --git a/odd-platform-specification/components.yaml b/odd-platform-specification/components.yaml index dd6470b8f..8e26b6919 100644 --- a/odd-platform-specification/components.yaml +++ b/odd-platform-specification/components.yaml @@ -3283,8 +3283,6 @@ components: $ref: '#/components/schemas/MetricLabel' metric_point: $ref: '#/components/schemas/MetricPoint' - required: - - metric_point MetricLabel: type: object From 5a085688bc88b8b4f81233de9c23f4cc59f59dde Mon Sep 17 00:00:00 2001 From: vburlachenko Date: Thu, 2 Nov 2023 18:28:00 +0200 Subject: [PATCH 03/14] 1484 - build fix --- .../oddplatform/mapper/MetricsMapperImpl.java | 2 +- .../oddplatform/mapper/PrometheusMetricsMapperImpl.java | 5 +---- .../api/ingestion/utils/IngestionMetricModelMapper.java | 2 +- odd-platform-specification/components.yaml | 2 ++ 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/MetricsMapperImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/MetricsMapperImpl.java index 78ba50253..88a03c470 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/MetricsMapperImpl.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/MetricsMapperImpl.java @@ -87,7 +87,7 @@ private Metric mapMetric(final MetricType metricType, final List points, final List series, final List labelValues) { - final Metric metric = new Metric(); + final Metric metric = new Metric(new MetricPoint()); final List metricLabels = labelValues.stream() .filter(dto -> metricLabelValues.contains(dto.labelValue().getId())) .map(dto -> new MetricLabel() diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/PrometheusMetricsMapperImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/PrometheusMetricsMapperImpl.java index 061082dfc..0899f15c8 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/PrometheusMetricsMapperImpl.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/PrometheusMetricsMapperImpl.java @@ -74,7 +74,7 @@ private List mapMetrics(final MetricType type, final Metric existingMetric = metricByLabels.get(); enrichMetric(existingMetric, type, metric); } else { - final Metric newMetric = new Metric(); + final Metric newMetric = new Metric(new MetricPoint()); newMetric.setLabels(metricLabels); enrichMetric(newMetric, type, metric); result.add(newMetric); @@ -94,9 +94,6 @@ private List mapMetrics(final MetricType type, private void enrichMetric(final Metric metric, final MetricType metricType, final PrometheusMetric prometheusMetric) { - if (metric.getMetricPoint() == null) { - metric.setMetricPoint(new MetricPoint()); - } metric.getMetricPoint().setTimestamp(getTimestampValue(prometheusMetric.getValue().get(0))); switch (metricType) { case GAUGE -> enrichGaugeValue(metric, prometheusMetric); diff --git a/odd-platform-api/src/test/java/org/opendatadiscovery/oddplatform/api/ingestion/utils/IngestionMetricModelMapper.java b/odd-platform-api/src/test/java/org/opendatadiscovery/oddplatform/api/ingestion/utils/IngestionMetricModelMapper.java index 18dab68bf..bc6db03ff 100644 --- a/odd-platform-api/src/test/java/org/opendatadiscovery/oddplatform/api/ingestion/utils/IngestionMetricModelMapper.java +++ b/odd-platform-api/src/test/java/org/opendatadiscovery/oddplatform/api/ingestion/utils/IngestionMetricModelMapper.java @@ -49,7 +49,7 @@ private static MetricFamily buildExpectedMetricFamily( private static Metric buildExpectedMetric( final org.opendatadiscovery.oddplatform.ingestion.contract.model.Metric metric) { - final Metric result = new Metric(); + final Metric result = new Metric(new MetricPoint()); if (CollectionUtils.isNotEmpty(metric.getLabels())) { final List labels = metric.getLabels().stream() .map(IngestionMetricModelMapper::buildExpectedLabel) diff --git a/odd-platform-specification/components.yaml b/odd-platform-specification/components.yaml index 8e26b6919..dd6470b8f 100644 --- a/odd-platform-specification/components.yaml +++ b/odd-platform-specification/components.yaml @@ -3283,6 +3283,8 @@ components: $ref: '#/components/schemas/MetricLabel' metric_point: $ref: '#/components/schemas/MetricPoint' + required: + - metric_point MetricLabel: type: object From 48e3a55047fe200365735344be36c7f3bcaf837c Mon Sep 17 00:00:00 2001 From: vburlachenko Date: Tue, 7 Nov 2023 13:37:16 +0200 Subject: [PATCH 04/14] 1484 - Implementation of Data Quality Dashboard. Added Tables Health info and count of monitored tables. --- .../controller/DataQualityRunsController.java | 4 +- .../mapper/DataQualityCategoryMapper.java | 4 +- .../mapper/DataQualityCategoryMapperImpl.java | 8 +- .../mapper/TablesDashboardMapper.java | 18 +++ .../mapper/TablesDashboardMapperImpl.java | 39 ++++++ .../ReactiveDataQualityRunsRepository.java | 9 +- ...ReactiveDataQualityRunsRepositoryImpl.java | 127 +++++++++++++++++- .../service/DataQualityRunsService.java | 4 +- .../service/DataQualityRunsServiceImpl.java | 18 ++- odd-platform-specification/components.yaml | 37 ++++- odd-platform-specification/openapi.yaml | 2 +- 11 files changed, 243 insertions(+), 27 deletions(-) create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/TablesDashboardMapper.java create mode 100644 odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/TablesDashboardMapperImpl.java diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/controller/DataQualityRunsController.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/controller/DataQualityRunsController.java index 2a06bf93a..16793199a 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/controller/DataQualityRunsController.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/controller/DataQualityRunsController.java @@ -2,7 +2,7 @@ import lombok.RequiredArgsConstructor; import org.opendatadiscovery.oddplatform.api.contract.api.DataQualityRunsApi; -import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityResults; import org.opendatadiscovery.oddplatform.service.DataQualityRunsService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -15,7 +15,7 @@ public class DataQualityRunsController implements DataQualityRunsApi { private final DataQualityRunsService service; @Override - public Mono> getDataQualityTestsRuns( + public Mono> getDataQualityTestsRuns( final ServerWebExchange exchange) { return service.getDataQualityTestsRuns() .map(ResponseEntity::ok); diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapper.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapper.java index 684800ef2..4ce47356a 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapper.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapper.java @@ -2,11 +2,11 @@ import java.util.List; import org.jooq.Record3; -import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResults; public interface DataQualityCategoryMapper { String TASK_RUNS_COUNT = "TASK_RUNS_COUNT"; String TASK_RUN_CATEGORY = "TASK_RUN_CATEGORY"; - DataQualityCategoryResultsList mapToDto(List> items); + List mapToDto(List> items); } diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapperImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapperImpl.java index 2d3179bb7..c986684a0 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapperImpl.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DataQualityCategoryMapperImpl.java @@ -10,7 +10,6 @@ import org.jooq.Record3; import org.opendatadiscovery.oddplatform.api.contract.model.DataEntityRunStatus; import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResults; -import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityRunStatusCount; import org.opendatadiscovery.oddplatform.dto.DataQualityCategory; import org.springframework.stereotype.Component; @@ -23,7 +22,7 @@ public class DataQualityCategoryMapperImpl implements DataQualityCategoryMapper private static final String TASK_RUN_CATEGORY = "TASK_RUN_CATEGORY"; @Override - public DataQualityCategoryResultsList mapToDto(final List> items) { + public List mapToDto(final List> items) { final Map categoryResults = Arrays.stream(DataQualityCategory.values()) .collect(Collectors.toMap(Function.identity(), @@ -39,10 +38,9 @@ public DataQualityCategoryResultsList mapToDto(final List addMissingStatuses(final List resultsList) { diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/TablesDashboardMapper.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/TablesDashboardMapper.java new file mode 100644 index 000000000..f97e46ed2 --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/TablesDashboardMapper.java @@ -0,0 +1,18 @@ +package org.opendatadiscovery.oddplatform.mapper; + +import java.util.List; +import org.jooq.Record2; +import org.opendatadiscovery.oddplatform.api.contract.model.TablesDashboard; + +public interface TablesDashboardMapper { + String TABLE_STATUS = "STATUS"; + String GOOD_HEALTH = "GOOD_HEALTH"; + String ERROR_HEALTH = "ERROR"; + String WARNING_HEALTH = "WARNING"; + String MONITORED_TABLES = "MONITORED_TABLES"; + String NOT_MONITORED_TABLES = "NOT_MONITORED_TABLES"; + String COUNT = "COUNT"; + + TablesDashboard mapToDto(final List> tableHealth, + final List> monitoredTablesStatus); +} diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/TablesDashboardMapperImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/TablesDashboardMapperImpl.java new file mode 100644 index 000000000..92bf2cba6 --- /dev/null +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/TablesDashboardMapperImpl.java @@ -0,0 +1,39 @@ +package org.opendatadiscovery.oddplatform.mapper; + +import java.util.List; +import org.jooq.Record2; +import org.opendatadiscovery.oddplatform.api.contract.model.MonitoredTablesDashboard; +import org.opendatadiscovery.oddplatform.api.contract.model.TablesDashboard; +import org.opendatadiscovery.oddplatform.api.contract.model.TablesHealthDashboard; +import org.springframework.stereotype.Component; + +@Component +public class TablesDashboardMapperImpl implements TablesDashboardMapper { + @Override + public TablesDashboard mapToDto(final List> tableHealth, + final List> monitoredTablesStatus) { + final TablesHealthDashboard tablesHealthDashboard = new TablesHealthDashboard(); + + tableHealth.forEach(row -> { + switch (row.get(TABLE_STATUS, String.class)) { + case GOOD_HEALTH -> tablesHealthDashboard.setHealthyTables(row.get(COUNT, Integer.class)); + case ERROR_HEALTH -> tablesHealthDashboard.setErrorTables(row.get(COUNT, Integer.class)); + case WARNING_HEALTH -> tablesHealthDashboard.setWarningTables(row.get(COUNT, Integer.class)); + } + }); + + final MonitoredTablesDashboard monitoredTablesDashboard = new MonitoredTablesDashboard(); + + monitoredTablesStatus.forEach(row -> { + switch (row.get(TABLE_STATUS, String.class)) { + case MONITORED_TABLES -> monitoredTablesDashboard.setMonitoredTables(row.get(COUNT, Integer.class)); + case NOT_MONITORED_TABLES -> + monitoredTablesDashboard.setNotMonitoredTables(row.get(COUNT, Integer.class)); + } + }); + + return new TablesDashboard() + .tablesHealth(tablesHealthDashboard) + .monitoredTables(monitoredTablesDashboard); + } +} diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepository.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepository.java index fbe82602b..503362a91 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepository.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepository.java @@ -1,9 +1,14 @@ package org.opendatadiscovery.oddplatform.repository.reactive; +import org.jooq.Record2; import org.jooq.Record3; -import org.jooq.SelectSeekStep1; +import reactor.core.publisher.Flux; public interface ReactiveDataQualityRunsRepository { - SelectSeekStep1, String> getLatestDataQualityRunsResults(); + Flux> getLatestDataQualityRunsResults(); + + Flux> getLatestTablesHealth(); + + Flux> getMonitoredTables(); } diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepositoryImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepositoryImpl.java index b65f345ac..438c39578 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepositoryImpl.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveDataQualityRunsRepositoryImpl.java @@ -1,17 +1,29 @@ package org.opendatadiscovery.oddplatform.repository.reactive; import lombok.RequiredArgsConstructor; +import org.jooq.Record1; +import org.jooq.Record2; import org.jooq.Record3; import org.jooq.Select; -import org.jooq.SelectSeekStep1; import org.jooq.Table; import org.jooq.impl.DSL; +import org.opendatadiscovery.oddplatform.api.contract.model.DataEntityRunStatus; import org.opendatadiscovery.oddplatform.dto.DataEntityTypeDto; import org.opendatadiscovery.oddplatform.mapper.DataQualityCategoryMapper; +import org.opendatadiscovery.oddplatform.repository.util.JooqReactiveOperations; import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; import static org.jooq.impl.DSL.field; +import static org.opendatadiscovery.oddplatform.mapper.TablesDashboardMapperImpl.COUNT; +import static org.opendatadiscovery.oddplatform.mapper.TablesDashboardMapperImpl.ERROR_HEALTH; +import static org.opendatadiscovery.oddplatform.mapper.TablesDashboardMapperImpl.GOOD_HEALTH; +import static org.opendatadiscovery.oddplatform.mapper.TablesDashboardMapperImpl.MONITORED_TABLES; +import static org.opendatadiscovery.oddplatform.mapper.TablesDashboardMapperImpl.NOT_MONITORED_TABLES; +import static org.opendatadiscovery.oddplatform.mapper.TablesDashboardMapperImpl.TABLE_STATUS; +import static org.opendatadiscovery.oddplatform.mapper.TablesDashboardMapperImpl.WARNING_HEALTH; import static org.opendatadiscovery.oddplatform.model.Tables.DATA_ENTITY; +import static org.opendatadiscovery.oddplatform.model.Tables.DATA_QUALITY_TEST_RELATIONS; import static org.opendatadiscovery.oddplatform.model.tables.DataEntityTaskLastRun.DATA_ENTITY_TASK_LAST_RUN; @Repository @@ -24,8 +36,18 @@ public class ReactiveDataQualityRunsRepositoryImpl implements ReactiveDataQualit public static final String CATEGORY = "category"; public static final String CATEGORIES_CTE = "categories_cte"; + public static final String DATA_QUALITY_TEST_RELATIONS_CTE = "de_oddrns"; + public static final String HEALTH_TABLE_CTE = "healthyTables"; + public static final String ERROR_HEALTH_TABLE_CTE = "errorTables"; + public static final String WARNING_HEALTH_TABLE_CTE = "warningTables"; + public static final String DATA_ENTITY_CTE = "dataEntityCTE"; + public static final String MONITORED_TABLE_CTE = "monitoredTablesCTE"; + public static final String NOT_MONITORED_TABLE_CTE = "notMonitoredTablesCTE"; + + private final JooqReactiveOperations jooqReactiveOperations; + @Override - public SelectSeekStep1, String> getLatestDataQualityRunsResults() { + public Flux> getLatestDataQualityRunsResults() { final Select> deCategoryCTE = DSL.select(DATA_ENTITY.ID.as(ID), DATA_ENTITY.ODDRN.as(ODDRN), field(DATA_QUALITY_TEST_TYPE, @@ -39,7 +61,7 @@ public SelectSeekStep1, String> getLatestDataQu final Table> categoriesSubTable = deCategoryCTE.asTable(CATEGORIES_CTE); - return DSL.select(categoriesSubTable.field(CATEGORY, String.class) + return jooqReactiveOperations.flux(DSL.select(categoriesSubTable.field(CATEGORY, String.class) .as(DataQualityCategoryMapper.TASK_RUN_CATEGORY), DATA_ENTITY_TASK_LAST_RUN.STATUS, DSL.count(categoriesSubTable.field(ID, Integer.class)) @@ -47,6 +69,103 @@ public SelectSeekStep1, String> getLatestDataQu .from(categoriesSubTable, DATA_ENTITY_TASK_LAST_RUN) .where(categoriesSubTable.field(ODDRN, String.class).eq(DATA_ENTITY_TASK_LAST_RUN.TASK_ODDRN)) .groupBy(categoriesSubTable.field(CATEGORY), DATA_ENTITY_TASK_LAST_RUN.STATUS) - .orderBy(categoriesSubTable.field(CATEGORY, String.class)); + .orderBy(categoriesSubTable.field(CATEGORY, String.class))); + } + + @Override + public Flux> getLatestTablesHealth() { + final Table> deOddrns = DSL.selectDistinct(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN) + .from(DATA_QUALITY_TEST_RELATIONS) + .asTable(DATA_QUALITY_TEST_RELATIONS_CTE); + + final Table> healthyTables = + DSL.select(deOddrns.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .from(deOddrns) + .where( + DSL.notExists( + DSL.select() + .from(DATA_ENTITY_TASK_LAST_RUN, DATA_QUALITY_TEST_RELATIONS) + .where(deOddrns.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN) + .eq(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .and(DATA_QUALITY_TEST_RELATIONS.DATA_QUALITY_TEST_ODDRN + .eq(DATA_ENTITY_TASK_LAST_RUN.TASK_ODDRN)) + .and(DATA_ENTITY_TASK_LAST_RUN.STATUS + .notIn(DataEntityRunStatus.SUCCESS.getValue())) + ) + ).asTable(HEALTH_TABLE_CTE); + + final Table> errorTables = DSL.select(deOddrns.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .from(deOddrns) + .where( + DSL.exists( + DSL.select() + .from(DATA_ENTITY_TASK_LAST_RUN, DATA_QUALITY_TEST_RELATIONS, healthyTables) + .where(deOddrns.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN) + .notIn(healthyTables.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN))) + .and(deOddrns.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN) + .eq(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .and(DATA_QUALITY_TEST_RELATIONS.DATA_QUALITY_TEST_ODDRN + .eq(DATA_ENTITY_TASK_LAST_RUN.TASK_ODDRN)) + .and(DATA_ENTITY_TASK_LAST_RUN.STATUS.in(DataEntityRunStatus.BROKEN.getValue(), + DataEntityRunStatus.FAILED.getValue())) + ) + ).asTable(ERROR_HEALTH_TABLE_CTE); + + final Table> warningTables = + DSL.select(deOddrns.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .from(deOddrns) + .where(deOddrns.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN).notIn( + DSL.select(healthyTables.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .from(healthyTables))) + .and(deOddrns.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN).notIn( + DSL.select(errorTables.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .from(errorTables))) + .asTable(WARNING_HEALTH_TABLE_CTE); + + return jooqReactiveOperations.flux( + DSL.select(DSL.count(healthyTables.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .as(COUNT), + DSL.inline(GOOD_HEALTH).as(TABLE_STATUS)) + .from(healthyTables) + .unionAll(DSL.select(DSL.count(errorTables.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .as(COUNT), + DSL.inline(ERROR_HEALTH).as(TABLE_STATUS)) + .from(errorTables)) + .unionAll(DSL.select(DSL.count(warningTables.field(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN)) + .as(COUNT), + DSL.inline(WARNING_HEALTH).as(TABLE_STATUS)) + .from(warningTables))); + } + + @Override + public Flux> getMonitoredTables() { + final Table> dataEntityCTE = DSL.select(DATA_ENTITY.ID, DATA_ENTITY.ODDRN) + .from(DATA_ENTITY) + .where(DATA_ENTITY.TYPE_ID.eq(DataEntityTypeDto.TABLE.getId())).asTable(DATA_ENTITY_CTE); + + final Table> monitoredTablesCTE = DSL.select(dataEntityCTE.field(DATA_ENTITY.ID)) + .from(dataEntityCTE) + .where(DSL.exists( + DSL.select() + .from(DATA_QUALITY_TEST_RELATIONS) + .where(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN + .eq(dataEntityCTE.field(DATA_ENTITY.ODDRN))) + )).asTable(MONITORED_TABLE_CTE); + + final Table> notMonitoredTablesCTE = DSL.select(dataEntityCTE.field(DATA_ENTITY.ID)) + .from(dataEntityCTE) + .where(DSL.notExists( + DSL.select() + .from(DATA_QUALITY_TEST_RELATIONS) + .where(DATA_QUALITY_TEST_RELATIONS.DATASET_ODDRN + .eq(dataEntityCTE.field(DATA_ENTITY.ODDRN))) + )).asTable(NOT_MONITORED_TABLE_CTE); + + return jooqReactiveOperations.flux(DSL.select(DSL.count(monitoredTablesCTE.field(DATA_ENTITY.ID)).as(COUNT), + DSL.inline(MONITORED_TABLES).as(TABLE_STATUS)) + .from(monitoredTablesCTE) + .unionAll(DSL.select(DSL.count(notMonitoredTablesCTE.field(DATA_ENTITY.ID)).as(COUNT), + DSL.inline(NOT_MONITORED_TABLES).as(TABLE_STATUS)) + .from(notMonitoredTablesCTE))); } } diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsService.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsService.java index 340e47c6a..30432bfb7 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsService.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsService.java @@ -1,8 +1,8 @@ package org.opendatadiscovery.oddplatform.service; -import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityResults; import reactor.core.publisher.Mono; public interface DataQualityRunsService { - Mono getDataQualityTestsRuns(); + Mono getDataQualityTestsRuns(); } diff --git a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsServiceImpl.java b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsServiceImpl.java index 4fb2ea040..050f675fc 100644 --- a/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsServiceImpl.java +++ b/odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataQualityRunsServiceImpl.java @@ -1,24 +1,28 @@ package org.opendatadiscovery.oddplatform.service; import lombok.RequiredArgsConstructor; -import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityCategoryResultsList; +import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityResults; import org.opendatadiscovery.oddplatform.mapper.DataQualityCategoryMapper; +import org.opendatadiscovery.oddplatform.mapper.TablesDashboardMapper; import org.opendatadiscovery.oddplatform.repository.reactive.ReactiveDataQualityRunsRepository; -import org.opendatadiscovery.oddplatform.repository.util.JooqReactiveOperations; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; @Service @RequiredArgsConstructor public class DataQualityRunsServiceImpl implements DataQualityRunsService { - private final JooqReactiveOperations jooqReactiveOperations; - private final DataQualityCategoryMapper mapper; + private final DataQualityCategoryMapper testsMapper; + private final TablesDashboardMapper tablesDashboardMapper; private final ReactiveDataQualityRunsRepository dataQualityRunsRepository; @Override - public Mono getDataQualityTestsRuns() { - return jooqReactiveOperations.flux(dataQualityRunsRepository.getLatestDataQualityRunsResults()) + public Mono getDataQualityTestsRuns() { + return dataQualityRunsRepository.getLatestDataQualityRunsResults() .collectList() - .map(mapper::mapToDto); + .zipWith(dataQualityRunsRepository.getLatestTablesHealth().collectList() + .zipWith(dataQualityRunsRepository.getMonitoredTables().collectList())) + .map(item -> new DataQualityResults() + .testResults(testsMapper.mapToDto(item.getT1())) + .tablesDashboard(tablesDashboardMapper.mapToDto(item.getT2().getT1(), item.getT2().getT2()))); } } diff --git a/odd-platform-specification/components.yaml b/odd-platform-specification/components.yaml index dd6470b8f..e85dfafe1 100644 --- a/odd-platform-specification/components.yaml +++ b/odd-platform-specification/components.yaml @@ -3475,13 +3475,46 @@ components: - entities - data_source - DataQualityCategoryResultsList: + DataQualityResults: type: object properties: - testResults: + test_results: type: array items: $ref: '#/components/schemas/DataQualityCategoryResults' + tables_dashboard: + $ref: '#/components/schemas/TablesDashboard' + + TablesDashboard: + type: object + properties: + tables_health: + $ref: '#/components/schemas/TablesHealthDashboard' + monitored_tables: + $ref: '#/components/schemas/MonitoredTablesDashboard' + + TablesHealthDashboard: + type: object + properties: + healthy_tables: + type: integer + format: int32 + error_tables: + type: integer + format: int32 + warning_tables: + type: integer + format: int32 + + MonitoredTablesDashboard: + type: object + properties: + monitored_tables: + type: integer + format: int32 + not_monitoredTables: + type: integer + format: int32 DataQualityCategoryResults: type: object diff --git a/odd-platform-specification/openapi.yaml b/odd-platform-specification/openapi.yaml index 784ecdab0..ab1ef0081 100644 --- a/odd-platform-specification/openapi.yaml +++ b/odd-platform-specification/openapi.yaml @@ -1922,7 +1922,7 @@ paths: content: application/json: schema: - $ref: './components.yaml/#/components/schemas/DataQualityCategoryResultsList' + $ref: './components.yaml/#/components/schemas/DataQualityResults' tags: - dataQualityRuns From 041734f67178d1473844793729976693e52dc8bd Mon Sep 17 00:00:00 2001 From: vburlachenko Date: Tue, 7 Nov 2023 13:43:51 +0200 Subject: [PATCH 05/14] 1484 - Implementation of Data Quality Dashboard. Added Tables Health info and count of monitored tables. --- odd-platform-specification/components.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odd-platform-specification/components.yaml b/odd-platform-specification/components.yaml index e85dfafe1..046992c40 100644 --- a/odd-platform-specification/components.yaml +++ b/odd-platform-specification/components.yaml @@ -3512,7 +3512,7 @@ components: monitored_tables: type: integer format: int32 - not_monitoredTables: + not_monitored_tables: type: integer format: int32 From 858974185028d62379146c511a5de273c0a9a37c Mon Sep 17 00:00:00 2001 From: vburlachenko Date: Tue, 7 Nov 2023 16:17:10 +0200 Subject: [PATCH 06/14] 1484 - Implementation of Data Quality Dashboard. Created API for Dashboard --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0e573253d..29b507014 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ spring-webflux = '6.0.9' reactor-extra = '3.5.1' micrometer-registry-prometheus = '1.9.0' -ingestion-contract-server = '0.1.24' +ingestion-contract-server = '0.1.27' oddrn-generator-java = '0.1.20' odd-integration-manifests = '0.0.4' apache-collections = '4.4' From e7f1f3a13ebdc79a55d794c9d23142cea0cc5f81 Mon Sep 17 00:00:00 2001 From: Andrey Nenashev Date: Thu, 2 Nov 2023 16:17:06 +0100 Subject: [PATCH 07/14] dependencies(fe): update dev dependencies --- odd-platform-ui/build.gradle | 2 +- odd-platform-ui/package.json | 36 +- odd-platform-ui/pnpm-lock.yaml | 1410 ++++++++++------- .../elements/MetricFamily/MetricFamily.tsx | 14 +- 4 files changed, 889 insertions(+), 573 deletions(-) diff --git a/odd-platform-ui/build.gradle b/odd-platform-ui/build.gradle index 6f3e36aa2..febf73455 100644 --- a/odd-platform-ui/build.gradle +++ b/odd-platform-ui/build.gradle @@ -7,7 +7,7 @@ plugins { node { download = true version = "18.18.2" - pnpmVersion = "8.9.2" + pnpmVersion = "8.10.2" } tasks.register("buildUI", PnpmTask) { diff --git a/odd-platform-ui/package.json b/odd-platform-ui/package.json index 97169df38..0ac7daa49 100644 --- a/odd-platform-ui/package.json +++ b/odd-platform-ui/package.json @@ -45,7 +45,7 @@ "@mui/system": "^5.14.4", "@mui/x-date-pickers": "^5.0.20", "@reduxjs/toolkit": "^1.9.5", - "@tanstack/react-query": "^5.0.5", + "@tanstack/react-query": "^5.4.3", "@tanstack/react-virtual": "3.0.0-beta.60", "@uiw/react-md-editor": "^3.23.5", "@visx/curve": "^3.3.0", @@ -109,36 +109,36 @@ "@types/testing-library__jest-dom": "^5.14.9", "@types/unist": "^2.0.7", "@types/uuid": "^9.0.2", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", - "@vitejs/plugin-react": "^4.0.4", - "eslint": "8.22.0", + "@typescript-eslint/eslint-plugin": "^6.9.1", + "@typescript-eslint/parser": "^6.9.1", + "@vitejs/plugin-react": "^4.1.1", + "eslint": "^8.52.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-config-prettier": "^8.10.0", - "eslint-plugin-import": "^2.28.0", - "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-lodash": "^7.4.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.33.1", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "husky": "^8.0.3", "i18next-scanner": "4.4.0", "jsdom": "^22.1.0", - "lint-staged": "^13.2.3", - "prettier": "^2.8.8", - "typescript": "^5.1.6", - "vite": "^4.4.9", - "vite-plugin-checker": "^0.5.6", - "vite-tsconfig-paths": "^4.2.0", - "vitest": "^0.29.8" + "lint-staged": "^15.0.2", + "prettier": "^3.0.3", + "typescript": "^5.2.2", + "vite": "^4.5.0", + "vite-plugin-checker": "^0.6.2", + "vite-tsconfig-paths": "^4.2.1", + "vitest": "^0.34.6" }, "resolutions": { "minimist": "1.2.6" }, "engines": { "node": "v18.18.2", - "pnpm": "^8.9.2" + "pnpm": "^8.10.2" }, "pnpm": { "overrides": { diff --git a/odd-platform-ui/pnpm-lock.yaml b/odd-platform-ui/pnpm-lock.yaml index a6c541b58..2b42c0aba 100644 --- a/odd-platform-ui/pnpm-lock.yaml +++ b/odd-platform-ui/pnpm-lock.yaml @@ -28,8 +28,8 @@ dependencies: specifier: ^1.9.5 version: 1.9.5(react-redux@8.1.2)(react@18.2.0) '@tanstack/react-query': - specifier: ^5.0.5 - version: 5.0.5(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.4.3 + version: 5.4.3(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-virtual': specifier: 3.0.0-beta.60 version: 3.0.0-beta.60(react@18.2.0) @@ -137,7 +137,7 @@ dependencies: version: 5.1.2(react@18.2.0) styled-components: specifier: ^5.3.11 - version: 5.3.11(@babel/core@7.22.11)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + version: 5.3.11(@babel/core@7.23.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) use-debounce: specifier: ^9.0.4 version: 9.0.4(react@18.2.0) @@ -216,44 +216,44 @@ devDependencies: specifier: ^9.0.2 version: 9.0.2 '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.22.0)(typescript@5.1.6) + specifier: ^6.9.1 + version: 6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^5.62.0 - version: 5.62.0(eslint@8.22.0)(typescript@5.1.6) + specifier: ^6.9.1 + version: 6.9.1(eslint@8.52.0)(typescript@5.2.2) '@vitejs/plugin-react': - specifier: ^4.0.4 - version: 4.0.4(vite@4.4.9) + specifier: ^4.1.1 + version: 4.1.1(vite@4.5.0) eslint: - specifier: 8.22.0 - version: 8.22.0 + specifier: ^8.52.0 + version: 8.52.0 eslint-config-airbnb: specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.28.0)(eslint-plugin-jsx-a11y@6.7.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.1)(eslint@8.22.0) + version: 19.0.4(eslint-plugin-import@2.29.0)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.52.0) eslint-config-airbnb-typescript: specifier: ^17.1.0 - version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.0)(eslint@8.22.0) + version: 17.1.0(@typescript-eslint/eslint-plugin@6.9.1)(@typescript-eslint/parser@6.9.1)(eslint-plugin-import@2.29.0)(eslint@8.52.0) eslint-config-prettier: - specifier: ^8.10.0 - version: 8.10.0(eslint@8.22.0) + specifier: ^9.0.0 + version: 9.0.0(eslint@8.52.0) eslint-plugin-import: - specifier: ^2.28.0 - version: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.22.0) + specifier: ^2.29.0 + version: 2.29.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0) eslint-plugin-jsx-a11y: - specifier: ^6.7.1 - version: 6.7.1(eslint@8.22.0) + specifier: ^6.8.0 + version: 6.8.0(eslint@8.52.0) eslint-plugin-lodash: specifier: ^7.4.0 - version: 7.4.0(eslint@8.22.0) + version: 7.4.0(eslint@8.52.0) eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.22.0)(prettier@2.8.8) + specifier: ^5.0.1 + version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.52.0)(prettier@3.0.3) eslint-plugin-react: - specifier: ^7.33.1 - version: 7.33.1(eslint@8.22.0) + specifier: ^7.33.2 + version: 7.33.2(eslint@8.52.0) eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.0(eslint@8.22.0) + version: 4.6.0(eslint@8.52.0) husky: specifier: ^8.0.3 version: 8.0.3 @@ -264,26 +264,26 @@ devDependencies: specifier: ^22.1.0 version: 22.1.0 lint-staged: - specifier: ^13.2.3 - version: 13.2.3 + specifier: ^15.0.2 + version: 15.0.2 prettier: - specifier: ^2.8.8 - version: 2.8.8 + specifier: ^3.0.3 + version: 3.0.3 typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.2.2 + version: 5.2.2 vite: - specifier: ^4.4.9 - version: 4.4.9(@types/node@20.6.2) + specifier: ^4.5.0 + version: 4.5.0(@types/node@20.6.2) vite-plugin-checker: - specifier: ^0.5.6 - version: 0.5.6(eslint@8.22.0)(typescript@5.1.6)(vite@4.4.9) + specifier: ^0.6.2 + version: 0.6.2(eslint@8.52.0)(typescript@5.2.2)(vite@4.5.0) vite-tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0(typescript@5.1.6)(vite@4.4.9) + specifier: ^4.2.1 + version: 4.2.1(typescript@5.2.2)(vite@4.5.0) vitest: - specifier: ^0.29.8 - version: 0.29.8(jsdom@22.1.0) + specifier: ^0.34.6 + version: 0.34.6(jsdom@22.1.0) packages: @@ -314,21 +314,21 @@ packages: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.22.11: - resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} + /@babel/core@7.23.2: + resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) - '@babel/helpers': 7.22.11 - '@babel/parser': 7.22.13 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11(supports-color@5.5.0) - '@babel/types': 7.22.11 - convert-source-map: 1.9.0 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 @@ -344,6 +344,16 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 + dev: false + + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} @@ -352,19 +362,24 @@ packages: '@babel/types': 7.22.11 dev: false - /@babel/helper-compilation-targets@7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} dependencies: '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 + '@babel/helper-validator-option': 7.22.15 browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} + dev: false /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} @@ -372,6 +387,14 @@ packages: dependencies: '@babel/template': 7.22.5 '@babel/types': 7.22.11 + dev: false + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} @@ -379,24 +402,30 @@ packages: dependencies: '@babel/types': 7.22.11 + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.11 - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} @@ -406,7 +435,7 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.23.0 /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} @@ -418,21 +447,25 @@ packages: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} - /@babel/helpers@7.22.11: - resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.11(supports-color@5.5.0) - '@babel/types': 7.22.11 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color @@ -451,33 +484,40 @@ packages: dependencies: '@babel/types': 7.22.11 - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.11): + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -492,7 +532,14 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 - dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} @@ -501,6 +548,7 @@ packages: '@babel/code-frame': 7.22.13 '@babel/parser': 7.22.13 '@babel/types': 7.22.11 + dev: false /@babel/traverse@7.22.11(supports-color@5.5.0): resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} @@ -518,6 +566,24 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: false + + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color /@babel/types@7.22.11: resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} @@ -527,6 +593,14 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + /@date-io/core@2.17.0: resolution: {integrity: sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw==} dev: false @@ -885,13 +959,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.22.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.22.0 + eslint: 8.52.0 eslint-visitor-keys: 3.4.3 dev: true @@ -900,8 +974,8 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@1.4.1: - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 @@ -917,6 +991,11 @@ packages: - supports-color dev: true + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@floating-ui/core@1.5.0: resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} dependencies: @@ -964,23 +1043,24 @@ packages: react-hook-form: 7.45.4(react@18.2.0) dev: false - /@humanwhocodes/config-array@0.10.7: - resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==} + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/gitignore-to-minimatch@1.0.2: - resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true /@jest/expect-utils@29.7.0: @@ -1417,6 +1497,18 @@ packages: fastq: 1.15.0 dev: true + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.1 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true + /@popperjs/core@2.11.8: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false @@ -1449,12 +1541,12 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@tanstack/query-core@5.0.5: - resolution: {integrity: sha512-MThCETMkHDHTnFZHp71L+SqTtD5d6XHftFCVR1xRJdWM3qGrlQ2VCXaj0SKVcyJej2e1Opa2c7iknu1llxCDNQ==} + /@tanstack/query-core@5.4.3: + resolution: {integrity: sha512-fnI9ORjcuLGm1sNrKatKIosRQUpuqcD4SV7RqRSVmj8JSicX2aoMyKryHEBpVQvf6N4PaBVgBxQomjsbsGPssQ==} dev: false - /@tanstack/react-query@5.0.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ZG0Q4HZ0iuI8mWiZ2/MdVYPHbrmAVhMn7+gLOkxJh6zLIgCL4luSZlohzN5Xt4MjxfxxWioO1nemwpudaTsmQg==} + /@tanstack/react-query@5.4.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4aSOrRNa6yEmf7mws5QPTVMn8Lp7L38tFoTZ0c1ZmhIvbr8GIA0WT7X5N3yz/nuK8hUtjw9cAzBr4BPDZZ+tzA==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -1465,7 +1557,7 @@ packages: react-native: optional: true dependencies: - '@tanstack/query-core': 5.0.5 + '@tanstack/query-core': 5.4.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -1544,6 +1636,35 @@ packages: resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} dev: true + /@types/babel__core@7.20.3: + resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} + dependencies: + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + '@types/babel__generator': 7.6.6 + '@types/babel__template': 7.4.3 + '@types/babel__traverse': 7.20.3 + dev: true + + /@types/babel__generator@7.6.6: + resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@types/babel__template@7.4.3: + resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} + dependencies: + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + dev: true + + /@types/babel__traverse@7.20.3: + resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} + dependencies: + '@babel/types': 7.22.11 + dev: true + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -1946,133 +2067,134 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.22.0)(typescript@5.1.6): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: '@eslint-community/regexpp': 4.8.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.22.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.22.0)(typescript@5.1.6) - '@typescript-eslint/utils': 5.62.0(eslint@8.22.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/type-utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4(supports-color@5.5.0) - eslint: 8.22.0 + eslint: 8.52.0 graphemer: 1.4.0 ignore: 5.2.4 - natural-compare-lite: 1.4.0 + natural-compare: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.22.0)(typescript@5.1.6): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser@6.9.1(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4(supports-color@5.5.0) - eslint: 8.22.0 - typescript: 5.1.6 + eslint: 8.52.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/scope-manager@6.9.1: + resolution: {integrity: sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.22.0)(typescript@5.1.6): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils@6.9.1(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) - '@typescript-eslint/utils': 5.62.0(eslint@8.22.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) debug: 4.3.4(supports-color@5.5.0) - eslint: 8.22.0 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 + eslint: 8.52.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/types@6.9.1: + resolution: {integrity: sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==} + engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/typescript-estree@6.9.1(typescript@5.2.2): + resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.22.0)(typescript@5.1.6): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils@6.9.1(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.22.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.1 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) - eslint: 8.22.0 - eslint-scope: 5.1.1 + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) + eslint: 8.52.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/visitor-keys@6.9.1: + resolution: {integrity: sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/types': 6.9.1 eslint-visitor-keys: 3.4.3 dev: true @@ -2122,6 +2244,10 @@ packages: - supports-color dev: false + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + /@use-gesture/core@10.2.27: resolution: {integrity: sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA==} dev: false @@ -2251,50 +2377,58 @@ packages: react: 18.2.0 dev: false - /@vitejs/plugin-react@4.0.4(vite@4.4.9): - resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==} + /@vitejs/plugin-react@4.1.1(vite@4.5.0): + resolution: {integrity: sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.11) + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2) + '@types/babel__core': 7.20.3 react-refresh: 0.14.0 - vite: 4.4.9(@types/node@20.6.2) + vite: 4.5.0(@types/node@20.6.2) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@0.29.8: - resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + /@vitest/expect@0.34.6: + resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} dependencies: - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 - chai: 4.3.8 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + chai: 4.3.10 dev: true - /@vitest/runner@0.29.8: - resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + /@vitest/runner@0.34.6: + resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} dependencies: - '@vitest/utils': 0.29.8 + '@vitest/utils': 0.34.6 p-limit: 4.0.0 pathe: 1.1.1 dev: true - /@vitest/spy@0.29.8: - resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + /@vitest/snapshot@0.34.6: + resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} dependencies: - tinyspy: 1.1.1 + magic-string: 0.30.5 + pathe: 1.1.1 + pretty-format: 29.7.0 dev: true - /@vitest/utils@0.29.8: - resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + /@vitest/spy@0.34.6: + resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} dependencies: - cli-truncate: 3.1.0 - diff: 5.1.0 + tinyspy: 2.2.0 + dev: true + + /@vitest/utils@0.34.6: + resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} + dependencies: + diff-sequences: 29.6.3 loupe: 2.3.6 - pretty-format: 27.5.1 + pretty-format: 29.7.0 dev: true /abab@2.0.6: @@ -2380,14 +2514,6 @@ packages: - supports-color dev: true - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -2413,6 +2539,13 @@ packages: type-fest: 0.21.3 dev: true + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2488,13 +2621,24 @@ packages: is-string: 1.0.7 dev: true + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: true + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array.prototype.findlastindex@1.2.2: - resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -2514,6 +2658,16 @@ packages: es-shim-unscopables: 1.0.0 dev: true + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + /array.prototype.flatmap@1.3.1: resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} engines: {node: '>= 0.4'} @@ -2524,6 +2678,16 @@ packages: es-shim-unscopables: 1.0.0 dev: true + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: true + /array.prototype.tosorted@1.1.1: resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} dependencies: @@ -2550,13 +2714,14 @@ packages: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true - /ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 dev: true /asynckit@0.4.0: @@ -2568,8 +2733,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /axe-core@4.7.2: - resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + /axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} engines: {node: '>=4'} dev: true @@ -2587,17 +2752,17 @@ packages: cosmiconfig: 7.1.0 resolve: 1.22.4 - /babel-plugin-styled-components@2.1.4(@babel/core@7.22.11)(styled-components@5.3.11): + /babel-plugin-styled-components@2.1.4(@babel/core@7.23.2)(styled-components@5.3.11): resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} peerDependencies: styled-components: '>= 2' dependencies: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.22.11)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + styled-components: 5.3.11(@babel/core@7.23.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) transitivePeerDependencies: - '@babel/core' dev: false @@ -2621,6 +2786,11 @@ packages: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} dev: false + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -2638,6 +2808,13 @@ packages: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: false + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -2669,6 +2846,13 @@ packages: ieee754: 1.2.1 dev: true + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2696,14 +2880,14 @@ packages: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false - /chai@4.3.8: - resolution: {integrity: sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==} + /chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 - check-error: 1.0.2 + check-error: 1.0.3 deep-eql: 4.1.3 - get-func-name: 2.0.0 + get-func-name: 2.0.2 loupe: 2.3.6 pathval: 1.1.1 type-detect: 4.0.8 @@ -2733,8 +2917,8 @@ packages: supports-color: 7.2.0 dev: true - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true @@ -2754,8 +2938,10 @@ packages: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} dev: false - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 dev: true /chokidar@3.5.3: @@ -2782,24 +2968,11 @@ packages: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} dev: false - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true - - /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 + restore-cursor: 4.0.0 dev: true /cli-truncate@3.1.0: @@ -2872,9 +3045,9 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} dev: true /commander@8.3.0: @@ -2904,7 +3077,6 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3201,6 +3373,38 @@ packages: engines: {node: '>=0.10.0'} dev: true + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} @@ -3209,6 +3413,15 @@ packages: object-keys: 1.1.1 dev: true + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + /delaunator@5.0.0: resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} dependencies: @@ -3237,6 +3450,7 @@ packages: /diff@5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} + dev: false /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -3320,10 +3534,6 @@ packages: resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} dev: false - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true @@ -3404,6 +3614,25 @@ packages: stop-iteration-iterator: 1.0.0 dev: true + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.1 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 + dev: true + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -3480,7 +3709,7 @@ packages: engines: {node: '>=12'} dev: false - /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.28.0)(eslint@8.22.0): + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.0)(eslint@8.52.0): resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -3488,14 +3717,14 @@ packages: eslint-plugin-import: ^2.25.2 dependencies: confusing-browser-globals: 1.0.11 - eslint: 8.22.0 - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.22.0) + eslint: 8.52.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0) object.assign: 4.1.4 object.entries: 1.1.7 semver: 6.3.1 dev: true - /eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.0)(eslint@8.22.0): + /eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.9.1)(@typescript-eslint/parser@6.9.1)(eslint-plugin-import@2.29.0)(eslint@8.52.0): resolution: {integrity: sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==} peerDependencies: '@typescript-eslint/eslint-plugin': ^5.13.0 || ^6.0.0 @@ -3503,14 +3732,14 @@ packages: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.3 dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.22.0)(typescript@5.1.6) - '@typescript-eslint/parser': 5.62.0(eslint@8.22.0)(typescript@5.1.6) - eslint: 8.22.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.28.0)(eslint@8.22.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.22.0) + '@typescript-eslint/eslint-plugin': 6.9.1(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + eslint: 8.52.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0)(eslint@8.52.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0) dev: true - /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.28.0)(eslint-plugin-jsx-a11y@6.7.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.1)(eslint@8.22.0): + /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.0)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.52.0): resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3520,36 +3749,36 @@ packages: eslint-plugin-react: ^7.28.0 eslint-plugin-react-hooks: ^4.3.0 dependencies: - eslint: 8.22.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.28.0)(eslint@8.22.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.22.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.22.0) - eslint-plugin-react: 7.33.1(eslint@8.22.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.22.0) + eslint: 8.52.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0)(eslint@8.52.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.52.0) + eslint-plugin-react: 7.33.2(eslint@8.52.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.52.0) object.assign: 4.1.4 object.entries: 1.1.7 dev: true - /eslint-config-prettier@8.10.0(eslint@8.22.0): - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + /eslint-config-prettier@9.0.0(eslint@8.52.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.22.0 + eslint: 8.52.0 dev: true /eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 - is-core-module: 2.13.0 + is-core-module: 2.13.1 resolve: 1.22.4 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.22.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.9.1)(eslint-import-resolver-node@0.3.9)(eslint@8.52.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -3570,16 +3799,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.22.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.22.0 + eslint: 8.52.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.22.0): - resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0): + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -3588,24 +3817,23 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.22.0)(typescript@5.1.6) - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@5.2.2) + 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: 8.22.0 + eslint: 8.52.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.22.0) - has: 1.0.3 - is-core-module: 2.13.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.9.1)(eslint-import-resolver-node@0.3.9)(eslint@8.52.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 - resolve: 1.22.4 semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: @@ -3614,69 +3842,73 @@ packages: - supports-color dev: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.22.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.52.0): + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.23.2 aria-query: 5.3.0 - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - ast-types-flow: 0.0.7 - axe-core: 4.7.2 + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.22.0 - has: 1.0.3 + es-iterator-helpers: 1.0.15 + eslint: 8.52.0 + hasown: 2.0.0 jsx-ast-utils: 3.3.5 - language-tags: 1.0.5 + language-tags: 1.0.9 minimatch: 3.1.2 object.entries: 1.1.7 object.fromentries: 2.0.7 - semver: 6.3.1 dev: true - /eslint-plugin-lodash@7.4.0(eslint@8.22.0): + /eslint-plugin-lodash@7.4.0(eslint@8.52.0): resolution: {integrity: sha512-Tl83UwVXqe1OVeBRKUeWcfg6/pCW1GTRObbdnbEJgYwjxp5Q92MEWQaH9+dmzbRt6kvYU1Mp893E79nJiCSM8A==} engines: {node: '>=10'} peerDependencies: eslint: '>=2' dependencies: - eslint: 8.22.0 + eslint: 8.52.0 lodash: 4.17.21 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.22.0)(prettier@2.8.8): - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.52.0)(prettier@3.0.3): + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=7.28.0' + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' eslint-config-prettier: '*' - prettier: '>=2.0.0' + prettier: '>=3.0.0' peerDependenciesMeta: + '@types/eslint': + optional: true eslint-config-prettier: optional: true dependencies: - eslint: 8.22.0 - eslint-config-prettier: 8.10.0(eslint@8.22.0) - prettier: 2.8.8 + eslint: 8.52.0 + eslint-config-prettier: 9.0.0(eslint@8.52.0) + prettier: 3.0.3 prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.22.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.52.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.22.0 + eslint: 8.52.0 dev: true - /eslint-plugin-react@7.33.1(eslint@8.22.0): - resolution: {integrity: sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==} + /eslint-plugin-react@7.33.2(eslint@8.52.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -3685,7 +3917,8 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.22.0 + es-iterator-helpers: 1.0.15 + eslint: 8.52.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -3699,14 +3932,6 @@ packages: string.prototype.matchall: 4.0.9 dev: true - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3715,34 +3940,24 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils@3.0.0(eslint@8.22.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.22.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.22.0: - resolution: {integrity: sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==} + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.10.7 - '@humanwhocodes/gitignore-to-minimatch': 1.0.2 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + '@eslint-community/regexpp': 4.8.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -3750,7 +3965,6 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 - eslint-utils: 3.0.0(eslint@8.22.0) eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 @@ -3758,15 +3972,13 @@ packages: fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 - functional-red-black-tree: 1.0.1 glob-parent: 6.0.2 globals: 13.21.0 - globby: 11.1.0 - grapheme-splitter: 1.0.4 + graphemer: 1.4.0 ignore: 5.2.4 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 + is-path-inside: 3.0.3 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 @@ -3774,11 +3986,8 @@ packages: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.3 - regexpp: 3.2.0 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 - v8-compile-cache: 2.4.0 transitivePeerDependencies: - supports-color dev: true @@ -3812,11 +4021,6 @@ packages: estraverse: 5.3.0 dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -3827,6 +4031,25 @@ packages: engines: {node: '>=0.10.0'} dev: true + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + /execa@7.2.0: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} @@ -3842,6 +4065,21 @@ packages: strip-final-newline: 3.0.0 dev: true + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + /expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3983,6 +4221,10 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} @@ -3993,10 +4235,6 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true @@ -4005,8 +4243,8 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true /get-intrinsic@1.2.1: @@ -4023,6 +4261,11 @@ packages: engines: {node: '>=10'} dev: true + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -4126,10 +4369,6 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true - /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true @@ -4195,6 +4434,13 @@ packages: dependencies: function-bind: 1.1.1 + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /hast-util-from-parse5@7.1.2: resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} dependencies: @@ -4384,11 +4630,21 @@ packages: - supports-color dev: true + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + /human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} dev: true + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + /husky@8.0.3: resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} @@ -4528,6 +4784,13 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -4564,6 +4827,12 @@ packages: dependencies: has: 1.0.3 + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -4575,14 +4844,27 @@ packages: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} dev: false + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.2 dev: true /is-fullwidth-code-point@4.0.0: @@ -4590,6 +4872,13 @@ packages: engines: {node: '>=12'} dev: true + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -4601,6 +4890,14 @@ packages: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} dev: false + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: true @@ -4627,6 +4924,11 @@ packages: engines: {node: '>=0.12.0'} dev: true + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -4661,6 +4963,11 @@ packages: call-bind: 1.0.2 dev: true + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4709,6 +5016,13 @@ packages: get-intrinsic: 1.2.1 dev: true + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true @@ -4726,6 +5040,16 @@ packages: engines: {node: '>=0.10.0'} dev: true + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 + dev: true + /jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4919,7 +5243,7 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.6 + array-includes: 3.1.7 array.prototype.flat: 1.3.1 object.assign: 4.1.4 object.values: 1.1.7 @@ -4945,8 +5269,9 @@ packages: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} dev: true - /language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} dependencies: language-subtag-registry: 0.3.22 dev: true @@ -4979,46 +5304,35 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /lint-staged@13.2.3: - resolution: {integrity: sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==} - engines: {node: ^14.13.1 || >=16.0.0} + /lint-staged@15.0.2: + resolution: {integrity: sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==} + engines: {node: '>=18.12.0'} hasBin: true dependencies: - chalk: 5.2.0 - cli-truncate: 3.1.0 - commander: 10.0.1 + chalk: 5.3.0 + commander: 11.1.0 debug: 4.3.4(supports-color@5.5.0) - execa: 7.2.0 + execa: 8.0.1 lilconfig: 2.1.0 - listr2: 5.0.8 + listr2: 7.0.2 micromatch: 4.0.5 - normalize-path: 3.0.0 - object-inspect: 1.12.3 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.3.2 + yaml: 2.3.3 transitivePeerDependencies: - - enquirer - supports-color dev: true - /listr2@5.0.8: - resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} - engines: {node: ^14.13.1 || >=16.0.0} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true + /listr2@7.0.2: + resolution: {integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==} + engines: {node: '>=16.0.0'} dependencies: - cli-truncate: 2.1.0 + cli-truncate: 3.1.0 colorette: 2.0.20 - log-update: 4.0.0 - p-map: 4.0.0 + eventemitter3: 5.0.1 + log-update: 5.0.1 rfdc: 1.3.0 - rxjs: 7.8.1 - through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 8.1.0 dev: true /local-pkg@0.4.3: @@ -5048,14 +5362,15 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + /log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 + ansi-escapes: 5.0.0 + cli-cursor: 4.0.0 + slice-ansi: 5.0.0 + strip-ansi: 7.1.0 + wrap-ansi: 8.1.0 dev: true /longest-streak@3.1.0: @@ -5071,7 +5386,7 @@ packages: /loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: - get-func-name: 2.0.0 + get-func-name: 2.0.2 dev: true /lru-cache@5.1.1: @@ -5091,6 +5406,13 @@ packages: hasBin: true dev: true + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false @@ -5561,10 +5883,6 @@ packages: hasBin: true dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -5710,6 +6028,16 @@ packages: mimic-fn: 4.0.0 dev: true + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -5743,13 +6071,6 @@ packages: p-limit: 3.1.0 dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5872,9 +6193,9 @@ packages: fast-diff: 1.3.0 dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} hasBin: true dev: true @@ -6234,6 +6555,18 @@ packages: dependencies: '@babel/runtime': 7.22.11 + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + /refractor@4.8.1: resolution: {integrity: sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg==} dependencies: @@ -6255,11 +6588,6 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - /rehype-attr@2.1.4: resolution: {integrity: sha512-iAeaL5JyF4XxkcvWzpi/0SAF7iV7qOTaHS56tJuEsXziQc3+PEmMn65kV8OFgbO9mRVY7J1fRC/aLvot1PsNkg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6450,9 +6778,9 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 @@ -6498,16 +6826,17 @@ packages: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} dependencies: - queue-microtask: 1.2.3 + execa: 5.1.1 dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: - tslib: 2.6.2 + queue-microtask: 1.2.3 dev: true /sade@1.8.1: @@ -6527,6 +6856,16 @@ packages: isarray: 2.0.5 dev: true + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true @@ -6571,6 +6910,15 @@ packages: lru-cache: 6.0.0 dev: true + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.0 + dev: true + /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -6610,27 +6958,14 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} dev: true - /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 dev: true /slice-ansi@5.0.0: @@ -6658,6 +6993,7 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + dev: false /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -6708,15 +7044,6 @@ packages: engines: {node: '>=0.6.19'} dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} @@ -6802,6 +7129,11 @@ packages: engines: {node: '>=4'} dev: true + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -6837,7 +7169,7 @@ packages: inline-style-parser: 0.1.1 dev: false - /styled-components@5.3.11(@babel/core@7.22.11)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): + /styled-components@5.3.11(@babel/core@7.23.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} engines: {node: '>=10'} peerDependencies: @@ -6850,7 +7182,7 @@ packages: '@emotion/is-prop-valid': 1.2.1 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.22.11)(styled-components@5.3.11) + babel-plugin-styled-components: 2.1.4(@babel/core@7.23.2)(styled-components@5.3.11) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 @@ -6886,6 +7218,14 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 + dev: true + /teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} dependencies: @@ -6914,10 +7254,6 @@ packages: readable-stream: 3.6.2 dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - /tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: true @@ -6926,16 +7262,21 @@ packages: resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} dev: true - /tinypool@0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + /tinypool@0.7.0: + resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} engines: {node: '>=14.0.0'} dev: true - /tinyspy@1.1.1: - resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + /tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} engines: {node: '>=14.0.0'} dev: true + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -6979,7 +7320,16 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false - /tsconfck@2.1.2(typescript@5.1.6): + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.2.2 + dev: true + + /tsconfck@2.1.2(typescript@5.2.2): resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} engines: {node: ^14.13.1 || ^16 || >=18} hasBin: true @@ -6989,7 +7339,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.1.6 + typescript: 5.2.2 dev: true /tsconfig-paths@3.14.2: @@ -7001,24 +7351,10 @@ packages: strip-bom: 3.0.0 dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsutils@3.21.0(typescript@5.1.6): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.1.6 - dev: true - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -7041,6 +7377,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -7079,8 +7420,8 @@ packages: is-typed-array: 1.1.12 dev: true - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -7173,6 +7514,11 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + /update-browserslist-db@1.0.11(browserslist@4.21.10): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true @@ -7232,10 +7578,6 @@ packages: sade: 1.8.1 dev: false - /v8-compile-cache@2.4.0: - resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - dev: true - /value-or-function@4.0.0: resolution: {integrity: sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==} engines: {node: '>= 10.13.0'} @@ -7319,9 +7661,9 @@ packages: teex: 1.0.1 dev: true - /vite-node@0.29.8(@types/node@18.17.4): - resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} - engines: {node: '>=v14.16.0'} + /vite-node@0.34.6(@types/node@20.6.2): + resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} + engines: {node: '>=v14.18.0'} hasBin: true dependencies: cac: 6.7.14 @@ -7329,7 +7671,7 @@ packages: mlly: 1.4.1 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@18.17.4) + vite: 4.5.0(@types/node@20.6.2) transitivePeerDependencies: - '@types/node' - less @@ -7341,8 +7683,8 @@ packages: - terser dev: true - /vite-plugin-checker@0.5.6(eslint@8.22.0)(typescript@5.1.6)(vite@4.4.9): - resolution: {integrity: sha512-ftRyON0gORUHDxcDt2BErmsikKSkfvl1i2DoP6Jt2zDO9InfvM6tqO1RkXhSjkaXEhKPea6YOnhFaZxW3BzudQ==} + /vite-plugin-checker@0.6.2(eslint@8.52.0)(typescript@5.2.2)(vite@4.5.0): + resolution: {integrity: sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==} engines: {node: '>=14.16'} peerDependencies: eslint: '>=7' @@ -7353,7 +7695,7 @@ packages: vite: '>=2.0.0' vls: '*' vti: '*' - vue-tsc: '*' + vue-tsc: '>=1.3.9' peerDependenciesMeta: eslint: optional: true @@ -7377,24 +7719,25 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 commander: 8.3.0 - eslint: 8.22.0 + eslint: 8.52.0 fast-glob: 3.3.1 fs-extra: 11.1.1 lodash.debounce: 4.0.8 lodash.pick: 4.4.0 npm-run-path: 4.0.1 + semver: 7.5.4 strip-ansi: 6.0.1 tiny-invariant: 1.3.1 - typescript: 5.1.6 - vite: 4.4.9(@types/node@20.6.2) + typescript: 5.2.2 + vite: 4.5.0(@types/node@20.6.2) vscode-languageclient: 7.0.0 vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.8 vscode-uri: 3.0.7 dev: true - /vite-tsconfig-paths@4.2.0(typescript@5.1.6)(vite@4.4.9): - resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + /vite-tsconfig-paths@4.2.1(typescript@5.2.2)(vite@4.5.0): + resolution: {integrity: sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==} peerDependencies: vite: '*' peerDependenciesMeta: @@ -7403,51 +7746,15 @@ packages: dependencies: debug: 4.3.4(supports-color@5.5.0) globrex: 0.1.2 - tsconfck: 2.1.2(typescript@5.1.6) - vite: 4.4.9(@types/node@20.6.2) + tsconfck: 2.1.2(typescript@5.2.2) + vite: 4.5.0(@types/node@20.6.2) transitivePeerDependencies: - supports-color - typescript dev: true - /vite@4.4.9(@types/node@18.17.4): - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.17.4 - esbuild: 0.18.20 - postcss: 8.4.28 - rollup: 3.28.1 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /vite@4.4.9(@types/node@20.6.2): - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + /vite@4.5.0(@types/node@20.6.2): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -7482,9 +7789,9 @@ packages: fsevents: 2.3.3 dev: true - /vitest@0.29.8(jsdom@22.1.0): - resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} - engines: {node: '>=v14.16.0'} + /vitest@0.34.6(jsdom@22.1.0): + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} + engines: {node: '>=v14.18.0'} hasBin: true peerDependencies: '@edge-runtime/vm': '*' @@ -7515,28 +7822,28 @@ packages: dependencies: '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 - '@types/node': 18.17.4 - '@vitest/expect': 0.29.8 - '@vitest/runner': 0.29.8 - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 + '@types/node': 20.6.2 + '@vitest/expect': 0.34.6 + '@vitest/runner': 0.34.6 + '@vitest/snapshot': 0.34.6 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 acorn: 8.10.0 acorn-walk: 8.2.0 cac: 6.7.14 - chai: 4.3.8 + chai: 4.3.10 debug: 4.3.4(supports-color@5.5.0) jsdom: 22.1.0 local-pkg: 0.4.3 + magic-string: 0.30.5 pathe: 1.1.1 picocolors: 1.0.0 - source-map: 0.6.1 std-env: 3.4.3 strip-literal: 1.3.0 tinybench: 2.5.0 - tinypool: 0.4.0 - tinyspy: 1.1.1 - vite: 4.4.9(@types/node@18.17.4) - vite-node: 0.29.8(@types/node@18.17.4) + tinypool: 0.7.0 + vite: 4.5.0(@types/node@20.6.2) + vite-node: 0.34.6(@types/node@20.6.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -7639,6 +7946,24 @@ packages: is-symbol: 1.0.4 dev: true + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.11 + dev: true + /which-collection@1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: @@ -7680,22 +8005,13 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: false - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 dev: true /wrappy@1.0.2: @@ -7740,8 +8056,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - /yaml@2.3.2: - resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} + /yaml@2.3.3: + resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==} engines: {node: '>= 14'} dev: true diff --git a/odd-platform-ui/src/components/shared/elements/MetricFamily/MetricFamily.tsx b/odd-platform-ui/src/components/shared/elements/MetricFamily/MetricFamily.tsx index 43c8786cd..6ef728687 100644 --- a/odd-platform-ui/src/components/shared/elements/MetricFamily/MetricFamily.tsx +++ b/odd-platform-ui/src/components/shared/elements/MetricFamily/MetricFamily.tsx @@ -21,7 +21,7 @@ const MetricFamilyView: React.FC = ({ family }) => { ); const emptyLabelsMetricValue = React.useMemo(() => { - if (emptyLabelsMetric) { + if (emptyLabelsMetric?.metricPoint) { if (family.type === 'COUNTER') { return ( @@ -108,8 +108,8 @@ const MetricFamilyView: React.FC = ({ family }) => { {metric.labels?.map(getLabel)} - - + + @@ -121,8 +121,8 @@ const MetricFamilyView: React.FC = ({ family }) => { {metric.labels?.map(getLabel)} - - + + @@ -134,7 +134,7 @@ const MetricFamilyView: React.FC = ({ family }) => { {metric.labels?.map(getLabel)} - {metric.metricPoint.histogramValue?.buckets?.map((bucket, idx) => ( + {metric.metricPoint?.histogramValue?.buckets?.map((bucket, idx) => ( = ({ family }) => { {metric.labels?.map(getLabel)} - {metric.metricPoint.summaryValue?.quantile?.map(quantile => ( + {metric.metricPoint?.summaryValue?.quantile?.map(quantile => ( Date: Thu, 2 Nov 2023 16:32:41 +0100 Subject: [PATCH 08/14] feature(data-quality): create Data Quality tab and route --- odd-platform-ui/src/components/App.tsx | 5 + .../AppToolbar/ToolbarTabs/ToolbarTabs.tsx | 6 + .../src/lib/hooks/useAppParams/interfaces.ts | 62 +++--- .../src/lib/hooks/useAppPaths/shared.ts | 194 +++++++++--------- .../src/lib/hooks/useAppPaths/useAppPaths.ts | 8 +- 5 files changed, 144 insertions(+), 131 deletions(-) diff --git a/odd-platform-ui/src/components/App.tsx b/odd-platform-ui/src/components/App.tsx index 51c3b03a5..ad038967e 100644 --- a/odd-platform-ui/src/components/App.tsx +++ b/odd-platform-ui/src/components/App.tsx @@ -11,6 +11,7 @@ import { fetchTagsList, } from 'redux/thunks'; import { useAppPaths } from 'lib/hooks'; +import { DataQualityRoutes } from '../lib/hooks/useAppPaths/shared'; // lazy elements const Management = lazy(() => import('./Management/Management')); @@ -90,6 +91,10 @@ const App: React.FC = () => { path={getNonExactPath(DirectoryRoutesEnum.directory)} element={} /> + Data Quality} + /> diff --git a/odd-platform-ui/src/components/shared/elements/AppToolbar/ToolbarTabs/ToolbarTabs.tsx b/odd-platform-ui/src/components/shared/elements/AppToolbar/ToolbarTabs/ToolbarTabs.tsx index 5571f4bcf..c0ab9a2e4 100644 --- a/odd-platform-ui/src/components/shared/elements/AppToolbar/ToolbarTabs/ToolbarTabs.tsx +++ b/odd-platform-ui/src/components/shared/elements/AppToolbar/ToolbarTabs/ToolbarTabs.tsx @@ -29,6 +29,7 @@ const ToolbarTabs: FC = () => { ActivityRoutes, DirectoryRoutes, DataEntityRoutes, + DataQualityRoutes, updatePath, } = useAppPaths(); @@ -44,6 +45,11 @@ const ToolbarTabs: FC = () => { link: updatePath(DirectoryRoutes.directory), value: DirectoryRoutes.directory, }, + { + name: t('Data Quality'), + link: updatePath(DataQualityRoutes.dataQuality), + value: DataQualityRoutes.dataQuality, + }, { name: t('Management'), link: updatePath(ManagementRoutes.management), diff --git a/odd-platform-ui/src/lib/hooks/useAppParams/interfaces.ts b/odd-platform-ui/src/lib/hooks/useAppParams/interfaces.ts index 1025671bf..8fd05f717 100644 --- a/odd-platform-ui/src/lib/hooks/useAppParams/interfaces.ts +++ b/odd-platform-ui/src/lib/hooks/useAppParams/interfaces.ts @@ -9,21 +9,21 @@ import type { interface DataEntityViewTypes { [DataEntityRoutes.dataEntityViewType]: - | DataEntityRoutes.overview - | DataEntityRoutes.lineage - | DataEntityRoutes.structure - | DataEntityRoutes.history - | DataEntityRoutes.alerts - | DataEntityRoutes.linkedEntities - | DataEntityRoutes.activity - | DataEntityRoutes.testReports - | DataEntityRoutes.discussions; + | typeof DataEntityRoutes.overview + | typeof DataEntityRoutes.lineage + | typeof DataEntityRoutes.structure + | typeof DataEntityRoutes.history + | typeof DataEntityRoutes.alerts + | typeof DataEntityRoutes.linkedEntities + | typeof DataEntityRoutes.activity + | typeof DataEntityRoutes.testReports + | typeof DataEntityRoutes.discussions; [DataEntityRoutes.testReportViewType]: - | DataEntityRoutes.overview - | DataEntityRoutes.history; + | typeof DataEntityRoutes.overview + | typeof DataEntityRoutes.history; [DataEntityRoutes.structureViewType]: - | DataEntityRoutes.overview - | DataEntityRoutes.structureCompare; + | typeof DataEntityRoutes.overview + | typeof DataEntityRoutes.structureCompare; } interface DataEntityRouteParams extends DataEntityViewTypes { @@ -41,7 +41,9 @@ interface AppDataEntityRouteParams extends DataEntityViewTypes { } interface TermRouteViewTypes { - [TermsRoutes.termsViewType]: TermsRoutes.overview | TermsRoutes.linkedEntities; + [TermsRoutes.termsViewType]: + | typeof TermsRoutes.overview + | typeof TermsRoutes.linkedEntities; } interface TermRouteParams extends TermRouteViewTypes { @@ -64,30 +66,30 @@ interface AppSearchRouteParams { interface AlertsRouteViewTypes { [AlertsRoutes.alertsViewType]: - | AlertsRoutes.all - | AlertsRoutes.my - | AlertsRoutes.dependents; + | typeof AlertsRoutes.all + | typeof AlertsRoutes.my + | typeof AlertsRoutes.dependents; } type AppAlertsRouteParams = AlertsRouteViewTypes; interface ManagementRouteViewTypes { [ManagementRoutes.managementViewType]: - | ManagementRoutes.namespaces - | ManagementRoutes.datasources - | ManagementRoutes.collectors - | ManagementRoutes.owners - | ManagementRoutes.tags - | ManagementRoutes.associations - | ManagementRoutes.roles - | ManagementRoutes.policies - | ManagementRoutes.integrations; + | typeof ManagementRoutes.namespaces + | typeof ManagementRoutes.datasources + | typeof ManagementRoutes.collectors + | typeof ManagementRoutes.owners + | typeof ManagementRoutes.tags + | typeof ManagementRoutes.associations + | typeof ManagementRoutes.roles + | typeof ManagementRoutes.policies + | typeof ManagementRoutes.integrations; [ManagementRoutes.associationsViewType]: - | ManagementRoutes.associationsNew - | ManagementRoutes.associationsResolved; + | typeof ManagementRoutes.associationsNew + | typeof ManagementRoutes.associationsResolved; [ManagementRoutes.integrationViewType]: - | ManagementRoutes.overview - | ManagementRoutes.configure; + | typeof ManagementRoutes.overview + | typeof ManagementRoutes.configure; } interface ManagementRouteParams extends ManagementRouteViewTypes { diff --git a/odd-platform-ui/src/lib/hooks/useAppPaths/shared.ts b/odd-platform-ui/src/lib/hooks/useAppPaths/shared.ts index 59ab61eda..6987c130e 100644 --- a/odd-platform-ui/src/lib/hooks/useAppPaths/shared.ts +++ b/odd-platform-ui/src/lib/hooks/useAppPaths/shared.ts @@ -1,106 +1,106 @@ export const EMBEDDED = 'embedded'; -export enum BaseRoutes { - base = '/', -} +export const ActivityRoutes = { + activity: 'activity', +} as const; -export enum ActivityRoutes { - activity = 'activity', -} +export const SearchRoutes = { + search: 'search', + searchId: 'searchId', + searchIdParam: ':searchId', +} as const; -export enum SearchRoutes { - search = 'search', - searchId = 'searchId', - searchIdParam = ':searchId', -} +export const DataEntityRoutes = { + dataentities: 'dataentities', + dataEntityId: 'dataEntityId', + dataEntityIdParam: ':dataEntityId', + dataQATestId: 'dataQATestId', + dataQATestIdParam: ':dataQATestId', + messageId: 'messageId', + messageIdParam: ':messageId', + dataEntityViewType: 'dataEntityViewType', + dataEntityViewTypeParam: ':dataEntityViewType', + testReportViewType: 'testReportViewType', + testReportViewTypeParam: ':testReportViewType', + versionId: 'versionId', + versionIdParam: ':versionId', + overview: 'overview', + lineage: 'lineage', + structure: 'structure', + structureViewType: 'structureViewType', + structureViewTypeParam: ':structureViewType', + structureCompare: 'compare', + testReports: 'test-reports', + history: 'history', + alerts: 'alerts', + linkedEntities: 'linked-entities', + activity: 'activity', + discussions: 'discussions', + createMessage: 'createMessage', + retries: 'retries', +} as const; -export enum DataEntityRoutes { - dataentities = 'dataentities', - dataEntityId = 'dataEntityId', - dataEntityIdParam = ':dataEntityId', - dataQATestId = 'dataQATestId', - dataQATestIdParam = ':dataQATestId', - messageId = 'messageId', - messageIdParam = ':messageId', - dataEntityViewType = 'dataEntityViewType', - dataEntityViewTypeParam = ':dataEntityViewType', - testReportViewType = 'testReportViewType', - testReportViewTypeParam = ':testReportViewType', - versionId = 'versionId', - versionIdParam = ':versionId', - overview = 'overview', - lineage = 'lineage', - structure = 'structure', - structureViewType = 'structureViewType', - structureViewTypeParam = ':structureViewType', - structureCompare = 'compare', - testReports = 'test-reports', - history = 'history', - alerts = 'alerts', - linkedEntities = 'linked-entities', - activity = 'activity', - discussions = 'discussions', - createMessage = 'createMessage', - retries = 'retries', -} +export const AlertsRoutes = { + alerts: 'alerts', + all: 'all', + my: 'my', + dependents: 'dependents', + alertsViewType: 'alertsViewType', + alertsViewTypeParam: ':alertsViewType', +} as const; -export enum AlertsRoutes { - alerts = 'alerts', - all = 'all', - my = 'my', - dependents = 'dependents', - alertsViewType = 'alertsViewType', - alertsViewTypeParam = ':alertsViewType', -} +export const ManagementRoutes = { + managementViewType: 'managementViewType', + managementViewTypeParam: ':managementViewType', + management: 'management', + namespaces: 'namespaces', + datasources: 'datasources', + collectors: 'collectors', + owners: 'owners', + tags: 'tags', + associations: 'associations', + associationsViewType: 'associationsViewType', + associationsViewTypeParam: ':associationsViewType', + associationsNew: 'new', + associationsResolved: 'resolved', + roles: 'roles', + policies: 'policies', + createPolicy: 'createPolicy', + policyId: 'policyId', + policyIdParam: ':policyId', + integrations: 'integrations', + integrationId: 'integrationId', + integrationIdParam: ':integrationId', + integrationViewType: 'integrationViewType', + integrationViewTypeParam: ':integrationViewType', + overview: 'overview', + configure: 'configure', +} as const; -export enum ManagementRoutes { - managementViewType = 'managementViewType', - managementViewTypeParam = ':managementViewType', - management = 'management', - namespaces = 'namespaces', - datasources = 'datasources', - collectors = 'collectors', - owners = 'owners', - tags = 'tags', - associations = 'associations', - associationsViewType = 'associationsViewType', - associationsViewTypeParam = ':associationsViewType', - associationsNew = 'new', - associationsResolved = 'resolved', - roles = 'roles', - policies = 'policies', - createPolicy = 'createPolicy', - policyId = 'policyId', - policyIdParam = ':policyId', - integrations = 'integrations', - integrationId = 'integrationId', - integrationIdParam = ':integrationId', - integrationViewType = 'integrationViewType', - integrationViewTypeParam = ':integrationViewType', - overview = 'overview', - configure = 'configure', -} +export const TermsRoutes = { + termSearch: 'termsearch', + terms: 'terms', + termSearchId: 'termSearchId', + termSearchIdParam: ':termSearchId', + termId: 'termId', + termIdParam: ':termId', + termsViewType: 'termsViewType', + termsViewTypeParam: ':termsViewType', + overview: 'overview', + linkedEntities: 'linked-entities', + linkedColumns: 'linked-columns', +} as const; -export enum TermsRoutes { - termSearch = 'termsearch', - terms = 'terms', - termSearchId = 'termSearchId', - termSearchIdParam = ':termSearchId', - termId = 'termId', - termIdParam = ':termId', - termsViewType = 'termsViewType', - termsViewTypeParam = ':termsViewType', - overview = 'overview', - linkedEntities = 'linked-entities', - linkedColumns = 'linked-columns', -} +export const DirectoryRoutes = { + directory: 'directory', + dataSourceTypePrefix: 'dataSourceTypePrefix', + dataSourceTypePrefixParam: ':dataSourceTypePrefix', + dataSourceId: 'dataSourceId', + dataSourceIdParam: ':dataSourceId', + typeId: 'typeId', + typeIdParam: ':typeId', +} as const; -export enum DirectoryRoutes { - directory = 'directory', - dataSourceTypePrefix = 'dataSourceTypePrefix', - dataSourceTypePrefixParam = ':dataSourceTypePrefix', - dataSourceId = 'dataSourceId', - dataSourceIdParam = ':dataSourceId', - typeId = 'typeId', - typeIdParam = ':typeId', -} +export const DataQualityRoutes = { + dataQuality: 'data-quality', +} as const; diff --git a/odd-platform-ui/src/lib/hooks/useAppPaths/useAppPaths.ts b/odd-platform-ui/src/lib/hooks/useAppPaths/useAppPaths.ts index c9118f149..4b990452c 100644 --- a/odd-platform-ui/src/lib/hooks/useAppPaths/useAppPaths.ts +++ b/odd-platform-ui/src/lib/hooks/useAppPaths/useAppPaths.ts @@ -1,9 +1,8 @@ -import React from 'react'; +import { useMemo } from 'react'; import { useIsEmbeddedPath } from './useIsEmbeddedPath'; import { useTermsPaths } from './useTermsPaths'; import { useDataEntityPaths } from './useDataEntityPaths'; import { - BaseRoutes, ActivityRoutes, SearchRoutes, AlertsRoutes, @@ -11,6 +10,7 @@ import { TermsRoutes, DataEntityRoutes, DirectoryRoutes, + DataQualityRoutes, } from './shared'; const useAppPaths = () => { @@ -53,10 +53,9 @@ const useAppPaths = () => { const directoryDataSourceListPath = (dataSourcePrefix: string) => updatePath(`${DirectoryRoutes.directory}/${dataSourcePrefix}`); - return React.useMemo( + return useMemo( () => ({ isPathEmbedded, - BaseRoutes, ActivityRoutes, SearchRoutes, AlertsRoutes, @@ -64,6 +63,7 @@ const useAppPaths = () => { TermsRoutes, DataEntityRoutes, DirectoryRoutes, + DataQualityRoutes, basePath, updatePath, getNonExactPath, From 73bec2bcacaaf58fea65bdd6acbae3e64f91e1bc Mon Sep 17 00:00:00 2001 From: Andrey Nenashev Date: Mon, 6 Nov 2023 19:42:14 +0100 Subject: [PATCH 09/14] feature(fe): create DonutChart component --- odd-platform-ui/package.json | 5 +- odd-platform-ui/pnpm-lock.yaml | 355 ++++++++++-------- odd-platform-ui/src/components/App.tsx | 3 +- .../LoadMoreButton/LoadMoreButtonStyles.ts | 49 +-- .../DataQuality/DataQuality.styles.ts | 48 +++ .../components/DataQuality/DataQuality.tsx | 74 ++++ .../DataEntitiesUsageInfoCard.styles.ts | 10 +- .../elements/AppRadio/AppRadioStyles.ts | 16 +- .../shared/elements/DonutChart/DonutChart.tsx | 119 ++++++ .../shared/elements/Input/Input.styles.ts | 4 +- .../src/components/shared/elements/index.ts | 1 + odd-platform-ui/src/index.tsx | 2 +- odd-platform-ui/src/lib/api.ts | 2 + .../src/lib/hooks/api/dataQuality.ts | 9 + 14 files changed, 510 insertions(+), 187 deletions(-) create mode 100644 odd-platform-ui/src/components/DataQuality/DataQuality.styles.ts create mode 100644 odd-platform-ui/src/components/DataQuality/DataQuality.tsx create mode 100644 odd-platform-ui/src/components/shared/elements/DonutChart/DonutChart.tsx create mode 100644 odd-platform-ui/src/lib/hooks/api/dataQuality.ts diff --git a/odd-platform-ui/package.json b/odd-platform-ui/package.json index 0ac7daa49..e19316d9b 100644 --- a/odd-platform-ui/package.json +++ b/odd-platform-ui/package.json @@ -81,7 +81,8 @@ "react-redux": "^8.1.2", "react-router-dom": "^6.17.0", "react-truncate-markup": "^5.1.2", - "styled-components": "^5.3.11", + "recharts": "^2.9.2", + "styled-components": "^6.1.0", "use-debounce": "^9.0.4", "uuid": "^9.0.1", "vanilla-jsoneditor": "^0.7.11" @@ -105,7 +106,7 @@ "@types/react": "^18.2.20", "@types/react-dom": "^18.2.7", "@types/react-redux": "^7.1.25", - "@types/styled-components": "^5.1.26", + "@types/recharts": "^1.8.26", "@types/testing-library__jest-dom": "^5.14.9", "@types/unist": "^2.0.7", "@types/uuid": "^9.0.2", diff --git a/odd-platform-ui/pnpm-lock.yaml b/odd-platform-ui/pnpm-lock.yaml index 2b42c0aba..fb5c68e8e 100644 --- a/odd-platform-ui/pnpm-lock.yaml +++ b/odd-platform-ui/pnpm-lock.yaml @@ -135,9 +135,12 @@ dependencies: react-truncate-markup: specifier: ^5.1.2 version: 5.1.2(react@18.2.0) + recharts: + specifier: ^2.9.2 + version: 2.9.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) styled-components: - specifier: ^5.3.11 - version: 5.3.11(@babel/core@7.23.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.2.0)(react@18.2.0) use-debounce: specifier: ^9.0.4 version: 9.0.4(react@18.2.0) @@ -203,9 +206,9 @@ devDependencies: '@types/react-redux': specifier: ^7.1.25 version: 7.1.25 - '@types/styled-components': - specifier: ^5.1.26 - version: 5.1.26 + '@types/recharts': + specifier: ^1.8.26 + version: 1.8.26 '@types/testing-library__jest-dom': specifier: ^5.14.9 version: 5.14.9 @@ -302,6 +305,7 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 + dev: true /@babel/code-frame@7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} @@ -313,6 +317,7 @@ packages: /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/core@7.23.2: resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==} @@ -329,22 +334,13 @@ packages: '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - - /@babel/generator@7.22.10: - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - jsesc: 2.5.2 - dev: false + dev: true /@babel/generator@7.23.0: resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} @@ -354,13 +350,7 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 - - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.11 - dev: false + dev: true /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} @@ -371,23 +361,12 @@ packages: browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 + dev: true /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.11 - dev: false + dev: true /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} @@ -395,18 +374,21 @@ packages: dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.0 + dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.11 + dev: true /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 + dev: true /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} @@ -426,22 +408,26 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + dev: true /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 + dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.11 + dev: true /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} @@ -450,6 +436,7 @@ packages: /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} @@ -458,6 +445,7 @@ packages: /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} + dev: true /@babel/helpers@7.23.2: resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} @@ -468,6 +456,7 @@ packages: '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color + dev: true /@babel/highlight@7.22.13: resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} @@ -483,6 +472,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.11 + dev: true /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} @@ -490,16 +480,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.23.0 - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.2 - '@babel/helper-plugin-utils': 7.22.5 - dev: false + dev: true /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} @@ -540,33 +521,7 @@ packages: '@babel/code-frame': 7.22.13 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.13 - '@babel/types': 7.22.11 - dev: false - - /@babel/traverse@7.22.11(supports-color@5.5.0): - resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.13 - '@babel/types': 7.22.11 - debug: 4.3.4(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false + dev: true /@babel/traverse@7.23.2: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} @@ -580,10 +535,11 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true /@babel/types@7.22.11: resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} @@ -600,6 +556,7 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + dev: true /@date-io/core@2.17.0: resolution: {integrity: sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw==} @@ -737,14 +694,6 @@ packages: '@types/react': 18.2.20 react: 18.2.0 - /@emotion/stylis@0.8.5: - resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - dev: false - - /@emotion/unitless@0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: false - /@emotion/unitless@0.8.1: resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} @@ -979,7 +928,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 espree: 9.6.1 globals: 13.21.0 ignore: 5.2.4 @@ -1048,7 +997,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -1096,23 +1045,28 @@ packages: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.19 + dev: true /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true /@jridgewell/trace-mapping@0.3.19: resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /@mui/base@5.0.0-beta.10(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-moTAhGwFfQffj7hsu61FnqcGqVcd53A1CrOhnskM9TF0Uh2rnLDMCuar4JRUWWpaJofAfQEbQBBFPadFQLI4PA==} @@ -1681,7 +1635,6 @@ packages: /@types/d3-array@3.0.7: resolution: {integrity: sha512-4/Q0FckQ8TBjsB0VdGFemJOG8BLXUB2KKlL0VmZ+eOYeOnTb/wDRQqYWpBmQ6IlvWkXwkYiot+n9Px2aTJ7zGQ==} - dev: true /@types/d3-axis@3.0.3: resolution: {integrity: sha512-SE3x/pLO/+GIHH17mvs1uUVPkZ3bHquGzvZpPAh4yadRy71J93MJBpgK/xY8l9gT28yTN1g9v3HfGSFeBMmwZw==} @@ -1728,7 +1681,6 @@ packages: /@types/d3-ease@3.0.0: resolution: {integrity: sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==} - dev: true /@types/d3-fetch@3.0.3: resolution: {integrity: sha512-/EsDKRiQkby3Z/8/AiZq8bsuLDo/tYHnNIZkUpSeEHWV7fHUl6QFBjvMPbhkKGk9jZutzfOkGygCV7eR/MkcXA==} @@ -1760,11 +1712,9 @@ packages: /@types/d3-path@1.0.9: resolution: {integrity: sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==} - dev: false /@types/d3-path@3.0.0: resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} - dev: true /@types/d3-polygon@3.0.0: resolution: {integrity: sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==} @@ -1792,7 +1742,6 @@ packages: resolution: {integrity: sha512-eq1ZeTj0yr72L8MQk6N6heP603ubnywSDRfNpi5enouR112HzGLS6RIvExCzZTraFF4HdzNpJMwA/zGiMoHUUw==} dependencies: '@types/d3-time': 3.0.0 - dev: true /@types/d3-selection@3.0.5: resolution: {integrity: sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==} @@ -1802,13 +1751,11 @@ packages: resolution: {integrity: sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==} dependencies: '@types/d3-path': 1.0.9 - dev: false /@types/d3-shape@3.1.1: resolution: {integrity: sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==} dependencies: '@types/d3-path': 3.0.0 - dev: true /@types/d3-time-format@2.1.0: resolution: {integrity: sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==} @@ -1823,7 +1770,6 @@ packages: /@types/d3-timer@3.0.0: resolution: {integrity: sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==} - dev: true /@types/d3-transition@3.0.4: resolution: {integrity: sha512-512a4uCOjUzsebydItSXsHrPeQblCVk8IKjqCUmrlvBWkkVh3donTTxmURDo1YPwIVDh5YVwCAO6gR4sgimCPQ==} @@ -2021,6 +1967,13 @@ packages: '@types/scheduler': 0.16.3 csstype: 3.1.2 + /@types/recharts@1.8.26: + resolution: {integrity: sha512-aQj6sPwcklOtLl/tpbs1i33YaIQnmIZjxm5yzvV0BnzgDAp039AfuGDZOT5kochG6MyIdyIMzoSu49aBSJAqow==} + dependencies: + '@types/d3-shape': 1.3.8 + '@types/react': 18.2.20 + dev: true + /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} @@ -2032,13 +1985,9 @@ packages: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/styled-components@5.1.26: - resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} - dependencies: - '@types/hoist-non-react-statics': 3.3.1 - '@types/react': 18.2.20 - csstype: 3.1.2 - dev: true + /@types/stylis@4.2.2: + resolution: {integrity: sha512-Rm17MsTpQQP5Jq4BF7CdrxJsDufoiL/q5IbJZYZmOZAJALyijgF7BzLgobXUqraNcQdqFYLYGeglDp6QzaxPpg==} + dev: false /@types/testing-library__jest-dom@5.14.9: resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} @@ -2084,7 +2033,7 @@ packages: '@typescript-eslint/type-utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.9.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 eslint: 8.52.0 graphemer: 1.4.0 ignore: 5.2.4 @@ -2110,7 +2059,7 @@ packages: '@typescript-eslint/types': 6.9.1 '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.9.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 eslint: 8.52.0 typescript: 5.2.2 transitivePeerDependencies: @@ -2137,7 +2086,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 6.9.1(typescript@5.2.2) '@typescript-eslint/utils': 6.9.1(eslint@8.52.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 eslint: 8.52.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 @@ -2161,7 +2110,7 @@ packages: dependencies: '@typescript-eslint/types': 6.9.1 '@typescript-eslint/visitor-keys': 6.9.1 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 @@ -2509,7 +2458,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true @@ -2752,21 +2701,6 @@ packages: cosmiconfig: 7.1.0 resolve: 1.22.4 - /babel-plugin-styled-components@2.1.4(@babel/core@7.23.2)(styled-components@5.3.11): - resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} - peerDependencies: - styled-components: '>= 2' - dependencies: - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) - lodash: 4.17.21 - picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.23.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) - transitivePeerDependencies: - - '@babel/core' - dev: false - /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false @@ -2838,6 +2772,7 @@ packages: electron-to-chromium: 1.4.504 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: true /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -2875,6 +2810,7 @@ packages: /caniuse-lite@1.0.30001524: resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} + dev: true /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3077,6 +3013,7 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3307,7 +3244,7 @@ packages: ms: 2.1.3 dev: true - /debug@4.3.4(supports-color@5.5.0): + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -3317,7 +3254,10 @@ packages: optional: true dependencies: ms: 2.1.2 - supports-color: 5.5.0 + + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -3482,6 +3422,12 @@ packages: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dev: true + /dom-helpers@3.4.0: + resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} + dependencies: + '@babel/runtime': 7.23.2 + dev: false + /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: @@ -3529,6 +3475,7 @@ packages: /electron-to-chromium@1.4.504: resolution: {integrity: sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==} + dev: true /elkjs@0.8.2: resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} @@ -3690,6 +3637,7 @@ packages: /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -3961,7 +3909,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -4031,6 +3979,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: true @@ -4102,6 +4054,11 @@ packages: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true + /fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + dev: false + /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} dev: true @@ -4242,6 +4199,7 @@ packages: /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + dev: true /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -4320,6 +4278,7 @@ packages: /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + dev: true /globals@13.21.0: resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} @@ -4615,7 +4574,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true @@ -4625,7 +4584,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true @@ -5195,6 +5154,7 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + dev: true /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -5226,6 +5186,7 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + dev: true /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} @@ -5311,7 +5272,7 @@ packages: dependencies: chalk: 5.3.0 commander: 11.1.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 execa: 8.0.1 lilconfig: 2.1.0 listr2: 7.0.2 @@ -5393,6 +5354,7 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 + dev: true /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -5792,7 +5754,7 @@ packages: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.8 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -5881,7 +5843,6 @@ packages: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5893,6 +5854,7 @@ packages: /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -6153,6 +6115,7 @@ packages: /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + dev: true /pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} @@ -6181,6 +6144,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -6355,6 +6327,10 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + dev: false + /react-markdown@8.0.7(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} peerDependencies: @@ -6437,6 +6413,17 @@ packages: engines: {node: '>=0.10.0'} dev: true + /react-resize-detector@8.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /react-router-dom@6.17.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==} engines: {node: '>=14.0.0'} @@ -6460,6 +6447,34 @@ packages: react: 18.2.0 dev: false + /react-smooth@2.0.5(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==} + peerDependencies: + prop-types: ^15.6.0 + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + fast-equals: 5.0.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 2.9.0(react-dom@18.2.0)(react@18.2.0) + dev: false + + /react-transition-group@2.9.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==} + peerDependencies: + react: '>=15.0.0' + react-dom: '>=15.0.0' + dependencies: + dom-helpers: 3.4.0 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-lifecycles-compat: 3.0.4 + dev: false + /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -6520,6 +6535,34 @@ packages: picomatch: 2.3.1 dev: true + /recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + dependencies: + decimal.js-light: 2.5.1 + dev: false + + /recharts@2.9.2(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ig0zYgO5nUP/896GW16b9yy2sHIRW1AHB90x48hypFTSjjxQt/J9rPzlLJjgNupzJKEHPCwMi1VnvN/k20K45w==} + engines: {node: '>=12'} + peerDependencies: + prop-types: ^15.6.0 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + classnames: 2.3.2 + eventemitter3: 4.0.7 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 16.13.1 + react-resize-detector: 8.1.0(react-dom@18.2.0)(react@18.2.0) + react-smooth: 2.0.5(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + recharts-scale: 0.4.5 + tiny-invariant: 1.3.1 + victory-vendor: 36.6.12 + dev: false + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -6901,6 +6944,7 @@ packages: /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + dev: true /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -6984,7 +7028,6 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - dev: true /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} @@ -7169,34 +7212,33 @@ packages: inline-style-parser: 0.1.1 dev: false - /styled-components@5.3.11(@babel/core@7.23.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} - engines: {node: '>=10'} + /styled-components@6.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VWNfYYBuXzuLS/QYEeoPgMErP26WL+dX9//rEh80B2mmlS1yRxRxuL5eax4m6ybYEUoHWlTy2XOU32767mlMkg==} + engines: {node: '>= 16'} peerDependencies: react: '>= 16.8.0' react-dom: '>= 16.8.0' - react-is: '>= 16.8.0' dependencies: - '@babel/helper-module-imports': 7.22.5 - '@babel/traverse': 7.22.11(supports-color@5.5.0) '@emotion/is-prop-valid': 1.2.1 - '@emotion/stylis': 0.8.5 - '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.23.2)(styled-components@5.3.11) + '@emotion/unitless': 0.8.1 + '@types/stylis': 4.2.2 css-to-react-native: 3.2.0 - hoist-non-react-statics: 3.3.2 + csstype: 3.1.2 + postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-is: 18.2.0 shallowequal: 1.1.0 - supports-color: 5.5.0 - transitivePeerDependencies: - - '@babel/core' + stylis: 4.3.0 + tslib: 2.6.2 dev: false /stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + /stylis@4.3.0: + resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -7256,7 +7298,6 @@ packages: /tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: true /tinybench@2.5.0: resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} @@ -7353,7 +7394,6 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -7528,6 +7568,7 @@ packages: browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 + dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -7610,6 +7651,25 @@ packages: vfile-message: 3.1.4 dev: false + /victory-vendor@36.6.12: + resolution: {integrity: sha512-pJrTkNHln+D83vDCCSUf0ZfxBvIaVrFHmrBOsnnLAbdqfudRACAj51He2zU94/IWq9464oTADcPVkmWAfNMwgA==} + dependencies: + '@types/d3-array': 3.0.7 + '@types/d3-ease': 3.0.0 + '@types/d3-interpolate': 3.0.1 + '@types/d3-scale': 4.0.4 + '@types/d3-shape': 3.1.1 + '@types/d3-time': 3.0.0 + '@types/d3-timer': 3.0.0 + d3-array: 3.2.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + dev: false + /vinyl-contents@2.0.0: resolution: {integrity: sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==} engines: {node: '>=10.13.0'} @@ -7667,7 +7727,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 mlly: 1.4.1 pathe: 1.1.1 picocolors: 1.0.0 @@ -7744,7 +7804,7 @@ packages: vite: optional: true dependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.2.2) vite: 4.5.0(@types/node@20.6.2) @@ -7832,7 +7892,7 @@ packages: acorn-walk: 8.2.0 cac: 6.7.14 chai: 4.3.10 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 jsdom: 22.1.0 local-pkg: 0.4.3 magic-string: 0.30.5 @@ -8047,6 +8107,7 @@ packages: /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} diff --git a/odd-platform-ui/src/components/App.tsx b/odd-platform-ui/src/components/App.tsx index ad038967e..9c136dc1f 100644 --- a/odd-platform-ui/src/components/App.tsx +++ b/odd-platform-ui/src/components/App.tsx @@ -26,6 +26,7 @@ const TermSearch = lazy(() => import('./Terms/TermSearch/TermSearch')); const Alerts = lazy(() => import('./Alerts/Alerts')); const Activity = lazy(() => import('./Activity/Activity')); const DirectoryRoutes = lazy(() => import('./Directory/DirectoryRoutes')); +const DataQuality = lazy(() => import('./DataQuality/DataQuality')); const App: React.FC = () => { const dispatch = useAppDispatch(); @@ -93,7 +94,7 @@ const App: React.FC = () => { /> Data Quality} + element={} /> diff --git a/odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Node/LoadMoreButton/LoadMoreButtonStyles.ts b/odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Node/LoadMoreButton/LoadMoreButtonStyles.ts index cf1ab95f0..de3f2cba8 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Node/LoadMoreButton/LoadMoreButtonStyles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Node/LoadMoreButton/LoadMoreButtonStyles.ts @@ -1,4 +1,4 @@ -import styled from 'styled-components'; +import styled, { css, keyframes } from 'styled-components'; import { Group } from '@visx/group'; export const LoadMoreButton = styled(Group)(({ theme }) => ({ @@ -12,28 +12,31 @@ export const LoadMoreButton = styled(Group)(({ theme }) => ({ }, })); -export const LoadMoreSpinner = styled('circle')(({ theme }) => ({ - fill: 'transparent', - strokeWidth: 2, - strokeDasharray: 2 * Math.PI * 8, - stroke: theme.palette.border.element, - strokeLinecap: 'round', - animation: 'dash 1.5s ease-in-out infinite', - '@keyframes dash': { - '0%': { - strokeDasharray: '1, 150', - strokeDashoffset: 0, - }, - '50%': { - strokeDasharray: '90, 150', - strokeDashoffset: -35, - }, - '100%': { - strokeDasharray: '90, 150', - strokeDashoffset: -124, - }, - }, -})); +const dash = keyframes` + 0% { + stroke-dasharray: 1, 150; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -35; + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -124; + } +`; + +export const LoadMoreSpinner = styled.circle( + ({ theme }) => css` + fill: transparent; + stroke-width: 2; + stroke-dasharray: ${2 * Math.PI * 8}; + stroke: ${theme.palette.border.element}; + stroke-linecap: round; + animation: ${dash} 1.5s ease-in-out infinite; + ` +); export const LoadMoreSpinnerBackground = styled('circle')(({ theme }) => ({ fill: 'transparent', diff --git a/odd-platform-ui/src/components/DataQuality/DataQuality.styles.ts b/odd-platform-ui/src/components/DataQuality/DataQuality.styles.ts new file mode 100644 index 000000000..bea467acb --- /dev/null +++ b/odd-platform-ui/src/components/DataQuality/DataQuality.styles.ts @@ -0,0 +1,48 @@ +import styled, { css } from 'styled-components'; +import type { DataEntityRunStatus } from 'generated-sources'; + +export const Container = styled.section( + ({ theme }) => css` + display: grid; + justify-content: center; + margin-top: ${theme.spacing(5)}; + gap: ${theme.spacing(3)}; + ` +); + +export const SectionWrapper = styled.div( + ({ theme }) => css` + display: flex; + padding: ${theme.spacing(3)}; + border: 1px solid ${theme.palette.border.primary}; + border-radius: ${theme.spacing(1)}; + ` +); + +export const DashboardLegend = styled.div( + ({ theme }) => css` + display: flex; + justify-content: space-between; + gap: ${theme.spacing(4)}; + ` +); + +interface DashboardLegendItemProps { + $status: DataEntityRunStatus; +} + +export const DashboardLegendItem = styled.span( + ({ theme, $status }) => css` + display: flex; + align-items: center; + gap: ${theme.spacing(1)}; + + &::before { + content: ''; + width: ${theme.spacing(1)}; + height: ${theme.spacing(1)}; + background-color: ${theme.palette.runStatus[$status].color}; + border-radius: 50%; + } + ` +); diff --git a/odd-platform-ui/src/components/DataQuality/DataQuality.tsx b/odd-platform-ui/src/components/DataQuality/DataQuality.tsx new file mode 100644 index 000000000..a514b2570 --- /dev/null +++ b/odd-platform-ui/src/components/DataQuality/DataQuality.tsx @@ -0,0 +1,74 @@ +import React, { useMemo } from 'react'; +import type { DataQualityCategoryResults } from 'generated-sources'; +import { DataEntityRunStatus } from 'generated-sources'; +import { Typography } from '@mui/material'; +import { useGetDataQualityDashboard } from 'lib/hooks/api/dataQuality'; +import { DonutChart } from 'components/shared/elements'; +import { useTheme } from 'styled-components'; +import { useTranslation } from 'react-i18next'; +import * as S from './DataQuality.styles'; + +function capitalizeFirstLetter(str: string) { + return [...str][0].toUpperCase() + str.slice(1); +} + +function calcTestResultsBreakdown(categoryResults: DataQualityCategoryResults[]) { + return categoryResults.reduce( + ({ statusCounts, total }, { results }) => { + results.forEach(({ status, count }) => { + statusCounts.set(status, (statusCounts.get(status) ?? 0) + count); + total += count; + }); + return { statusCounts, total }; + }, + { + statusCounts: new Map(), + total: 0, + } + ); +} + +const DataQuality: React.FC = () => { + const { data, isSuccess } = useGetDataQualityDashboard(); + const { palette } = useTheme(); + const { t } = useTranslation(); + + const testResultsBreakdownChartData = useMemo(() => { + if (!data) return []; + const breakdown = calcTestResultsBreakdown(data.testResults); + return Array.from(breakdown.statusCounts.entries()).map(([status, count]) => ({ + title: status, + value: count, + color: palette.runStatus[status].color, + })); + }, [data?.testResults]); + + return ( + + + + {Object.values(DataEntityRunStatus).map(status => ( + + + {capitalizeFirstLetter(status.toLowerCase())} + + + ))} + + {isSuccess ? ( + + ) : null} + + Table Monitor Section + + ); +}; + +export default DataQuality; diff --git a/odd-platform-ui/src/components/Overview/DataEntitiesUsageInfo/DataEntityUsageInfoView/DataEntityUsageInfoCard/DataEntitiesUsageInfoCard.styles.ts b/odd-platform-ui/src/components/Overview/DataEntitiesUsageInfo/DataEntityUsageInfoView/DataEntityUsageInfoCard/DataEntitiesUsageInfoCard.styles.ts index 885d747b4..3769ce9f2 100644 --- a/odd-platform-ui/src/components/Overview/DataEntitiesUsageInfo/DataEntityUsageInfoView/DataEntityUsageInfoCard/DataEntitiesUsageInfoCard.styles.ts +++ b/odd-platform-ui/src/components/Overview/DataEntitiesUsageInfo/DataEntityUsageInfoView/DataEntityUsageInfoCard/DataEntitiesUsageInfoCard.styles.ts @@ -21,7 +21,7 @@ export const Container = styled('div')( display: 'flex', flexDirection: 'column', width: '100%', - } as CSSObject) + }) as CSSObject ); export const ClassHeaderContainer = styled('div')( @@ -30,7 +30,7 @@ export const ClassHeaderContainer = styled('div')( display: 'flex', flexWrap: 'nowrap', justifyContent: 'space-between', - } as CSSObject) + }) as CSSObject ); export const Header = styled('div')(({ theme }) => ({ @@ -56,7 +56,7 @@ export const TypeListContainer = styled('div')(({ theme }) => ({ marginLeft: theme.spacing(0.5), })); -export const TypeItem = styled('div')(({ theme }) => ({ +export const TypeItem = styled.div(({ theme }) => ({ display: 'flex', justifyContent: 'space-between', padding: theme.spacing(0, 0.25), @@ -66,7 +66,6 @@ export const TypeItem = styled('div')(({ theme }) => ({ position: 'relative', '&:hover': { backgroundColor: theme.palette.backgrounds.primary }, '&:active': { backgroundColor: theme.palette.backgrounds.secondary }, - '&::after': { content: '""', position: 'absolute', @@ -77,6 +76,5 @@ export const TypeItem = styled('div')(({ theme }) => ({ right: '-6px', top: '42%', }, - - '&:last-child': { '&::after': { display: 'none' } }, + '&:last-child::after': { display: 'none' }, })); diff --git a/odd-platform-ui/src/components/shared/elements/AppRadio/AppRadioStyles.ts b/odd-platform-ui/src/components/shared/elements/AppRadio/AppRadioStyles.ts index 13d38d953..6393b7910 100644 --- a/odd-platform-ui/src/components/shared/elements/AppRadio/AppRadioStyles.ts +++ b/odd-platform-ui/src/components/shared/elements/AppRadio/AppRadioStyles.ts @@ -1,11 +1,15 @@ import { Radio, radioClasses } from '@mui/material'; -import styled from 'styled-components'; +import styled, { css } from 'styled-components'; -export const StyledRadio = styled(Radio)(() => ({ - [`&.${radioClasses.root}`]: { - '&:hover': { backgroundColor: 'unset' }, - }, -})); +export const StyledRadio = styled(Radio)( + () => css` + &.${radioClasses.root} { + &:hover { + background-color: unset; + } + } + ` +); const iconStyles = { borderRadius: '50%', diff --git a/odd-platform-ui/src/components/shared/elements/DonutChart/DonutChart.tsx b/odd-platform-ui/src/components/shared/elements/DonutChart/DonutChart.tsx new file mode 100644 index 000000000..aa01a71fc --- /dev/null +++ b/odd-platform-ui/src/components/shared/elements/DonutChart/DonutChart.tsx @@ -0,0 +1,119 @@ +import React, { forwardRef, useMemo } from 'react'; +import { PieChart, Pie, Cell, Text, Label } from 'recharts'; +import type { LabelProps, type PieLabelRenderProps } from 'recharts'; +import { typography } from 'theme/typography'; +import type { PolarViewBox } from 'recharts/types/util/types'; +import { palette } from 'theme/palette'; + +interface DonutChartData { + title: string; + value: number; + color?: string; +} + +interface DonutChartProps extends Omit, 'data'> { + data: DonutChartData[]; + label?: string; +} +const RADIAN = Math.PI / 180; +const CustomLabel = ({ + cx, + cy, + midAngle, + innerRadius, + outerRadius, + value, + color, +}: PieLabelRenderProps) => { + const radius = + Number(outerRadius) + + (Number(outerRadius) - Number(innerRadius)) * Math.abs(Math.cos(RADIAN)); + const x = Number(cx) + radius * Math.cos(-midAngle * RADIAN); + const y = Number(cy) + radius * Math.sin(-midAngle * RADIAN); + + return ( + + {value} + + ); +}; + +const CustomPieLabel = ({ viewBox, value, label }: LabelProps & { label?: string }) => { + const { cx, cy } = viewBox as PolarViewBox; + return ( + <> + + {label} + + + {value} + + + ); +}; + +const DonutChart: React.FC = props => { + const { data, label, ...pieChartProps } = props; + const { width, height, innerRadius, outerRadius } = pieChartProps; + const totalValue = useMemo( + () => data.reduce((acc, { value }) => acc + value, 0), + [data] + ); + + return ( + + + + + ); +}; + +export default DonutChart; diff --git a/odd-platform-ui/src/components/shared/elements/Input/Input.styles.ts b/odd-platform-ui/src/components/shared/elements/Input/Input.styles.ts index 15a542cad..a6d0b3e6b 100644 --- a/odd-platform-ui/src/components/shared/elements/Input/Input.styles.ts +++ b/odd-platform-ui/src/components/shared/elements/Input/Input.styles.ts @@ -10,7 +10,9 @@ export const Container = styled(Box)<{ $maxWidth?: number }>(({ $maxWidth }) => maxWidth: $maxWidth !== undefined ? `${$maxWidth}px` : 'auto', })); -export const Input = styled('input')<{ +export const Input = styled.input.withConfig({ + shouldForwardProp: prop => !['inputProps', 'inputContainerRef'].includes(prop), +})<{ $type: InputType; $size: InputSize; $isError: boolean; diff --git a/odd-platform-ui/src/components/shared/elements/index.ts b/odd-platform-ui/src/components/shared/elements/index.ts index 21941238c..9caed2a20 100644 --- a/odd-platform-ui/src/components/shared/elements/index.ts +++ b/odd-platform-ui/src/components/shared/elements/index.ts @@ -78,3 +78,4 @@ export { default as BreadCrumbs } from './BreadCrumbs/BreadCrumbs'; export { default as TruncatedList } from './TruncatedList/TruncatedList'; export { default as IconicInfoBadge } from './IconicInfoBadge/IconicInfoBadge'; export { default as MetadataStale } from './MetadataStale/MetadataStale'; +export { default as DonutChart } from './DonutChart/DonutChart'; diff --git a/odd-platform-ui/src/index.tsx b/odd-platform-ui/src/index.tsx index 10cb22150..f845076e8 100644 --- a/odd-platform-ui/src/index.tsx +++ b/odd-platform-ui/src/index.tsx @@ -59,7 +59,7 @@ root.render( - + diff --git a/odd-platform-ui/src/lib/api.ts b/odd-platform-ui/src/lib/api.ts index ca9135ea9..f2862ada0 100644 --- a/odd-platform-ui/src/lib/api.ts +++ b/odd-platform-ui/src/lib/api.ts @@ -29,6 +29,7 @@ import { TitleApi, IntegrationApi, DirectoryApi, + DataQualityRunsApi, } from 'generated-sources'; const HEADERS: ConfigurationParameters = { @@ -72,3 +73,4 @@ export const integrationApi = new IntegrationApi(apiConf); export const dataEntityAttachmentApi = new DataEntityAttachmentApi(apiConf); export const dataEntityFileUploadApi = new DataEntityAttachmentApi(fileUploadConf); export const directoryApi = new DirectoryApi(apiConf); +export const dataQualityRunsApi = new DataQualityRunsApi(apiConf); diff --git a/odd-platform-ui/src/lib/hooks/api/dataQuality.ts b/odd-platform-ui/src/lib/hooks/api/dataQuality.ts new file mode 100644 index 000000000..b2c4340d0 --- /dev/null +++ b/odd-platform-ui/src/lib/hooks/api/dataQuality.ts @@ -0,0 +1,9 @@ +import { useQuery } from '@tanstack/react-query'; +import { dataQualityRunsApi } from 'lib/api'; + +export function useGetDataQualityDashboard() { + return useQuery({ + queryKey: ['dataQualityDashboard'], + queryFn: async () => dataQualityRunsApi.getDataQualityTestsRuns(), + }); +} From 99b99f2eead4806c0460300942965064ae79696d Mon Sep 17 00:00:00 2001 From: Andrey Nenashev Date: Tue, 7 Nov 2023 14:40:02 +0100 Subject: [PATCH 10/14] feature(fe): data quality dashboard --- .../DataQuality/DataQuality.styles.ts | 29 ++++- .../components/DataQuality/DataQuality.tsx | 102 ++++++++++++++++-- .../TestResults/TestCategoryResults.styles.ts | 36 +++++++ .../TestResults/TestCategoryResults.tsx | 48 +++++++++ .../shared/elements/DonutChart/DonutChart.tsx | 4 +- odd-platform-ui/src/theme/interfaces.ts | 5 + odd-platform-ui/src/theme/palette.ts | 1 + odd-platform-ui/src/theme/typography.ts | 13 +++ 8 files changed, 226 insertions(+), 12 deletions(-) create mode 100644 odd-platform-ui/src/components/DataQuality/TestResults/TestCategoryResults.styles.ts create mode 100644 odd-platform-ui/src/components/DataQuality/TestResults/TestCategoryResults.tsx diff --git a/odd-platform-ui/src/components/DataQuality/DataQuality.styles.ts b/odd-platform-ui/src/components/DataQuality/DataQuality.styles.ts index bea467acb..70d53039c 100644 --- a/odd-platform-ui/src/components/DataQuality/DataQuality.styles.ts +++ b/odd-platform-ui/src/components/DataQuality/DataQuality.styles.ts @@ -10,23 +10,48 @@ export const Container = styled.section( ` ); -export const SectionWrapper = styled.div( +export const Section = styled.div( ({ theme }) => css` display: flex; + flex-direction: column; + width: fit-content; padding: ${theme.spacing(3)}; border: 1px solid ${theme.palette.border.primary}; border-radius: ${theme.spacing(1)}; + gap: ${theme.spacing(2)}; + ` +); + +interface FlexDirection { + $direction?: 'column' | 'row'; +} + +export const SubSection = styled.div( + ({ theme, $direction = 'row' }) => css` + display: flex; + flex-direction: ${$direction}; + gap: ${theme.spacing(3)}; ` ); export const DashboardLegend = styled.div( ({ theme }) => css` display: flex; - justify-content: space-between; gap: ${theme.spacing(4)}; ` ); +export const ChartWrapper = styled.div( + ({ theme }) => css` + display: flex; + flex-direction: column; + justify-content: space-evenly; + padding-top: ${theme.spacing(2)}; + background: ${theme.palette.backgrounds.tertiary}; + border-radius: ${theme.spacing(1)}; + ` +); + interface DashboardLegendItemProps { $status: DataEntityRunStatus; } diff --git a/odd-platform-ui/src/components/DataQuality/DataQuality.tsx b/odd-platform-ui/src/components/DataQuality/DataQuality.tsx index a514b2570..0158d0b0b 100644 --- a/odd-platform-ui/src/components/DataQuality/DataQuality.tsx +++ b/odd-platform-ui/src/components/DataQuality/DataQuality.tsx @@ -7,6 +7,7 @@ import { DonutChart } from 'components/shared/elements'; import { useTheme } from 'styled-components'; import { useTranslation } from 'react-i18next'; import * as S from './DataQuality.styles'; +import TestCategoryResults from './TestResults/TestCategoryResults'; function capitalizeFirstLetter(str: string) { return [...str][0].toUpperCase() + str.slice(1); @@ -43,30 +44,115 @@ const DataQuality: React.FC = () => { })); }, [data?.testResults]); + const tableHealthData = useMemo(() => { + if (!data) return []; + return [ + { + title: 'Healthy', + value: 10, + color: palette.runStatus.SUCCESS.color, + }, + { + title: 'Unhealthy', + value: 5, + color: palette.runStatus.FAILED.color, + }, + { + title: 'Unknown', + value: 2, + color: palette.runStatus.BROKEN.color, + }, + ]; + }, [data?.testResults]); + + const tableMonitoredTables = useMemo(() => { + if (!data) return []; + return [ + { + title: 'Monitored', + value: 10, + color: palette.runStatus.SUCCESS.color, + }, + { + title: 'Not Monitored', + value: 5, + color: palette.runStatus.UNKNOWN.color, + }, + ]; + }, [data?.testResults]); + + const testResults = useMemo(() => { + if (!data) return []; + return data.testResults.sort(({ category: a }, { category: b }) => + a.localeCompare(b) + ); + }, [data?.testResults]); + return ( - + {Object.values(DataEntityRunStatus).map(status => ( - + {capitalizeFirstLetter(status.toLowerCase())} ))} - {isSuccess ? ( + + + + {t('Table Health')} + + + + + + {t('Test Results Breakdown')} + + + + + {isSuccess && + testResults.map(categoryResults => ( + + ))} + + + + + + + {t('Monitored Tables')} + - ) : null} - - Table Monitor Section + + ); }; diff --git a/odd-platform-ui/src/components/DataQuality/TestResults/TestCategoryResults.styles.ts b/odd-platform-ui/src/components/DataQuality/TestResults/TestCategoryResults.styles.ts new file mode 100644 index 000000000..72ebf68db --- /dev/null +++ b/odd-platform-ui/src/components/DataQuality/TestResults/TestCategoryResults.styles.ts @@ -0,0 +1,36 @@ +import type { DataEntityRunStatus } from 'generated-sources'; +import styled, { css } from 'styled-components'; + +export const TestCategoryResultsWrapper = styled.div( + ({ theme }) => css` + display: flex; + justify-content: space-between; + align-items: center; + width: 560px; + background: ${theme.palette.backgrounds.tertiary}; + padding: ${theme.spacing(1)} ${theme.spacing(2)}; + border-radius: ${theme.spacing(1)}; + ` +); + +export const TestCategoryResults = styled.div( + ({ theme }) => css` + display: flex; + align-items: center; + gap: ${theme.spacing(1)}; + ` +); + +interface Status { + $status: DataEntityRunStatus; +} +export const TestCategoryResultsItem = styled.div( + ({ theme, $status }) => css` + text-align: center; + width: ${theme.spacing(5)}; + padding: ${theme.spacing(1 / 2)} ${theme.spacing(1)}; + border-radius: ${theme.spacing(1 / 2)}; + color: ${theme.palette.runStatus[$status].color}; + background: ${theme.palette.backgrounds.default}; + ` +); diff --git a/odd-platform-ui/src/components/DataQuality/TestResults/TestCategoryResults.tsx b/odd-platform-ui/src/components/DataQuality/TestResults/TestCategoryResults.tsx new file mode 100644 index 000000000..ca3cbce96 --- /dev/null +++ b/odd-platform-ui/src/components/DataQuality/TestResults/TestCategoryResults.tsx @@ -0,0 +1,48 @@ +import { Typography } from '@mui/material'; +import React, { useMemo } from 'react'; +import type { DataQualityCategoryResults } from 'generated-sources'; +import { DataEntityRunStatus } from 'generated-sources'; +import * as S from './TestCategoryResults.styles'; + +interface TestCategoryResultsProps { + categoryResults: DataQualityCategoryResults; +} + +const TestCategoryResults = ({ categoryResults }: TestCategoryResultsProps) => { + const { category, results } = categoryResults; + + const total = useMemo( + () => results.reduce((acc, { count }) => acc + count, 0), + [results] + ); + + const sortedResults = useMemo( + () => + Object.values(DataEntityRunStatus) + .map(status => results.find(result => result.status === status)) + .flatMap(f => (f ? [f] : [])), + [results] + ); + + return ( + + + {category} + + + + {total} + + {sortedResults.map(({ status, count }) => ( + + + {count > 0 ? count : '\u2013'} + + + ))} + + + ); +}; + +export default TestCategoryResults; diff --git a/odd-platform-ui/src/components/shared/elements/DonutChart/DonutChart.tsx b/odd-platform-ui/src/components/shared/elements/DonutChart/DonutChart.tsx index aa01a71fc..e2c76477b 100644 --- a/odd-platform-ui/src/components/shared/elements/DonutChart/DonutChart.tsx +++ b/odd-platform-ui/src/components/shared/elements/DonutChart/DonutChart.tsx @@ -1,6 +1,6 @@ -import React, { forwardRef, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { PieChart, Pie, Cell, Text, Label } from 'recharts'; -import type { LabelProps, type PieLabelRenderProps } from 'recharts'; +import type { LabelProps, PieLabelRenderProps } from 'recharts'; import { typography } from 'theme/typography'; import type { PolarViewBox } from 'recharts/types/util/types'; import { palette } from 'theme/palette'; diff --git a/odd-platform-ui/src/theme/interfaces.ts b/odd-platform-ui/src/theme/interfaces.ts index 8ff1abea7..daed31021 100644 --- a/odd-platform-ui/src/theme/interfaces.ts +++ b/odd-platform-ui/src/theme/interfaces.ts @@ -55,6 +55,7 @@ type EntityStatus = Record; interface TextType { primary: string; secondary: string; + secondaryVariant: string; info: string; hint: string; action: string; @@ -169,6 +170,8 @@ declare module '@mui/material/styles/createTypography' { interface TypographyOptions extends Record { errorCode?: TypographyStyleOptions; totalCountTitle?: TypographyStyleOptions; + label?: TypographyStyleOptions; + title?: TypographyStyleOptions; h0?: TypographyStyleOptions; } } @@ -176,6 +179,8 @@ declare module '@mui/material/Typography/Typography' { interface TypographyPropsVariantOverrides extends Record { errorCode: true; totalCountTitle: true; + label: true; + title: true; h0: true; } } diff --git a/odd-platform-ui/src/theme/palette.ts b/odd-platform-ui/src/theme/palette.ts index eb96886f6..733e717b3 100644 --- a/odd-platform-ui/src/theme/palette.ts +++ b/odd-platform-ui/src/theme/palette.ts @@ -76,6 +76,7 @@ export const palette = createPalette({ texts: { primary: colors.black90, secondary: colors.black50, + secondaryVariant: colors.black40, hint: colors.black30, info: colors.black70, action: colors.blue60, diff --git a/odd-platform-ui/src/theme/typography.ts b/odd-platform-ui/src/theme/typography.ts index a2805c0e6..7bf546c87 100644 --- a/odd-platform-ui/src/theme/typography.ts +++ b/odd-platform-ui/src/theme/typography.ts @@ -62,6 +62,13 @@ export const typography = createTypography(palette, { lineHeight: pxToRem(16), fontWeight: 500, }, + title: { + fontSize: pxToRem(14), + lineHeight: pxToRem(20), + color: palette.texts.secondary, + fontWeight: 500, + ...breakpointDownLgBody2, + }, subtitle1: { fontSize: pxToRem(14), lineHeight: pxToRem(20), @@ -105,6 +112,12 @@ export const typography = createTypography(palette, { lineHeight: pxToRem(36), fontWeight: 500, }, + label: { + fontSize: pxToRem(14), + lineHeight: pxToRem(20), + fontWeight: 400, + color: palette.texts.secondaryVariant, + }, ...mapKeysToValue( [ getButtonFontType('main', 'lg'), From 9ed8e16ba16679a46656d00f4ebb20d0c31dbf41 Mon Sep 17 00:00:00 2001 From: Andrey Nenashev Date: Tue, 7 Nov 2023 15:30:18 +0100 Subject: [PATCH 11/14] feature(fe): monitored tables dashboard. Linter fixes --- .../AlertsList/AlertItem/AlertItemStyles.ts | 2 +- .../Alerts/AlertsList/AlertsList.tsx | 4 +- .../DataCollaborationStyles.ts | 2 +- .../ActivityItem/ActivityItem.tsx | 10 +- .../ActivityItem/ActivityItemStyles.ts | 4 +- .../DataEntityAlertItemStyles.ts | 2 +- .../DatasetStructureCompareListItem.styles.ts | 2 +- .../DatasetFieldTagsStyles.ts | 2 +- .../TagsEditForm/TagsEditFormStyles.ts | 2 +- .../DatasetStructureList.styles.ts | 2 +- .../Lineage/DEGLineage/DEGLineage.styles.ts | 2 +- .../EdgesRenderer/EdgesRenderer.styles.ts | 2 +- .../ZoomableDEGLineage.styles.ts | 4 +- .../DEGLineage/components/Node/Node.styles.ts | 2 +- .../Node/NodeTitle/NodeTitleStyles.ts | 2 +- .../OverviewDQSLAReportStyles.ts | 2 +- .../OverviewDataConsumerStats.tsx | 22 +- .../OverviewDataInputStats.tsx | 20 +- .../OverviewEntityGroupItems.styles.ts | 4 +- .../OverviewQualityTestStats.tsx | 20 +- .../OverviewTransformerStats.tsx | 40 +-- .../OverviewTags/OverviewTagsStyles.ts | 2 +- .../TagsEditForm/TagsEditFormStyles.ts | 2 +- .../components/DataQuality/DataQuality.tsx | 62 +++-- .../DirectoryItem/DirectoryItem.styles.ts | 2 +- .../src/components/Directory/shared/styles.ts | 2 +- .../EditableOwnerItemStyles.ts | 2 +- .../RolesList/RoleItem/RoleItemStyles.ts | 2 +- .../OwnerAssociationStyles.ts | 2 +- .../ActivityFieldStateStyles.ts | 2 +- .../AlertActivityField/AlertActivityField.tsx | 2 +- .../OwnerActivityField/OwnerActivityField.tsx | 13 +- .../AppCircularProgressStyles.ts | 2 +- .../elements/AppJSONEditor/AppJSONEditor.tsx | 2 +- .../AppLoadingPage/AppLoadingPageStyles.ts | 2 +- .../elements/AppPopover/AppPopoverStyles.ts | 2 +- .../shared/elements/Button/Button.styles.ts | 240 +++++++++--------- .../CollapsibleInfoContainer.styles.ts | 2 +- .../shared/elements/DonutChart/DonutChart.tsx | 15 +- .../elements/FileInput/FileInput.styles.ts | 4 +- .../dataEntityAttachments/dataEntityFiles.ts | 5 +- .../src/redux/interfaces/dataentityLineage.ts | 4 +- odd-platform-ui/src/redux/lib/helpers.ts | 4 +- 43 files changed, 280 insertions(+), 247 deletions(-) diff --git a/odd-platform-ui/src/components/Alerts/AlertsList/AlertItem/AlertItemStyles.ts b/odd-platform-ui/src/components/Alerts/AlertsList/AlertItem/AlertItemStyles.ts index 08c041720..1345141b8 100644 --- a/odd-platform-ui/src/components/Alerts/AlertsList/AlertItem/AlertItemStyles.ts +++ b/odd-platform-ui/src/components/Alerts/AlertsList/AlertItem/AlertItemStyles.ts @@ -15,5 +15,5 @@ export const Wrapper = styled(Grid)<{ $alignItems?: CSSObject['alignItems'] }>( flexWrap: 'nowrap', alignItems: $alignItems, justifyContent: 'flex-end', - } as CSSObject) + }) as CSSObject ); diff --git a/odd-platform-ui/src/components/Alerts/AlertsList/AlertsList.tsx b/odd-platform-ui/src/components/Alerts/AlertsList/AlertsList.tsx index d33b3c275..419eac00e 100644 --- a/odd-platform-ui/src/components/Alerts/AlertsList/AlertsList.tsx +++ b/odd-platform-ui/src/components/Alerts/AlertsList/AlertsList.tsx @@ -92,9 +92,7 @@ const AlertsList: React.FC = ({ fetchAlerts }) => { loader={isAlertsFetching && } scrollableTarget='alerts-list' > - {alerts?.map(alert => ( - - ))} + {alerts?.map(alert => )} diff --git a/odd-platform-ui/src/components/DataEntityDetails/DataCollaboration/DataCollaborationStyles.ts b/odd-platform-ui/src/components/DataEntityDetails/DataCollaboration/DataCollaborationStyles.ts index 7cc23eb1b..c01381d0a 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/DataCollaboration/DataCollaborationStyles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/DataCollaboration/DataCollaborationStyles.ts @@ -6,5 +6,5 @@ export const Container = styled(Grid)( ({ position: 'relative', flexWrap: 'nowrap', - } as CSSObject) + }) as CSSObject ); diff --git a/odd-platform-ui/src/components/DataEntityDetails/DataEntityActivity/ActivityResults/ActivityItem/ActivityItem.tsx b/odd-platform-ui/src/components/DataEntityDetails/DataEntityActivity/ActivityResults/ActivityItem/ActivityItem.tsx index 5491ca0a2..2125565b4 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/DataEntityActivity/ActivityResults/ActivityItem/ActivityItem.tsx +++ b/odd-platform-ui/src/components/DataEntityDetails/DataEntityActivity/ActivityResults/ActivityItem/ActivityItem.tsx @@ -88,9 +88,8 @@ const ActivityItem: React.FC = ({ activity, hideAllDetails }) )} {isTypeRelatedTo([ActivityEventType.DATASET_FIELD_DESCRIPTION_UPDATED]) && ( = ({ activity, hideAllDetails }) )} {isTypeRelatedTo([ActivityEventType.DATASET_FIELD_TAGS_UPDATED]) && ( ( diff --git a/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldTags/DatasetFieldTagsStyles.ts b/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldTags/DatasetFieldTagsStyles.ts index 8f38f60a9..713b2ca30 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldTags/DatasetFieldTagsStyles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldTags/DatasetFieldTagsStyles.ts @@ -8,5 +8,5 @@ export const TagsContainer = styled(Box)( alignItems: 'center', justifyContent: 'flex-start', flexWrap: 'wrap', - } as CSSObject) + }) as CSSObject ); diff --git a/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldTags/TagsEditForm/TagsEditFormStyles.ts b/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldTags/TagsEditForm/TagsEditFormStyles.ts index 9bb2dd9d1..f301c6786 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldTags/TagsEditForm/TagsEditFormStyles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldTags/TagsEditForm/TagsEditFormStyles.ts @@ -27,5 +27,5 @@ export const TagListContainer = styled(Box)( alignItems: 'center', justifyContent: 'flex-start', flexWrap: 'wrap', - } as CSSObject) + }) as CSSObject ); diff --git a/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetStructureList/DatasetStructureList.styles.ts b/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetStructureList/DatasetStructureList.styles.ts index 0d990496b..9050da4d3 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetStructureList/DatasetStructureList.styles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetStructureList/DatasetStructureList.styles.ts @@ -7,7 +7,7 @@ export const Scrollable = styled('div')( width: '100%', overflowY: 'auto', contain: 'strict', - } as CSSObject) + }) as CSSObject ); export const Container = styled('div')<{ $height: number }>(({ $height }) => ({ diff --git a/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/DEGLineage.styles.ts b/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/DEGLineage.styles.ts index 5b2d37e59..dd1823afc 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/DEGLineage.styles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/DEGLineage.styles.ts @@ -25,5 +25,5 @@ export const LineageViewContainer = styled('div')( width: '100%', height: '100%', position: 'relative', - } as CSSObject) + }) as CSSObject ); diff --git a/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/ZoomableDEGLineage/DEGLinegeGraph/EdgesRenderer/EdgesRenderer.styles.ts b/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/ZoomableDEGLineage/DEGLinegeGraph/EdgesRenderer/EdgesRenderer.styles.ts index e343915f8..f93ec7c93 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/ZoomableDEGLineage/DEGLinegeGraph/EdgesRenderer/EdgesRenderer.styles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/ZoomableDEGLineage/DEGLinegeGraph/EdgesRenderer/EdgesRenderer.styles.ts @@ -11,5 +11,5 @@ export const Container = styled('svg')( height: '100%', top: 0, left: 0, - } as CSSObject) + }) as CSSObject ); diff --git a/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/ZoomableDEGLineage/ZoomableDEGLineage.styles.ts b/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/ZoomableDEGLineage/ZoomableDEGLineage.styles.ts index 4ab84046a..93a5583a8 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/ZoomableDEGLineage/ZoomableDEGLineage.styles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/ZoomableDEGLineage/ZoomableDEGLineage.styles.ts @@ -16,7 +16,7 @@ export const ZoomWrapper = styled('div')( position: 'absolute', top: 0, left: 0, - } as CSSObject) + }) as CSSObject ); export const ZoomContainer = styled('div')( @@ -28,5 +28,5 @@ export const ZoomContainer = styled('div')( top: 0, left: 0, transformOrigin: '0 0', - } as CSSObject) + }) as CSSObject ); diff --git a/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/components/Node/Node.styles.ts b/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/components/Node/Node.styles.ts index 326e07471..64b041e45 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/components/Node/Node.styles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/components/Node/Node.styles.ts @@ -36,7 +36,7 @@ export const TitleContainer = styled(Typography)( ({ wordBreak: 'break-all', '&:hover': { cursor: 'pointer' }, - } as CSSObject) + }) as CSSObject ); export const SourceContainer = styled('div')(({ theme }) => ({ diff --git a/odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Node/NodeTitle/NodeTitleStyles.ts b/odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Node/NodeTitle/NodeTitleStyles.ts index 3af68c33f..af9f2684c 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Node/NodeTitle/NodeTitleStyles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Node/NodeTitle/NodeTitleStyles.ts @@ -18,7 +18,7 @@ export const TitleWrapper = styled('div')<{ $fullNames: boolean }>( overflow: $fullNames ? 'initial' : 'hidden', textOverflow: $fullNames ? 'initial' : 'ellipsis', whiteSpace: $fullNames ? 'initial' : 'nowrap', - } as CSSObject) + }) as CSSObject ); export const UnknownEntityNameCircle = styled('circle')(({ theme }) => ({ diff --git a/odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewDataQualityReport/OverviewDQSLAReport/OverviewDQSLAReportStyles.ts b/odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewDataQualityReport/OverviewDQSLAReport/OverviewDQSLAReportStyles.ts index 99b9f5375..17d536f3f 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewDataQualityReport/OverviewDQSLAReport/OverviewDQSLAReportStyles.ts +++ b/odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewDataQualityReport/OverviewDQSLAReport/OverviewDQSLAReportStyles.ts @@ -23,7 +23,7 @@ export const TooltipStyles = { }; export const BarContainer = styled(Grid)( - () => ({ flexWrap: 'nowrap', marginTop: '3px', columnGap: '2px' } as CSSObject) + () => ({ flexWrap: 'nowrap', marginTop: '3px', columnGap: '2px' }) as CSSObject ); export const Bar = styled(LinearProgress)<{ diff --git a/odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewStats/OverviewDataConsumerStats/OverviewDataConsumerStats.tsx b/odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewStats/OverviewDataConsumerStats/OverviewDataConsumerStats.tsx index 77d12ef13..2e12e0d3f 100644 --- a/odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewStats/OverviewDataConsumerStats/OverviewDataConsumerStats.tsx +++ b/odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewStats/OverviewDataConsumerStats/OverviewDataConsumerStats.tsx @@ -35,16 +35,18 @@ const OverviewDataConsumerStats: React.FC = ({ - {inputs?.slice(0, displayedEntitiesNumber).map(input => ( -