diff --git a/.github/workflows/aws_publisher.yaml b/.github/workflows/aws_publisher.yaml index 4aa59876c6..5ce2b587fb 100644 --- a/.github/workflows/aws_publisher.yaml +++ b/.github/workflows/aws_publisher.yaml @@ -31,7 +31,7 @@ jobs: echo "Packer will be triggered in this dir $WORK_DIR" - name: Configure AWS credentials for Kafka-UI account - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.AWS_AMI_PUBLISH_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_AMI_PUBLISH_KEY_SECRET }} diff --git a/.github/workflows/branch-deploy.yml b/.github/workflows/branch-deploy.yml index 5ba69390fc..2aa7612629 100644 --- a/.github/workflows/branch-deploy.yml +++ b/.github/workflows/branch-deploy.yml @@ -45,7 +45,7 @@ jobs: restore-keys: | ${{ runner.os }}-buildx- - name: Configure AWS credentials for Kafka-UI account - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/build-public-image.yml b/.github/workflows/build-public-image.yml index dc01cff131..5f6c46e25e 100644 --- a/.github/workflows/build-public-image.yml +++ b/.github/workflows/build-public-image.yml @@ -42,7 +42,7 @@ jobs: restore-keys: | ${{ runner.os }}-buildx- - name: Configure AWS credentials for Kafka-UI account - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/delete-public-image.yml b/.github/workflows/delete-public-image.yml index 37391bd9bd..45b4e8f7f3 100644 --- a/.github/workflows/delete-public-image.yml +++ b/.github/workflows/delete-public-image.yml @@ -15,7 +15,7 @@ jobs: tag='${{ github.event.pull_request.number }}' echo "tag=${tag}" >> $GITHUB_OUTPUT - name: Configure AWS credentials for Kafka-UI account - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/e2e-automation.yml b/.github/workflows/e2e-automation.yml index ab5d781b38..b3bb2f266f 100644 --- a/.github/workflows/e2e-automation.yml +++ b/.github/workflows/e2e-automation.yml @@ -24,7 +24,7 @@ jobs: with: ref: ${{ github.sha }} - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/e2e-checks.yaml b/.github/workflows/e2e-checks.yaml index d08e0cade7..e62cd724a8 100644 --- a/.github/workflows/e2e-checks.yaml +++ b/.github/workflows/e2e-checks.yaml @@ -18,7 +18,7 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.S3_AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.S3_AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/e2e-weekly.yml b/.github/workflows/e2e-weekly.yml index 78363de8d8..439d803764 100644 --- a/.github/workflows/e2e-weekly.yml +++ b/.github/workflows/e2e-weekly.yml @@ -11,7 +11,7 @@ jobs: with: ref: ${{ github.sha }} - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/separate_env_public_create.yml b/.github/workflows/separate_env_public_create.yml index dd4506d3ba..cac2d444ec 100644 --- a/.github/workflows/separate_env_public_create.yml +++ b/.github/workflows/separate_env_public_create.yml @@ -47,7 +47,7 @@ jobs: restore-keys: | ${{ runner.os }}-buildx- - name: Configure AWS credentials for Kafka-UI account - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/terraform-deploy.yml b/.github/workflows/terraform-deploy.yml index 1b4b367979..e42d52b11a 100644 --- a/.github/workflows/terraform-deploy.yml +++ b/.github/workflows/terraform-deploy.yml @@ -26,7 +26,7 @@ jobs: echo "Terraform will be triggered in this dir $TF_DIR" - name: Configure AWS credentials for Kafka-UI account - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v3 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/CorsGlobalConfiguration.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/CorsGlobalConfiguration.java index 448f92ad47..a0f892492e 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/CorsGlobalConfiguration.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/CorsGlobalConfiguration.java @@ -7,8 +7,6 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.web.reactive.config.CorsRegistry; -import org.springframework.web.reactive.config.WebFluxConfigurer; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/WebclientProperties.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/WebclientProperties.java index ad7732612d..24d8bf01db 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/WebclientProperties.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/WebclientProperties.java @@ -1,7 +1,6 @@ package com.provectus.kafka.ui.config; import com.provectus.kafka.ui.exception.ValidationException; -import java.beans.Transient; import javax.annotation.PostConstruct; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/AuthenticatedUser.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/AuthenticatedUser.java index bb69e2ddcd..9ff33cad3a 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/AuthenticatedUser.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/AuthenticatedUser.java @@ -1,7 +1,6 @@ package com.provectus.kafka.ui.config.auth; import java.util.Collection; -import lombok.Value; public record AuthenticatedUser(String principal, Collection groups) { diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/RbacOAuth2User.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/RbacOAuth2User.java index 79f3055413..ce0622cc18 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/RbacOAuth2User.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/RbacOAuth2User.java @@ -2,7 +2,6 @@ package com.provectus.kafka.ui.config.auth; import java.util.Collection; import java.util.Map; -import lombok.Value; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.oauth2.core.user.OAuth2User; diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/RbacOidcUser.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/RbacOidcUser.java index 2ecab7343f..9642883f43 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/RbacOidcUser.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/RbacOidcUser.java @@ -2,7 +2,6 @@ package com.provectus.kafka.ui.config.auth; import java.util.Collection; import java.util.Map; -import lombok.Value; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.oauth2.core.oidc.OidcIdToken; import org.springframework.security.oauth2.core.oidc.OidcUserInfo; diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/AccessController.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/AccessController.java index b6522647b4..e6f2e3fdfd 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/AccessController.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/AccessController.java @@ -13,7 +13,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import javax.annotation.Nullable; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -38,7 +37,7 @@ public class AccessController implements AuthorizationApi { .filter(role -> user.groups().contains(role.getName())) .map(role -> mapPermissions(role.getPermissions(), role.getClusters())) .flatMap(Collection::stream) - .collect(Collectors.toList()) + .toList() ) .switchIfEmpty(Mono.just(Collections.emptyList())); @@ -70,10 +69,10 @@ public class AccessController implements AuthorizationApi { .map(String::toUpperCase) .map(this::mapAction) .filter(Objects::nonNull) - .collect(Collectors.toList())); + .toList()); return dto; }) - .collect(Collectors.toList()); + .toList(); } @Nullable diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/BrokersController.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/BrokersController.java index a3209ce722..31f02e2b4c 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/BrokersController.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/BrokersController.java @@ -26,6 +26,8 @@ import reactor.core.publisher.Mono; @RequiredArgsConstructor @Slf4j public class BrokersController extends AbstractController implements BrokersApi { + private static final String BROKER_ID = "brokerId"; + private final BrokerService brokerService; private final ClusterMapper clusterMapper; @@ -89,7 +91,7 @@ public class BrokersController extends AbstractController implements BrokersApi .cluster(clusterName) .clusterConfigActions(ClusterConfigAction.VIEW) .operationName("getBrokerConfig") - .operationParams(Map.of("brokerId", id)) + .operationParams(Map.of(BROKER_ID, id)) .build(); return validateAccess(context).thenReturn( @@ -108,7 +110,7 @@ public class BrokersController extends AbstractController implements BrokersApi .cluster(clusterName) .clusterConfigActions(ClusterConfigAction.VIEW, ClusterConfigAction.EDIT) .operationName("updateBrokerTopicPartitionLogDir") - .operationParams(Map.of("brokerId", id)) + .operationParams(Map.of(BROKER_ID, id)) .build(); return validateAccess(context).then( @@ -128,7 +130,7 @@ public class BrokersController extends AbstractController implements BrokersApi .cluster(clusterName) .clusterConfigActions(ClusterConfigAction.VIEW, ClusterConfigAction.EDIT) .operationName("updateBrokerConfigByName") - .operationParams(Map.of("brokerId", id)) + .operationParams(Map.of(BROKER_ID, id)) .build(); return validateAccess(context).then( diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/ConsumerGroupsController.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/ConsumerGroupsController.java index aac43855af..d4214e2877 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/ConsumerGroupsController.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/ConsumerGroupsController.java @@ -22,7 +22,6 @@ import com.provectus.kafka.ui.service.OffsetsResetService; import java.util.Map; import java.util.Optional; import java.util.function.Supplier; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -200,7 +199,7 @@ public class ConsumerGroupsController extends AbstractController implements Cons .consumerGroups(consumerGroupConsumerGroupsPage.consumerGroups() .stream() .map(ConsumerGroupMapper::toDto) - .collect(Collectors.toList())); + .toList()); } } diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/KafkaConnectController.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/KafkaConnectController.java index 9d2376c22f..eb215b1099 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/KafkaConnectController.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/KafkaConnectController.java @@ -36,6 +36,7 @@ import reactor.core.publisher.Mono; public class KafkaConnectController extends AbstractController implements KafkaConnectApi { private static final Set RESTART_ACTIONS = Set.of(RESTART, RESTART_FAILED_TASKS, RESTART_ALL_TASKS); + private static final String CONNECTOR_NAME = "connectorName"; private final KafkaConnectService kafkaConnectService; @@ -112,7 +113,7 @@ public class KafkaConnectController extends AbstractController implements KafkaC .connect(connectName) .connectActions(ConnectAction.VIEW, ConnectAction.EDIT) .operationName("deleteConnector") - .operationParams(Map.of("connectorName", connectName)) + .operationParams(Map.of(CONNECTOR_NAME, connectName)) .build(); return validateAccess(context).then( @@ -180,7 +181,7 @@ public class KafkaConnectController extends AbstractController implements KafkaC .connect(connectName) .connectActions(ConnectAction.VIEW, ConnectAction.EDIT) .operationName("setConnectorConfig") - .operationParams(Map.of("connectorName", connectorName)) + .operationParams(Map.of(CONNECTOR_NAME, connectorName)) .build(); return validateAccess(context).then( @@ -207,7 +208,7 @@ public class KafkaConnectController extends AbstractController implements KafkaC .connect(connectName) .connectActions(connectActions) .operationName("updateConnectorState") - .operationParams(Map.of("connectorName", connectorName)) + .operationParams(Map.of(CONNECTOR_NAME, connectorName)) .build(); return validateAccess(context).then( @@ -227,7 +228,7 @@ public class KafkaConnectController extends AbstractController implements KafkaC .connect(connectName) .connectActions(ConnectAction.VIEW) .operationName("getConnectorTasks") - .operationParams(Map.of("connectorName", connectorName)) + .operationParams(Map.of(CONNECTOR_NAME, connectorName)) .build(); return validateAccess(context).thenReturn( @@ -247,7 +248,7 @@ public class KafkaConnectController extends AbstractController implements KafkaC .connect(connectName) .connectActions(ConnectAction.VIEW, ConnectAction.RESTART) .operationName("restartConnectorTask") - .operationParams(Map.of("connectorName", connectorName)) + .operationParams(Map.of(CONNECTOR_NAME, connectorName)) .build(); return validateAccess(context).then( diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/SchemasController.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/SchemasController.java index a6cee97fd3..481ff4c75b 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/SchemasController.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/SchemasController.java @@ -15,7 +15,6 @@ import com.provectus.kafka.ui.model.rbac.permission.SchemaAction; import com.provectus.kafka.ui.service.SchemaRegistryService; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -235,7 +234,7 @@ public class SchemasController extends AbstractController implements SchemasApi List subjectsToRender = filteredSubjects.stream() .skip(subjectToSkip) .limit(pageSize) - .collect(Collectors.toList()); + .toList(); return schemaRegistryService.getAllLatestVersionSchemas(getCluster(clusterName), subjectsToRender) .map(subjs -> subjs.stream().map(kafkaSrMapper::toDto).toList()) .map(subjs -> new SchemaSubjectsResponseDTO().pageCount(totalPages).schemas(subjs)); diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/TopicsController.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/TopicsController.java index d422a2cbc6..d24044717f 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/TopicsController.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/controller/TopicsController.java @@ -22,6 +22,7 @@ import com.provectus.kafka.ui.model.TopicConfigDTO; import com.provectus.kafka.ui.model.TopicCreationDTO; import com.provectus.kafka.ui.model.TopicDTO; import com.provectus.kafka.ui.model.TopicDetailsDTO; +import com.provectus.kafka.ui.model.TopicProducerStateDTO; import com.provectus.kafka.ui.model.TopicUpdateDTO; import com.provectus.kafka.ui.model.TopicsResponseDTO; import com.provectus.kafka.ui.model.rbac.AccessContext; @@ -143,7 +144,7 @@ public class TopicsController extends AbstractController implements TopicsApi { .map(lst -> lst.stream() .map(InternalTopicConfig::from) .map(clusterMapper::toTopicConfig) - .collect(toList())) + .toList()) .map(Flux::fromIterable) .map(ResponseEntity::ok) ).doOnEach(sig -> audit(context, sig)); @@ -207,7 +208,7 @@ public class TopicsController extends AbstractController implements TopicsApi { return topicsService.loadTopics(getCluster(clusterName), topicsPage) .map(topicsToRender -> new TopicsResponseDTO() - .topics(topicsToRender.stream().map(clusterMapper::toTopic).collect(toList())) + .topics(topicsToRender.stream().map(clusterMapper::toTopic).toList()) .pageCount(totalPages)); }) .map(ResponseEntity::ok) @@ -327,6 +328,34 @@ public class TopicsController extends AbstractController implements TopicsApi { .doOnEach(sig -> audit(context, sig)); } + @Override + public Mono>> getActiveProducerStates(String clusterName, + String topicName, + ServerWebExchange exchange) { + var context = AccessContext.builder() + .cluster(clusterName) + .topic(topicName) + .topicActions(VIEW) + .operationName("getActiveProducerStates") + .build(); + + Comparator ordering = + Comparator.comparingInt(TopicProducerStateDTO::getPartition) + .thenComparing(Comparator.comparing(TopicProducerStateDTO::getProducerId).reversed()); + + Flux states = topicsService.getActiveProducersState(getCluster(clusterName), topicName) + .flatMapMany(statesMap -> + Flux.fromStream( + statesMap.entrySet().stream() + .flatMap(e -> e.getValue().stream().map(p -> clusterMapper.map(e.getKey().partition(), p))) + .sorted(ordering))); + + return validateAccess(context) + .thenReturn(states) + .map(ResponseEntity::ok) + .doOnEach(sig -> audit(context, sig)); + } + private Comparator getComparatorForTopic( TopicColumnsToSortDTO orderBy) { var defaultComparator = Comparator.comparing(InternalTopic::getName); diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/emitter/OffsetsInfo.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/emitter/OffsetsInfo.java index 24e2a0aa88..8580272417 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/emitter/OffsetsInfo.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/emitter/OffsetsInfo.java @@ -5,7 +5,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.mutable.MutableLong; @@ -28,7 +27,7 @@ class OffsetsInfo { this(consumer, consumer.partitionsFor(topic).stream() .map(pi -> new TopicPartition(topic, pi.partition())) - .collect(Collectors.toList()) + .toList() ); } diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/exception/GlobalErrorWebExceptionHandler.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/exception/GlobalErrorWebExceptionHandler.java index 8ad83fe47d..1d7cddf423 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/exception/GlobalErrorWebExceptionHandler.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/exception/GlobalErrorWebExceptionHandler.java @@ -106,7 +106,7 @@ public class GlobalErrorWebExceptionHandler extends AbstractErrorWebExceptionHan err.setFieldName(e.getKey()); err.setRestrictions(List.copyOf(e.getValue())); return err; - }).collect(Collectors.toList()); + }).toList(); var message = fieldsErrors.isEmpty() ? exception.getMessage() diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/mapper/ClusterMapper.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/mapper/ClusterMapper.java index a122a269a4..7fb7bc5c48 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/mapper/ClusterMapper.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/mapper/ClusterMapper.java @@ -30,11 +30,12 @@ import com.provectus.kafka.ui.model.ReplicaDTO; import com.provectus.kafka.ui.model.TopicConfigDTO; import com.provectus.kafka.ui.model.TopicDTO; import com.provectus.kafka.ui.model.TopicDetailsDTO; +import com.provectus.kafka.ui.model.TopicProducerStateDTO; import com.provectus.kafka.ui.service.metrics.RawMetric; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import org.apache.kafka.clients.admin.ConfigEntry; +import org.apache.kafka.clients.admin.ProducerState; import org.apache.kafka.common.acl.AccessControlEntry; import org.apache.kafka.common.acl.AclBinding; import org.apache.kafka.common.acl.AclOperation; @@ -54,7 +55,7 @@ public interface ClusterMapper { default ClusterMetricsDTO toClusterMetrics(Metrics metrics) { return new ClusterMetricsDTO() - .items(metrics.getSummarizedMetrics().map(this::convert).collect(Collectors.toList())); + .items(metrics.getSummarizedMetrics().map(this::convert).toList()); } private MetricDTO convert(RawMetric rawMetric) { @@ -66,7 +67,7 @@ public interface ClusterMapper { default BrokerMetricsDTO toBrokerMetrics(List metrics) { return new BrokerMetricsDTO() - .metrics(metrics.stream().map(this::convert).collect(Collectors.toList())); + .metrics(metrics.stream().map(this::convert).toList()); } @Mapping(target = "isSensitive", source = "sensitive") @@ -107,7 +108,7 @@ public interface ClusterMapper { List toFeaturesEnum(List features); default List map(Map map) { - return map.values().stream().map(this::toPartition).collect(Collectors.toList()); + return map.values().stream().map(this::toPartition).toList(); } default BrokerDiskUsageDTO map(Integer id, InternalBrokerDiskUsage internalBrokerDiskUsage) { @@ -118,6 +119,17 @@ public interface ClusterMapper { return brokerDiskUsage; } + default TopicProducerStateDTO map(int partition, ProducerState state) { + return new TopicProducerStateDTO() + .partition(partition) + .producerId(state.producerId()) + .producerEpoch(state.producerEpoch()) + .lastSequence(state.lastSequence()) + .lastTimestampMs(state.lastTimestamp()) + .coordinatorEpoch(state.coordinatorEpoch().stream().boxed().findAny().orElse(null)) + .currentTransactionStartOffset(state.currentTransactionStartOffset().stream().boxed().findAny().orElse(null)); + } + static KafkaAclDTO.OperationEnum mapAclOperation(AclOperation operation) { return switch (operation) { case ALL -> KafkaAclDTO.OperationEnum.ALL; diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/mapper/DescribeLogDirsMapper.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/mapper/DescribeLogDirsMapper.java index 3d84aa3ad9..d07eff2e0a 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/mapper/DescribeLogDirsMapper.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/mapper/DescribeLogDirsMapper.java @@ -21,7 +21,7 @@ public class DescribeLogDirsMapper { return logDirsInfo.entrySet().stream().map( mapEntry -> mapEntry.getValue().entrySet().stream() .map(e -> toBrokerLogDirs(mapEntry.getKey(), e.getKey(), e.getValue())) - .collect(Collectors.toList()) + .toList() ).flatMap(Collection::stream).collect(Collectors.toList()); } @@ -35,7 +35,7 @@ public class DescribeLogDirsMapper { var topics = logDirInfo.replicaInfos.entrySet().stream() .collect(Collectors.groupingBy(e -> e.getKey().topic())).entrySet().stream() .map(e -> toTopicLogDirs(broker, e.getKey(), e.getValue())) - .collect(Collectors.toList()); + .toList(); result.setTopics(topics); return result; } @@ -48,7 +48,7 @@ public class DescribeLogDirsMapper { topic.setPartitions( partitions.stream().map( e -> topicPartitionLogDir( - broker, e.getKey().partition(), e.getValue())).collect(Collectors.toList()) + broker, e.getKey().partition(), e.getValue())).toList() ); return topic; } diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/InternalLogDirStats.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/InternalLogDirStats.java index 34ec3d59e3..7fcecd9ab6 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/InternalLogDirStats.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/InternalLogDirStats.java @@ -44,7 +44,7 @@ public class InternalLogDirStats { topicMap.getValue().replicaInfos.entrySet().stream() .map(e -> Tuples.of(b.getKey(), e.getKey(), e.getValue().size)) ) - ).collect(toList()); + ).toList(); partitionsStats = topicPartitions.stream().collect( groupingBy( diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/rbac/AccessContext.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/rbac/AccessContext.java index cf126bf3df..dfa6ad7b37 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/rbac/AccessContext.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/model/rbac/AccessContext.java @@ -52,6 +52,8 @@ public class AccessContext { } public static final class AccessContextBuilder { + private static final String ACTIONS_NOT_PRESENT = "actions not present"; + private Collection applicationConfigActions = Collections.emptySet(); private String cluster; private Collection clusterConfigActions = Collections.emptySet(); @@ -75,7 +77,7 @@ public class AccessContext { } public AccessContextBuilder applicationConfigActions(ApplicationConfigAction... actions) { - Assert.isTrue(actions.length > 0, "actions not present"); + Assert.isTrue(actions.length > 0, ACTIONS_NOT_PRESENT); this.applicationConfigActions = List.of(actions); return this; } @@ -86,7 +88,7 @@ public class AccessContext { } public AccessContextBuilder clusterConfigActions(ClusterConfigAction... actions) { - Assert.isTrue(actions.length > 0, "actions not present"); + Assert.isTrue(actions.length > 0, ACTIONS_NOT_PRESENT); this.clusterConfigActions = List.of(actions); return this; } @@ -97,7 +99,7 @@ public class AccessContext { } public AccessContextBuilder topicActions(TopicAction... actions) { - Assert.isTrue(actions.length > 0, "actions not present"); + Assert.isTrue(actions.length > 0, ACTIONS_NOT_PRESENT); this.topicActions = List.of(actions); return this; } @@ -108,7 +110,7 @@ public class AccessContext { } public AccessContextBuilder consumerGroupActions(ConsumerGroupAction... actions) { - Assert.isTrue(actions.length > 0, "actions not present"); + Assert.isTrue(actions.length > 0, ACTIONS_NOT_PRESENT); this.consumerGroupActions = List.of(actions); return this; } @@ -119,7 +121,7 @@ public class AccessContext { } public AccessContextBuilder connectActions(ConnectAction... actions) { - Assert.isTrue(actions.length > 0, "actions not present"); + Assert.isTrue(actions.length > 0, ACTIONS_NOT_PRESENT); this.connectActions = List.of(actions); return this; } @@ -135,25 +137,25 @@ public class AccessContext { } public AccessContextBuilder schemaActions(SchemaAction... actions) { - Assert.isTrue(actions.length > 0, "actions not present"); + Assert.isTrue(actions.length > 0, ACTIONS_NOT_PRESENT); this.schemaActions = List.of(actions); return this; } public AccessContextBuilder ksqlActions(KsqlAction... actions) { - Assert.isTrue(actions.length > 0, "actions not present"); + Assert.isTrue(actions.length > 0, ACTIONS_NOT_PRESENT); this.ksqlActions = List.of(actions); return this; } public AccessContextBuilder aclActions(AclAction... actions) { - Assert.isTrue(actions.length > 0, "actions not present"); + Assert.isTrue(actions.length > 0, ACTIONS_NOT_PRESENT); this.aclActions = List.of(actions); return this; } public AccessContextBuilder auditActions(AuditAction... actions) { - Assert.isTrue(actions.length > 0, "actions not present"); + Assert.isTrue(actions.length > 0, ACTIONS_NOT_PRESENT); this.auditActions = List.of(actions); return this; } diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/Base64Serde.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/Base64Serde.java index e27215f688..9c2b00bfdf 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/Base64Serde.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/Base64Serde.java @@ -6,7 +6,6 @@ import com.provectus.kafka.ui.serdes.BuiltInSerde; import java.util.Base64; import java.util.Map; import java.util.Optional; -import org.apache.kafka.common.header.Headers; public class Base64Serde implements BuiltInSerde { diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/ConsumerOffsetsSerde.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/ConsumerOffsetsSerde.java index 5ce48e79e2..8a0c0e2bfa 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/ConsumerOffsetsSerde.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/ConsumerOffsetsSerde.java @@ -28,6 +28,23 @@ public class ConsumerOffsetsSerde implements BuiltInSerde { private static final JsonMapper JSON_MAPPER = createMapper(); + private static final String ASSIGNMENT = "assignment"; + private static final String CLIENT_HOST = "client_host"; + private static final String CLIENT_ID = "client_id"; + private static final String COMMIT_TIMESTAMP = "commit_timestamp"; + private static final String CURRENT_STATE_TIMESTAMP = "current_state_timestamp"; + private static final String GENERATION = "generation"; + private static final String LEADER = "leader"; + private static final String MEMBERS = "members"; + private static final String MEMBER_ID = "member_id"; + private static final String METADATA = "metadata"; + private static final String OFFSET = "offset"; + private static final String PROTOCOL = "protocol"; + private static final String PROTOCOL_TYPE = "protocol_type"; + private static final String REBALANCE_TIMEOUT = "rebalance_timeout"; + private static final String SESSION_TIMEOUT = "session_timeout"; + private static final String SUBSCRIPTION = "subscription"; + public static final String TOPIC = "__consumer_offsets"; public static String name() { @@ -116,128 +133,128 @@ public class ConsumerOffsetsSerde implements BuiltInSerde { private Deserializer valueDeserializer() { final Schema commitOffsetSchemaV0 = new Schema( - new Field("offset", Type.INT64, ""), - new Field("metadata", Type.STRING, ""), - new Field("commit_timestamp", Type.INT64, "") + new Field(OFFSET, Type.INT64, ""), + new Field(METADATA, Type.STRING, ""), + new Field(COMMIT_TIMESTAMP, Type.INT64, "") ); final Schema commitOffsetSchemaV1 = new Schema( - new Field("offset", Type.INT64, ""), - new Field("metadata", Type.STRING, ""), - new Field("commit_timestamp", Type.INT64, ""), + new Field(OFFSET, Type.INT64, ""), + new Field(METADATA, Type.STRING, ""), + new Field(COMMIT_TIMESTAMP, Type.INT64, ""), new Field("expire_timestamp", Type.INT64, "") ); final Schema commitOffsetSchemaV2 = new Schema( - new Field("offset", Type.INT64, ""), - new Field("metadata", Type.STRING, ""), - new Field("commit_timestamp", Type.INT64, "") + new Field(OFFSET, Type.INT64, ""), + new Field(METADATA, Type.STRING, ""), + new Field(COMMIT_TIMESTAMP, Type.INT64, "") ); final Schema commitOffsetSchemaV3 = new Schema( - new Field("offset", Type.INT64, ""), + new Field(OFFSET, Type.INT64, ""), new Field("leader_epoch", Type.INT32, ""), - new Field("metadata", Type.STRING, ""), - new Field("commit_timestamp", Type.INT64, "") + new Field(METADATA, Type.STRING, ""), + new Field(COMMIT_TIMESTAMP, Type.INT64, "") ); final Schema commitOffsetSchemaV4 = new Schema( - new Field("offset", Type.INT64, ""), + new Field(OFFSET, Type.INT64, ""), new Field("leader_epoch", Type.INT32, ""), - new Field("metadata", Type.COMPACT_STRING, ""), - new Field("commit_timestamp", Type.INT64, ""), + new Field(METADATA, Type.COMPACT_STRING, ""), + new Field(COMMIT_TIMESTAMP, Type.INT64, ""), Field.TaggedFieldsSection.of() ); final Schema metadataSchema0 = new Schema( - new Field("protocol_type", Type.STRING, ""), - new Field("generation", Type.INT32, ""), - new Field("protocol", Type.NULLABLE_STRING, ""), - new Field("leader", Type.NULLABLE_STRING, ""), - new Field("members", new ArrayOf(new Schema( - new Field("member_id", Type.STRING, ""), - new Field("client_id", Type.STRING, ""), - new Field("client_host", Type.STRING, ""), - new Field("session_timeout", Type.INT32, ""), - new Field("subscription", Type.BYTES, ""), - new Field("assignment", Type.BYTES, "") + new Field(PROTOCOL_TYPE, Type.STRING, ""), + new Field(GENERATION, Type.INT32, ""), + new Field(PROTOCOL, Type.NULLABLE_STRING, ""), + new Field(LEADER, Type.NULLABLE_STRING, ""), + new Field(MEMBERS, new ArrayOf(new Schema( + new Field(MEMBER_ID, Type.STRING, ""), + new Field(CLIENT_ID, Type.STRING, ""), + new Field(CLIENT_HOST, Type.STRING, ""), + new Field(SESSION_TIMEOUT, Type.INT32, ""), + new Field(SUBSCRIPTION, Type.BYTES, ""), + new Field(ASSIGNMENT, Type.BYTES, "") )), "") ); final Schema metadataSchema1 = new Schema( - new Field("protocol_type", Type.STRING, ""), - new Field("generation", Type.INT32, ""), - new Field("protocol", Type.NULLABLE_STRING, ""), - new Field("leader", Type.NULLABLE_STRING, ""), - new Field("members", new ArrayOf(new Schema( - new Field("member_id", Type.STRING, ""), - new Field("client_id", Type.STRING, ""), - new Field("client_host", Type.STRING, ""), - new Field("rebalance_timeout", Type.INT32, ""), - new Field("session_timeout", Type.INT32, ""), - new Field("subscription", Type.BYTES, ""), - new Field("assignment", Type.BYTES, "") + new Field(PROTOCOL_TYPE, Type.STRING, ""), + new Field(GENERATION, Type.INT32, ""), + new Field(PROTOCOL, Type.NULLABLE_STRING, ""), + new Field(LEADER, Type.NULLABLE_STRING, ""), + new Field(MEMBERS, new ArrayOf(new Schema( + new Field(MEMBER_ID, Type.STRING, ""), + new Field(CLIENT_ID, Type.STRING, ""), + new Field(CLIENT_HOST, Type.STRING, ""), + new Field(REBALANCE_TIMEOUT, Type.INT32, ""), + new Field(SESSION_TIMEOUT, Type.INT32, ""), + new Field(SUBSCRIPTION, Type.BYTES, ""), + new Field(ASSIGNMENT, Type.BYTES, "") )), "") ); final Schema metadataSchema2 = new Schema( - new Field("protocol_type", Type.STRING, ""), - new Field("generation", Type.INT32, ""), - new Field("protocol", Type.NULLABLE_STRING, ""), - new Field("leader", Type.NULLABLE_STRING, ""), - new Field("current_state_timestamp", Type.INT64, ""), - new Field("members", new ArrayOf(new Schema( - new Field("member_id", Type.STRING, ""), - new Field("client_id", Type.STRING, ""), - new Field("client_host", Type.STRING, ""), - new Field("rebalance_timeout", Type.INT32, ""), - new Field("session_timeout", Type.INT32, ""), - new Field("subscription", Type.BYTES, ""), - new Field("assignment", Type.BYTES, "") + new Field(PROTOCOL_TYPE, Type.STRING, ""), + new Field(GENERATION, Type.INT32, ""), + new Field(PROTOCOL, Type.NULLABLE_STRING, ""), + new Field(LEADER, Type.NULLABLE_STRING, ""), + new Field(CURRENT_STATE_TIMESTAMP, Type.INT64, ""), + new Field(MEMBERS, new ArrayOf(new Schema( + new Field(MEMBER_ID, Type.STRING, ""), + new Field(CLIENT_ID, Type.STRING, ""), + new Field(CLIENT_HOST, Type.STRING, ""), + new Field(REBALANCE_TIMEOUT, Type.INT32, ""), + new Field(SESSION_TIMEOUT, Type.INT32, ""), + new Field(SUBSCRIPTION, Type.BYTES, ""), + new Field(ASSIGNMENT, Type.BYTES, "") )), "") ); final Schema metadataSchema3 = new Schema( - new Field("protocol_type", Type.STRING, ""), - new Field("generation", Type.INT32, ""), - new Field("protocol", Type.NULLABLE_STRING, ""), - new Field("leader", Type.NULLABLE_STRING, ""), - new Field("current_state_timestamp", Type.INT64, ""), - new Field("members", new ArrayOf(new Schema( - new Field("member_id", Type.STRING, ""), + new Field(PROTOCOL_TYPE, Type.STRING, ""), + new Field(GENERATION, Type.INT32, ""), + new Field(PROTOCOL, Type.NULLABLE_STRING, ""), + new Field(LEADER, Type.NULLABLE_STRING, ""), + new Field(CURRENT_STATE_TIMESTAMP, Type.INT64, ""), + new Field(MEMBERS, new ArrayOf(new Schema( + new Field(MEMBER_ID, Type.STRING, ""), new Field("group_instance_id", Type.NULLABLE_STRING, ""), - new Field("client_id", Type.STRING, ""), - new Field("client_host", Type.STRING, ""), - new Field("rebalance_timeout", Type.INT32, ""), - new Field("session_timeout", Type.INT32, ""), - new Field("subscription", Type.BYTES, ""), - new Field("assignment", Type.BYTES, "") + new Field(CLIENT_ID, Type.STRING, ""), + new Field(CLIENT_HOST, Type.STRING, ""), + new Field(REBALANCE_TIMEOUT, Type.INT32, ""), + new Field(SESSION_TIMEOUT, Type.INT32, ""), + new Field(SUBSCRIPTION, Type.BYTES, ""), + new Field(ASSIGNMENT, Type.BYTES, "") )), "") ); final Schema metadataSchema4 = new Schema( - new Field("protocol_type", Type.COMPACT_STRING, ""), - new Field("generation", Type.INT32, ""), - new Field("protocol", Type.COMPACT_NULLABLE_STRING, ""), - new Field("leader", Type.COMPACT_NULLABLE_STRING, ""), - new Field("current_state_timestamp", Type.INT64, ""), - new Field("members", new CompactArrayOf(new Schema( - new Field("member_id", Type.COMPACT_STRING, ""), + new Field(PROTOCOL_TYPE, Type.COMPACT_STRING, ""), + new Field(GENERATION, Type.INT32, ""), + new Field(PROTOCOL, Type.COMPACT_NULLABLE_STRING, ""), + new Field(LEADER, Type.COMPACT_NULLABLE_STRING, ""), + new Field(CURRENT_STATE_TIMESTAMP, Type.INT64, ""), + new Field(MEMBERS, new CompactArrayOf(new Schema( + new Field(MEMBER_ID, Type.COMPACT_STRING, ""), new Field("group_instance_id", Type.COMPACT_NULLABLE_STRING, ""), - new Field("client_id", Type.COMPACT_STRING, ""), - new Field("client_host", Type.COMPACT_STRING, ""), - new Field("rebalance_timeout", Type.INT32, ""), - new Field("session_timeout", Type.INT32, ""), - new Field("subscription", Type.COMPACT_BYTES, ""), - new Field("assignment", Type.COMPACT_BYTES, ""), + new Field(CLIENT_ID, Type.COMPACT_STRING, ""), + new Field(CLIENT_HOST, Type.COMPACT_STRING, ""), + new Field(REBALANCE_TIMEOUT, Type.INT32, ""), + new Field(SESSION_TIMEOUT, Type.INT32, ""), + new Field(SUBSCRIPTION, Type.COMPACT_BYTES, ""), + new Field(ASSIGNMENT, Type.COMPACT_BYTES, ""), Field.TaggedFieldsSection.of() )), ""), Field.TaggedFieldsSection.of() @@ -249,7 +266,7 @@ public class ConsumerOffsetsSerde implements BuiltInSerde { short version = bb.getShort(); // ideally, we should distinguish if value is commit or metadata // by checking record's key, but our current serde structure doesn't allow that. - // so, we trying to parse into metadata first and after into commit msg + // so, we are trying to parse into metadata first and after into commit msg try { result = toJson( switch (version) { diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/Int32Serde.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/Int32Serde.java index 95343a0eeb..e89c799606 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/Int32Serde.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/Int32Serde.java @@ -2,7 +2,6 @@ package com.provectus.kafka.ui.serdes.builtin; import com.google.common.primitives.Ints; import com.provectus.kafka.ui.serde.api.DeserializeResult; -import com.provectus.kafka.ui.serde.api.PropertyResolver; import com.provectus.kafka.ui.serde.api.SchemaDescription; import com.provectus.kafka.ui.serdes.BuiltInSerde; import java.util.Map; diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/sr/SchemaRegistrySerde.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/sr/SchemaRegistrySerde.java index d1f8ddba96..4ef0bbe5dd 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/sr/SchemaRegistrySerde.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/sr/SchemaRegistrySerde.java @@ -47,6 +47,8 @@ public class SchemaRegistrySerde implements BuiltInSerde { return "SchemaRegistry"; } + private static final String SCHEMA_REGISTRY = "schemaRegistry"; + private SchemaRegistryClient schemaRegistryClient; private List schemaRegistryUrls; private String valueSchemaNameTemplate; @@ -58,7 +60,7 @@ public class SchemaRegistrySerde implements BuiltInSerde { @Override public boolean canBeAutoConfigured(PropertyResolver kafkaClusterProperties, PropertyResolver globalProperties) { - return kafkaClusterProperties.getListProperty("schemaRegistry", String.class) + return kafkaClusterProperties.getListProperty(SCHEMA_REGISTRY, String.class) .filter(lst -> !lst.isEmpty()) .isPresent(); } @@ -66,7 +68,7 @@ public class SchemaRegistrySerde implements BuiltInSerde { @Override public void autoConfigure(PropertyResolver kafkaClusterProperties, PropertyResolver globalProperties) { - var urls = kafkaClusterProperties.getListProperty("schemaRegistry", String.class) + var urls = kafkaClusterProperties.getListProperty(SCHEMA_REGISTRY, String.class) .filter(lst -> !lst.isEmpty()) .orElseThrow(() -> new ValidationException("No urls provided for schema registry")); configure( @@ -92,7 +94,7 @@ public class SchemaRegistrySerde implements BuiltInSerde { PropertyResolver kafkaClusterProperties, PropertyResolver globalProperties) { var urls = serdeProperties.getListProperty("url", String.class) - .or(() -> kafkaClusterProperties.getListProperty("schemaRegistry", String.class)) + .or(() -> kafkaClusterProperties.getListProperty(SCHEMA_REGISTRY, String.class)) .filter(lst -> !lst.isEmpty()) .orElseThrow(() -> new ValidationException("No urls provided for schema registry")); configure( diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/ReactiveAdminClient.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/ReactiveAdminClient.java index 9de908efa7..6defb07423 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/ReactiveAdminClient.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/ReactiveAdminClient.java @@ -31,6 +31,7 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; import javax.annotation.Nullable; import lombok.AccessLevel; @@ -55,6 +56,7 @@ import org.apache.kafka.clients.admin.NewPartitionReassignment; import org.apache.kafka.clients.admin.NewPartitions; import org.apache.kafka.clients.admin.NewTopic; import org.apache.kafka.clients.admin.OffsetSpec; +import org.apache.kafka.clients.admin.ProducerState; import org.apache.kafka.clients.admin.RecordsToDelete; import org.apache.kafka.clients.admin.TopicDescription; import org.apache.kafka.clients.consumer.OffsetAndMetadata; @@ -658,6 +660,21 @@ public class ReactiveAdminClient implements Closeable { return toMono(client.alterReplicaLogDirs(replicaAssignment).all()); } + // returns tp -> list of active producer's states (if any) + public Mono>> getActiveProducersState(String topic) { + return describeTopic(topic) + .map(td -> client.describeProducers( + IntStream.range(0, td.partitions().size()) + .mapToObj(i -> new TopicPartition(topic, i)) + .toList() + ).all() + ) + .flatMap(ReactiveAdminClient::toMono) + .map(map -> map.entrySet().stream() + .filter(e -> !e.getValue().activeProducers().isEmpty()) // skipping partitions without producers + .collect(toMap(Map.Entry::getKey, e -> e.getValue().activeProducers()))); + } + private Mono incrementalAlterConfig(String topicName, List currentConfigs, Map newConfigs) { diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/TopicsService.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/TopicsService.java index 3ddcd6f82e..8e976906d5 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/TopicsService.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/TopicsService.java @@ -39,6 +39,7 @@ import org.apache.kafka.clients.admin.ConfigEntry; import org.apache.kafka.clients.admin.NewPartitionReassignment; import org.apache.kafka.clients.admin.NewPartitions; import org.apache.kafka.clients.admin.OffsetSpec; +import org.apache.kafka.clients.admin.ProducerState; import org.apache.kafka.clients.admin.TopicDescription; import org.apache.kafka.common.Node; import org.apache.kafka.common.TopicPartition; @@ -459,6 +460,11 @@ public class TopicsService { ); } + public Mono>> getActiveProducersState(KafkaCluster cluster, String topic) { + return adminClientService.get(cluster) + .flatMap(ac -> ac.getActiveProducersState(topic)); + } + private Mono> filterExisting(KafkaCluster cluster, Collection topics) { return adminClientService.get(cluster) .flatMap(ac -> ac.listTopics(true)) diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/metrics/WellKnownMetrics.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/metrics/WellKnownMetrics.java index 10ad128c65..8dd4609b60 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/metrics/WellKnownMetrics.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/metrics/WellKnownMetrics.java @@ -11,6 +11,9 @@ import org.apache.kafka.common.Node; class WellKnownMetrics { + private static final String BROKER_TOPIC_METRICS = "BrokerTopicMetrics"; + private static final String FIFTEEN_MINUTE_RATE = "FifteenMinuteRate"; + // per broker final Map brokerBytesInFifteenMinuteRate = new HashMap<>(); final Map brokerBytesOutFifteenMinuteRate = new HashMap<>(); @@ -36,15 +39,15 @@ class WellKnownMetrics { if (!brokerBytesInFifteenMinuteRate.containsKey(node.id()) && rawMetric.labels().size() == 1 && "BytesInPerSec".equalsIgnoreCase(rawMetric.labels().get("name")) - && containsIgnoreCase(name, "BrokerTopicMetrics") - && endsWithIgnoreCase(name, "FifteenMinuteRate")) { + && containsIgnoreCase(name, BROKER_TOPIC_METRICS) + && endsWithIgnoreCase(name, FIFTEEN_MINUTE_RATE)) { brokerBytesInFifteenMinuteRate.put(node.id(), rawMetric.value()); } if (!brokerBytesOutFifteenMinuteRate.containsKey(node.id()) && rawMetric.labels().size() == 1 && "BytesOutPerSec".equalsIgnoreCase(rawMetric.labels().get("name")) - && containsIgnoreCase(name, "BrokerTopicMetrics") - && endsWithIgnoreCase(name, "FifteenMinuteRate")) { + && containsIgnoreCase(name, BROKER_TOPIC_METRICS) + && endsWithIgnoreCase(name, FIFTEEN_MINUTE_RATE)) { brokerBytesOutFifteenMinuteRate.put(node.id(), rawMetric.value()); } } @@ -53,8 +56,8 @@ class WellKnownMetrics { String name = rawMetric.name(); String topic = rawMetric.labels().get("topic"); if (topic != null - && containsIgnoreCase(name, "BrokerTopicMetrics") - && endsWithIgnoreCase(name, "FifteenMinuteRate")) { + && containsIgnoreCase(name, BROKER_TOPIC_METRICS) + && endsWithIgnoreCase(name, FIFTEEN_MINUTE_RATE)) { String nameProperty = rawMetric.labels().get("name"); if ("BytesInPerSec".equalsIgnoreCase(nameProperty)) { bytesInFifteenMinuteRate.compute(topic, (k, v) -> v == null ? rawMetric.value() : v.add(rawMetric.value())); diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/rbac/AccessControlService.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/rbac/AccessControlService.java index 59ea02fea8..4ff311ff91 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/rbac/AccessControlService.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/rbac/AccessControlService.java @@ -52,6 +52,7 @@ import reactor.core.publisher.Mono; public class AccessControlService { private static final String ACCESS_DENIED = "Access denied"; + private static final String ACTIONS_ARE_EMPTY = "actions are empty"; @Nullable private final InMemoryReactiveClientRegistrationRepository clientRegistrationRepository; @@ -206,7 +207,7 @@ public class AccessControlService { if (context.getTopic() == null && context.getTopicActions().isEmpty()) { return true; } - Assert.isTrue(!context.getTopicActions().isEmpty(), "actions are empty"); + Assert.isTrue(!context.getTopicActions().isEmpty(), ACTIONS_ARE_EMPTY); Set requiredActions = context.getTopicActions() .stream() @@ -243,7 +244,7 @@ public class AccessControlService { if (context.getConsumerGroup() == null && context.getConsumerGroupActions().isEmpty()) { return true; } - Assert.isTrue(!context.getConsumerGroupActions().isEmpty(), "actions are empty"); + Assert.isTrue(!context.getConsumerGroupActions().isEmpty(), ACTIONS_ARE_EMPTY); Set requiredActions = context.getConsumerGroupActions() .stream() @@ -276,7 +277,7 @@ public class AccessControlService { if (context.getSchema() == null && context.getSchemaActions().isEmpty()) { return true; } - Assert.isTrue(!context.getSchemaActions().isEmpty(), "actions are empty"); + Assert.isTrue(!context.getSchemaActions().isEmpty(), ACTIONS_ARE_EMPTY); Set requiredActions = context.getSchemaActions() .stream() @@ -309,7 +310,7 @@ public class AccessControlService { if (context.getConnect() == null && context.getConnectActions().isEmpty()) { return true; } - Assert.isTrue(!context.getConnectActions().isEmpty(), "actions are empty"); + Assert.isTrue(!context.getConnectActions().isEmpty(), ACTIONS_ARE_EMPTY); Set requiredActions = context.getConnectActions() .stream() diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/rbac/extractor/CognitoAuthorityExtractor.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/rbac/extractor/CognitoAuthorityExtractor.java index 67bcba69a2..58ac063bab 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/rbac/extractor/CognitoAuthorityExtractor.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/rbac/extractor/CognitoAuthorityExtractor.java @@ -59,8 +59,8 @@ public class CognitoAuthorityExtractor implements ProviderAuthorityExtractor { .stream() .filter(s -> s.getProvider().equals(Provider.OAUTH_COGNITO)) .filter(s -> s.getType().equals("group")) - .anyMatch(subject -> Stream.of(groups) - .map(Object::toString) + .anyMatch(subject -> groups + .stream() .anyMatch(cognitoGroup -> cognitoGroup.equals(subject.getValue())) )) .map(Role::getName) diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/JsonAvroConversion.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/JsonAvroConversion.java index 0708044837..74701d0c70 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/JsonAvroConversion.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/JsonAvroConversion.java @@ -43,6 +43,8 @@ public class JsonAvroConversion { private static final JsonMapper MAPPER = new JsonMapper(); private static final Schema NULL_SCHEMA = Schema.create(Schema.Type.NULL); + private static final String FORMAT = "format"; + private static final String DATE_TIME = "date-time"; // converts json into Object that is expected input for KafkaAvroSerializer // (with AVRO_USE_LOGICAL_TYPE_CONVERTERS flat enabled!) @@ -347,7 +349,7 @@ public class JsonAvroConversion { new SimpleFieldSchema( new SimpleJsonType( JsonType.Type.STRING, - Map.of("format", new TextNode("uuid")))) + Map.of(FORMAT, new TextNode("uuid")))) ), DECIMAL("decimal", @@ -385,7 +387,7 @@ public class JsonAvroConversion { new SimpleFieldSchema( new SimpleJsonType( JsonType.Type.STRING, - Map.of("format", new TextNode("date")))) + Map.of(FORMAT, new TextNode("date")))) ), TIME_MILLIS("time-millis", @@ -406,7 +408,7 @@ public class JsonAvroConversion { new SimpleFieldSchema( new SimpleJsonType( JsonType.Type.STRING, - Map.of("format", new TextNode("time")))) + Map.of(FORMAT, new TextNode("time")))) ), TIME_MICROS("time-micros", @@ -427,7 +429,7 @@ public class JsonAvroConversion { new SimpleFieldSchema( new SimpleJsonType( JsonType.Type.STRING, - Map.of("format", new TextNode("time")))) + Map.of(FORMAT, new TextNode("time")))) ), TIMESTAMP_MILLIS("timestamp-millis", @@ -448,7 +450,7 @@ public class JsonAvroConversion { new SimpleFieldSchema( new SimpleJsonType( JsonType.Type.STRING, - Map.of("format", new TextNode("date-time")))) + Map.of(FORMAT, new TextNode(DATE_TIME)))) ), TIMESTAMP_MICROS("timestamp-micros", @@ -473,7 +475,7 @@ public class JsonAvroConversion { new SimpleFieldSchema( new SimpleJsonType( JsonType.Type.STRING, - Map.of("format", new TextNode("date-time")))) + Map.of(FORMAT, new TextNode(DATE_TIME)))) ), LOCAL_TIMESTAMP_MILLIS("local-timestamp-millis", @@ -491,7 +493,7 @@ public class JsonAvroConversion { new SimpleFieldSchema( new SimpleJsonType( JsonType.Type.STRING, - Map.of("format", new TextNode("date-time")))) + Map.of(FORMAT, new TextNode(DATE_TIME)))) ), LOCAL_TIMESTAMP_MICROS("local-timestamp-micros", @@ -508,7 +510,7 @@ public class JsonAvroConversion { new SimpleFieldSchema( new SimpleJsonType( JsonType.Type.STRING, - Map.of("format", new TextNode("date-time")))) + Map.of(FORMAT, new TextNode(DATE_TIME)))) ); private final String name; diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/ProtobufSchemaConverter.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/ProtobufSchemaConverter.java index 86ea8fcf0e..8a0c1071db 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/ProtobufSchemaConverter.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/ProtobufSchemaConverter.java @@ -37,6 +37,9 @@ import reactor.util.function.Tuples; public class ProtobufSchemaConverter implements JsonSchemaConverter { + private static final String MAXIMUM = "maximum"; + private static final String MINIMUM = "minimum"; + private final Set simpleTypesWrapperNames = Set.of( BoolValue.getDescriptor().getFullName(), Int32Value.getDescriptor().getFullName(), @@ -156,15 +159,15 @@ public class ProtobufSchemaConverter implements JsonSchemaConverter new SimpleJsonType( JsonType.Type.INTEGER, Map.of( - "maximum", IntNode.valueOf(Integer.MAX_VALUE), - "minimum", IntNode.valueOf(Integer.MIN_VALUE) + MAXIMUM, IntNode.valueOf(Integer.MAX_VALUE), + MINIMUM, IntNode.valueOf(Integer.MIN_VALUE) ) ); case UINT32 -> new SimpleJsonType( JsonType.Type.INTEGER, Map.of( - "maximum", LongNode.valueOf(UnsignedInteger.MAX_VALUE.longValue()), - "minimum", IntNode.valueOf(0) + MAXIMUM, LongNode.valueOf(UnsignedInteger.MAX_VALUE.longValue()), + MINIMUM, IntNode.valueOf(0) ) ); //TODO: actually all *64 types will be printed with quotes (as strings), @@ -173,15 +176,15 @@ public class ProtobufSchemaConverter implements JsonSchemaConverter new SimpleJsonType( JsonType.Type.INTEGER, Map.of( - "maximum", LongNode.valueOf(Long.MAX_VALUE), - "minimum", LongNode.valueOf(Long.MIN_VALUE) + MAXIMUM, LongNode.valueOf(Long.MAX_VALUE), + MINIMUM, LongNode.valueOf(Long.MIN_VALUE) ) ); case UINT64 -> new SimpleJsonType( JsonType.Type.INTEGER, Map.of( - "maximum", new BigIntegerNode(UnsignedLong.MAX_VALUE.bigIntegerValue()), - "minimum", LongNode.valueOf(0) + MAXIMUM, new BigIntegerNode(UnsignedLong.MAX_VALUE.bigIntegerValue()), + MINIMUM, LongNode.valueOf(0) ) ); case MESSAGE, GROUP -> new SimpleJsonType(JsonType.Type.OBJECT); diff --git a/kafka-ui-contract/src/main/resources/swagger/kafka-ui-api.yaml b/kafka-ui-contract/src/main/resources/swagger/kafka-ui-api.yaml index 306c3fd2dd..ae51d31568 100644 --- a/kafka-ui-contract/src/main/resources/swagger/kafka-ui-api.yaml +++ b/kafka-ui-contract/src/main/resources/swagger/kafka-ui-api.yaml @@ -763,6 +763,33 @@ paths: 404: description: Not found + /api/clusters/{clusterName}/topics/{topicName}/activeproducers: + get: + tags: + - Topics + summary: get producer states for topic + operationId: getActiveProducerStates + parameters: + - name: clusterName + in: path + required: true + schema: + type: string + - name: topicName + in: path + required: true + schema: + type: string + responses: + 200: + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TopicProducerState' + /api/clusters/{clusterName}/topics/{topicName}/consumer-groups: get: tags: @@ -2619,6 +2646,31 @@ components: - PROTOBUF - UNKNOWN + TopicProducerState: + type: object + properties: + partition: + type: integer + format: int32 + producerId: + type: integer + format: int64 + producerEpoch: + type: integer + format: int32 + lastSequence: + type: integer + format: int32 + lastTimestampMs: + type: integer + format: int64 + coordinatorEpoch: + type: integer + format: int32 + currentTransactionStartOffset: + type: integer + format: int64 + ConsumerGroup: discriminator: propertyName: inherit diff --git a/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Schema.java b/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Schema.java index 55a6e63112..1d5cbb7e80 100644 --- a/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Schema.java +++ b/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/models/Schema.java @@ -10,25 +10,27 @@ import lombok.experimental.Accessors; @Accessors(chain = true) public class Schema { + private static final String USER_DIR = "user.dir"; + private String name, valuePath; private SchemaType type; public static Schema createSchemaAvro() { return new Schema().setName("schema_avro-" + randomAlphabetic(5)) .setType(SchemaType.AVRO) - .setValuePath(System.getProperty("user.dir") + "/src/main/resources/testData/schemas/schema_avro_value.json"); + .setValuePath(System.getProperty(USER_DIR) + "/src/main/resources/testData/schemas/schema_avro_value.json"); } public static Schema createSchemaJson() { return new Schema().setName("schema_json-" + randomAlphabetic(5)) .setType(SchemaType.JSON) - .setValuePath(System.getProperty("user.dir") + "/src/main/resources/testData/schemas/schema_json_Value.json"); + .setValuePath(System.getProperty(USER_DIR) + "/src/main/resources/testData/schemas/schema_json_Value.json"); } public static Schema createSchemaProtobuf() { return new Schema().setName("schema_protobuf-" + randomAlphabetic(5)) .setType(SchemaType.PROTOBUF) .setValuePath( - System.getProperty("user.dir") + "/src/main/resources/testData/schemas/schema_protobuf_value.txt"); + System.getProperty(USER_DIR) + "/src/main/resources/testData/schemas/schema_protobuf_value.txt"); } } diff --git a/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicCreateEditForm.java b/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicCreateEditForm.java index 57f5930d66..46493ab97f 100644 --- a/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicCreateEditForm.java +++ b/kafka-ui-e2e-checks/src/main/java/com/provectus/kafka/ui/pages/topics/TopicCreateEditForm.java @@ -19,6 +19,8 @@ import io.qameta.allure.Step; public class TopicCreateEditForm extends BasePage { + private static final String RETENTION_BYTES = "retentionBytes"; + protected SelenideElement timeToRetainField = $x("//input[@id='timeToRetain']"); protected SelenideElement partitionsField = $x("//input[@name='partitions']"); protected SelenideElement nameField = $(id("topicFormName")); @@ -138,12 +140,12 @@ public class TopicCreateEditForm extends BasePage { @Step public TopicCreateEditForm selectRetentionBytes(String visibleValue) { - return selectFromDropDownByVisibleText("retentionBytes", visibleValue); + return selectFromDropDownByVisibleText(RETENTION_BYTES, visibleValue); } @Step public TopicCreateEditForm selectRetentionBytes(Long optionValue) { - return selectFromDropDownByOptionValue("retentionBytes", optionValue.toString()); + return selectFromDropDownByOptionValue(RETENTION_BYTES, optionValue.toString()); } @Step @@ -202,7 +204,7 @@ public class TopicCreateEditForm extends BasePage { @Step public String getMaxSizeOnDisk() { - return new KafkaUiSelectElement("retentionBytes").getCurrentValue(); + return new KafkaUiSelectElement(RETENTION_BYTES).getCurrentValue(); } @Step diff --git a/kafka-ui-react-app/pnpm-lock.yaml b/kafka-ui-react-app/pnpm-lock.yaml index fa4eb35de1..59ffa9757a 100644 --- a/kafka-ui-react-app/pnpm-lock.yaml +++ b/kafka-ui-react-app/pnpm-lock.yaml @@ -10,7 +10,7 @@ dependencies: version: 0.19.2(@types/react@18.0.9)(react-dom@18.1.0)(react@18.1.0) '@hookform/error-message': specifier: ^2.0.0 - version: 2.0.0(react-dom@18.1.0)(react-hook-form@7.43.1)(react@18.1.0) + version: 2.0.1(react-dom@18.1.0)(react-hook-form@7.43.1)(react@18.1.0) '@hookform/resolvers': specifier: ^2.7.1 version: 2.8.9(react-hook-form@7.43.1) @@ -52,10 +52,10 @@ dependencies: version: 9.11.0 jest: specifier: ^29.4.3 - version: 29.5.0(@types/node@16.11.7)(ts-node@10.9.1) + version: 29.6.4(@types/node@16.11.7)(ts-node@10.9.1) jest-watch-typeahead: specifier: ^2.2.2 - version: 2.2.2(jest@29.5.0) + version: 2.2.2(jest@29.6.4) json-schema-faker: specifier: ^0.5.0-rcv.44 version: 0.5.0-rcv.44 @@ -67,7 +67,7 @@ dependencies: version: 4.17.21 lossless-json: specifier: ^2.0.8 - version: 2.0.8 + version: 2.0.11 pretty-ms: specifier: 7.0.1 version: 7.0.1 @@ -115,7 +115,7 @@ dependencies: version: 5.3.1(react-dom@18.1.0)(react-is@18.2.0)(react@18.1.0) use-debounce: specifier: ^9.0.3 - version: 9.0.3(react@18.1.0) + version: 9.0.4(react@18.1.0) vite: specifier: ^4.0.0 version: 4.0.5(@types/node@16.11.7)(sass@1.52.3) @@ -156,7 +156,7 @@ devDependencies: version: 14.4.3(@testing-library/dom@9.0.0) '@types/eventsource': specifier: ^1.1.8 - version: 1.1.8 + version: 1.1.11 '@types/lodash': specifier: ^4.14.172 version: 4.14.177 @@ -198,7 +198,7 @@ devDependencies: version: 8.16.0 eslint-config-airbnb: specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.26.0)(eslint-plugin-jsx-a11y@6.5.1)(eslint-plugin-react-hooks@4.5.0)(eslint-plugin-react@7.30.1)(eslint@8.16.0) + version: 19.0.4(eslint-plugin-import@2.26.0)(eslint-plugin-jsx-a11y@6.5.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.30.1)(eslint@8.16.0) eslint-config-airbnb-typescript: specifier: ^17.0.0 version: 17.0.0(@typescript-eslint/eslint-plugin@5.29.0)(@typescript-eslint/parser@5.29.0)(eslint-plugin-import@2.26.0)(eslint@8.16.0) @@ -207,7 +207,7 @@ devDependencies: version: 8.5.0(eslint@8.16.0) eslint-import-resolver-node: specifier: ^0.3.6 - version: 0.3.6 + version: 0.3.9 eslint-import-resolver-typescript: specifier: ^3.2.7 version: 3.2.7(eslint-plugin-import@2.26.0)(eslint@8.16.0) @@ -222,13 +222,13 @@ devDependencies: version: 6.5.1(eslint@8.16.0) eslint-plugin-prettier: specifier: ^4.0.0 - version: 4.0.0(eslint-config-prettier@8.5.0)(eslint@8.16.0)(prettier@2.8.4) + version: 4.2.1(eslint-config-prettier@8.5.0)(eslint@8.16.0)(prettier@2.8.4) eslint-plugin-react: specifier: ^7.30.1 version: 7.30.1(eslint@8.16.0) eslint-plugin-react-hooks: specifier: ^4.5.0 - version: 4.5.0(eslint@8.16.0) + version: 4.6.0(eslint@8.16.0) jest-environment-jsdom: specifier: ^29.4.3 version: 29.5.0 @@ -268,14 +268,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.15 - dev: false - - /@babel/code-frame@7.16.7: - resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 + '@jridgewell/trace-mapping': 0.3.19 dev: false /@babel/code-frame@7.18.6: @@ -294,15 +287,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.18.2 - '@babel/helper-compilation-targets': 7.18.2(@babel/core@7.18.2) - '@babel/helper-module-transforms': 7.18.0 - '@babel/helpers': 7.18.2 - '@babel/parser': 7.18.4 - '@babel/template': 7.16.7 - '@babel/traverse': 7.18.2(supports-color@5.5.0) - '@babel/types': 7.18.4 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.18.9 + '@babel/helper-compilation-targets': 7.18.9(@babel/core@7.18.2) + '@babel/helper-module-transforms': 7.18.9 + '@babel/helpers': 7.18.9 + '@babel/parser': 7.18.9 + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.9 + '@babel/types': 7.18.9 convert-source-map: 1.7.0 debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 @@ -335,15 +328,6 @@ packages: - supports-color dev: false - /@babel/generator@7.18.2: - resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.9 - '@jridgewell/gen-mapping': 0.3.2 - jsesc: 2.5.2 - dev: false - /@babel/generator@7.18.9: resolution: {integrity: sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==} engines: {node: '>=6.9.0'} @@ -358,8 +342,8 @@ packages: dependencies: '@babel/types': 7.18.9 - /@babel/helper-compilation-targets@7.18.2(@babel/core@7.18.2): - resolution: {integrity: sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==} + /@babel/helper-compilation-targets@7.18.9(@babel/core@7.18.2): + resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -413,22 +397,6 @@ packages: dependencies: '@babel/types': 7.18.9 - /@babel/helper-module-transforms@7.18.0: - resolution: {integrity: sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.18.6 - '@babel/template': 7.18.6 - '@babel/traverse': 7.18.9 - '@babel/types': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-module-transforms@7.18.9: resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} engines: {node: '>=6.9.0'} @@ -472,17 +440,6 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helpers@7.18.2: - resolution: {integrity: sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.18.6 - '@babel/traverse': 7.18.9 - '@babel/types': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helpers@7.18.9: resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==} engines: {node: '>=6.9.0'} @@ -502,14 +459,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.18.4: - resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.18.9 - dev: false - /@babel/parser@7.18.9: resolution: {integrity: sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==} engines: {node: '>=6.0.0'} @@ -660,15 +609,6 @@ packages: dependencies: regenerator-runtime: 0.13.7 - /@babel/template@7.16.7: - resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.18.9 - '@babel/types': 7.18.9 - dev: false - /@babel/template@7.18.6: resolution: {integrity: sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==} engines: {node: '>=6.9.0'} @@ -712,14 +652,6 @@ packages: - supports-color dev: false - /@babel/types@7.18.4: - resolution: {integrity: sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.18.6 - to-fast-properties: 2.0.0 - dev: false - /@babel/types@7.18.9: resolution: {integrity: sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==} engines: {node: '>=6.9.0'} @@ -980,8 +912,8 @@ packages: - '@types/react' dev: false - /@hookform/error-message@2.0.0(react-dom@18.1.0)(react-hook-form@7.43.1)(react@18.1.0): - resolution: {integrity: sha512-Y90nHzjgL2MP7GFy75kscdvxrCTjtyxGmOLLxX14nd08OXRIh9lMH/y9Kpdo0p1IPowJBiZMHyueg7p+yrqynQ==} + /@hookform/error-message@2.0.1(react-dom@18.1.0)(react-hook-form@7.43.1)(react@18.1.0): + resolution: {integrity: sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -1031,20 +963,20 @@ packages: engines: {node: '>=8'} dev: false - /@jest/console@29.5.0: - resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} + /@jest/console@29.6.4: + resolution: {integrity: sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/node': 16.11.7 chalk: 4.1.2 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + jest-message-util: 29.6.3 + jest-util: 29.6.3 slash: 3.0.0 dev: false - /@jest/core@29.5.0(ts-node@10.9.1): - resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} + /@jest/core@29.6.4(ts-node@10.9.1): + resolution: {integrity: sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1052,35 +984,36 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.5.0 - '@jest/reporters': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/console': 29.6.4 + '@jest/reporters': 29.6.4 + '@jest/test-result': 29.6.4 + '@jest/transform': 29.6.4 + '@jest/types': 29.6.3 '@types/node': 16.11.7 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.3.1 exit: 0.1.2 graceful-fs: 4.2.10 - jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@16.11.7)(ts-node@10.9.1) - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-resolve-dependencies: 29.5.0 - jest-runner: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 - jest-watcher: 29.5.0 + jest-changed-files: 29.6.3 + jest-config: 29.6.4(@types/node@16.11.7)(ts-node@10.9.1) + jest-haste-map: 29.6.4 + jest-message-util: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.6.4 + jest-resolve-dependencies: 29.6.4 + jest-runner: 29.6.4 + jest-runtime: 29.6.4 + jest-snapshot: 29.6.4 + jest-util: 29.6.3 + jest-validate: 29.6.3 + jest-watcher: 29.6.4 micromatch: 4.0.5 - pretty-format: 29.5.0 + pretty-format: 29.6.3 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: + - babel-plugin-macros - supports-color - ts-node dev: false @@ -1096,30 +1029,34 @@ packages: resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 + '@jest/fake-timers': 29.6.4 + '@jest/types': 29.6.3 '@types/node': 16.11.7 - jest-mock: 29.5.0 + jest-mock: 29.6.3 + dev: true - /@jest/expect-utils@29.0.3: - resolution: {integrity: sha512-i1xUkau7K/63MpdwiRqaxgZOjxYs4f0WMTGJnYwUKubsNRZSeQbLorS7+I4uXVF9KQ5r61BUPAUMZ7Lf66l64Q==} + /@jest/environment@29.6.4: + resolution: {integrity: sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.0.0 - - /@jest/expect-utils@29.5.0: - resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 + '@jest/fake-timers': 29.6.4 + '@jest/types': 29.6.3 + '@types/node': 16.11.7 + jest-mock: 29.6.3 dev: false - /@jest/expect@29.5.0: - resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} + /@jest/expect-utils@29.6.4: + resolution: {integrity: sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 29.5.0 - jest-snapshot: 29.5.0 + jest-get-type: 29.6.3 + + /@jest/expect@29.6.4: + resolution: {integrity: sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.6.4 + jest-snapshot: 29.6.4 transitivePeerDependencies: - supports-color dev: false @@ -1128,27 +1065,39 @@ packages: resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.0.2 '@types/node': 16.11.7 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 - jest-util: 29.5.0 + jest-message-util: 29.6.3 + jest-mock: 29.6.3 + jest-util: 29.6.3 + dev: true - /@jest/globals@29.5.0: - resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} + /@jest/fake-timers@29.6.4: + resolution: {integrity: sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/types': 29.5.0 - jest-mock: 29.5.0 + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.0.2 + '@types/node': 16.11.7 + jest-message-util: 29.6.3 + jest-mock: 29.6.3 + jest-util: 29.6.3 + + /@jest/globals@29.6.4: + resolution: {integrity: sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.6.4 + '@jest/expect': 29.6.4 + '@jest/types': 29.6.3 + jest-mock: 29.6.3 transitivePeerDependencies: - supports-color dev: false - /@jest/reporters@29.5.0: - resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} + /@jest/reporters@29.6.4: + resolution: {integrity: sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1157,11 +1106,11 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.15 + '@jest/console': 29.6.4 + '@jest/test-result': 29.6.4 + '@jest/transform': 29.6.4 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.19 '@types/node': 16.11.7 chalk: 4.1.2 collect-v8-coverage: 1.0.1 @@ -1169,13 +1118,13 @@ packages: glob: 7.2.0 graceful-fs: 4.2.10 istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.0 + istanbul-lib-instrument: 6.0.0 istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.4 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - jest-worker: 29.5.0 + jest-message-util: 29.6.3 + jest-util: 29.6.3 + jest-worker: 29.6.4 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 @@ -1184,72 +1133,63 @@ packages: - supports-color dev: false - /@jest/schemas@29.0.0: - resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.24.40 - /@jest/schemas@29.4.3: resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.25.24 + dev: true - /@jest/source-map@29.4.3: - resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.15 + '@sinclair/typebox': 0.27.8 + + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.19 callsites: 3.1.0 graceful-fs: 4.2.10 dev: false - /@jest/test-result@29.0.3: - resolution: {integrity: sha512-vViVnQjCgTmbhDKEonKJPtcFe9G/CJO4/Np4XwYJah+lF2oI7KKeRp8t1dFvv44wN2NdbDb/qC6pi++Vpp0Dlg==} + /@jest/test-result@29.6.4: + resolution: {integrity: sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.5.0 - '@jest/types': 29.5.0 + '@jest/console': 29.6.4 + '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.3 collect-v8-coverage: 1.0.1 dev: false - /@jest/test-result@29.5.0: - resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} + /@jest/test-sequencer@29.6.4: + resolution: {integrity: sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.5.0 - '@jest/types': 29.5.0 - '@types/istanbul-lib-coverage': 2.0.3 - collect-v8-coverage: 1.0.1 - dev: false - - /@jest/test-sequencer@29.5.0: - resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.5.0 + '@jest/test-result': 29.6.4 graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 + jest-haste-map: 29.6.4 slash: 3.0.0 dev: false - /@jest/transform@29.5.0: - resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} + /@jest/transform@29.6.4: + resolution: {integrity: sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.18.9 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.15 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.19 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 + jest-haste-map: 29.6.4 + jest-regex-util: 29.6.3 + jest-util: 29.6.3 micromatch: 4.0.5 pirates: 4.0.5 slash: 3.0.0 @@ -1279,13 +1219,25 @@ packages: '@types/node': 16.11.7 '@types/yargs': 17.0.10 chalk: 4.1.2 + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.3 + '@types/istanbul-reports': 3.0.1 + '@types/node': 16.11.7 + '@types/yargs': 17.0.10 + chalk: 4.1.2 /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.1 - '@jridgewell/sourcemap-codec': 1.4.13 + '@jridgewell/sourcemap-codec': 1.4.15 dev: false /@jridgewell/gen-mapping@0.3.2: @@ -1293,31 +1245,31 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.1 - '@jridgewell/sourcemap-codec': 1.4.13 - '@jridgewell/trace-mapping': 0.3.15 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 - /@jridgewell/resolve-uri@3.0.7: - resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} /@jridgewell/set-array@1.1.1: resolution: {integrity: sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==} engines: {node: '>=6.0.0'} - /@jridgewell/sourcemap-codec@1.4.13: - resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.15: - resolution: {integrity: sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==} + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: - '@jridgewell/resolve-uri': 3.0.7 - '@jridgewell/sourcemap-codec': 1.4.13 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.0.7 - '@jridgewell/sourcemap-codec': 1.4.13 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 /@microsoft/fetch-event-source@2.0.1: resolution: {integrity: sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==} @@ -1480,11 +1432,12 @@ packages: reselect: 4.1.5 dev: false - /@sinclair/typebox@0.24.40: - resolution: {integrity: sha512-Xint60L8rF0+nRy+6fCjW9jQMmu7fTpbwTBrXZiK6eq/RHDJS7LvWX/0oXC8O7fCePmrY/XdfaTv2HiUDeCq4g==} - /@sinclair/typebox@0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} @@ -1782,8 +1735,8 @@ packages: '@babel/types': 7.18.9 dev: false - /@types/eventsource@1.1.8: - resolution: {integrity: sha512-fJQNt9LijJCZwYvM6O30uLzdpAK9zs52Uc9iUW9M2Zsg0HQM6DLf6QysjC/wuFX+0798B8AppVMvgdO6IftPKQ==} + /@types/eventsource@1.1.11: + resolution: {integrity: sha512-L7wLDZlWm5mROzv87W0ofIYeQP5K2UhoFnnUyEWLKM6UBb0ZNRgAqp98qE5DkgfBXdWfc2kYmw9KZm4NLjRbsw==} dev: true /@types/graceful-fs@4.1.5: @@ -1818,8 +1771,8 @@ packages: /@types/jest@29.0.1: resolution: {integrity: sha512-CAZrjLRZs4xEdIrfrdV74xK1Vo/BKQZwUcjJv3gp6gMeV3BsVxMnXTcgtYOKyphT4DPPo7jxVEVhuwJTQn3oPQ==} dependencies: - expect: 29.0.3 - pretty-format: 29.0.3 + expect: 29.6.4 + pretty-format: 29.6.3 /@types/jsdom@20.0.0: resolution: {integrity: sha512-YfAchFs0yM1QPDrLm2VHe+WHGtqms3NXnXAMolrgrVP6fgBHHXy1ozAbo/dFtPNtZC/m66bPiCTWYmqp1F14gA==} @@ -1852,10 +1805,6 @@ packages: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@types/prettier@2.6.3: - resolution: {integrity: sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==} - dev: false - /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -2031,7 +1980,7 @@ packages: debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.7 + semver: 7.5.4 tsutils: 3.21.0(typescript@4.7.4) typescript: 4.7.4 transitivePeerDependencies: @@ -2304,17 +2253,17 @@ packages: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true - /babel-jest@29.5.0(@babel/core@7.18.9): - resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} + /babel-jest@29.6.4(@babel/core@7.18.9): + resolution: {integrity: sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: '@babel/core': 7.18.9 - '@jest/transform': 29.5.0 + '@jest/transform': 29.6.4 '@types/babel__core': 7.1.19 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.18.9) + babel-preset-jest: 29.6.3(@babel/core@7.18.9) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -2335,8 +2284,8 @@ packages: - supports-color dev: false - /babel-plugin-jest-hoist@29.5.0: - resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.18.6 @@ -2379,14 +2328,14 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.9) dev: false - /babel-preset-jest@29.5.0(@babel/core@7.18.9): - resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + /babel-preset-jest@29.6.3(@babel/core@7.18.9): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.18.9 - babel-plugin-jest-hoist: 29.5.0 + babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.9) dev: false @@ -2809,8 +2758,13 @@ packages: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + /dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true dev: false /deep-is@0.1.3: @@ -2856,15 +2810,10 @@ packages: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} dev: false - /diff-sequences@29.0.0: - resolution: {integrity: sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: false - /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -3091,7 +3040,7 @@ packages: eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.29.0)(eslint-import-resolver-typescript@3.2.7)(eslint@8.16.0) dev: true - /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.26.0)(eslint-plugin-jsx-a11y@6.5.1)(eslint-plugin-react-hooks@4.5.0)(eslint-plugin-react@7.30.1)(eslint@8.16.0): + /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.26.0)(eslint-plugin-jsx-a11y@6.5.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.30.1)(eslint@8.16.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: @@ -3106,7 +3055,7 @@ packages: eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.29.0)(eslint-import-resolver-typescript@3.2.7)(eslint@8.16.0) eslint-plugin-jsx-a11y: 6.5.1(eslint@8.16.0) eslint-plugin-react: 7.30.1(eslint@8.16.0) - eslint-plugin-react-hooks: 4.5.0(eslint@8.16.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.16.0) object.assign: 4.1.2 object.entries: 1.1.5 dev: true @@ -3120,11 +3069,12 @@ packages: eslint: 8.16.0 dev: true - /eslint-import-resolver-node@0.3.6: - resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 - resolve: 1.22.0 + is-core-module: 2.13.0 + resolve: 1.22.4 transitivePeerDependencies: - supports-color dev: true @@ -3149,7 +3099,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.7.3(@typescript-eslint/parser@5.29.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@3.2.7): + /eslint-module-utils@2.7.3(@typescript-eslint/parser@5.29.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.2.7): resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} engines: {node: '>=4'} peerDependencies: @@ -3169,7 +3119,7 @@ packages: dependencies: '@typescript-eslint/parser': 5.29.0(eslint@8.16.0)(typescript@4.7.4) debug: 3.2.7 - eslint-import-resolver-node: 0.3.6 + eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.2.7(eslint-plugin-import@2.26.0)(eslint@8.16.0) find-up: 2.1.0 transitivePeerDependencies: @@ -3192,8 +3142,8 @@ packages: debug: 2.6.9 doctrine: 2.1.0 eslint: 8.16.0 - eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3(@typescript-eslint/parser@5.29.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@3.2.7) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.7.3(@typescript-eslint/parser@5.29.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.2.7) has: 1.0.3 is-core-module: 2.9.0 is-glob: 4.0.3 @@ -3240,9 +3190,9 @@ packages: minimatch: 3.1.2 dev: true - /eslint-plugin-prettier@4.0.0(eslint-config-prettier@8.5.0)(eslint@8.16.0)(prettier@2.8.4): - resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} - engines: {node: '>=6.0.0'} + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.5.0)(eslint@8.16.0)(prettier@2.8.4): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} peerDependencies: eslint: '>=7.28.0' eslint-config-prettier: '*' @@ -3257,8 +3207,8 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-react-hooks@4.5.0(eslint@8.16.0): - resolution: {integrity: sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==} + /eslint-plugin-react-hooks@4.6.0(eslint@8.16.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 @@ -3432,26 +3382,15 @@ packages: engines: {node: '>= 0.8.0'} dev: false - /expect@29.0.3: - resolution: {integrity: sha512-t8l5DTws3212VbmPL+tBFXhjRHLmctHB0oQbL8eUc6S7NzZtYUhycrFO9mkxA0ZUC6FAWdNi7JchJSkODtcu1Q==} + /expect@29.6.4: + resolution: {integrity: sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.0.3 - jest-get-type: 29.0.0 - jest-matcher-utils: 29.0.3 - jest-message-util: 29.0.3 - jest-util: 29.0.3 - - /expect@29.5.0: - resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.5.0 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - dev: false + '@jest/expect-utils': 29.6.4 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.6.4 + jest-message-util: 29.6.3 + jest-util: 29.6.3 /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} @@ -3984,10 +3923,16 @@ packages: engines: {node: '>= 0.4'} dev: true + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + /is-core-module@2.9.0: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 + dev: true /is-date-object@1.0.4: resolution: {integrity: sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==} @@ -4118,6 +4063,19 @@ packages: - supports-color dev: false + /istanbul-lib-instrument@6.0.0: + resolution: {integrity: sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.18.9 + '@babel/parser': 7.18.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: false + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} @@ -4162,44 +4120,46 @@ packages: minimatch: 3.1.2 dev: true - /jest-changed-files@29.5.0: - resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} + /jest-changed-files@29.6.3: + resolution: {integrity: sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 + jest-util: 29.6.3 p-limit: 3.1.0 dev: false - /jest-circus@29.5.0: - resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} + /jest-circus@29.6.4: + resolution: {integrity: sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/expect': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/environment': 29.6.4 + '@jest/expect': 29.6.4 + '@jest/test-result': 29.6.4 + '@jest/types': 29.6.3 '@types/node': 16.11.7 chalk: 4.1.2 co: 4.6.0 - dedent: 0.7.0 + dedent: 1.5.1 is-generator-fn: 2.1.0 - jest-each: 29.5.0 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-runtime: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 + jest-each: 29.6.3 + jest-matcher-utils: 29.6.4 + jest-message-util: 29.6.3 + jest-runtime: 29.6.4 + jest-snapshot: 29.6.4 + jest-util: 29.6.3 p-limit: 3.1.0 - pretty-format: 29.5.0 + pretty-format: 29.6.3 pure-rand: 6.0.0 slash: 3.0.0 stack-utils: 2.0.5 transitivePeerDependencies: + - babel-plugin-macros - supports-color dev: false - /jest-cli@29.5.0(@types/node@16.11.7)(ts-node@10.9.1): - resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + /jest-cli@29.6.4(@types/node@16.11.7)(ts-node@10.9.1): + resolution: {integrity: sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -4208,26 +4168,27 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/core': 29.6.4(ts-node@10.9.1) + '@jest/test-result': 29.6.4 + '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.5.0(@types/node@16.11.7)(ts-node@10.9.1) - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-config: 29.6.4(@types/node@16.11.7)(ts-node@10.9.1) + jest-util: 29.6.3 + jest-validate: 29.6.3 prompts: 2.4.2 yargs: 17.5.1 transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: false - /jest-config@29.5.0(@types/node@16.11.7)(ts-node@10.9.1): - resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + /jest-config@29.6.4(@types/node@16.11.7)(ts-node@10.9.1): + resolution: {integrity: sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -4239,68 +4200,59 @@ packages: optional: true dependencies: '@babel/core': 7.18.9 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.5.0 + '@jest/test-sequencer': 29.6.4 + '@jest/types': 29.6.3 '@types/node': 16.11.7 - babel-jest: 29.5.0(@babel/core@7.18.9) + babel-jest: 29.6.4(@babel/core@7.18.9) chalk: 4.1.2 ci-info: 3.3.1 deepmerge: 4.2.2 glob: 7.2.0 graceful-fs: 4.2.10 - jest-circus: 29.5.0 - jest-environment-node: 29.5.0 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.5.0 - jest-validate: 29.5.0 + jest-circus: 29.6.4 + jest-environment-node: 29.6.4 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.6.4 + jest-runner: 29.6.4 + jest-util: 29.6.3 + jest-validate: 29.6.3 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.5.0 + pretty-format: 29.6.3 slash: 3.0.0 strip-json-comments: 3.1.1 ts-node: 10.9.1(@swc/core@1.3.38)(@types/node@16.11.7)(typescript@4.7.4) transitivePeerDependencies: + - babel-plugin-macros - supports-color dev: false - /jest-diff@29.0.3: - resolution: {integrity: sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg==} + /jest-diff@29.6.4: + resolution: {integrity: sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - diff-sequences: 29.0.0 - jest-get-type: 29.4.3 - pretty-format: 29.5.0 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.6.3 - /jest-diff@29.5.0: - resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.5.0 - dev: false - - /jest-docblock@29.4.3: - resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} + /jest-docblock@29.6.3: + resolution: {integrity: sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: false - /jest-each@29.5.0: - resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} + /jest-each@29.6.3: + resolution: {integrity: sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.5.0 - pretty-format: 29.5.0 + jest-get-type: 29.6.3 + jest-util: 29.6.3 + pretty-format: 29.6.3 dev: false /jest-environment-jsdom@29.5.0: @@ -4326,97 +4278,69 @@ packages: - utf-8-validate dev: true - /jest-environment-node@29.5.0: - resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} + /jest-environment-node@29.6.4: + resolution: {integrity: sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/types': 29.5.0 + '@jest/environment': 29.6.4 + '@jest/fake-timers': 29.6.4 + '@jest/types': 29.6.3 '@types/node': 16.11.7 - jest-mock: 29.5.0 - jest-util: 29.5.0 + jest-mock: 29.6.3 + jest-util: 29.6.3 dev: false - /jest-get-type@29.0.0: - resolution: {integrity: sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==} + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - /jest-haste-map@29.5.0: - resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} + /jest-haste-map@29.6.4: + resolution: {integrity: sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.5 '@types/node': 16.11.7 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 - jest-worker: 29.5.0 + jest-regex-util: 29.6.3 + jest-util: 29.6.3 + jest-worker: 29.6.4 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: false - /jest-leak-detector@29.5.0: - resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} + /jest-leak-detector@29.6.3: + resolution: {integrity: sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.5.0 + jest-get-type: 29.6.3 + pretty-format: 29.6.3 dev: false - /jest-matcher-utils@29.0.3: - resolution: {integrity: sha512-RsR1+cZ6p1hDV4GSCQTg+9qjeotQCgkaleIKLK7dm+U4V/H2bWedU3RAtLm8+mANzZ7eDV33dMar4pejd7047w==} + /jest-matcher-utils@29.6.4: + resolution: {integrity: sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - jest-diff: 29.0.3 - jest-get-type: 29.0.0 - pretty-format: 29.5.0 + jest-diff: 29.6.4 + jest-get-type: 29.6.3 + pretty-format: 29.6.3 - /jest-matcher-utils@29.5.0: - resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.5.0 - jest-get-type: 29.4.3 - pretty-format: 29.5.0 - dev: false - - /jest-message-util@29.0.3: - resolution: {integrity: sha512-7T8JiUTtDfppojosORAflABfLsLKMLkBHSWkjNQrjIltGoDzNGn7wEPOSfjqYAGTYME65esQzMJxGDjuLBKdOg==} + /jest-message-util@29.6.3: + resolution: {integrity: sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/code-frame': 7.18.6 - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.10 micromatch: 4.0.5 - pretty-format: 29.5.0 - slash: 3.0.0 - stack-utils: 2.0.5 - - /jest-message-util@29.5.0: - resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.18.6 - '@jest/types': 29.5.0 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 29.5.0 + pretty-format: 29.6.3 slash: 3.0.0 stack-utils: 2.0.5 @@ -4424,11 +4348,20 @@ packages: resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 '@types/node': 16.11.7 - jest-util: 29.5.0 + jest-util: 29.6.3 + dev: true - /jest-pnp-resolver@1.2.2(jest-resolve@29.5.0): + /jest-mock@29.6.3: + resolution: {integrity: sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 16.11.7 + jest-util: 29.6.3 + + /jest-pnp-resolver@1.2.2(jest-resolve@29.6.4): resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} peerDependencies: @@ -4437,7 +4370,7 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.5.0 + jest-resolve: 29.6.4 dev: false /jest-regex-util@29.0.0: @@ -4445,122 +4378,119 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: false - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: false - /jest-resolve-dependencies@29.5.0: - resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} + /jest-resolve-dependencies@29.6.4: + resolution: {integrity: sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.5.0 + jest-regex-util: 29.6.3 + jest-snapshot: 29.6.4 transitivePeerDependencies: - supports-color dev: false - /jest-resolve@29.5.0: - resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} + /jest-resolve@29.6.4: + resolution: {integrity: sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.2(jest-resolve@29.5.0) - jest-util: 29.5.0 - jest-validate: 29.5.0 - resolve: 1.22.1 + jest-haste-map: 29.6.4 + jest-pnp-resolver: 1.2.2(jest-resolve@29.6.4) + jest-util: 29.6.3 + jest-validate: 29.6.3 + resolve: 1.22.4 resolve.exports: 2.0.1 slash: 3.0.0 dev: false - /jest-runner@29.5.0: - resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} + /jest-runner@29.6.4: + resolution: {integrity: sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.5.0 - '@jest/environment': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/console': 29.6.4 + '@jest/environment': 29.6.4 + '@jest/test-result': 29.6.4 + '@jest/transform': 29.6.4 + '@jest/types': 29.6.3 '@types/node': 16.11.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 - jest-docblock: 29.4.3 - jest-environment-node: 29.5.0 - jest-haste-map: 29.5.0 - jest-leak-detector: 29.5.0 - jest-message-util: 29.5.0 - jest-resolve: 29.5.0 - jest-runtime: 29.5.0 - jest-util: 29.5.0 - jest-watcher: 29.5.0 - jest-worker: 29.5.0 + jest-docblock: 29.6.3 + jest-environment-node: 29.6.4 + jest-haste-map: 29.6.4 + jest-leak-detector: 29.6.3 + jest-message-util: 29.6.3 + jest-resolve: 29.6.4 + jest-runtime: 29.6.4 + jest-util: 29.6.3 + jest-watcher: 29.6.4 + jest-worker: 29.6.4 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: false - /jest-runtime@29.5.0: - resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} + /jest-runtime@29.6.4: + resolution: {integrity: sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/globals': 29.5.0 - '@jest/source-map': 29.4.3 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 + '@jest/environment': 29.6.4 + '@jest/fake-timers': 29.6.4 + '@jest/globals': 29.6.4 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.6.4 + '@jest/transform': 29.6.4 + '@jest/types': 29.6.3 '@types/node': 16.11.7 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 glob: 7.2.0 graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 + jest-haste-map: 29.6.4 + jest-message-util: 29.6.3 + jest-mock: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.6.4 + jest-snapshot: 29.6.4 + jest-util: 29.6.3 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: false - /jest-snapshot@29.5.0: - resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} + /jest-snapshot@29.6.4: + resolution: {integrity: sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.18.9 '@babel/generator': 7.18.9 '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.18.9) '@babel/plugin-syntax-typescript': 7.17.12(@babel/core@7.18.9) - '@babel/traverse': 7.18.9 '@babel/types': 7.18.9 - '@jest/expect-utils': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/babel__traverse': 7.17.1 - '@types/prettier': 2.6.3 + '@jest/expect-utils': 29.6.4 + '@jest/transform': 29.6.4 + '@jest/types': 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.9) chalk: 4.1.2 - expect: 29.5.0 + expect: 29.6.4 graceful-fs: 4.2.10 - jest-diff: 29.5.0 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 + jest-diff: 29.6.4 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.6.4 + jest-message-util: 29.6.3 + jest-util: 29.6.3 natural-compare: 1.4.0 - pretty-format: 29.5.0 - semver: 7.3.7 + pretty-format: 29.6.3 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: false @@ -4582,41 +4512,42 @@ packages: styled-components: 5.3.1(react-dom@18.1.0)(react-is@18.2.0)(react@18.1.0) dev: true - /jest-util@29.0.3: - resolution: {integrity: sha512-Q0xaG3YRG8QiTC4R6fHjHQPaPpz9pJBEi0AeOE4mQh/FuWOijFjGXMMOfQEaU9i3z76cNR7FobZZUQnL6IyfdQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/node': 16.11.7 - chalk: 4.1.2 - ci-info: 3.3.1 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - /jest-util@29.5.0: resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 + '@types/node': 16.11.7 + chalk: 4.1.2 + ci-info: 3.3.1 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + + /jest-util@29.6.3: + resolution: {integrity: sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 '@types/node': 16.11.7 chalk: 4.1.2 ci-info: 3.3.1 graceful-fs: 4.2.10 picomatch: 2.3.1 - /jest-validate@29.5.0: - resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} + /jest-validate@29.6.3: + resolution: {integrity: sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.5.0 + '@jest/types': 29.6.3 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 29.4.3 + jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 29.5.0 + pretty-format: 29.6.3 dev: false - /jest-watch-typeahead@2.2.2(jest@29.5.0): + /jest-watch-typeahead@2.2.2(jest@29.6.4): resolution: {integrity: sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==} engines: {node: ^14.17.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -4624,7 +4555,7 @@ packages: dependencies: ansi-escapes: 6.0.0 chalk: 5.2.0 - jest: 29.5.0(@types/node@16.11.7)(ts-node@10.9.1) + jest: 29.6.4(@types/node@16.11.7)(ts-node@10.9.1) jest-regex-util: 29.0.0 jest-watcher: 29.0.3 slash: 5.0.0 @@ -4636,42 +4567,42 @@ packages: resolution: {integrity: sha512-tQX9lU91A+9tyUQKUMp0Ns8xAcdhC9fo73eqA3LFxP2bSgiF49TNcc+vf3qgGYYK9qRjFpXW9+4RgF/mbxyOOw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.0.3 - '@jest/types': 29.5.0 + '@jest/test-result': 29.6.4 + '@jest/types': 29.6.3 '@types/node': 16.11.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 - jest-util: 29.5.0 + jest-util: 29.6.3 string-length: 4.0.2 dev: false - /jest-watcher@29.5.0: - resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} + /jest-watcher@29.6.4: + resolution: {integrity: sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 + '@jest/test-result': 29.6.4 + '@jest/types': 29.6.3 '@types/node': 16.11.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.5.0 + jest-util: 29.6.3 string-length: 4.0.2 dev: false - /jest-worker@29.5.0: - resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} + /jest-worker@29.6.4: + resolution: {integrity: sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/node': 16.11.7 - jest-util: 29.5.0 + jest-util: 29.6.3 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false - /jest@29.5.0(@types/node@16.11.7)(ts-node@10.9.1): - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + /jest@29.6.4(@types/node@16.11.7)(ts-node@10.9.1): + resolution: {integrity: sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -4680,12 +4611,13 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.5.0(ts-node@10.9.1) - '@jest/types': 29.5.0 + '@jest/core': 29.6.4(ts-node@10.9.1) + '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@16.11.7)(ts-node@10.9.1) + jest-cli: 29.6.4(@types/node@16.11.7)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros - supports-color - ts-node dev: false @@ -4915,8 +4847,8 @@ packages: dependencies: js-tokens: 4.0.0 - /lossless-json@2.0.8: - resolution: {integrity: sha512-7/GaZldUc7H5oNZlSk6bF06cRbtA7oF8zWXwbfMZm8yrYC2debx0KvWTBbQIbj6fh08LsXTWg+YtHJshXgYKow==} + /lossless-json@2.0.11: + resolution: {integrity: sha512-BP0vn+NGYvzDielvBZaFain/wgeJ1hTvURCqtKvhr1SCPePdaaTanmmcplrHfEJSJOUql7hk4FHwToNJjWRY3g==} dev: false /lru-cache@6.0.0: @@ -5390,19 +5322,11 @@ packages: ansi-styles: 5.2.0 react-is: 17.0.2 - /pretty-format@29.0.3: - resolution: {integrity: sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q==} + /pretty-format@29.6.3: + resolution: {integrity: sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.0.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - - /pretty-format@29.5.0: - resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.4.3 + '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 @@ -5766,7 +5690,7 @@ packages: resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -5775,14 +5699,22 @@ packages: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 /resolve@2.0.0-next.3: resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} dependencies: - is-core-module: 2.9.0 + is-core-module: 2.13.0 path-parse: 1.0.7 dev: true @@ -5888,6 +5820,14 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 /shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} @@ -6383,8 +6323,8 @@ packages: requires-port: 1.0.0 dev: true - /use-debounce@9.0.3(react@18.1.0): - resolution: {integrity: sha512-FhtlbDtDXILJV7Lix5OZj5yX/fW1tzq+VrvK1fnT2bUrPOGruU9Rw8NCEn+UI9wopfERBEZAOQ8lfeCJPllgnw==} + /use-debounce@9.0.4(react@18.1.0): + resolution: {integrity: sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ==} engines: {node: '>= 10.0.0'} peerDependencies: react: '>=16.8.0' @@ -6420,7 +6360,7 @@ packages: resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.15 + '@jridgewell/trace-mapping': 0.3.19 '@types/istanbul-lib-coverage': 2.0.3 convert-source-map: 1.7.0 dev: false diff --git a/kafka-ui-react-app/src/components/Topics/Topic/Statistics/Metrics.tsx b/kafka-ui-react-app/src/components/Topics/Topic/Statistics/Metrics.tsx index eae9d4b3ce..69da71c31b 100644 --- a/kafka-ui-react-app/src/components/Topics/Topic/Statistics/Metrics.tsx +++ b/kafka-ui-react-app/src/components/Topics/Topic/Statistics/Metrics.tsx @@ -44,9 +44,11 @@ const Metrics: React.FC = () => { if (data.progress) { return ( + + {Math.floor(data.progress.completenessPercent || 0)}% + - {Math.floor(data.progress.completenessPercent || 0)} % { diff --git a/kafka-ui-react-app/src/components/Topics/Topic/Statistics/Statistics.styles.ts b/kafka-ui-react-app/src/components/Topics/Topic/Statistics/Statistics.styles.ts index 06a4ae9c9d..ca98cdcbfd 100644 --- a/kafka-ui-react-app/src/components/Topics/Topic/Statistics/Statistics.styles.ts +++ b/kafka-ui-react-app/src/components/Topics/Topic/Statistics/Statistics.styles.ts @@ -42,3 +42,10 @@ export const ProgressBarWrapper = styled.div` align-items: center; width: 280px; `; + +export const ProgressPct = styled.span` + font-size: 15px; + font-weight: bold; + line-height: 1.5; + color: ${({ theme }) => theme.statictics.progressPctColor}; +`; diff --git a/kafka-ui-react-app/src/theme/theme.ts b/kafka-ui-react-app/src/theme/theme.ts index 5ff21fe7e3..8426d3c2fc 100644 --- a/kafka-ui-react-app/src/theme/theme.ts +++ b/kafka-ui-react-app/src/theme/theme.ts @@ -291,6 +291,7 @@ const baseTheme = { }, statictics: { createdAtColor: Colors.neutral[50], + progressPctColor: Colors.neutral[100], }, progressBar: { backgroundColor: Colors.neutral[3],