From 7a4aba5224b9008e46a7da885104e23c8838eb1d Mon Sep 17 00:00:00 2001 From: StephanStrehlerCGI <115698474+StephanStrehlerCGI@users.noreply.github.com> Date: Wed, 9 Aug 2023 10:04:58 +0200 Subject: [PATCH 01/30] Feature/#535 database pagination for process instances (#566) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * #535: move paginition to database for process instances * #535: add create index database migrations * #535: fixed missing entity mapping * #535: MR feedback * chore: merge branch dev * chore: merge branch dev * #535: typo in JavaDoc * #535: typo in JavaDoc and removing of unused method --------- Co-authored-by: Lukas Mösle --- .../api/mapper/ProcessInstancePageMapper.java | 63 ---------- .../service/ServiceInstanceService.java | 20 +-- .../ProcessInstanceInfoRepository.java | 67 +++++++++- ...add_indexes_to_process_instance_tables.sql | 3 + ...add_indexes_to_process_instance_tables.sql | 3 + ...add_indexes_to_process_instance_tables.sql | 3 + .../mapper/ProcessInstancePageMapperTest.java | 78 ------------ .../ProcessInstanceInfoRepositoryTest.java | 118 ++++++++++++++++++ 8 files changed, 203 insertions(+), 152 deletions(-) delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/api/mapper/ProcessInstancePageMapper.java create mode 100644 digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/h2/V11__add_indexes_to_process_instance_tables.sql create mode 100644 digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/oracle/V22__add_indexes_to_process_instance_tables.sql create mode 100644 digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/postgresql/V11__add_indexes_to_process_instance_tables.sql delete mode 100644 digiwf-engine/digiwf-engine-service/src/test/java/de/muenchen/oss/digiwf/process/instance/api/mapper/ProcessInstancePageMapperTest.java create mode 100644 digiwf-engine/digiwf-engine-service/src/test/java/de/muenchen/oss/digiwf/process/instance/infrastructure/repository/ProcessInstanceInfoRepositoryTest.java diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/api/mapper/ProcessInstancePageMapper.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/api/mapper/ProcessInstancePageMapper.java deleted file mode 100644 index daf5291636..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/api/mapper/ProcessInstancePageMapper.java +++ /dev/null @@ -1,63 +0,0 @@ -package de.muenchen.oss.digiwf.process.instance.api.mapper; - -import de.muenchen.oss.digiwf.process.instance.domain.model.ServiceInstance; -import lombok.NoArgsConstructor; -import lombok.val; -import org.apache.commons.lang3.StringUtils; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; - -import javax.annotation.Nullable; -import java.util.List; -import java.util.stream.Collectors; - -@Component -@NoArgsConstructor -public class ProcessInstancePageMapper { - - - public Page toPage( - final List definitions, - final int page, - final int size, - @Nullable final String query - ) { - val filteredDefinitions = filterByQuery(definitions, query); - return listToPage(filteredDefinitions, page, size); - } - - private Page listToPage( - final List definitions, - final int page, - final int size) { - - val from = page * size; - val to = Math.min((page + 1) * size, definitions.size()); - val pageContent = definitions.subList(from, to); - return new PageImpl(pageContent, PageRequest.of(page, size), definitions.size()); - } - - private List filterByQuery( - final List definitions, - @Nullable final String query - ) { - final String lowerCaseQuery = query == null ? "" : query.toLowerCase(); - return lowerCaseQuery.isBlank() - ? definitions - : definitions.stream().filter( - it -> - StringUtils.containsIgnoreCase(it.getId(), lowerCaseQuery) - || StringUtils.containsIgnoreCase(it.getInstanceId(), lowerCaseQuery) - || StringUtils.containsIgnoreCase(it.getDescription(), lowerCaseQuery) - || StringUtils.containsIgnoreCase(it.getDefinitionKey(), lowerCaseQuery) - || StringUtils.containsIgnoreCase(it.getDefinitionName(), lowerCaseQuery) - || StringUtils.containsIgnoreCase(it.getStatusKey(), lowerCaseQuery) - || StringUtils.containsIgnoreCase(it.getStatus(), lowerCaseQuery) - || StringUtils.containsIgnoreCase(it.getStartTime() != null ? it.getStartTime().toString() : "", lowerCaseQuery) - || StringUtils.containsIgnoreCase(it.getEndTime() != null ? it.getEndTime().toString() : "", lowerCaseQuery) - || StringUtils.containsIgnoreCase(it.getRemovalTime() != null ? it.getRemovalTime().toString() : "", lowerCaseQuery) - ).collect(Collectors.toList()); - } -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/domain/service/ServiceInstanceService.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/domain/service/ServiceInstanceService.java index f096ef0317..afa30fbf19 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/domain/service/ServiceInstanceService.java +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/domain/service/ServiceInstanceService.java @@ -7,7 +7,6 @@ import de.muenchen.oss.digiwf.jsonschema.domain.model.JsonSchema; import de.muenchen.oss.digiwf.jsonschema.domain.service.JsonSchemaService; import de.muenchen.oss.digiwf.process.config.domain.service.ProcessConfigService; -import de.muenchen.oss.digiwf.process.instance.api.mapper.ProcessInstancePageMapper; import de.muenchen.oss.digiwf.process.instance.domain.mapper.HistoryTaskMapper; import de.muenchen.oss.digiwf.process.instance.domain.mapper.ServiceInstanceMapper; import de.muenchen.oss.digiwf.process.instance.domain.model.ServiceInstance; @@ -20,6 +19,8 @@ import org.apache.commons.lang3.StringUtils; import org.camunda.bpm.engine.HistoryService; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import javax.annotation.Nullable; @@ -50,7 +51,6 @@ public class ServiceInstanceService { private final JsonSchemaService jsonSchemaService; private final ServiceInstanceDataService serviceInstanceDataService; - private final ProcessInstancePageMapper processInstancePageMapper; /** @@ -62,12 +62,15 @@ public Page getProcessInstanceByUser( final String userId, final int page, final int size, - @Nullable - final String query - ) { - final List processAuthIds = this.serviceInstanceAuthService.getAllServiceInstanceIdsByUser(userId); - val instances = this.serviceInstanceMapper.map2Model(this.processInstanceInfoRepository.findAllByInstanceIdIn(processAuthIds)); - return processInstancePageMapper.toPage(instances, page, size, query); + @Nullable final String query + ) { + final Pageable pageRequest = PageRequest.of(page, size); + if (query == null || query.isBlank()) { + return processInstanceInfoRepository.findAllByUserId(userId, pageRequest) + .map(this.serviceInstanceMapper::map2Model); + } + return processInstanceInfoRepository.searchAllByUserId(query.toLowerCase(), userId, pageRequest) + .map(this.serviceInstanceMapper::map2Model); } /** @@ -196,5 +199,4 @@ public void cleanupInstance(final String instanceId) { log.info("Service instance cleaned up: {}", entity.get().getInstanceId()); } } - } diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/infrastructure/repository/ProcessInstanceInfoRepository.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/infrastructure/repository/ProcessInstanceInfoRepository.java index 942613a0c3..d138d1d118 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/infrastructure/repository/ProcessInstanceInfoRepository.java +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/process/instance/infrastructure/repository/ProcessInstanceInfoRepository.java @@ -5,7 +5,12 @@ package de.muenchen.oss.digiwf.process.instance.infrastructure.repository; import de.muenchen.oss.digiwf.process.instance.infrastructure.entity.ServiceInstanceEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; import java.util.Date; import java.util.List; @@ -16,11 +21,69 @@ * * @author externer.dl.horn */ +@Repository public interface ProcessInstanceInfoRepository extends JpaRepository { Optional findByInstanceId(String processInstanceId); - List findAllByInstanceIdIn(List instanceIds); - List findByRemovalTimeBefore(Date referenceDate); + + /** + * + * @param userId id of the user + * @param pageable page request + * @return all process information which th user with the given id is allowed to see + */ + @Query( + value = "SELECT si FROM ServiceInstance si " + + "LEFT JOIN ProcessInstanceAuth sia ON sia.processInstanceId = si.instanceId " + + "WHERE sia.userId = :user", + countQuery = "SELECT count(si) FROM ServiceInstance si " + + "LEFT JOIN ProcessInstanceAuth sia ON sia.processInstanceId = si.instanceId " + + "WHERE sia.userId = :user" + ) + Page findAllByUserId(@Param("user") String userId, Pageable pageable); + + /** + * + * @param lowerQuery search string in lower case + * @param userId id of the user + * @param pageable page request + * @return all process information which th user with the given id is allowed to see and which contains the search query in the following columns + * - id + * - instanceId + * - definitionName + * - definitionKey + * - description + * - status + * - statusKey + */ + @Query( + value = "SELECT si FROM ServiceInstance si " + + "LEFT JOIN ProcessInstanceAuth sia " + + "ON sia.processInstanceId = si.instanceId WHERE sia.userId = :user AND (" + + "lower(si.id) LIKE concat('%', :search,'%')" + + "OR lower(si.instanceId) LIKE concat('%', :search,'%')" + + "OR lower(si.definitionName) LIKE concat('%', :search,'%')" + + "OR lower(si.definitionKey) LIKE concat('%', :search,'%')" + + "OR lower(si.description) LIKE concat('%', :search,'%')" + + "OR lower(si.status) LIKE concat('%', :search,'%')" + + "OR lower(si.statusKey) LIKE concat('%', :search,'%')" + + ")", + countQuery = "SELECT count(si) FROM ServiceInstance si " + + "LEFT JOIN ProcessInstanceAuth sia ON sia.processInstanceId = si.instanceId WHERE sia.userId = :user AND (" + + "lower(si.id) LIKE concat('%', :search,'%')" + + "OR lower(si.instanceId) LIKE concat('%', :search,'%')" + + "OR lower(si.definitionName) LIKE concat('%', :search,'%')" + + "OR lower(si.definitionKey) LIKE concat('%', :search,'%')" + + "OR lower(si.description) LIKE concat('%', :search,'%')" + + "OR lower(si.status) LIKE concat('%', :search,'%')" + + "OR lower(si.statusKey) LIKE concat('%', :search,'%')" + + ")" + ) + Page searchAllByUserId( + @Param("search") String lowerQuery, + @Param("user") String userId, + Pageable pageable + ); } diff --git a/digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/h2/V11__add_indexes_to_process_instance_tables.sql b/digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/h2/V11__add_indexes_to_process_instance_tables.sql new file mode 100644 index 0000000000..679a2fef89 --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/h2/V11__add_indexes_to_process_instance_tables.sql @@ -0,0 +1,3 @@ + +create index IDX_dwf_process_instance_info_pii on dwf_process_instance_info (processinstanceid_); +create index IDX_dwf_process_instance_auth_pii on dwf_process_instance_auth (processinstanceid_); diff --git a/digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/oracle/V22__add_indexes_to_process_instance_tables.sql b/digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/oracle/V22__add_indexes_to_process_instance_tables.sql new file mode 100644 index 0000000000..679a2fef89 --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/oracle/V22__add_indexes_to_process_instance_tables.sql @@ -0,0 +1,3 @@ + +create index IDX_dwf_process_instance_info_pii on dwf_process_instance_info (processinstanceid_); +create index IDX_dwf_process_instance_auth_pii on dwf_process_instance_auth (processinstanceid_); diff --git a/digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/postgresql/V11__add_indexes_to_process_instance_tables.sql b/digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/postgresql/V11__add_indexes_to_process_instance_tables.sql new file mode 100644 index 0000000000..679a2fef89 --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/resources/db/migration/postgresql/V11__add_indexes_to_process_instance_tables.sql @@ -0,0 +1,3 @@ + +create index IDX_dwf_process_instance_info_pii on dwf_process_instance_info (processinstanceid_); +create index IDX_dwf_process_instance_auth_pii on dwf_process_instance_auth (processinstanceid_); diff --git a/digiwf-engine/digiwf-engine-service/src/test/java/de/muenchen/oss/digiwf/process/instance/api/mapper/ProcessInstancePageMapperTest.java b/digiwf-engine/digiwf-engine-service/src/test/java/de/muenchen/oss/digiwf/process/instance/api/mapper/ProcessInstancePageMapperTest.java deleted file mode 100644 index 8455f8cb64..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/test/java/de/muenchen/oss/digiwf/process/instance/api/mapper/ProcessInstancePageMapperTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package de.muenchen.oss.digiwf.process.instance.api.mapper; - -import de.muenchen.oss.digiwf.process.instance.domain.model.ServiceInstance; -import lombok.val; -import org.junit.jupiter.api.Test; - -import java.sql.Date; -import java.time.Instant; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class ProcessInstancePageMapperTest { - - private final ProcessInstancePageMapper mapper = new ProcessInstancePageMapper(); - - private final List instances = List.of( - createServiceInstance(1, "A"), - createServiceInstance(2, "A"), - createServiceInstance(3, "B"), - createServiceInstance(4, "B"), - createServiceInstance(5, "B"), - createServiceInstance(6, "C"), - createServiceInstance(7, "C"), - createServiceInstance(8, "D") - ); - - @Test - public void shouldSplitPageCorrectly() { - - val resultOfFirstPage = mapper.toPage(instances, 0, 3, null); - assertEquals(8, resultOfFirstPage.getTotalElements()); - assertEquals(0, resultOfFirstPage.getNumber()); - assertEquals(3, resultOfFirstPage.getSize()); - assertEquals(3, resultOfFirstPage.getTotalPages()); - assertArrayEquals(List.of("id-1", "id-2", "id-3").toArray(), resultOfFirstPage.getContent().stream().map(ServiceInstance::getId).toArray()); - - val resultOfSecondPage = mapper.toPage(instances, 1, 3, null); - assertEquals(8, resultOfSecondPage.getTotalElements()); - assertEquals(1, resultOfSecondPage.getNumber()); - assertEquals(3, resultOfSecondPage.getSize()); - assertEquals(3, resultOfFirstPage.getTotalPages()); - assertArrayEquals(List.of("id-4", "id-5", "id-6").toArray(), resultOfSecondPage.getContent().stream().map(ServiceInstance::getId).toArray()); - } - - @Test - public void shouldSearchCorrectlyInProperties() { - val resultOfDescriptionSearch = mapper.toPage(instances, 0, 3, "-A"); - assertEquals(2, resultOfDescriptionSearch.getTotalElements()); - assertEquals(0, resultOfDescriptionSearch.getNumber()); - assertArrayEquals(List.of("id-1", "id-2").toArray(), resultOfDescriptionSearch.getContent().stream().map(ServiceInstance::getId).toArray()); - - val resultOfNameSearch = mapper.toPage(instances, 0, 3, "name-7"); - assertEquals(1, resultOfNameSearch.getTotalElements()); - assertEquals(0, resultOfNameSearch.getNumber()); - assertArrayEquals(List.of("id-7").toArray(), resultOfNameSearch.getContent().stream().map(ServiceInstance::getId).toArray()); - - val resultOfNonSuccessfullySearch = mapper.toPage(instances, 0, 3, "does-not-exist"); - assertEquals(0, resultOfNonSuccessfullySearch.getTotalElements()); - assertEquals(0, resultOfNonSuccessfullySearch.getNumber()); - assertEquals(0, resultOfNonSuccessfullySearch.getContent().size()); - } - - private ServiceInstance createServiceInstance(int id, String descriptionSuffix) { - return new ServiceInstance( - "id-" + id, - "instance-key-" + id, - "definition-name-" + id, - "definition-key-" + id, - Date.from(Instant.now()), - Date.from(Instant.now()), - Date.from(Instant.now()), - "status", - "status-key-1", - "description-" + descriptionSuffix - ); - } -} diff --git a/digiwf-engine/digiwf-engine-service/src/test/java/de/muenchen/oss/digiwf/process/instance/infrastructure/repository/ProcessInstanceInfoRepositoryTest.java b/digiwf-engine/digiwf-engine-service/src/test/java/de/muenchen/oss/digiwf/process/instance/infrastructure/repository/ProcessInstanceInfoRepositoryTest.java new file mode 100644 index 0000000000..166145a07f --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/test/java/de/muenchen/oss/digiwf/process/instance/infrastructure/repository/ProcessInstanceInfoRepositoryTest.java @@ -0,0 +1,118 @@ +package de.muenchen.oss.digiwf.process.instance.infrastructure.repository; + +import de.muenchen.oss.digiwf.process.instance.infrastructure.entity.ServiceInstanceAuthorizationEntity; +import de.muenchen.oss.digiwf.process.instance.infrastructure.entity.ServiceInstanceEntity; +import lombok.val; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.data.domain.PageRequest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +import java.sql.Date; +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.*; + +@RunWith(SpringRunner.class) +@DataJpaTest +@ActiveProfiles("test") +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +class ProcessInstanceInfoRepositoryTest { + + @Autowired + private TestEntityManager entityManager; + + @Autowired + private ProcessInstanceInfoRepository processInstanceInfoRepository; + + + @Test + void findAllUserId() { + createAndSaveProcessInstance(1); + createAndSaveProcessInstance(2); + createAndSaveProcessInstance(3); + createAndSaveProcessInstance(4); + createAndSaveProcessInstance(5); + + createAndSaveProcessAuthInstance(1, 1); + createAndSaveProcessAuthInstance(2, 1); + createAndSaveProcessAuthInstance(3, 1); + + createAndSaveProcessAuthInstance(1, 2); + createAndSaveProcessAuthInstance(2, 2); + + createAndSaveProcessAuthInstance(3, 3); + createAndSaveProcessAuthInstance(4, 3); + + + val firstPageOfUser1 = processInstanceInfoRepository.findAllByUserId("user-1", PageRequest.of(0, 2)); + assertEquals(3, firstPageOfUser1.getTotalElements()); + assertEquals("instance-1", firstPageOfUser1.getContent().get(0).getInstanceId()); + assertEquals("instance-2", firstPageOfUser1.getContent().get(1).getInstanceId()); + + val secondPageOfUser1 = processInstanceInfoRepository.findAllByUserId("user-1", PageRequest.of(1, 2)); + assertEquals("instance-3", secondPageOfUser1.getContent().get(0).getInstanceId()); + + val firstPageOfUser2 = processInstanceInfoRepository.findAllByUserId("user-2", PageRequest.of(0, 2)); + assertEquals(2, firstPageOfUser2.getTotalElements()); + assertEquals("instance-1", firstPageOfUser2.getContent().get(0).getInstanceId()); + assertEquals("instance-2", firstPageOfUser2.getContent().get(1).getInstanceId()); + + + val firstPageOfUser3 = processInstanceInfoRepository.findAllByUserId("user-3", PageRequest.of(0, 2)); + assertEquals(2, firstPageOfUser3.getTotalElements()); + assertEquals("instance-3", firstPageOfUser3.getContent().get(0).getInstanceId()); + assertEquals("instance-4", firstPageOfUser3.getContent().get(1).getInstanceId()); + } + + @Test + void searchAllByUserId() { + createAndSaveProcessInstance(1); + createAndSaveProcessInstance(2); + createAndSaveProcessInstance(3); + createAndSaveProcessInstance(4); + createAndSaveProcessInstance(5); + + createAndSaveProcessAuthInstance(1, 1); + createAndSaveProcessAuthInstance(2, 1); + createAndSaveProcessAuthInstance(3, 1); + + createAndSaveProcessAuthInstance(1, 2); + createAndSaveProcessAuthInstance(2, 2); + + createAndSaveProcessAuthInstance(3, 3); + createAndSaveProcessAuthInstance(4, 3); + + val searchResultOfServiceByInstanceIdPart = processInstanceInfoRepository.searchAllByUserId("ce-1", "user-1", PageRequest.of(0, 2)); + assertEquals(1, searchResultOfServiceByInstanceIdPart.getTotalElements()); + assertEquals("instance-1", searchResultOfServiceByInstanceIdPart.getContent().get(0).getInstanceId()); + + val searchResultOfDefinitionNameSearch = processInstanceInfoRepository.searchAllByUserId("definitionName".toLowerCase(), "user-1", PageRequest.of(0, 2)); + assertEquals(3, searchResultOfDefinitionNameSearch.getTotalElements()); + assertEquals("instance-1", searchResultOfDefinitionNameSearch.getContent().get(0).getInstanceId()); + assertEquals("instance-2", searchResultOfDefinitionNameSearch.getContent().get(1).getInstanceId()); + } + + private void createAndSaveProcessInstance(int idSuffix) { + val process = ServiceInstanceEntity.builder() + .instanceId("instance-" + idSuffix) + .definitionKey("definition-key-" + idSuffix) + .definitionName("definitionName") + .startTime(Date.valueOf(LocalDate.now())) + .build(); + entityManager.persistAndFlush(process); + } + + private void createAndSaveProcessAuthInstance(int processIdSuffix, int userIdSuffix) { + val processAuth = ServiceInstanceAuthorizationEntity.builder() + .userId("user-" + userIdSuffix) + .processInstanceId("instance-" + processIdSuffix) + .build(); + entityManager.persistAndFlush(processAuth); + } +} From e6ac600b5081c082d9d39fdd5e77051753f325f7 Mon Sep 17 00:00:00 2001 From: StephanStrehlerCGI <115698474+StephanStrehlerCGI@users.noreply.github.com> Date: Fri, 11 Aug 2023 14:05:48 +0200 Subject: [PATCH 02/30] Feature/#512 configure sort direction (#577) * #512: first nearly working solution * #512: add vuex and refactor connection from component layer to Vuex * #512: remove unnecessary code * #512: add tests * #512: restructure vuex data structure * #512: add test id to component * #512: MR feedback --- .../apps/digiwf-tasklist/components.d.ts | 4 +- .../apps/digiwf-tasklist/package-lock.json | 163 +++++++++++++++++- .../apps/digiwf-tasklist/package.json | 3 +- .../packages/apps/digiwf-tasklist/src/App.vue | 7 +- .../src/api/tasks/tasksApiCalls.ts | 9 +- .../src/components/common/SearchField.vue | 4 +- .../src/components/common/SortBySelect.vue | 35 ++++ .../src/components/task/TaskList.vue | 16 +- .../PageBasedPaginationProvider.spec.ts | 4 +- .../middleware/PageBasedPaginationProvider.ts | 4 +- .../src/middleware/paginationData.ts | 6 +- .../src/middleware/tasks/taskMiddleware.ts | 45 +++-- .../apps/digiwf-tasklist/src/store/index.ts | 11 +- .../src/store/modules/filters.spec.ts | 71 ++++++++ .../src/store/modules/filters.ts | 84 +++++++++ .../digiwf-tasklist/src/store/modules/menu.ts | 8 - .../src/views/AssignedGroupTasks.vue | 25 +-- .../src/views/OpenGroupTasks.vue | 29 ++-- .../apps/digiwf-tasklist/src/views/Tasks.vue | 8 +- 19 files changed, 451 insertions(+), 85 deletions(-) create mode 100644 digiwf-apps/packages/apps/digiwf-tasklist/src/components/common/SortBySelect.vue create mode 100644 digiwf-apps/packages/apps/digiwf-tasklist/src/store/modules/filters.spec.ts create mode 100644 digiwf-apps/packages/apps/digiwf-tasklist/src/store/modules/filters.ts diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/components.d.ts b/digiwf-apps/packages/apps/digiwf-tasklist/components.d.ts index 1098c817a3..f871c1f15b 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/components.d.ts +++ b/digiwf-apps/packages/apps/digiwf-tasklist/components.d.ts @@ -31,6 +31,7 @@ declare module '@vue/runtime-core' { ProcessDefinitionItem: typeof import('./src/components/process/ProcessDefinitionItem.vue')['default'] ProcessInstanceItem: typeof import('./src/components/process/ProcessInstanceItem.vue')['default'] SearchField: typeof import('./src/components/common/SearchField.vue')['default'] + SortBySelect: typeof import('./src/components/common/SortBySelect.vue')['default'] TaskFollowUpDialog: typeof import('./src/components/task/TaskFollowUpDialog.vue')['default'] TaskItem: typeof import('./src/components/task/TaskItem.vue')['default'] TaskList: typeof import('./src/components/task/TaskList.vue')['default'] @@ -49,7 +50,6 @@ declare module '@vue/runtime-core' { VCardTitle: typeof import('vuetify/lib')['VCardTitle'] VCheckbox: typeof import('vuetify/lib')['VCheckbox'] VChip: typeof import('vuetify/lib')['VChip'] - VCol: typeof import('vuetify/lib')['VCol'] VCombobox: typeof import('vuetify/lib')['VCombobox'] VContainer: typeof import('vuetify/lib')['VContainer'] VDataIterator: typeof import('vuetify/lib')['VDataIterator'] @@ -74,11 +74,11 @@ declare module '@vue/runtime-core' { VListItemTitle: typeof import('vuetify/lib')['VListItemTitle'] VMain: typeof import('vuetify/lib')['VMain'] VMenu: typeof import('vuetify/lib')['VMenu'] - VMessages: typeof import('vuetify/lib')['VMessages'] VMultiUserInput: typeof import('./src/components/schema/VMultiUserInput.vue')['default'] VNavigationDrawer: typeof import('vuetify/lib')['VNavigationDrawer'] VProgressCircular: typeof import('vuetify/lib')['VProgressCircular'] VRow: typeof import('vuetify/lib')['VRow'] + VSelect: typeof import('vuetify/lib')['VSelect'] VSimpleTable: typeof import('vuetify/lib')['VSimpleTable'] VSpacer: typeof import('vuetify/lib')['VSpacer'] VSpeedDial: typeof import('vuetify/lib')['VSpeedDial'] diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/package-lock.json b/digiwf-apps/packages/apps/digiwf-tasklist/package-lock.json index a9a4f6a9f9..a7a340d59c 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/package-lock.json +++ b/digiwf-apps/packages/apps/digiwf-tasklist/package-lock.json @@ -30,7 +30,8 @@ "vue-text-highlight": "2.0.10", "vuetify": "^2.6.9", "vuetify-form-base": "0.3.2", - "vuex": "^3.6.2" + "vuex": "^3.6.2", + "vuex-persist": "^3.1.3" }, "devDependencies": { "@mdi/font": "^5.9.55", @@ -1374,6 +1375,78 @@ "integrity": "sha512-rK0/vLFaiItYS2W7uVmaKPKnhNQE4XVkylpk5njtVwENnp8elwY5uRL6qvdj2esuvUHG7DwygE4Qu3eKxxuJiQ==", "optional": true }, + "node_modules/@muenchen/digiwf-date-input": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-date-input/-/digiwf-date-input-0.21.11.tgz", + "integrity": "sha512-Et7BIxyHEkbbNiy0BGhjZz1Av+amtxZtzhAVpFGVRRSQcJzLETI9qixAbiXvPv60N92Xnx/7pKKDgZZUokPIvw==", + "peerDependencies": { + "vue": "^2.7.0", + "vuetify": "^2.6.0" + } + }, + "node_modules/@muenchen/digiwf-engine-api-internal": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-engine-api-internal/-/digiwf-engine-api-internal-0.21.11.tgz", + "integrity": "sha512-6ioFiR4+wCVQMnj1dPs/kMSt2Dvz1A6Ew2xehaW+NO+XgyHzy0abnQeT6+T6rZ6q1R0Xn1OnrU7X0YdHcSUnvA==", + "dependencies": { + "typescript": "^4.8.2" + } + }, + "node_modules/@muenchen/digiwf-engine-api-internal/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@muenchen/digiwf-form-renderer": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-form-renderer/-/digiwf-form-renderer-0.21.11.tgz", + "integrity": "sha512-j8KJoVtbkvLQSw/pL35j+SdLgUEcpntW7jZIf1lJbmsWXK0nK4Yy5mM+cgWuk+62pS0qLnLlzFFbwFA2X/PvNQ==", + "peerDependencies": { + "@muenchen/vjsf": "^2.21.7", + "vue": "^2.7.0", + "vuetify": "^2.6.0" + } + }, + "node_modules/@muenchen/digiwf-multi-file-input": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-multi-file-input/-/digiwf-multi-file-input-0.21.11.tgz", + "integrity": "sha512-okzuTzhjck54ZH+VKm+TUfAplcchgOuzjFgziUEXI2mTH5nLEfRIzZabFWs/N16K6oSKvCk6L3fLuV3aGK4JKA==", + "dependencies": { + "@muenchen/digiwf-engine-api-internal": "^0.21.11", + "@muenchen/digiwf-task-api-internal": "^0.21.11" + }, + "peerDependencies": { + "vue": "^2.7.0", + "vuetify": "^2.6.0" + } + }, + "node_modules/@muenchen/digiwf-task-api-internal": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-task-api-internal/-/digiwf-task-api-internal-0.21.11.tgz", + "integrity": "sha512-Jhu4iSaOCkNroKnYBewg7sH8UOuwtHMn2WXY0RbLbpmbsVbjPmlRWwjF7Ctd+lNC1JXodj/+RYK8bye3feMamw==", + "dependencies": { + "typescript": "^4.8.2" + } + }, + "node_modules/@muenchen/digiwf-task-api-internal/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/@muenchen/vjsf": { "version": "2.21.7", "resolved": "https://registry.npmjs.org/@muenchen/vjsf/-/vjsf-2.21.7.tgz", @@ -3531,7 +3604,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9779,6 +9851,23 @@ "vue": "^2.0.0" } }, + "node_modules/vuex-persist": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vuex-persist/-/vuex-persist-3.1.3.tgz", + "integrity": "sha512-QWOpP4SxmJDC5Y1+0+Yl/F4n7z27syd1St/oP+IYCGe0X0GFio0Zan6kngZFufdIhJm+5dFGDo3VG5kdkCGeRQ==", + "dependencies": { + "deepmerge": "^4.2.2", + "flatted": "^3.0.5" + }, + "peerDependencies": { + "vuex": ">=2.5" + } + }, + "node_modules/vuex-persist/node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -11057,6 +11146,57 @@ "integrity": "sha512-rK0/vLFaiItYS2W7uVmaKPKnhNQE4XVkylpk5njtVwENnp8elwY5uRL6qvdj2esuvUHG7DwygE4Qu3eKxxuJiQ==", "optional": true }, + "@muenchen/digiwf-date-input": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-date-input/-/digiwf-date-input-0.21.11.tgz", + "integrity": "sha512-Et7BIxyHEkbbNiy0BGhjZz1Av+amtxZtzhAVpFGVRRSQcJzLETI9qixAbiXvPv60N92Xnx/7pKKDgZZUokPIvw==", + "requires": {} + }, + "@muenchen/digiwf-engine-api-internal": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-engine-api-internal/-/digiwf-engine-api-internal-0.21.11.tgz", + "integrity": "sha512-6ioFiR4+wCVQMnj1dPs/kMSt2Dvz1A6Ew2xehaW+NO+XgyHzy0abnQeT6+T6rZ6q1R0Xn1OnrU7X0YdHcSUnvA==", + "requires": { + "typescript": "^4.8.2" + }, + "dependencies": { + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + } + } + }, + "@muenchen/digiwf-form-renderer": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-form-renderer/-/digiwf-form-renderer-0.21.11.tgz", + "integrity": "sha512-j8KJoVtbkvLQSw/pL35j+SdLgUEcpntW7jZIf1lJbmsWXK0nK4Yy5mM+cgWuk+62pS0qLnLlzFFbwFA2X/PvNQ==", + "requires": {} + }, + "@muenchen/digiwf-multi-file-input": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-multi-file-input/-/digiwf-multi-file-input-0.21.11.tgz", + "integrity": "sha512-okzuTzhjck54ZH+VKm+TUfAplcchgOuzjFgziUEXI2mTH5nLEfRIzZabFWs/N16K6oSKvCk6L3fLuV3aGK4JKA==", + "requires": { + "@muenchen/digiwf-engine-api-internal": "^0.21.11", + "@muenchen/digiwf-task-api-internal": "^0.21.11" + } + }, + "@muenchen/digiwf-task-api-internal": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/@muenchen/digiwf-task-api-internal/-/digiwf-task-api-internal-0.21.11.tgz", + "integrity": "sha512-Jhu4iSaOCkNroKnYBewg7sH8UOuwtHMn2WXY0RbLbpmbsVbjPmlRWwjF7Ctd+lNC1JXodj/+RYK8bye3feMamw==", + "requires": { + "typescript": "^4.8.2" + }, + "dependencies": { + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + } + } + }, "@muenchen/vjsf": { "version": "2.21.7", "resolved": "https://registry.npmjs.org/@muenchen/vjsf/-/vjsf-2.21.7.tgz", @@ -12609,8 +12749,7 @@ "deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" }, "delayed-stream": { "version": "1.0.0", @@ -17309,6 +17448,22 @@ "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", "requires": {} }, + "vuex-persist": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vuex-persist/-/vuex-persist-3.1.3.tgz", + "integrity": "sha512-QWOpP4SxmJDC5Y1+0+Yl/F4n7z27syd1St/oP+IYCGe0X0GFio0Zan6kngZFufdIhJm+5dFGDo3VG5kdkCGeRQ==", + "requires": { + "deepmerge": "^4.2.2", + "flatted": "^3.0.5" + }, + "dependencies": { + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + } + } + }, "w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/package.json b/digiwf-apps/packages/apps/digiwf-tasklist/package.json index 3eabbb2c07..07256ad245 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/package.json +++ b/digiwf-apps/packages/apps/digiwf-tasklist/package.json @@ -30,7 +30,8 @@ "vue-text-highlight": "2.0.10", "vuetify": "^2.6.9", "vuetify-form-base": "0.3.2", - "vuex": "^3.6.2" + "vuex": "^3.6.2", + "vuex-persist": "^3.1.3" }, "devDependencies": { "@mdi/font": "^5.9.55", diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/src/App.vue b/digiwf-apps/packages/apps/digiwf-tasklist/src/App.vue index 40cef0f764..daedb23a04 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/src/App.vue +++ b/digiwf-apps/packages/apps/digiwf-tasklist/src/App.vue @@ -190,12 +190,7 @@ import {InfoTO, ServiceInstanceTO, UserTO,} from "@muenchen/digiwf-engine-api-in import AppMenuList from "./components/UI/appMenu/AppMenuList.vue"; import {apiGatewayUrl} from "./utils/envVariables"; import {queryClient} from "./middleware/queryClient"; -import { - setShouldUseTaskService, - shouldShowBetaButton, - shouldUseTaskService, - switchShouldUseTaskService -} from "./utils/featureToggles"; +import {shouldShowBetaButton, shouldUseTaskService, switchShouldUseTaskService} from "./utils/featureToggles"; @Component({ components: {AppMenuList} diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/src/api/tasks/tasksApiCalls.ts b/digiwf-apps/packages/apps/digiwf-tasklist/src/api/tasks/tasksApiCalls.ts index e88d272bfe..9b3c378a26 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/src/api/tasks/tasksApiCalls.ts +++ b/digiwf-apps/packages/apps/digiwf-tasklist/src/api/tasks/tasksApiCalls.ts @@ -48,9 +48,9 @@ export const callGetOpenGroupTasksFromEngine = (page: number, size: number, quer return Promise.resolve(res.data); }).catch((err: AxiosError) => Promise.reject(FetchUtils.defaultCatchHandler(err, "Die Aufgaben konnten nicht geladen werden. Bitte versuchen Sie es erneut."))); }; -export const callGetOpenGroupTasksFromTaskService = (page: number, size: number, query?: string): Promise => { +export const callGetOpenGroupTasksFromTaskService = (page: number, size: number, query?: string, sort?: string): Promise => { const cfg = ApiConfig.getTasklistAxiosConfig(FetchUtils.getGETConfig()); - return TasksApiFactory(cfg).getUnassignedGroupTasks(page, size, query) + return TasksApiFactory(cfg).getUnassignedGroupTasks(page, size, query, sort) .then((res) => Promise.resolve(res.data)) .catch((err: AxiosError) => Promise.reject(FetchUtils.defaultCatchHandler(err, "Die Aufgaben konnten nicht geladen werden. Bitte versuchen Sie es erneut."))); }; @@ -68,9 +68,9 @@ export const callGetAssignedGroupTasksFromEngine = (page: number, size: number, return Promise.resolve(res.data); }).catch((err: AxiosError) => Promise.reject(FetchUtils.defaultCatchHandler(err, "Die Aufgaben konnten nicht geladen werden. Bitte versuchen Sie es erneut."))); }; -export const callGetAssignedGroupTasksFromTaskService = (page: number, size: number, query?: string): Promise => { +export const callGetAssignedGroupTasksFromTaskService = (page: number, size: number, query?: string, sort?: string): Promise => { const cfg = ApiConfig.getTasklistAxiosConfig(FetchUtils.getGETConfig()); - return TasksApiFactory(cfg).getAssignedGroupTasks(page, size, query).then((res) => { + return TasksApiFactory(cfg).getAssignedGroupTasks(page, size, query, sort).then((res) => { return Promise.resolve(res.data); }).catch((err: AxiosError) => Promise.reject(FetchUtils.defaultCatchHandler(err, "Die Aufgaben konnten nicht geladen werden. Bitte versuchen Sie es erneut."))); }; @@ -147,7 +147,6 @@ export const callCompleteTaskInEngine = (taskId: string, variables: TaskVariable }; export const callCompleteTaskInTaskService = (taskId: string, variables: TaskVariables): Promise => { - console.log("callCompleteTaskInTaskService"); const cfg = ApiConfig.getTasklistAxiosConfig(FetchUtils.getPOSTConfig({})); return TaskApiFactory(cfg).completeTask(taskId, variables) .then(() => Promise.resolve()) diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/common/SearchField.vue b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/common/SearchField.vue index 90f8c789d3..9998fcb410 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/common/SearchField.vue +++ b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/common/SearchField.vue @@ -131,5 +131,7 @@ export default defineComponent({ diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/common/SortBySelect.vue b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/common/SortBySelect.vue new file mode 100644 index 0000000000..f86c516f26 --- /dev/null +++ b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/common/SortBySelect.vue @@ -0,0 +1,35 @@ + + + + diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/TaskList.vue b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/TaskList.vue index fd41036106..e63067a7ee 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/TaskList.vue +++ b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/TaskList.vue @@ -4,9 +4,12 @@

{{ viewName }}

- + + + +
diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/src/views/Tasks.vue b/digiwf-apps/packages/apps/digiwf-tasklist/src/views/Tasks.vue index d84795a62b..218c1d5322 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/src/views/Tasks.vue +++ b/digiwf-apps/packages/apps/digiwf-tasklist/src/views/Tasks.vue @@ -59,6 +59,7 @@ import AppPaginationFooter from "../components/UI/AppPaginationFooter.vue"; import {useMyTasksQuery} from "../middleware/tasks/taskMiddleware"; import {useGetPaginationData} from "../middleware/paginationData"; import {usePageId} from "../middleware/pageId"; +import {usePageFilters} from "../store/modules/filters"; export default defineComponent({ components: {AppPaginationFooter, TaskItem, TaskList, AppViewLayout}, @@ -68,9 +69,14 @@ export default defineComponent({ const pageId = usePageId(); const {searchQuery, size, page, setSize, setPage, setSearchQuery} = useGetPaginationData(); + const {currentSortDirection} = usePageFilters(); const getFollowOfUrl = (): boolean => router.currentRoute.query?.followUp === "true"; const shouldIgnoreFollowUpTasks = ref(getFollowOfUrl()); - const {isLoading, data, error, refetch} = useMyTasksQuery(page, size, searchQuery, shouldIgnoreFollowUpTasks); + const {isLoading, data, error, refetch} = useMyTasksQuery(page, size, searchQuery,shouldIgnoreFollowUpTasks, currentSortDirection); + + watch(currentSortDirection, () => { + refetch(); + }); watch(page, (newPage) => { setPage(newPage); From 04e98a467278d3b446c34061bac9815bd62cf59d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 10:01:23 +0200 Subject: [PATCH 03/30] chore(deps): bump tika.version from 2.7.0 to 2.8.0 (#463) Bumps `tika.version` from 2.7.0 to 2.8.0. Updates `tika-core` from 2.7.0 to 2.8.0 - [Changelog](https://github.com/apache/tika/blob/main/CHANGES.txt) - [Commits](https://github.com/apache/tika/compare/2.7.0...2.8.0) Updates `tika-parsers-standard-package` from 2.7.0 to 2.8.0 --- updated-dependencies: - dependency-name: org.apache.tika:tika-core dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.apache.tika:tika-parsers-standard-package dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b9e0c0e364..3db7a134a5 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ 7.18.0-ee 7.18.0 1.7.0 - 2.7.0 + 2.8.0 7.3 From bcaafdb327b2a731e7f5e6d8de8d021feb0f222d Mon Sep 17 00:00:00 2001 From: Dominik Horn Date: Mon, 14 Aug 2023 10:16:55 +0200 Subject: [PATCH 04/30] Feature/secure cockpit + sso roles (#575) * implementing secure cockpit * implement secure cockpit via gateway * #402: add camunda plugin filter rule * integration of groups * fixed review comments --------- Co-authored-by: Simon Zambrovski Co-authored-by: stephan.strehler --- digiwf-engine/digiwf-engine-cockpit/pom.xml | 138 ++++++++ .../CamundaWebappsAutoConfiguration.java | 76 +++++ .../cockpit/CamundaWebappsProperties.java | 15 + ...amundaWebAppsEnvironmentPostProcessor.java | 19 ++ ...piAdminTokenBasedAuthenticationFilter.java | 57 ++++ ...hContainerBasedAuthenticationProvider.java | 46 +++ .../camunda/OAuthIdentityServiceProvider.java | 307 ++++++++++++++++++ ...ReadOnlyIdentityProviderConfiguration.java | 15 + .../CamundaWebAppsSecurityConfiguration.java | 58 ++++ .../main/resources/META-INF/spring.factories | 5 + .../main/resources/application-webapps.yml | 3 + digiwf-engine/digiwf-engine-service/pom.xml | 30 +- .../listener/NoSecurityUserTaskListener.java | 2 +- .../service/InAuthorizedGroupsPredicate.java | 2 +- ...undaAuthenticationFilterConfiguration.java | 97 ------ .../CamundaJacksonConfiguration.java | 13 - .../ForwardedHeaderConfiguration.java | 26 -- .../GrantedAuthoritiesConverter.java | 132 -------- .../JwtUserInfoAuthenticationConverter.java | 24 -- ...undaAuthenticationFilterConfiguration.java | 73 ----- .../NoSecurityConfiguration.java | 34 -- .../configuration/SecurityConfiguration.java | 99 ------ .../UserInfoAuthoritiesService.java | 124 ------- ...undaAuthenticationFilterConfiguration.java | 46 +++ .../camunda/CamundaJacksonConfiguration.java | 14 + .../camunda/CamundaRestExceptionHandler.java | 43 +++ ...undaRestExceptionHandlerConfiguration.java | 20 ++ .../CamundaUserAuthenticationFilter.java | 43 +++ .../CustomIncidentProcessEnginePlugin.java} | 15 +- .../shared/nfcconverter/NfcRequest.java | 4 - .../shared/nfcconverter/NfcRequestFilter.java | 13 +- .../NoSecurityUserAuthenticationProvider.java | 24 -- .../RequestResponseLoggingFilter.java | 87 ----- .../security/UserAuthenticationProvider.java | 21 -- .../UserAuthenticationProviderImpl.java | 36 -- .../src/main/resources/application-local.yml | 16 +- .../src/main/resources/application.yml | 26 +- digiwf-engine/pom.xml | 1 + .../src/main/resources/application-local.yml | 14 +- .../digiwf-spring-security-core/pom.xml | 4 + .../oss/digiwf/spring/security/JwtClaims.java | 17 + .../JwtUserInfoAuthenticationConverter.java | 24 -- .../security/NoSecurityConfiguration.java | 10 +- .../digiwf/spring/security/PrincipalUtil.java | 29 ++ .../security/SecurityConfiguration.java | 77 +++-- .../security/SpringSecurityProperties.java | 17 + .../TokenBasedAuthoritiesConverter.java | 123 +++++++ .../NoSecurityUserAuthenticationProvider.java | 9 + .../RequestResponseLoggingFilter.java | 81 +++++ .../UserAuthenticationProvider.java | 14 +- .../UserAuthenticationProviderImpl.java | 36 +- .../security/client/ClientParameters.java | 57 ++++ .../client}/OAuth2AccessTokenSupplier.java | 24 +- ...erviceAccountAccessTokenConfiguration.java | 24 +- .../UserInfoAuthoritiesConverter.java} | 50 +-- .../application-spring-security-starter.yaml | 22 +- .../muenchen/oss/digiwf/task/HttpHeaders.java | 11 - digiwf-task/digiwf-tasklist-service/pom.xml | 5 + .../CurrentUserSpringSecurityAdapter.java | 34 +- .../user/LdapUserGroupResolverAdapter.java | 2 +- .../port/out/auth/CurrentUserPort.java | 6 + .../infra/engine/AuthRequestInterceptor.java | 10 +- .../security/GrantedAuthoritiesConverter.java | 125 ------- .../infra/security/SecurityConfig.java | 42 --- .../TaskServiceSecurityConfiguration.java | 15 + .../src/main/resources/application.yml | 27 +- .../ControllerAuthorizationHelper.java | 11 +- .../security/SecurityTestConfiguration.java | 12 +- .../src/test/resources/application-itest.yml | 3 + stack/keycloak/11_johndoe_webapp.yml | 13 + stack/keycloak/keycloak-changelog.yml | 1 + 71 files changed, 1543 insertions(+), 1210 deletions(-) create mode 100644 digiwf-engine/digiwf-engine-cockpit/pom.xml create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/CamundaWebappsAutoConfiguration.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/CamundaWebappsProperties.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/envprocessor/CamundaWebAppsEnvironmentPostProcessor.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/CamundaApiAdminTokenBasedAuthenticationFilter.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/OAuthContainerBasedAuthenticationProvider.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/OAuthIdentityServiceProvider.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/ReadOnlyIdentityProviderConfiguration.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/spring/CamundaWebAppsSecurityConfiguration.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/resources/META-INF/spring.factories create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/resources/application-webapps.yml delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CamundaAuthenticationFilterConfiguration.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CamundaJacksonConfiguration.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/ForwardedHeaderConfiguration.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/GrantedAuthoritiesConverter.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/JwtUserInfoAuthenticationConverter.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/NoSecurityCamundaAuthenticationFilterConfiguration.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/NoSecurityConfiguration.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/SecurityConfiguration.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/UserInfoAuthoritiesService.java create mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaAuthenticationFilterConfiguration.java create mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaJacksonConfiguration.java create mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaRestExceptionHandler.java create mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaRestExceptionHandlerConfiguration.java create mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaUserAuthenticationFilter.java rename digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/{CustomProcessEngineConfiguration.java => camunda/CustomIncidentProcessEnginePlugin.java} (70%) delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/NoSecurityUserAuthenticationProvider.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/RequestResponseLoggingFilter.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/UserAuthenticationProvider.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/UserAuthenticationProviderImpl.java create mode 100644 digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/JwtClaims.java delete mode 100644 digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/JwtUserInfoAuthenticationConverter.java create mode 100644 digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/PrincipalUtil.java create mode 100644 digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/TokenBasedAuthoritiesConverter.java create mode 100644 digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/RequestResponseLoggingFilter.java create mode 100644 digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/ClientParameters.java rename {digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security => digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client}/OAuth2AccessTokenSupplier.java (60%) rename {digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security => digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client}/ServiceAccountAccessTokenConfiguration.java (89%) rename digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/{UserInfoAuthoritiesService.java => userinfo/UserInfoAuthoritiesConverter.java} (69%) delete mode 100644 digiwf-task/digiwf-task-api/src/main/java/de/muenchen/oss/digiwf/task/HttpHeaders.java delete mode 100644 digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/GrantedAuthoritiesConverter.java delete mode 100644 digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/SecurityConfig.java create mode 100644 digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/TaskServiceSecurityConfiguration.java create mode 100644 stack/keycloak/11_johndoe_webapp.yml diff --git a/digiwf-engine/digiwf-engine-cockpit/pom.xml b/digiwf-engine/digiwf-engine-cockpit/pom.xml new file mode 100644 index 0000000000..e335e081ea --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + + de.muenchen.oss.digiwf + digiwf-engine + 0.18.0-SNAPSHOT + + + digiwf-engine-cockpit + digiwf-engine-cockpit + jar + + + + 1.4.200 + 18.15.0.0 + 42.5.1 + + + + + + de.muenchen.oss.digiwf + digiwf-spring-security-core + ${project.version} + + + org.projectlombok + lombok + + + + + org.camunda.bpm.springboot + camunda-bpm-spring-boot-starter-rest + provided + + + + + com.h2database + h2 + ${h2.version} + + + + com.oracle.database.jdbc + ojdbc8 + ${ojdbc8.version} + + + org.postgresql + postgresql + ${postgresql.version} + + + org.flywaydb + flyway-core + + + + + org.springframework.boot + spring-boot-test + test + + + org.springframework.boot + spring-boot-starter-test + test + + + com.vaadin.external.google + android-json + + + + + org.springframework.security + spring-security-test + test + + + org.camunda.bpm.springboot + camunda-bpm-spring-boot-starter-test + ${camunda.version} + test + + + + + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + + + + camunda-ce + + + !camunda-ee + + + + + org.camunda.bpm.springboot + camunda-bpm-spring-boot-starter-webapp + provided + + + + + camunda-ee + + + org.camunda.bpm.springboot + camunda-bpm-spring-boot-starter-webapp-ee + provided + + + + + diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/CamundaWebappsAutoConfiguration.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/CamundaWebappsAutoConfiguration.java new file mode 100644 index 0000000000..a6f7e1b1c6 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/CamundaWebappsAutoConfiguration.java @@ -0,0 +1,76 @@ +package de.muenchen.oss.digiwf.cockpit; + +import de.muenchen.oss.digiwf.cockpit.security.camunda.CamundaApiAdminTokenBasedAuthenticationFilter; +import de.muenchen.oss.digiwf.cockpit.security.camunda.OAuthContainerBasedAuthenticationProvider; +import lombok.extern.slf4j.Slf4j; +import org.camunda.bpm.webapp.impl.security.auth.ContainerBasedAuthenticationFilter; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Profile; +import org.springframework.core.Ordered; +import org.springframework.web.filter.ForwardedHeaderFilter; +import de.muenchen.oss.digiwf.spring.security.SecurityConfiguration; + +import java.util.Collections; + +import static de.muenchen.oss.digiwf.spring.security.SecurityConfiguration.SECURITY; +import static org.camunda.bpm.engine.rest.security.auth.ProcessEngineAuthenticationFilter.AUTHENTICATION_PROVIDER_PARAM; + + +@ComponentScan +@EnableConfigurationProperties({ + CamundaWebappsProperties.class +}) +@AutoConfigureAfter( + SecurityConfiguration.class +) +@Profile(SECURITY) +@Slf4j +public class CamundaWebappsAutoConfiguration { + + // The ForwardedHeaderFilter is required to correctly assemble the redirect URL for OAUth2 login. Without the filter, Spring generates an http URL even though the OpenShift + // route is accessed through https. + @Bean + public FilterRegistrationBean forwardedHeaderFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + filterRegistrationBean.setFilter(new ForwardedHeaderFilter()); + filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); + return filterRegistrationBean; + } + + + /** + * Registriert den Filter für die Camunda-Authentifizierung. + */ + @Bean + public FilterRegistrationBean containerBasedAuthenticationFilter() { + log.trace("CamundaWebAppsSecurityConfiguration.containerBasedAuthenticationFilter()...."); + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + filterRegistrationBean.setFilter(new ContainerBasedAuthenticationFilter()); + filterRegistrationBean.setInitParameters(Collections.singletonMap(AUTHENTICATION_PROVIDER_PARAM, OAuthContainerBasedAuthenticationProvider.class.getName())); + filterRegistrationBean.setOrder(101); // make sure the filter is registered after the Spring Security Filter Chain + filterRegistrationBean.addUrlPatterns("/camunda/app/*"); + filterRegistrationBean.addUrlPatterns("/camunda/lib/*"); + filterRegistrationBean.addUrlPatterns("/camunda/api/engine/*"); // api engine - yes, api admin - no, see below... + filterRegistrationBean.addUrlPatterns("/camunda/api/cockpit/plugin/*"); // api cockpit plugins - yes, api admin - no, see below... + return filterRegistrationBean; + } + + /** + * Registriert den Filter für die Camunda Admin Token Based Authentifizierung statt der Session-basierten. + */ + @Bean + public FilterRegistrationBean camundaApiAdminTokenBasedAuthenticationFilter() { + log.trace("CamundaWebAppsSecurityConfiguration.camundaApiAdminTokenBasedAuthenticationFilter()...."); + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(); + filterRegistrationBean.setFilter(new CamundaApiAdminTokenBasedAuthenticationFilter()); + filterRegistrationBean.setInitParameters(Collections.singletonMap(AUTHENTICATION_PROVIDER_PARAM, OAuthContainerBasedAuthenticationProvider.class.getName())); + filterRegistrationBean.setOrder(101); // make sure the filter is registered after the Spring Security Filter Chain + filterRegistrationBean.addUrlPatterns("/camunda/api/admin/auth/user/default"); + return filterRegistrationBean; + } + +} diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/CamundaWebappsProperties.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/CamundaWebappsProperties.java new file mode 100644 index 0000000000..a450e1578b --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/CamundaWebappsProperties.java @@ -0,0 +1,15 @@ +package de.muenchen.oss.digiwf.cockpit; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.ConstructorBinding; + +@ConfigurationProperties("digiwf.camunda-webapps") +@ConstructorBinding +@Data +public class CamundaWebappsProperties { + /** + * The role required to access camunda webapp. + */ + private final String webAppRole; +} diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/envprocessor/CamundaWebAppsEnvironmentPostProcessor.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/envprocessor/CamundaWebAppsEnvironmentPostProcessor.java new file mode 100644 index 0000000000..86b171bde4 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/envprocessor/CamundaWebAppsEnvironmentPostProcessor.java @@ -0,0 +1,19 @@ +package de.muenchen.oss.digiwf.cockpit.envprocessor; + +import org.springframework.boot.context.config.ConfigFileApplicationListener; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; + +/** + * This post processor is registered in spring.factories to be called by the "real" ConfigFileApplicationListener to register the properties from + * {@code application-polyflow-starter.yaml} in the environment. We prefer this method over adding a configuration annotated with @{@link + * org.springframework.context.annotation.PropertySource} because the latter registers its properties too late for @{@link + * org.springframework.boot.autoconfigure.condition.ConditionalOnProperty} annotations to use them. + */ +@Order(Ordered.LOWEST_PRECEDENCE - 1) +public final class CamundaWebAppsEnvironmentPostProcessor extends ConfigFileApplicationListener { + public CamundaWebAppsEnvironmentPostProcessor() { + setSearchNames("application-webapps"); + setOrder(Ordered.LOWEST_PRECEDENCE - 1); + } +} diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/CamundaApiAdminTokenBasedAuthenticationFilter.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/CamundaApiAdminTokenBasedAuthenticationFilter.java new file mode 100644 index 0000000000..ddf8c1d1db --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/CamundaApiAdminTokenBasedAuthenticationFilter.java @@ -0,0 +1,57 @@ +package de.muenchen.oss.digiwf.cockpit.security.camunda; + +import lombok.RequiredArgsConstructor; +import lombok.val; +import org.camunda.bpm.engine.rest.security.auth.AuthenticationResult; +import org.camunda.bpm.webapp.impl.security.auth.Authentication; +import org.camunda.bpm.webapp.impl.security.auth.Authentications; +import org.camunda.bpm.webapp.impl.security.auth.ContainerBasedAuthenticationFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.util.List; + +/** + * We set up {@link OAuthContainerBasedAuthenticationProvider} to extract the authenticated user from the request. + * If the user is authenticated, this filter will create authentication for the DEFAULT engine (in Spring Boot the only + * engine that exists). + * We use this filter on access to all resources which usually rely on session-based authentication of Camunda engine. + */ +@RequiredArgsConstructor +public class CamundaApiAdminTokenBasedAuthenticationFilter extends ContainerBasedAuthenticationFilter { + + private static final String DEFAULT_ENGINE = "default"; + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + + final HttpServletRequest req = (HttpServletRequest) request; + final HttpServletResponse resp = (HttpServletResponse) response; + + val engine = getAddressedEngine(DEFAULT_ENGINE); + + AuthenticationResult authenticationResult = authenticationProvider.extractAuthenticatedUser(req, engine); + if (authenticationResult.isAuthenticated()) { + Authentications authentications = Authentications.getFromSession(req.getSession()); + String authenticatedUser = authenticationResult.getAuthenticatedUser(); + + if (!existisAuthentication(authentications, DEFAULT_ENGINE, authenticatedUser)) { + List groups = authenticationResult.getGroups(); + List tenants = authenticationResult.getTenants(); + + Authentication authentication = createAuthentication(engine, authenticatedUser, groups, tenants); + authentications.addAuthentication(authentication); + } + chain.doFilter(request, response); + } else { + resp.setStatus(Response.Status.UNAUTHORIZED.getStatusCode()); + authenticationProvider.augmentResponseByAuthenticationChallenge(resp, engine); + } + } +} diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/OAuthContainerBasedAuthenticationProvider.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/OAuthContainerBasedAuthenticationProvider.java new file mode 100644 index 0000000000..59011a9a55 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/OAuthContainerBasedAuthenticationProvider.java @@ -0,0 +1,46 @@ +package de.muenchen.oss.digiwf.cockpit.security.camunda; + +import de.muenchen.oss.digiwf.spring.security.PrincipalUtil; +import org.camunda.bpm.engine.ProcessEngine; +import org.camunda.bpm.engine.rest.security.auth.AuthenticationProvider; +import org.camunda.bpm.engine.rest.security.auth.AuthenticationResult; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.security.Principal; + +import static java.util.Collections.emptyList; + +/** + * Similar to camunda's {@link org.camunda.bpm.engine.rest.security.auth.impl.ContainerBasedAuthenticationProvider} + * but also adds SSO roles to the authentication result. + * + * This filter is installed after the Spring Security filter which uses passed JWT token to extract the identity + * of the user and write SSO roles into the corresponding token claim. + */ +public class OAuthContainerBasedAuthenticationProvider implements AuthenticationProvider { + + @Override + public AuthenticationResult extractAuthenticatedUser(HttpServletRequest request, ProcessEngine engine) { + Principal principal = request.getUserPrincipal(); + + if (principal == null) { + return AuthenticationResult.unsuccessful(); + } + + String name = principal.getName(); + if (name == null || name.isEmpty()) { + return AuthenticationResult.unsuccessful(); + } + + AuthenticationResult result = AuthenticationResult.successful(name); + result.setGroups(PrincipalUtil.extractRoles(principal)); + result.setTenants(emptyList()); + return result; + } + + @Override + public void augmentResponseByAuthenticationChallenge(HttpServletResponse response, ProcessEngine engine) { + // noop + } +} diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/OAuthIdentityServiceProvider.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/OAuthIdentityServiceProvider.java new file mode 100644 index 0000000000..afff1ec5a3 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/OAuthIdentityServiceProvider.java @@ -0,0 +1,307 @@ +package de.muenchen.oss.digiwf.cockpit.security.camunda; + + +import de.muenchen.oss.digiwf.spring.security.SecurityConfiguration; +import org.apache.commons.lang3.StringUtils; +import org.camunda.bpm.engine.identity.*; +import org.camunda.bpm.engine.impl.GroupQueryImpl; +import org.camunda.bpm.engine.impl.Page; +import org.camunda.bpm.engine.impl.TenantQueryImpl; +import org.camunda.bpm.engine.impl.UserQueryImpl; +import org.camunda.bpm.engine.impl.identity.ReadOnlyIdentityProvider; +import org.camunda.bpm.engine.impl.interceptor.CommandContext; +import org.camunda.bpm.engine.impl.persistence.AbstractManager; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; +import de.muenchen.oss.digiwf.spring.security.JwtClaims; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import static java.util.stream.Collectors.toList; + +/** + * This Identity Provider returns only the currently logged-in user's data. It is required for the camunda apps to work properly with OAuth + * login. Only the necessary methods of the interface are implemented, most methods just return null or empty things. + **/ +public class OAuthIdentityServiceProvider extends AbstractManager implements ReadOnlyIdentityProvider { + + @Override + public User findUserById(String userId) { + return createUserQuery().userId(userId).singleResult(); + } + + @Override + public UserQuery createUserQuery() { + return new OAuthUserQueryImpl(this); + } + + @Override + public UserQuery createUserQuery(CommandContext commandContext) { + return new OAuthUserQueryImpl(this); + } + + @Override + public NativeUserQuery createNativeUserQuery() { + return null; + } + + @Override + public boolean checkPassword(String userId, String password) { + return false; + } + + @Override + public Group findGroupById(String groupId) { + return createGroupQuery().groupId(groupId).singleResult(); + } + + @Override + public GroupQuery createGroupQuery() { + return new OAuthGroupQueryImpl(this); + } + + @Override + public GroupQuery createGroupQuery(CommandContext commandContext) { + return new OAuthGroupQueryImpl(this); + } + + @Override + public Tenant findTenantById(String tenantId) { + return new NoTenantQueryImpl().tenantId(tenantId).singleResult(); + } + + @Override + public TenantQuery createTenantQuery() { + return new NoTenantQueryImpl(); + } + + @Override + public TenantQuery createTenantQuery(CommandContext commandContext) { + return new NoTenantQueryImpl(); + } + + + private User single(OAuthUserQueryImpl oAuthUserQuery) { + return getJwtAuthenticationToken().map( + token -> + (User) new OAuthUser( + (String) token.getTokenAttributes().get(JwtClaims.USER_ID), + (String) token.getTokenAttributes().getOrDefault(JwtClaims.GIVEN_NAME, ""), + (String) token.getTokenAttributes().getOrDefault(JwtClaims.FAMILY_NAME, token.getTokenAttributes().get(JwtClaims.USER_ID)), + (String) token.getTokenAttributes().getOrDefault(JwtClaims.EMAIL, token.getTokenAttributes().get(JwtClaims.USER_ID)) + ) + ).orElse(null); + } + + private Group single(OAuthGroupQueryImpl oAuthGroupQuery) { + return list(oAuthGroupQuery) + .stream() + .filter(group -> group.getId().equals(oAuthGroupQuery.getId())) + .findFirst().orElse(null); + } + + private List list(OAuthGroupQueryImpl oAuthGroupQuery) { + return getJwtAuthenticationToken() + .map(token -> token.getAuthorities() + .stream() + .map(GrantedAuthority::getAuthority) + .map(role -> StringUtils.removeStart(role, SecurityConfiguration.SPRING_ROLE_PREFIX)) // currently not used, roles are mapped directly? + .map(role -> (Group) new OAuthGroup(role, role, "oauth")) + .collect(toList()) + ).orElse(Collections.emptyList()); + } + + private List list(OAuthUserQueryImpl oAuthUserQuery) { + return Collections.singletonList(single(oAuthUserQuery)); + } + + private long count(OAuthUserQueryImpl oAuthUserQuery) { + return list(oAuthUserQuery).size(); + } + + private long count(OAuthGroupQueryImpl oAuthGroupQuery) { + return list(oAuthGroupQuery).size(); + } + + private Optional getJwtAuthenticationToken() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication instanceof JwtAuthenticationToken) { + return Optional.of(((JwtAuthenticationToken) authentication)); + } else { + return Optional.empty(); + } + } + + static class OAuthUserQueryImpl extends UserQueryImpl { + + private final OAuthIdentityServiceProvider oAuthIdentityServiceProvider; + + public OAuthUserQueryImpl(OAuthIdentityServiceProvider oAuthIdentityServiceProvider) { + this.oAuthIdentityServiceProvider = oAuthIdentityServiceProvider; + } + + @Override + public long executeCount(CommandContext commandContext) { + return oAuthIdentityServiceProvider.count(this); + } + + @Override + public List executeList(CommandContext commandContext, Page page) { + return oAuthIdentityServiceProvider.list(this); + } + + @Override + public User singleResult() { + return oAuthIdentityServiceProvider.single(this); + } + } + + static class OAuthGroupQueryImpl extends GroupQueryImpl { + + private final OAuthIdentityServiceProvider oAuthIdentityServiceProvider; + + public OAuthGroupQueryImpl(OAuthIdentityServiceProvider oAuthIdentityServiceProvider) { + this.oAuthIdentityServiceProvider = oAuthIdentityServiceProvider; + } + + @Override + public long executeCount(CommandContext commandContext) { + return oAuthIdentityServiceProvider.count(this); + } + + @Override + public List executeList(CommandContext commandContext, Page page) { + return oAuthIdentityServiceProvider.list(this); + } + + @Override + public Group singleResult() { + return oAuthIdentityServiceProvider.single(this); + } + } + + static class NoTenantQueryImpl extends TenantQueryImpl { + + @Override + public long executeCount(CommandContext commandContext) { + return 0; + } + + @Override + public List executeList(CommandContext commandContext, Page page) { + return Collections.emptyList(); + } + } + + static class OAuthUser implements User { + + private final String id; + private final String firstName; + private final String lastName; + private final String emailAddress; + + OAuthUser(String id, String firstName, String lastName, String emailAddress) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.emailAddress = emailAddress; + } + + @Override + public String getId() { + return id; + } + + @Override + public void setId(String s) { + throw new UnsupportedOperationException("Can't change user attributes"); + } + + @Override + public String getFirstName() { + return firstName; + } + + @Override + public void setFirstName(String s) { + throw new UnsupportedOperationException("Can't change user attributes"); + } + + @Override + public void setLastName(String s) { + throw new UnsupportedOperationException("Can't change user attributes"); + } + + @Override + public String getLastName() { + return lastName; + } + + @Override + public void setEmail(String s) { + throw new UnsupportedOperationException("Can't change user attributes"); + } + + @Override + public String getEmail() { + return emailAddress; + } + + @Override + public String getPassword() { + throw new UnsupportedOperationException("Can't read user's password"); + } + + @Override + public void setPassword(String s) { + throw new UnsupportedOperationException("Can't change user attributes"); + } + } + + static class OAuthGroup implements Group { + + private final String id; + private final String name; + private final String type; + + OAuthGroup(String id, String name, String type) { + this.id = id; + this.name = name; + this.type = type; + } + + @Override + public String getId() { + return this.id; + } + + @Override + public void setId(String id) { + throw new UnsupportedOperationException("Can't set group id"); + } + + @Override + public String getName() { + return this.name; + } + + @Override + public void setName(String name) { + throw new UnsupportedOperationException("Can't set group name"); + } + + @Override + public String getType() { + return this.type; + } + + @Override + public void setType(String string) { + throw new UnsupportedOperationException("Can't set group type"); + } + } +} diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/ReadOnlyIdentityProviderConfiguration.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/ReadOnlyIdentityProviderConfiguration.java new file mode 100644 index 0000000000..bd3a3b70d2 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/camunda/ReadOnlyIdentityProviderConfiguration.java @@ -0,0 +1,15 @@ +package de.muenchen.oss.digiwf.cockpit.security.camunda; + +import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl; +import org.camunda.bpm.engine.impl.persistence.GenericManagerFactory; +import org.camunda.bpm.spring.boot.starter.configuration.CamundaProcessEngineConfiguration; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ReadOnlyIdentityProviderConfiguration implements CamundaProcessEngineConfiguration { + @Override + public void preInit(ProcessEngineConfigurationImpl processEngineConfiguration) { + processEngineConfiguration + .setIdentityProviderSessionFactory(new GenericManagerFactory(OAuthIdentityServiceProvider.class)); + } +} diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/spring/CamundaWebAppsSecurityConfiguration.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/spring/CamundaWebAppsSecurityConfiguration.java new file mode 100644 index 0000000000..b77103f566 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/spring/CamundaWebAppsSecurityConfiguration.java @@ -0,0 +1,58 @@ +package de.muenchen.oss.digiwf.cockpit.security.spring; + +import de.muenchen.oss.digiwf.cockpit.CamundaWebappsProperties; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter; +import org.springframework.security.web.SecurityFilterChain; + +import static de.muenchen.oss.digiwf.spring.security.SecurityConfiguration.DEFAULT_SECURITY_ORDER; + +/** + * Configuration making sure that webapps can be accessed only is the user has a specific role. + */ +@Configuration +@Slf4j +@RequiredArgsConstructor +public class CamundaWebAppsSecurityConfiguration { + private static final String[] CAMUNDA_APP_PATHS = { + "/camunda/app/**", + "/camunda/api/**", + "/camunda/lib/**" + }; + + private final CamundaWebappsProperties camundaWebappsProperties; + + @Bean + @Order(DEFAULT_SECURITY_ORDER - 100) + public SecurityFilterChain camundaWebAppFilterChain( + final HttpSecurity http, + final JwtAuthenticationConverter jwtAuthenticationConverter + ) throws Exception { + // @formatter:off + http + .requestMatchers(matchers -> matchers + .antMatchers(CAMUNDA_APP_PATHS) + ) + // Disable CSRF for these paths + .csrf(AbstractHttpConfigurer::disable) + // Any requests on these paths require the configured role + .authorizeRequests(requests -> requests + .anyRequest().hasRole(camundaWebappsProperties.getWebAppRole()) + ) + // oath2 resource server config + .oauth2ResourceServer( server -> server + .jwt( jwt -> jwt + .jwtAuthenticationConverter(jwtAuthenticationConverter) + ) + ) + ; + // @formatter:on + return http.build(); + } +} \ No newline at end of file diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/resources/META-INF/spring.factories b/digiwf-engine/digiwf-engine-cockpit/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..5e9327f1b9 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/resources/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + de.muenchen.oss.digiwf.cockpit.CamundaWebappsAutoConfiguration +# Environment post processors responsible for scanning additional properties files +org.springframework.boot.env.EnvironmentPostProcessor=\ + de.muenchen.oss.digiwf.cockpit.envprocessor.CamundaWebAppsEnvironmentPostProcessor \ No newline at end of file diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/resources/application-webapps.yml b/digiwf-engine/digiwf-engine-cockpit/src/main/resources/application-webapps.yml new file mode 100644 index 0000000000..8c5a9e6de4 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/resources/application-webapps.yml @@ -0,0 +1,3 @@ +digiwf: + camunda-webapps: + web-app-role: digiwf-webapp-user \ No newline at end of file diff --git a/digiwf-engine/digiwf-engine-service/pom.xml b/digiwf-engine/digiwf-engine-service/pom.xml index 16db789c06..f3d375176e 100644 --- a/digiwf-engine/digiwf-engine-service/pom.xml +++ b/digiwf-engine/digiwf-engine-service/pom.xml @@ -66,6 +66,16 @@ digiwf-polyflow-connector-starter ${project.version} + + de.muenchen.oss.digiwf + digiwf-spring-security-starter + ${project.version} + + + de.muenchen.oss.digiwf + digiwf-engine-cockpit + ${project.version} + @@ -412,30 +422,30 @@ camunda-ce + + + !camunda-ee + + org.camunda.bpm.springboot camunda-bpm-spring-boot-starter-webapp - - io.holunda - camunda-platform-7-autologin - 0.0.1 - camunda-ee + + + camunda-ee + + org.camunda.bpm.springboot camunda-bpm-spring-boot-starter-webapp-ee - - io.holunda - camunda-platform-7-autologin - 0.0.1 - diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/humantask/process/listener/NoSecurityUserTaskListener.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/humantask/process/listener/NoSecurityUserTaskListener.java index 1e61107a11..733ae25a97 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/humantask/process/listener/NoSecurityUserTaskListener.java +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/humantask/process/listener/NoSecurityUserTaskListener.java @@ -4,7 +4,7 @@ package de.muenchen.oss.digiwf.humantask.process.listener; -import de.muenchen.oss.digiwf.shared.security.UserAuthenticationProvider; +import de.muenchen.oss.digiwf.spring.security.authentication.UserAuthenticationProvider; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.camunda.bpm.engine.delegate.DelegateTask; diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/legacy/form/domain/service/InAuthorizedGroupsPredicate.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/legacy/form/domain/service/InAuthorizedGroupsPredicate.java index 621957f37a..b515ba74ee 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/legacy/form/domain/service/InAuthorizedGroupsPredicate.java +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/legacy/form/domain/service/InAuthorizedGroupsPredicate.java @@ -5,7 +5,7 @@ import de.muenchen.oss.digiwf.legacy.form.infrastructure.entity.FormEntity; import de.muenchen.oss.digiwf.legacy.user.domain.service.UserService; -import de.muenchen.oss.digiwf.shared.security.UserAuthenticationProvider; +import de.muenchen.oss.digiwf.spring.security.authentication.UserAuthenticationProvider; import lombok.RequiredArgsConstructor; import lombok.val; import org.apache.commons.lang3.StringUtils; diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CamundaAuthenticationFilterConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CamundaAuthenticationFilterConfiguration.java deleted file mode 100644 index d678741d76..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CamundaAuthenticationFilterConfiguration.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ - -package de.muenchen.oss.digiwf.shared.configuration; - -import de.muenchen.oss.digiwf.legacy.user.domain.service.UserService; -import de.muenchen.oss.digiwf.shared.security.UserAuthenticationProvider; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; -import org.camunda.bpm.engine.IdentityService; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; -import java.util.Optional; - -import static de.muenchen.oss.digiwf.task.HttpHeaders.HEADER_AUTHORIZED_USERNAME; - -/** - * Camunda Security configuration. - * Adds the filter retrieving currently logged-in user and setting Camunda authorization to it for all REST requests. - */ -@Configuration -@RequiredArgsConstructor -@Profile("!no-security") -@Slf4j -public class CamundaAuthenticationFilterConfiguration { - - private final IdentityService identityService; - private final UserAuthenticationProvider userProvider; - private final UserService userService; - - @Bean - public FilterRegistrationBean statelessUserAuthenticationFilter() { - final FilterRegistrationBean filterRegistration = new FilterRegistrationBean<>(); - filterRegistration.setFilter(new CamundaUserAuthenticationFilter()); - filterRegistration.setOrder(102); // make sure the filter is registered after the Spring Security Filter Chain - // install the filter on all protected URLs to propagate the identity from the token to Camunda and Identity Service. - filterRegistration.addUrlPatterns( - "/rest/*", // custom rest api - "/engine-rest/*" // camunda rest api should be protected - ); - return filterRegistration; - } - - /** - * Filter to set authentication / authorization information. - * This information is used for restrict access to resources. - */ - @RequiredArgsConstructor - class CamundaUserAuthenticationFilter implements Filter { - - @Override - public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { - // first try to read the header of HTTP request. - val delegatedUserName = extractUserNameFromHeader(request); - // take that or fallback to username from user provider, reading it from the token - val username = delegatedUserName.orElseGet(userProvider::getLoggedInUser); - try { - val user = userService.getUserByUserName(username); - // could be a service account - if (user.isPresent()) { - val groups = userService.getGroups(user.get().getLhmObjectId()); - identityService.setAuthentication(user.get().getLhmObjectId(), groups); - log.debug("Accessing {} [ {} ]", username, groups); - } else { - identityService.setAuthentication(username, null); - log.debug("Accessing {}", username); - } - chain.doFilter(request, response); - } finally { - identityService.clearAuthentication(); - } - } - - @Override - public void destroy() { - } - - /** - * Tries to detect username based on authorization header. - * @param request http request. - * @return username or empty. - */ - private Optional extractUserNameFromHeader(ServletRequest request) { - final HttpServletRequest httpRequest = (HttpServletRequest) request; - return Optional.ofNullable(httpRequest.getHeader(HEADER_AUTHORIZED_USERNAME)); - } - } - -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CamundaJacksonConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CamundaJacksonConfiguration.java deleted file mode 100644 index b747b07cb7..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CamundaJacksonConfiguration.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.muenchen.oss.digiwf.shared.configuration; - -import org.camunda.bpm.engine.rest.mapper.JacksonConfigurator; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class CamundaJacksonConfiguration { - - CamundaJacksonConfiguration() { - JacksonConfigurator.dateFormatString = "yyyy-MM-dd'T'HH:mm:ss.SSSX"; - } - -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/ForwardedHeaderConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/ForwardedHeaderConfiguration.java deleted file mode 100644 index bf8968b6fb..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/ForwardedHeaderConfiguration.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ -package de.muenchen.oss.digiwf.shared.configuration; - -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.filter.ForwardedHeaderFilter; - -/** - * This class provides the {@link ForwardedHeaderFilter} to handle - * the headers of type "Forwarded" and "X-Forwarded-*". - */ -@Configuration -public class ForwardedHeaderConfiguration { - - @Bean - public FilterRegistrationBean forwardedHeaderFilter() { - final FilterRegistrationBean registration = new FilterRegistrationBean<>(); - registration.setFilter(new ForwardedHeaderFilter()); - registration.addUrlPatterns("/*"); - return registration; - } - -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/GrantedAuthoritiesConverter.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/GrantedAuthoritiesConverter.java deleted file mode 100644 index b122ce5d7e..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/GrantedAuthoritiesConverter.java +++ /dev/null @@ -1,132 +0,0 @@ -package de.muenchen.oss.digiwf.shared.configuration; - -import com.nimbusds.jose.shaded.json.JSONObject; -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.oauth2.core.ClaimAccessor; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter; -import org.springframework.stereotype.Component; - -import java.security.Principal; -import java.util.*; -import java.util.stream.Stream; - -import static java.util.Collections.emptyList; -import static java.util.stream.Collectors.toList; - -/** - * The {@link GrantedAuthoritiesConverter} parses the JWT and extracts the granted roles of the user. In the current - * Keycloak setup roles are provided under the claim "realm_access". Client roles are provided per client in the claim - * "resource_access".
- *
- * Please note, that the extractor does only extract the client roles of the given clientId. If no clientId is given in - * the configuration, only the Realm roles are used for checking authorization.
- *
- * Example:
- *
- * {
- *   ...
- *   "realm_access" : {
- *     "roles" : [
- *       "realm_role1",
- *       "realm_role2",
- *       "realm_roleN"
- *     ]
- *   },
- *   "resource_access" : {
- *       "client1" : {
- *           roles: [
- *            "client_role1",
- *            "client_role2"
- *            "client_role3"
- *           ]
- *       },
- *       "client2" : {
- *           roles: [
- *            "client_role4",
- *            "client_role5"
- *            "client_role6"
- *           ]
- *       }
- *    }
- * }
- * 
- */ -@Component -public class GrantedAuthoritiesConverter extends JwtAuthenticationConverter { - - public static final String SPRING_ROLE_PREFIX = "ROLE_"; - - private static final String ROLE_DECLARATIONS = "roles"; - private static final String REALM_ROLES_CLAIM = "realm_access"; - private static final String CLIENTS_CLAIM = "resource_access"; - /** - * LHM Claim containing the user roles mapped from the current client via client scope protocol mapper. - */ - private static final String USER_ROLES_CLAIM = "user_roles"; - private static final String CLIENT_ROLE_SEPARATOR = ":"; - - @SuppressWarnings("unchecked") - @Override - protected Collection extractAuthorities(Jwt jwt) { - - // Retrieve client roles of all clients - final Collection clientAuthorities = getClientAuthorities(jwt); - - final Collection userRoles = getUserRolesClaimAuthorities(jwt); - - // Retrieve realm roles - final Map realmAccess = jwt.getClaimAsMap(REALM_ROLES_CLAIM); - - Collection realmAuthorities = Collections.emptyList(); - if (realmAccess != null && realmAccess.containsKey(ROLE_DECLARATIONS)) { - realmAuthorities = (Collection) realmAccess.get(ROLE_DECLARATIONS); - } - - return Stream.concat( - Stream.concat(realmAuthorities.stream(), clientAuthorities.stream()).map(s -> SPRING_ROLE_PREFIX + s), - userRoles.stream() - ).map(SimpleGrantedAuthority::new).collect(toList()); - } - - public static List getClientAuthorities(ClaimAccessor jwt) { - // retrieve client roles of all clients - final List clientAuthorities = new ArrayList<>(); - Map clientClaims = jwt.getClaimAsMap(CLIENTS_CLAIM); - if (clientClaims != null) { - clientClaims.forEach((client, claims) -> clientAuthorities.addAll(extractRoles(client, (JSONObject) claims))); - } - return clientAuthorities; - } - - public static List getUserRolesClaimAuthorities(ClaimAccessor jwt) { - // retrieve roles - return jwt.getClaimAsStringList(USER_ROLES_CLAIM); - } - - @SuppressWarnings("unchecked") - static List extractRoles(String client, JSONObject clientObject) { - final Collection clientRoles = (Collection) clientObject.get(ROLE_DECLARATIONS); - if (clientRoles != null) { - return clientRoles - .stream() - .map(role -> client + CLIENT_ROLE_SEPARATOR + role) - .collect(toList()); - } else { - return Collections.emptyList(); - } - } - - public static List extractRoles(Principal principal) { - if (principal instanceof Authentication) { - return ((Authentication) principal).getAuthorities().stream() - .map(GrantedAuthority::getAuthority) - .map(role -> StringUtils.removeStart(role, SPRING_ROLE_PREFIX)) - .collect(toList()); - } - return emptyList(); - } -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/JwtUserInfoAuthenticationConverter.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/JwtUserInfoAuthenticationConverter.java deleted file mode 100644 index 964d9cff7f..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/JwtUserInfoAuthenticationConverter.java +++ /dev/null @@ -1,24 +0,0 @@ -package de.muenchen.oss.digiwf.shared.configuration; - -import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; -import org.springframework.core.convert.converter.Converter; -import org.springframework.security.authentication.AbstractAuthenticationToken; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; - -/** - * Stateful configuration of a Jwt Converter loading details from UserInfo endpoint. - */ -@RequiredArgsConstructor -public class JwtUserInfoAuthenticationConverter implements Converter { - - private final UserInfoAuthoritiesService userInfoService; - - @Override - public AbstractAuthenticationToken convert(@NotNull Jwt source) { - return new JwtAuthenticationToken(source, this.userInfoService.loadAuthorities(source)); - } - -} - diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/NoSecurityCamundaAuthenticationFilterConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/NoSecurityCamundaAuthenticationFilterConfiguration.java deleted file mode 100644 index a93408f7cb..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/NoSecurityCamundaAuthenticationFilterConfiguration.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ - -package de.muenchen.oss.digiwf.shared.configuration; - -import de.muenchen.oss.digiwf.legacy.user.domain.service.UserService; -import de.muenchen.oss.digiwf.shared.security.UserAuthenticationProvider; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.camunda.bpm.engine.IdentityService; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -import javax.servlet.*; -import java.io.IOException; - -/** - * Camunda no-security configuration. - * Adds the corresponding filter. - * - * @author externer.dl.horn - */ -@Configuration -@Profile("no-security") -@RequiredArgsConstructor -public class NoSecurityCamundaAuthenticationFilterConfiguration { - - private final IdentityService identityService; - private final UserService userService; - private final UserAuthenticationProvider userAuthenticationProvider; - - @Bean - public FilterRegistrationBean statelessUserAuthenticationFilter() { - final FilterRegistrationBean filterRegistration = new FilterRegistrationBean<>(); - filterRegistration.setFilter(new NoSecurityCamundaUserAuthenticationFilter()); - filterRegistration.setOrder(102); // make sure the filter is registered after the Spring Security Filter Chain - filterRegistration.addUrlPatterns("/rest/*"); - return filterRegistration; - } - - /** - * User authentication Filter for no-security environments. - */ - class NoSecurityCamundaUserAuthenticationFilter implements Filter { - - @Override - public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { - try { - final String username = userAuthenticationProvider.getLoggedInUser(); - val user = userService.getUserByUserName(username); - if (user.isPresent()) { - val groups = userService.getGroups(user.get().getLhmObjectId()); - identityService.setAuthentication(user.get().getLhmObjectId(), groups); - } else { - identityService.setAuthentication(username, null); - } - chain.doFilter(request, response); - } finally { - identityService.clearAuthentication(); - } - } - - @Override - public void destroy() { - - } - - } - -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/NoSecurityConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/NoSecurityConfiguration.java deleted file mode 100644 index e6b5ab83cc..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/NoSecurityConfiguration.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ -package de.muenchen.oss.digiwf.shared.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.web.SecurityFilterChain; - -@Configuration -@Profile("no-security") -@EnableWebSecurity -public class NoSecurityConfiguration { - - @Bean - public SecurityFilterChain mainSecurityFilterChain(HttpSecurity http) throws Exception { - // @formatter:off - http - .headers() - .frameOptions().disable() - .and() - .authorizeRequests() - .anyRequest().permitAll() - .and() - .csrf() - .disable(); - // @formatter:on - return http.build(); - } - -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/SecurityConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/SecurityConfiguration.java deleted file mode 100644 index b222884aca..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/SecurityConfiguration.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ -package de.muenchen.oss.digiwf.shared.configuration; - -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.core.convert.converter.Converter; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AbstractAuthenticationToken; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.security.web.SecurityFilterChain; - -/** - * The central class for configuration of all security aspects. - */ -@Configuration -@Profile("!no-security") -@EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) -@RequiredArgsConstructor -public class SecurityConfiguration { - - private static final String[] PERMITTED_URLS = { - "/error", // allow the error page - "/actuator/info", // allow access to /actuator/info - "/actuator/health", // allow access to /actuator/health for OpenShift Health Check - "/actuator/metrics", // allow access to /actuator/metrics for Prometheus monitoring in OpenShift - "/swagger-ui/index.html", // allow access to swagger - "/swagger-ui*/*swagger-initializer.js", // allow access to swagger - "/swagger-ui*/**", // allow access to swagger - "/v3/api-docs/*", // allow access to swagger - "/v3/api-docs", // allow access to swagger - "/camunda/**" // allow access to camunda cockpit - }; - - private final RestTemplateBuilder restTemplateBuilder; - - @Value("${spring.security.oauth2.client.provider.keycloak.user-info-uri}") - private String userInfoUri; - - @Bean - public SecurityFilterChain configure(final HttpSecurity http) throws Exception { - // @formatter:off - http - .csrf() - .ignoringAntMatchers(PERMITTED_URLS) - .disable() - .authorizeRequests() - .antMatchers(HttpMethod.OPTIONS).permitAll() - .antMatchers(PERMITTED_URLS).permitAll() - .anyRequest().authenticated() - .and() - .oauth2ResourceServer() - .jwt() - // This custom converter lazily fetches UserInfo Endpoint and reads the "authorities" configured in the - // SSO. Also includes user_roles. - .jwtAuthenticationConverter(customCachingUserServiceConverter()) - .and(); - return http.build(); - // @formatter:on - } - - /** - * Creates a converter from JWT to AbstractAuthenticationToken. - * - * @return custom converter. - * FIXME: this implementation is taken from the reference architecture - * It is required to map the information from the "authorities" field of the response from UserInfo endpoint - * to the Spring Granted Authorities. This implementation should remain AS-IS, until mid-term refactoring of security. - * Weak points: - * - the converter should only convert instead of accessing the REST endpoints. - * - the value of the endpoint URL is hard-coded based on config key-name and injected via @Value instead of usage of OAuth2ClientProperties - * - The Cache is configured internally in the service (check CacheConfiguration for other caches) - * - Consider this https://docs.spring.io/spring-security/reference/servlet/oauth2/login/advanced.html which states, - * that the configuration of three independent facilities: - *
-   * .userInfoEndpoint(userInfo -> userInfo
-   * .userAuthoritiesMapper(this.userAuthoritiesMapper())
-   * .userService(this.oauth2UserService())
-   * .oidcUserService(this.oidcUserService())
-   * )
-   * 
- *

- * Better implementation would be: - * - provide a clear authorities mapper (stateless) - * - provide extension of the DEFAULT OAUth2 User Service see https://docs.spring.io/spring-security/reference/servlet/oauth2/login/advanced.html#oauth2login-advanced-oauth2-user-service - */ - private Converter customCachingUserServiceConverter() { - return new JwtUserInfoAuthenticationConverter(new UserInfoAuthoritiesService(this.userInfoUri, this.restTemplateBuilder)); - } -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/UserInfoAuthoritiesService.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/UserInfoAuthoritiesService.java deleted file mode 100644 index 9cc3cd281b..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/UserInfoAuthoritiesService.java +++ /dev/null @@ -1,124 +0,0 @@ -package de.muenchen.oss.digiwf.shared.configuration; - - -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.Ticker; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.cache.Cache; -import org.springframework.cache.Cache.ValueWrapper; -import org.springframework.cache.caffeine.CaffeineCache; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.util.ObjectUtils; -import org.springframework.web.client.RestTemplate; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * Service, der einen OIDC /userinfo Endpoint aufruft (mit JWT Bearer Auth) und dort die enthaltenen - * "Authorities" extrahiert. - * Die Information aus dem ROLE_ claim werden ignoriert. - * - */ -@Slf4j -public class UserInfoAuthoritiesService { - - private static final String NAME_AUTHENTICATION_CACHE = "authentication_cache"; - private static final int AUTHENTICATION_CACHE_ENTRY_SECONDS_TO_EXPIRE = 60; - - private static final String CLAIM_AUTHORITIES = "authorities"; - - private final String userInfoUri; - private final RestTemplate restTemplate; - private final Cache cache; - - /** - * Erzeugt eine neue Instanz. - * - * @param userInfoUri userinfo Endpoint URI - * @param restTemplateBuilder ein {@link RestTemplateBuilder} - */ - public UserInfoAuthoritiesService(final String userInfoUri, final RestTemplateBuilder restTemplateBuilder) { - this.userInfoUri = userInfoUri; - this.restTemplate = restTemplateBuilder.build(); - this.cache = new CaffeineCache(NAME_AUTHENTICATION_CACHE, - Caffeine.newBuilder() - .expireAfterWrite(AUTHENTICATION_CACHE_ENTRY_SECONDS_TO_EXPIRE, TimeUnit.SECONDS) - .ticker(Ticker.systemTicker()) - .build()); - } - - /** - * Ruft den /userinfo Endpoint und extrahiert {@link GrantedAuthority}s aus dem "authorities" - * Claim. - * - * @param jwt der JWT - * @return die {@link GrantedAuthority}s gem. Claim "authorities" des /userinfo Endpoints - */ - public Collection loadAuthorities(final Jwt jwt) { - final ValueWrapper valueWrapper = this.cache.get(jwt.getSubject()); - if (valueWrapper != null) { - // value present in cache - @SuppressWarnings("unchecked") final Collection authorities = (Collection) valueWrapper.get(); - log.debug("Resolved authorities (from cache): {}", authorities); - return authorities; - } - - log.debug("Fetching user-info for token subject: {}", jwt.getSubject()); - final HttpHeaders headers = new HttpHeaders(); - headers.set(HttpHeaders.AUTHORIZATION, "Bearer " + jwt.getTokenValue()); - final HttpEntity entity = new HttpEntity<>(headers); - - Collection authorities = new ArrayList<>(); - try { - @SuppressWarnings("unchecked") final Map map = this.restTemplate.exchange(this.userInfoUri, HttpMethod.GET, entity, - Map.class).getBody(); - - log.debug("Response from user-info Endpoint: {}", map); - if (map != null && map.containsKey(CLAIM_AUTHORITIES)) { - authorities.addAll(asAuthorities(map.get(CLAIM_AUTHORITIES))); - } - if (map != null && map.containsKey("user_roles")) { - authorities.addAll(asAuthorities(map.get("user_roles"))); - } - log.debug("Resolved Authorities (from /userinfo Endpoint): {}", authorities); - // store - this.cache.put(jwt.getSubject(), authorities); - } catch (final Exception e) { - log.error(String.format("Could not fetch user details from %s - user is granted NO authorities", - this.userInfoUri), e); - } - - return authorities; - } - - private static List asAuthorities(Object object) { - final List authorities = new ArrayList<>(); - if (object instanceof Collection) { - final Collection collection = (Collection) object; - object = collection.toArray(new Object[0]); - } - if (ObjectUtils.isArray(object)) { - authorities.addAll( - Stream.of(((Object[]) object)) - .map(Object::toString) - .map(SimpleGrantedAuthority::new) - .collect(Collectors.toList()) - ); - } - return authorities; - } - -} - diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaAuthenticationFilterConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaAuthenticationFilterConfiguration.java new file mode 100644 index 0000000000..752535a0ca --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaAuthenticationFilterConfiguration.java @@ -0,0 +1,46 @@ +/* + * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 + */ + +package de.muenchen.oss.digiwf.shared.configuration.camunda; + +import de.muenchen.oss.digiwf.legacy.user.domain.service.UserService; +import de.muenchen.oss.digiwf.spring.security.authentication.UserAuthenticationProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.camunda.bpm.engine.IdentityService; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Camunda Security configuration. + * Adds the filter retrieving currently logged-in user and setting Camunda authorization to it for all REST requests. + */ +@Configuration +@RequiredArgsConstructor +@Slf4j +public class CamundaAuthenticationFilterConfiguration { + + @Bean + public FilterRegistrationBean statelessUserAuthenticationFilter( + IdentityService identityService, + UserAuthenticationProvider userProvider, + UserService userService + + ) { + final FilterRegistrationBean filterRegistration = new FilterRegistrationBean<>(); + filterRegistration.setFilter(new CamundaUserAuthenticationFilter( + identityService, + userProvider, + userService + )); + filterRegistration.setOrder(102); // make sure the filter is registered after the Spring Security Filter Chain + // install the filter on all protected URLs to propagate the identity from the token to Camunda and Identity Service. + filterRegistration.addUrlPatterns( + "/rest/*", // custom rest api + "/engine-rest/*" // camunda rest api should be protected + ); + return filterRegistration; + } +} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaJacksonConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaJacksonConfiguration.java new file mode 100644 index 0000000000..1bccb65b46 --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaJacksonConfiguration.java @@ -0,0 +1,14 @@ +package de.muenchen.oss.digiwf.shared.configuration.camunda; + +import org.camunda.bpm.engine.rest.mapper.JacksonConfigurator; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +@Configuration +public class CamundaJacksonConfiguration { + @PostConstruct + public void configureDateFormat() { + JacksonConfigurator.dateFormatString = "yyyy-MM-dd'T'HH:mm:ss.SSSX"; + } +} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaRestExceptionHandler.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaRestExceptionHandler.java new file mode 100644 index 0000000000..17c53652ce --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaRestExceptionHandler.java @@ -0,0 +1,43 @@ +package de.muenchen.oss.digiwf.shared.configuration.camunda; + +import lombok.extern.slf4j.Slf4j; +import org.camunda.bpm.engine.rest.dto.ExceptionDto; +import org.camunda.bpm.engine.rest.exception.ExceptionHandlerHelper; +import org.camunda.bpm.engine.rest.exception.RestException; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.Provider; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static org.camunda.commons.utils.StringUtil.getStackTrace; + +/** + * Changes the behaviour of camunda's {@link org.camunda.bpm.engine.rest.exception.RestExceptionHandler RestExceptionHandler} + * to log only internal server errors on WARNING level and all other exceptions on FINE level. + */ +@Provider +@Slf4j +public class CamundaRestExceptionHandler extends org.camunda.bpm.engine.rest.exception.RestExceptionHandler { + + private static final Logger LOGGER = Logger.getLogger(CamundaRestExceptionHandler.class.getSimpleName()); + + @Override + public Response toResponse(RestException exception) { + Response.Status responseStatus = ExceptionHandlerHelper.getInstance().getStatus(exception); + ExceptionDto exceptionDto = ExceptionHandlerHelper.getInstance().fromException(exception); + + if (responseStatus == Response.Status.INTERNAL_SERVER_ERROR) { + LOGGER.log(Level.WARNING, getStackTrace(exception)); + } else if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.log(Level.FINE, getStackTrace(exception)); + } + + return Response + .status(responseStatus) + .entity(exceptionDto) + .type(MediaType.APPLICATION_JSON_TYPE) + .build(); + } +} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaRestExceptionHandlerConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaRestExceptionHandlerConfiguration.java new file mode 100644 index 0000000000..5c0c67a249 --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaRestExceptionHandlerConfiguration.java @@ -0,0 +1,20 @@ +package de.muenchen.oss.digiwf.shared.configuration.camunda; + +import org.camunda.bpm.engine.rest.exception.RestExceptionHandler; +import org.camunda.bpm.engine.rest.impl.CamundaRestResources; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; +import java.util.Set; + +@Configuration +public class CamundaRestExceptionHandlerConfiguration { + // Quite a dirty hack to replace camunda's RestExceptionHandler with our own that logs exceptions more selectively. + // Workaround for https://app.camunda.com/jira/browse/CAM-10799. + @PostConstruct + public void replaceRestExceptionHandler() { + Set> configurationClasses = CamundaRestResources.getConfigurationClasses(); + configurationClasses.remove(org.camunda.bpm.engine.rest.exception.RestExceptionHandler.class); + configurationClasses.add(RestExceptionHandler.class); + } +} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaUserAuthenticationFilter.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaUserAuthenticationFilter.java new file mode 100644 index 0000000000..3d90468add --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CamundaUserAuthenticationFilter.java @@ -0,0 +1,43 @@ +package de.muenchen.oss.digiwf.shared.configuration.camunda; + +import de.muenchen.oss.digiwf.legacy.user.domain.service.UserService; +import de.muenchen.oss.digiwf.spring.security.authentication.UserAuthenticationProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.camunda.bpm.engine.IdentityService; + +import javax.servlet.*; +import java.io.IOException; +import java.util.ArrayList; +import java.util.stream.Collectors; + + +/** + * Filter to set authentication / authorization information. + * This information is used for restrict access to resources. + */ +@RequiredArgsConstructor +@Slf4j +class CamundaUserAuthenticationFilter implements Filter { + + private final IdentityService identityService; + private final UserAuthenticationProvider userAuthenticationProvider; + private final UserService userService; + + @Override + public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { + val userId = userAuthenticationProvider.getLoggedInUser(); + val roles = new ArrayList<>(userAuthenticationProvider.getLoggedInUserRoles()); + try { + val user = userService.getUserOrNull(userId); + // could be a service account, add groups from LDAP if it is a user. + user.ifPresent(value -> roles.addAll(userService.getGroups(value.getLhmObjectId()))); + log.debug("Accessing {} [ {} ]", userId, roles); + identityService.setAuthentication(userId, roles); + chain.doFilter(request, response); + } finally { + identityService.clearAuthentication(); + } + } +} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CustomProcessEngineConfiguration.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CustomIncidentProcessEnginePlugin.java similarity index 70% rename from digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CustomProcessEngineConfiguration.java rename to digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CustomIncidentProcessEnginePlugin.java index c4c71a2e90..f85f7d2281 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/CustomProcessEngineConfiguration.java +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/configuration/camunda/CustomIncidentProcessEnginePlugin.java @@ -1,19 +1,18 @@ /* * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 */ - -package de.muenchen.oss.digiwf.shared.configuration; +package de.muenchen.oss.digiwf.shared.configuration.camunda; import de.muenchen.oss.digiwf.engine.incidents.IncidentNotifierHandler; +import lombok.RequiredArgsConstructor; import org.camunda.bpm.engine.ProcessEngine; import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.camunda.bpm.engine.impl.cfg.ProcessEnginePlugin; import org.camunda.bpm.spring.boot.starter.configuration.Ordering; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import java.util.Arrays; +import java.util.Collections; /** * Custom configuration for camunda process engine. @@ -22,14 +21,14 @@ */ @Component @Order(Ordering.DEFAULT_ORDER + 1) -public class CustomProcessEngineConfiguration implements ProcessEnginePlugin { +@RequiredArgsConstructor +public class CustomIncidentProcessEnginePlugin implements ProcessEnginePlugin { - @Autowired - private IncidentNotifierHandler incidentNotifierHandler; + private final IncidentNotifierHandler incidentNotifierHandler; @Override public void preInit(final ProcessEngineConfigurationImpl processEngineConfiguration) { - processEngineConfiguration.setCustomIncidentHandlers(Arrays.asList(this.incidentNotifierHandler)); + processEngineConfiguration.setCustomIncidentHandlers(Collections.singletonList(this.incidentNotifierHandler)); } @Override diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/nfcconverter/NfcRequest.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/nfcconverter/NfcRequest.java index 33d34a2113..0a5b0113c7 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/nfcconverter/NfcRequest.java +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/nfcconverter/NfcRequest.java @@ -36,15 +36,11 @@ class NfcRequest extends HttpServletRequestWrapper implements HttpServletRequest private Map> headers; - @SuppressWarnings("unused") - private Set contentTypes; - public NfcRequest(final HttpServletRequest request, final Set contentTypes) { super(request); this.params = null; this.cookies = null; this.headers = null; - this.contentTypes = contentTypes; } private void convert() { if (params != null) { diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/nfcconverter/NfcRequestFilter.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/nfcconverter/NfcRequestFilter.java index 0a0901f8eb..463e455ba9 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/nfcconverter/NfcRequestFilter.java +++ b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/nfcconverter/NfcRequestFilter.java @@ -4,6 +4,7 @@ */ package de.muenchen.oss.digiwf.shared.nfcconverter; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -51,7 +52,7 @@ public class NfcRequestFilter extends OncePerRequestFilter { */ public static final String CONTENTTYPES_PROPERTY = "contentTypes"; - private Set contentTypes = new HashSet<>(); + private final Set contentTypes = new HashSet<>(); /** * @return Das Property contentTypes @@ -66,21 +67,19 @@ public String getContentTypes() { @Autowired(required = false) public void setContentTypes(final String contentTypes) { this.contentTypes.clear(); - if (StringUtils.isEmpty(contentTypes)) { + if (StringUtils.hasLength(contentTypes)) { LOG.info("Disabling context-type filter."); } else { - final Set newContentTypes = Arrays.asList(contentTypes.split(";")) - .stream().map(String::trim) + final Set newContentTypes = Arrays.stream(contentTypes.split(";")).map(String::trim) .collect(Collectors.toSet()); this.contentTypes.addAll(newContentTypes); LOG.info("Enabled content-type filtering to NFC for: {}", getContentTypes()); - } } @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + protected void doFilterInternal(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain) throws ServletException, IOException { LOG.debug("Request-Type={}", request.getClass().getName()); @@ -88,7 +87,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse final String contentType = request.getContentType(); LOG.debug("ContentType for request with URI: \"{}\"", contentType); - if ((contentTypes != null) && (contentTypes.contains(contentType))) { + if (contentTypes.contains(contentType)) { LOG.debug("Processing request {}.", request.getRequestURI()); filterChain.doFilter(new NfcRequest(request, contentTypes), response); } else { diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/NoSecurityUserAuthenticationProvider.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/NoSecurityUserAuthenticationProvider.java deleted file mode 100644 index ad635f69a8..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/NoSecurityUserAuthenticationProvider.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ - -package de.muenchen.oss.digiwf.shared.security; - -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Component; - -/** - * Security provider for no-security environments. - */ -@Component -@Profile("no-security") -public class NoSecurityUserAuthenticationProvider implements UserAuthenticationProvider { - - public static final String DEFAULT_USER = "externer.john.doe"; - - @Override - public String getLoggedInUser() { - return DEFAULT_USER; - } - -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/RequestResponseLoggingFilter.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/RequestResponseLoggingFilter.java deleted file mode 100644 index 0495b1b850..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/RequestResponseLoggingFilter.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ -package de.muenchen.oss.digiwf.shared.security; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.annotation.Order; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.stereotype.Component; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -/** - * This filter logs the username for requests. - */ -@Component -@Order(1) -@Slf4j -public class RequestResponseLoggingFilter implements Filter { - - private static final String REQUEST_LOGGING_MODE_ALL = "all"; - - private static final String REQUEST_LOGGING_MODE_CHANGING = "changing"; - - private static final List CHANGING_METHODS = Arrays.asList("POST", "PUT", "PATCH", "DELETE"); - - /** - * The property or a zero length string if no property is available. - */ - @Value("${security.logging.requests:}") - private String requestLoggingMode; - - @Autowired - private UserAuthenticationProvider userAuthenticationProvider; - - /** - * {@inheritDoc} - */ - @Override - public void init(final FilterConfig filterConfig) throws ServletException { - log.debug("Initializing filter: {}", this); - } - - /** - * The method logs the username extracted out of the {@link SecurityContext}. - * In addition to the username, the kind of HTTP-Request and the targeted URI is logged. - *

- * {@inheritDoc} - */ - @Override - public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) - throws IOException, ServletException { - final HttpServletRequest httpRequest = (HttpServletRequest) request; - if (this.checkForLogging(httpRequest)) { - log.info("User {} executed {} on URI {}", - userAuthenticationProvider.getLoggedInUser(), - httpRequest.getMethod(), - httpRequest.getRequestURI() - ); - } - chain.doFilter(request, response); - } - - @Override - public void destroy() { - log.debug("Destructing filter: {}", this); - } - - /** - * The method checks if logging the username should be done. - * - * @param httpServletRequest The request to check for logging. - * @return True if logging should be done otherwise false. - */ - private boolean checkForLogging(final HttpServletRequest httpServletRequest) { - return this.requestLoggingMode.equals(REQUEST_LOGGING_MODE_ALL) - || (this.requestLoggingMode.equals(REQUEST_LOGGING_MODE_CHANGING) - && CHANGING_METHODS.contains(httpServletRequest.getMethod())); - } - -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/UserAuthenticationProvider.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/UserAuthenticationProvider.java deleted file mode 100644 index 7a63164417..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/UserAuthenticationProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ - -package de.muenchen.oss.digiwf.shared.security; - -/** - * Provides the username for the currently logged-in user. - * - * @author externer.dl.horn - */ -public interface UserAuthenticationProvider { - - /** - * Get the username of the logged-in user. - * - * @return username - */ - String getLoggedInUser(); - -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/UserAuthenticationProviderImpl.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/UserAuthenticationProviderImpl.java deleted file mode 100644 index c3407dfc7a..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/UserAuthenticationProviderImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ - -package de.muenchen.oss.digiwf.shared.security; - -import org.springframework.context.annotation.Profile; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.stereotype.Component; - -/** - * User authentication provider. - * Extracts the name from the token. - * - * @author externer.dl.horn - */ -@Component -@Profile("!no-security") -public class UserAuthenticationProviderImpl implements UserAuthenticationProvider { - - private static final String USER_ATTRIBUTE = "user_name"; - public static final String NAME_UNAUTHENTICATED_USER = "unauthenticated"; - - @Override - public String getLoggedInUser() { - final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication.getPrincipal() instanceof Jwt) { - final Jwt jwt = (Jwt) authentication.getPrincipal(); - return (String) jwt.getClaims().get(USER_ATTRIBUTE); - } - return NAME_UNAUTHENTICATED_USER; - } - -} diff --git a/digiwf-engine/digiwf-engine-service/src/main/resources/application-local.yml b/digiwf-engine/digiwf-engine-service/src/main/resources/application-local.yml index e0107417f5..f01c408cea 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/resources/application-local.yml +++ b/digiwf-engine/digiwf-engine-service/src/main/resources/application-local.yml @@ -20,16 +20,8 @@ spring: logging: level: de.muenchen.oss.digiwf.legacy.form.domain.service.FormService: WARN - org.springframework.boot.web: DEBUG de.muenchen.oss.digiwf.shared.configuration: DEBUG -camunda: - bpm: - admin-user: - id: admin - first-name: Admin - last-name: Administratus - email: ex.admin@munchen.de - password: admin - login: - enabled: true - user-id: admin + org.springframework.boot.web: TRACE + org.springframework.security: TRACE + org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE + diff --git a/digiwf-engine/digiwf-engine-service/src/main/resources/application.yml b/digiwf-engine/digiwf-engine-service/src/main/resources/application.yml index cb89434798..031fbb4fe4 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/resources/application.yml +++ b/digiwf-engine/digiwf-engine-service/src/main/resources/application.yml @@ -5,7 +5,7 @@ info: camunda: bpm: authorization: - enabled: false + enabled: true job-executor-acquire-by-priority: true deployment-resource-pattern: "prozesse/**/*.bpmn, bausteine/**/*.bpmn, bausteine/**/*.dmn" generic-properties: @@ -102,27 +102,6 @@ spring: fallback: true starttls: enable: true - security: - oauth2: - resourceserver: - jwt: - issuer-uri: ${SSO_ISSUER_URL} - - client: - provider: - keycloak: - issuer-uri: ${SSO_ISSUER_URL} - user-info-uri: ${SSO_BASE_URL}/realms/${SSO_REALM}/protocol/openid-connect/userinfo - # jwk-set-uri: ${SSO_BASE_URL}/realms/${SSO_REALM}/protocol/openid-connect/certs - user-name-attribute: user_name # was lhmObjectID... FIXME: check - registration: - keycloak: - provider: keycloak - client-id: ${SSO_ENGINE_CLIENT_ID} - client-secret: ${SSO_ENGINE_CLIENT_SECRET} - scope: email, profile, openid # needed for userInfo endpoint - - springdoc: packagesToScan: de.muenchen.oss.digiwf @@ -177,6 +156,9 @@ digiwf: overridereceivers: false parkausweis: url: "${PARKAUSWEIS_HOST}:${PARKAUSWEIS_PORT}/" + security: + client-id: ${SSO_ENGINE_CLIENT_ID} + client-secret: ${SSO_ENGINE_CLIENT_SECRET} streaming: engine: topics: 'dwf-digiwf-engine-${DIGIWF_ENV},dwf-cocreation-${DIGIWF_ENV}' diff --git a/digiwf-engine/pom.xml b/digiwf-engine/pom.xml index 2ea58a71f4..2b33d313a3 100644 --- a/digiwf-engine/pom.xml +++ b/digiwf-engine/pom.xml @@ -16,6 +16,7 @@ digiwf-engine-service + digiwf-engine-cockpit diff --git a/digiwf-gateway/src/main/resources/application-local.yml b/digiwf-gateway/src/main/resources/application-local.yml index f421cde903..6597fbf060 100644 --- a/digiwf-gateway/src/main/resources/application-local.yml +++ b/digiwf-gateway/src/main/resources/application-local.yml @@ -11,6 +11,7 @@ spring: - Path=/api/sso/userinfo filters: - RewritePath=/api/sso/userinfo, /realms/${SSO_REALM}/protocol/openid-connect/userinfo + - id: backend uri: http://${ENGINE_SERVER_HOST:localhost}:${ENGINE_SERVER_PORT}/ predicates: @@ -18,6 +19,12 @@ spring: filters: - RewritePath=/api/digitalwf-backend-service/(?.*), /$\{urlsegments} - RemoveResponseHeader=WWW-Authenticate + + - id: backend-cockpit + uri: http://${ENGINE_SERVER_HOST:localhost}:${ENGINE_SERVER_PORT} + predicates: + - Path=/camunda/** + - id: tasklist uri: http://${TASKSERVICE_SERVER_HOST:localhost}:${TASKSERVICE_SERVER_PORT}/ predicates: @@ -25,15 +32,16 @@ spring: filters: - RewritePath=/api/digitalwf-tasklist-service/(?.*), /$\{urlsegments} - RemoveResponseHeader=WWW-Authenticate + - id: frontend uri: http://localhost:8081/ predicates: - - Path=/** + - Path=/app/** default-filters: - RemoveResponseHeader=Expires - - RemoveRequestHeader=cookie - - RemoveRequestHeader=x-xsrf-token +# - RemoveRequestHeader=cookie +# - RemoveRequestHeader=x-xsrf-token - TokenRelay= - AddResponseHeader=set-cookie, FEATURE_USE_TASK_SERVICE=${FEATURETOGGLES_FRONTEND_USETASKSERVICE} - AddResponseHeader=set-cookie, FEATURE_SHOW_BETA_BUTTON=${FEATURETOGGLES_FRONTEND_SHOWBETABUTTON} diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/pom.xml b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/pom.xml index 121f221b47..ab969fbbe7 100644 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/pom.xml +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/pom.xml @@ -29,6 +29,10 @@ org.springframework.boot spring-boot-starter-oauth2-client + + org.apache.commons + commons-lang3 + diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/JwtClaims.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/JwtClaims.java new file mode 100644 index 0000000000..811a32dacc --- /dev/null +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/JwtClaims.java @@ -0,0 +1,17 @@ +package de.muenchen.oss.digiwf.spring.security; + +/** + * Collection of useful claims. + */ +public enum JwtClaims { + ; + public static final String USER_ID = "lhmObjectID"; + public static final String GIVEN_NAME = "given_name"; + public static final String FAMILY_NAME = "family_name"; + public static final String EMAIL = "email"; + + public static final String AUTHORITIES = "authorities"; + public static final String ROLES = "user_roles"; + +} + diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/JwtUserInfoAuthenticationConverter.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/JwtUserInfoAuthenticationConverter.java deleted file mode 100644 index 73c4ac495f..0000000000 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/JwtUserInfoAuthenticationConverter.java +++ /dev/null @@ -1,24 +0,0 @@ -package de.muenchen.oss.digiwf.spring.security; - -import lombok.RequiredArgsConstructor; -import org.springframework.core.convert.converter.Converter; -import org.springframework.lang.NonNull; -import org.springframework.security.authentication.AbstractAuthenticationToken; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; - -/** - * Stateful configuration of a Jwt Converter loading details from UserInfo endpoint. - */ -@RequiredArgsConstructor -public class JwtUserInfoAuthenticationConverter implements Converter { - - private final UserInfoAuthoritiesService userInfoService; - - @Override - public AbstractAuthenticationToken convert(@NonNull Jwt source) { - return new JwtAuthenticationToken(source, this.userInfoService.loadAuthorities(source)); - } - -} - diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/NoSecurityConfiguration.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/NoSecurityConfiguration.java index 18af7f5930..39a6f59812 100644 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/NoSecurityConfiguration.java +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/NoSecurityConfiguration.java @@ -27,13 +27,13 @@ public SecurityFilterChain mainSecurityFilterChain(HttpSecurity http) throws Exc // @formatter:off http .headers() - .frameOptions().disable() - .and() + .frameOptions().disable() + .and() .authorizeRequests() - .anyRequest().permitAll() - .and() + .anyRequest().permitAll() + .and() .csrf() - .disable(); + .disable(); // @formatter:on return http.build(); } diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/PrincipalUtil.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/PrincipalUtil.java new file mode 100644 index 0000000000..5adb8d0498 --- /dev/null +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/PrincipalUtil.java @@ -0,0 +1,29 @@ +package de.muenchen.oss.digiwf.spring.security; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; + +import java.security.Principal; +import java.util.List; + +import static de.muenchen.oss.digiwf.spring.security.SecurityConfiguration.SPRING_ROLE_PREFIX; +import static java.util.Collections.emptyList; +import static java.util.stream.Collectors.toList; + +public class PrincipalUtil { + @SuppressWarnings("unused") + public static List extractRoles(Principal principal) { + if (principal instanceof Authentication) { + return extractRoles((Authentication) principal); + } + return emptyList(); + } + + public static List extractRoles(Authentication authentication) { + return authentication.getAuthorities().stream() + .map(GrantedAuthority::getAuthority) + .map(role -> StringUtils.removeStart(role, SPRING_ROLE_PREFIX)) + .collect(toList()); + } +} diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/SecurityConfiguration.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/SecurityConfiguration.java index a85f906c2d..81145e5953 100644 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/SecurityConfiguration.java +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/SecurityConfiguration.java @@ -4,22 +4,30 @@ */ package de.muenchen.oss.digiwf.spring.security; +import de.muenchen.oss.digiwf.spring.security.userinfo.UserInfoAuthoritiesConverter; +import io.muenchendigital.digiwf.spring.security.client.ClientParameters; import lombok.RequiredArgsConstructor; import lombok.val; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; +import org.springframework.core.annotation.Order; import org.springframework.core.convert.converter.Converter; +import org.springframework.core.env.Environment; import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.core.GrantedAuthority; import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter; import org.springframework.security.web.SecurityFilterChain; +import javax.annotation.PostConstruct; +import java.util.Collection; + import static de.muenchen.oss.digiwf.spring.security.SecurityConfiguration.SECURITY; /** @@ -27,38 +35,58 @@ */ @Configuration @Profile(SECURITY) -@EnableWebSecurity +@EnableWebSecurity(debug = true) @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) @RequiredArgsConstructor public class SecurityConfiguration { + + @Bean + public WebSecurityCustomizer webSecurityCustomizer() { + return (web) -> web.debug(true); + } + /** * Activates security. */ public static final String SECURITY = "!no-security"; - + public static final int DEFAULT_SECURITY_ORDER = 77; + public static final String SPRING_ROLE_PREFIX = "ROLE_"; private final RestTemplateBuilder restTemplateBuilder; private final SpringSecurityProperties springSecurityProperties; - private final ClientRegistrationRepository clientRegistrationRepository; + private final Environment environment; + private ClientParameters clientParameters; + + @PostConstruct + void setupClientRegistration() { + this.clientParameters = ClientParameters.fromEnvironment(environment, springSecurityProperties.getClientRegistration()); + } + @Bean - public SecurityFilterChain configure(final HttpSecurity http, Converter converter) throws Exception { + @Order(DEFAULT_SECURITY_ORDER) + public SecurityFilterChain mainSecurityFilterChain( + final HttpSecurity http, + final JwtAuthenticationConverter jwtAuthenticationConverter + ) throws Exception { // @formatter:off http - .csrf() - .ignoringAntMatchers(springSecurityProperties.getPermittedUrls()) - .disable() - .authorizeRequests() - .antMatchers(HttpMethod.OPTIONS).permitAll() - .antMatchers(springSecurityProperties.getPermittedUrls()).permitAll() - .anyRequest().authenticated() - .and() - .oauth2ResourceServer() - .jwt() - .jwtAuthenticationConverter(converter) - .and(); - return http.build(); + .csrf( csrf -> csrf + .ignoringAntMatchers(springSecurityProperties.getPermittedUrls()) + .disable() + ) + .authorizeRequests( requests -> requests + .antMatchers(HttpMethod.OPTIONS).permitAll() + .antMatchers(springSecurityProperties.getPermittedUrls()).permitAll() + .anyRequest().authenticated() + ) + .oauth2ResourceServer( server -> server + .jwt() + .jwtAuthenticationConverter(jwtAuthenticationConverter) + ) + ; // @formatter:on + return http.build(); } /** @@ -87,14 +115,15 @@ public SecurityFilterChain configure(final HttpSecurity http, Converter customCachingUserServiceConverter(final UserInfoAuthoritiesService userInfoAuthoritiesService) { - return new JwtUserInfoAuthenticationConverter(userInfoAuthoritiesService); + public JwtAuthenticationConverter customCachingUserServiceConverter(final Converter> userInfoAuthoritiesConverter) { + val converter = new JwtAuthenticationConverter(); + converter.setJwtGrantedAuthoritiesConverter(userInfoAuthoritiesConverter); + return converter; } @Bean - public UserInfoAuthoritiesService userInfoAuthoritiesService() { - val userInfoUri = clientRegistrationRepository.findByRegistrationId(this.springSecurityProperties.getClientRegistration()).getProviderDetails().getUserInfoEndpoint().getUri(); - return new UserInfoAuthoritiesService(userInfoUri, restTemplateBuilder); + public Converter> userInfoAuthoritiesConverter() { + return new UserInfoAuthoritiesConverter(clientParameters.getProviderUserInfoUri(), restTemplateBuilder); } } diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/SpringSecurityProperties.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/SpringSecurityProperties.java index 7e0b8b3608..4dffc7d8ba 100644 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/SpringSecurityProperties.java +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/SpringSecurityProperties.java @@ -11,6 +11,18 @@ public class SpringSecurityProperties { */ private String clientRegistration = "keycloak"; + private String clientRegistrationServiceAccount = "keycloak-service-account"; + + /** + * Client id to use. + */ + private String clientId; + + /** + * Client secret to use. + */ + private String clientSecret; + private String[] permittedUrls = { "/error", // allow the error page "/actuator/info", // allow access to /actuator/info @@ -22,4 +34,9 @@ public class SpringSecurityProperties { * Username fallback to use in no-security mode. */ private String fallbackUsername = "externer.john.doe"; + + /** + * Roles to fallback to use in no-security mode. + */ + private String[] fallbackUserRoles = {"office", "administration"}; } diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/TokenBasedAuthoritiesConverter.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/TokenBasedAuthoritiesConverter.java new file mode 100644 index 0000000000..2f740bfcb8 --- /dev/null +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/TokenBasedAuthoritiesConverter.java @@ -0,0 +1,123 @@ +package de.muenchen.oss.digiwf.spring.security; + +import com.nimbusds.jose.shaded.json.JSONObject; +import org.springframework.core.convert.converter.Converter; +import org.springframework.lang.NonNull; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.core.ClaimAccessor; +import org.springframework.security.oauth2.jwt.Jwt; + +import java.util.*; +import java.util.stream.Stream; + +import static de.muenchen.oss.digiwf.spring.security.SecurityConfiguration.SPRING_ROLE_PREFIX; +import static java.util.stream.Collectors.toList; + +/** + * @deprecated just for reference, not used yet. + * The {@link TokenBasedAuthoritiesConverter} parses the JWT and extracts the granted roles of the user. In the current + * Keycloak setup roles are provided under the claim "realm_access". Client roles are provided per client in the claim + * "resource_access".
+ *
+ * Please note, that the extractor does only extract the client roles of the given clientId. If no clientId is given in + * the configuration, only the Realm roles are used for checking authorization.
+ *
+ * Example:
+ *

+ * {
+ *   ...
+ *   "realm_access" : {
+ *     "roles" : [
+ *       "realm_role1",
+ *       "realm_role2",
+ *       "realm_roleN"
+ *     ]
+ *   },
+ *   "resource_access" : {
+ *       "client1" : {
+ *           roles: [
+ *            "client_role1",
+ *            "client_role2"
+ *            "client_role3"
+ *           ]
+ *       },
+ *       "client2" : {
+ *           roles: [
+ *            "client_role4",
+ *            "client_role5"
+ *            "client_role6"
+ *           ]
+ *       }
+ *    }
+ * }
+ * 
+ */ +@Deprecated +public class TokenBasedAuthoritiesConverter implements Converter> { + + private static final String ROLE_DECLARATIONS = "roles"; + private static final String REALM_ROLES_CLAIM = "realm_access"; + private static final String CLIENTS_CLAIM = "resource_access"; + /** + * LHM Claim containing the user roles mapped from the current client via client scope protocol mapper. + */ + private static final String USER_ROLES_CLAIM = "user_roles"; + private static final String CLIENT_ROLE_SEPARATOR = ":"; + + + @Override + public Collection convert(@NonNull Jwt source) { + return extractAuthorities(source); + } + + protected Collection extractAuthorities(Jwt jwt) { + + // Retrieve client roles of all clients + final Collection clientAuthorities = getClientAuthorities(jwt); + + final Collection userRoles = getUserRolesClaimAuthorities(jwt); + + // Retrieve realm roles + final Map realmAccess = jwt.getClaimAsMap(REALM_ROLES_CLAIM); + + Collection realmAuthorities = Collections.emptyList(); + if (realmAccess != null && realmAccess.containsKey(ROLE_DECLARATIONS)) { + //noinspection unchecked + realmAuthorities = (Collection) realmAccess.get(ROLE_DECLARATIONS); + } + + return Stream.concat( + Stream.concat(realmAuthorities.stream(), clientAuthorities.stream()).map(s -> SPRING_ROLE_PREFIX + s), + userRoles.stream() + ).map(SimpleGrantedAuthority::new).collect(toList()); + } + + public static List getClientAuthorities(ClaimAccessor jwt) { + // retrieve client roles of all clients + final List clientAuthorities = new ArrayList<>(); + Map clientClaims = jwt.getClaimAsMap(CLIENTS_CLAIM); + if (clientClaims != null) { + clientClaims.forEach((client, claims) -> clientAuthorities.addAll(extractRoles(client, (JSONObject) claims))); + } + return clientAuthorities; + } + + public static List getUserRolesClaimAuthorities(ClaimAccessor jwt) { + // retrieve roles + return jwt.getClaimAsStringList(USER_ROLES_CLAIM); + } + + + static List extractRoles(String client, JSONObject clientObject) { + @SuppressWarnings("unchecked") final Collection clientRoles = (Collection) clientObject.get(ROLE_DECLARATIONS); + if (clientRoles != null) { + return clientRoles + .stream() + .map(role -> client + CLIENT_ROLE_SEPARATOR + role) + .collect(toList()); + } else { + return Collections.emptyList(); + } + } +} diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/NoSecurityUserAuthenticationProvider.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/NoSecurityUserAuthenticationProvider.java index 4d18c82558..1b0ff5a90c 100644 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/NoSecurityUserAuthenticationProvider.java +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/NoSecurityUserAuthenticationProvider.java @@ -11,6 +11,10 @@ import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + /** * Security provider for no-security environments. */ @@ -27,4 +31,9 @@ public String getLoggedInUser() { return springSecurityProperties.getFallbackUsername(); } + @Override + @NonNull + public Set getLoggedInUserRoles() { + return Arrays.stream(springSecurityProperties.getFallbackUserRoles()).collect(Collectors.toSet()); + } } diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/RequestResponseLoggingFilter.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/RequestResponseLoggingFilter.java new file mode 100644 index 0000000000..96b2d27c8f --- /dev/null +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/RequestResponseLoggingFilter.java @@ -0,0 +1,81 @@ +/* + * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 + */ +package de.muenchen.oss.digiwf.spring.security.authentication; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.annotation.Order; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * This filter logs the username for requests. + */ +@Component +@Order(1) +@Slf4j +public class RequestResponseLoggingFilter implements Filter { + + private static final String REQUEST_LOGGING_MODE_ALL = "all"; + + private static final String REQUEST_LOGGING_MODE_CHANGING = "changing"; + + private static final List CHANGING_METHODS = Arrays.asList("POST", "PUT", "PATCH", "DELETE"); + + /** + * The property or a zero length string if no property is available. + */ + + private final String requestLoggingMode; + private final UserAuthenticationProvider userAuthenticationProvider; + + public RequestResponseLoggingFilter(UserAuthenticationProvider userAuthenticationProvider, + @Value("${security.logging.requests:}") + String requestLoggingMode) { + this.userAuthenticationProvider = userAuthenticationProvider; + this.requestLoggingMode = requestLoggingMode; + } + + /** + * The method logs the username extracted out of the {@link SecurityContext}. + * In addition to the username, the kind of HTTP-Request and the targeted URI is logged. + *

+ */ + @Override + public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) + throws IOException, ServletException { + final HttpServletRequest httpRequest = (HttpServletRequest) request; + if (this.checkForLogging(httpRequest)) { + log.info("User {} executed {} on URI {}", + userAuthenticationProvider.getLoggedInUser(), + httpRequest.getMethod(), + httpRequest.getRequestURI() + ); + } + chain.doFilter(request, response); + } + + /** + * The method checks if logging the username should be done. + * + * @param httpServletRequest The request to check for logging. + * @return True if logging should be done otherwise false. + */ + private boolean checkForLogging(final HttpServletRequest httpServletRequest) { + switch (this.requestLoggingMode) { + case REQUEST_LOGGING_MODE_ALL: + return true; + case REQUEST_LOGGING_MODE_CHANGING: + return CHANGING_METHODS.contains(httpServletRequest.getMethod()); + default: + return false; + } + } +} diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/UserAuthenticationProvider.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/UserAuthenticationProvider.java index 2475963ae7..f4b3053445 100644 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/UserAuthenticationProvider.java +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/UserAuthenticationProvider.java @@ -6,16 +6,26 @@ import org.springframework.lang.NonNull; +import java.util.Set; + /** * Provides the username for the currently logged-in user. */ public interface UserAuthenticationProvider { /** - * Get the username of the logged-in user. + * Get the user id of the logged-in user. * - * @return username + * @return user id. */ @NonNull String getLoggedInUser(); + + /** + * Retrieves user roles of logged-in user. + * + * @return set of users. + */ + @NonNull + Set getLoggedInUserRoles(); } diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/UserAuthenticationProviderImpl.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/UserAuthenticationProviderImpl.java index 86ca486f92..993d921a95 100644 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/UserAuthenticationProviderImpl.java +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/authentication/UserAuthenticationProviderImpl.java @@ -4,19 +4,23 @@ package de.muenchen.oss.digiwf.spring.security.authentication; +import de.muenchen.oss.digiwf.spring.security.PrincipalUtil; import de.muenchen.oss.digiwf.spring.security.SecurityConfiguration; import de.muenchen.oss.digiwf.spring.security.SpringSecurityProperties; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; import org.springframework.lang.NonNull; +import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; +import java.util.HashSet; +import java.util.Set; + +import static io.muenchendigital.digiwf.spring.security.client.ClientParameters.fromEnvironment; /** * User authentication provider. @@ -24,36 +28,32 @@ */ @Component @Profile(SecurityConfiguration.SECURITY) -@RequiredArgsConstructor @Slf4j public class UserAuthenticationProviderImpl implements UserAuthenticationProvider { - private final SpringSecurityProperties springSecurityProperties; - private final ClientRegistrationRepository clientRegistrationRepository; - private String userNameAttribute; + private final String userNameAttribute; public static final String NAME_UNAUTHENTICATED_USER = "unauthenticated"; - @PostConstruct - public void getUsernameAttributeName() { - try { - userNameAttribute = clientRegistrationRepository.findByRegistrationId(springSecurityProperties.getClientRegistration()) - .getProviderDetails().getUserInfoEndpoint().getUserNameAttributeName(); - } catch (Exception e) { - userNameAttribute = "user_name"; - log.error("Error reading username attribute for configured client registration " - + springSecurityProperties.getClientRegistration() + ". Falling back to " + userNameAttribute, e); - } + public UserAuthenticationProviderImpl(SpringSecurityProperties springSecurityProperties, Environment environment) { + this.userNameAttribute = fromEnvironment(environment, springSecurityProperties.getClientRegistration()) + .getUserNameAttribute(); } @Override @NonNull public String getLoggedInUser() { final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication.getPrincipal() instanceof Jwt) { + if (authentication instanceof AbstractAuthenticationToken && authentication.getPrincipal() instanceof Jwt) { final Jwt jwt = (Jwt) authentication.getPrincipal(); return (String) jwt.getClaims().get(userNameAttribute); } return NAME_UNAUTHENTICATED_USER; } + @Override + @NonNull + public Set getLoggedInUserRoles() { + final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + return new HashSet<>(PrincipalUtil.extractRoles(authentication)); + } } diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/ClientParameters.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/ClientParameters.java new file mode 100644 index 0000000000..cf9ad215f1 --- /dev/null +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/ClientParameters.java @@ -0,0 +1,57 @@ +package io.muenchendigital.digiwf.spring.security.client; + +import lombok.Data; +import org.springframework.core.env.Environment; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * OAuth2 Client parameters read directly from the environment. + */ +@Data +public class ClientParameters { + private final String providerIssuerUrl; + private final String providerUserInfoUri; + private final String userNameAttribute; + private final String clientId; + private final List scopes; + + private static final String CLIENT_ID_TMPL = "spring.security.oauth2.client.registration.%s.client-id"; + private static final String SCOPE_TMPL = "spring.security.oauth2.client.registration.%s.scope"; + private static final String PROVIDER_ISSUER_URL_TMPL = "spring.security.oauth2.client.provider.%s.issuer-uri"; + private static final String PROVIDER_USER_INFO_URL_TMPL = "spring.security.oauth2.client.provider.%s.user-info-uri"; + private static final String USER_NAME_ATTRIBUTE_TMPL = "spring.security.oauth2.client.provider.%s.user-name-attribute"; + + /** + * Creates client parameters from configuration of the Spring environment. + * + * @param environment environment. + * @param registrationId registration id using client. + * @return client parameters. + */ + public static ClientParameters fromEnvironment(Environment environment, String registrationId) { + final String providerIssuerUri = environment.getProperty(String.format(PROVIDER_ISSUER_URL_TMPL, registrationId)); + final String providerUserInfoUri = environment.getProperty(String.format(PROVIDER_USER_INFO_URL_TMPL, registrationId)); + final String usernameAttribute = environment.getProperty(String.format(USER_NAME_ATTRIBUTE_TMPL, registrationId)); + final String clientId = environment.getProperty(String.format(CLIENT_ID_TMPL, registrationId)); + final String scopeString = environment.getProperty(String.format(SCOPE_TMPL, registrationId)); + return new ClientParameters(providerIssuerUri, providerUserInfoUri, usernameAttribute, clientId, splitScopes(scopeString)); + } + + /** + * Extracts scopes from single scope string, split by ",". Removes leading and trailing spaces. + * @param scopeString scope string from environment. + * @return list of scopes. + */ + static List splitScopes(String scopeString) { + if (scopeString == null || scopeString.isEmpty()) { + return new ArrayList<>(); + } + return Arrays.stream(scopeString.split(",")).map(String::trim).collect(Collectors.toList()); + } + + +} diff --git a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/OAuth2AccessTokenSupplier.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/OAuth2AccessTokenSupplier.java similarity index 60% rename from digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/OAuth2AccessTokenSupplier.java rename to digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/OAuth2AccessTokenSupplier.java index 35328c5e1a..f90921076e 100644 --- a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/OAuth2AccessTokenSupplier.java +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/OAuth2AccessTokenSupplier.java @@ -1,6 +1,9 @@ -package de.muenchen.oss.digiwf.task.service.infra.security; +package de.muenchen.oss.digiwf.spring.security.client; +import de.muenchen.oss.digiwf.spring.security.SecurityConfiguration; +import de.muenchen.oss.digiwf.spring.security.SpringSecurityProperties; import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.oauth2.client.OAuth2AuthorizeRequest; @@ -16,32 +19,37 @@ * Supplier for service account access token using given registration. */ @Component +@ConditionalOnProperty(value = "digiwf.security.service-account", matchIfMissing = true) @RequiredArgsConstructor public class OAuth2AccessTokenSupplier implements Supplier { + private final SpringSecurityProperties springSecurityProperties; + private final OAuth2AuthorizedClientManager authorizedClientManager; - private static final String clientRegistrationId = "keycloak-service-account"; // FIXME -> load from properties. - private static final String ACCESS_ROLE = "clientrole_taskuser"; // FIXME -> load from properties. + private static final String ACCESS_ROLE = "clientrole_user"; private AnonymousAuthenticationToken anonymousUserToken; @PostConstruct void init() { anonymousUserToken = new AnonymousAuthenticationToken( - clientRegistrationId, - clientRegistrationId, - AuthorityUtils.createAuthorityList(GrantedAuthoritiesConverter.SPRING_ROLE_PREFIX + ACCESS_ROLE) + springSecurityProperties.getClientRegistrationServiceAccount(), + springSecurityProperties.getClientRegistrationServiceAccount(), + AuthorityUtils.createAuthorityList(SecurityConfiguration.SPRING_ROLE_PREFIX + ACCESS_ROLE) ); } @Override public OAuth2AccessToken get() { final OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest - .withClientRegistrationId(clientRegistrationId) + .withClientRegistrationId( + springSecurityProperties.getClientRegistrationServiceAccount() + ) .principal(anonymousUserToken) .build(); final OAuth2AuthorizedClient authorizedClient = authorizedClientManager.authorize(authorizeRequest); if (authorizedClient == null) { - throw new IllegalStateException("Client credentials authorization using client registration '" + clientRegistrationId + "' failed."); + throw new IllegalStateException("Client credentials authorization using client registration '" + + springSecurityProperties.getClientRegistrationServiceAccount() + "' failed."); } return authorizedClient.getAccessToken(); } diff --git a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/ServiceAccountAccessTokenConfiguration.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/ServiceAccountAccessTokenConfiguration.java similarity index 89% rename from digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/ServiceAccountAccessTokenConfiguration.java rename to digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/ServiceAccountAccessTokenConfiguration.java index b07947e93f..f25c9ccf90 100644 --- a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/ServiceAccountAccessTokenConfiguration.java +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/client/ServiceAccountAccessTokenConfiguration.java @@ -1,6 +1,7 @@ -package de.muenchen.oss.digiwf.task.service.infra.security; +package de.muenchen.oss.digiwf.spring.security.client; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.SimpleClientHttpRequestFactory; @@ -12,15 +13,13 @@ import org.springframework.security.oauth2.client.endpoint.DefaultClientCredentialsTokenResponseClient; import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; -import org.springframework.security.oauth2.core.OAuth2AccessToken; import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; import org.springframework.web.client.RestTemplate; -import java.util.function.Supplier; - import static java.util.Arrays.asList; @Configuration +@ConditionalOnProperty(value = "digiwf.security.service-account", matchIfMissing = true) public class ServiceAccountAccessTokenConfiguration { private final static int TIMEOUT = 20_000; @@ -32,12 +31,7 @@ public OAuth2AuthorizedClientManager serviceAccountAuthorizedClientManager( OAuth2AuthorizedClientService authorizedClientService) { // We need to create and configure all these objects manually in order to set the timeouts. // These are the objects that would be created if we just used a `new ClientCredentialsOAuth2AuthorizedClientProvider()` with only the timeouts added. - final SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); - requestFactory.setConnectTimeout(TIMEOUT); - requestFactory.setReadTimeout(TIMEOUT); - final RestTemplate restTemplate = new RestTemplate(asList(new FormHttpMessageConverter(), new OAuth2AccessTokenResponseHttpMessageConverter())); - restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler()); - restTemplate.setRequestFactory(requestFactory); + final RestTemplate restTemplate = constructRestTemplate(); final DefaultClientCredentialsTokenResponseClient accessTokenResponseClient = new DefaultClientCredentialsTokenResponseClient(); accessTokenResponseClient.setRestOperations(restTemplate); @@ -52,4 +46,14 @@ public OAuth2AuthorizedClientManager serviceAccountAuthorizedClientManager( return authorizedClientManager; } + private static RestTemplate constructRestTemplate() { + final SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); + requestFactory.setConnectTimeout(TIMEOUT); + requestFactory.setReadTimeout(TIMEOUT); + final RestTemplate restTemplate = new RestTemplate(asList(new FormHttpMessageConverter(), new OAuth2AccessTokenResponseHttpMessageConverter())); + restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler()); + restTemplate.setRequestFactory(requestFactory); + return restTemplate; + } + } diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/UserInfoAuthoritiesService.java b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/userinfo/UserInfoAuthoritiesConverter.java similarity index 69% rename from digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/UserInfoAuthoritiesService.java rename to digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/userinfo/UserInfoAuthoritiesConverter.java index 091631b2a9..a87f2c98ed 100644 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/UserInfoAuthoritiesService.java +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-core/src/main/java/de/muenchen/oss/digiwf/spring/security/userinfo/UserInfoAuthoritiesConverter.java @@ -1,13 +1,16 @@ -package de.muenchen.oss.digiwf.spring.security; +package de.muenchen.oss.digiwf.spring.security.userinfo; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.Ticker; +import de.muenchen.oss.digiwf.spring.security.JwtClaims; +import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cache.Cache; import org.springframework.cache.Cache.ValueWrapper; import org.springframework.cache.caffeine.CaffeineCache; +import org.springframework.core.convert.converter.Converter; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -27,17 +30,14 @@ /** * Service, der einen OIDC /userinfo Endpoint aufruft (mit JWT Bearer Auth) und dort die enthaltenen - * "Authorities" und "User_Roles extrahiert. + * "authorities" und "user_roles" extrahiert. */ @Slf4j -public class UserInfoAuthoritiesService { +public class UserInfoAuthoritiesConverter implements Converter> { private static final String NAME_AUTHENTICATION_CACHE = "authentication_cache"; private static final int AUTHENTICATION_CACHE_ENTRY_SECONDS_TO_EXPIRE = 60; - private static final String CLAIM_AUTHORITIES = "authorities"; - private static final String CLAIM_ROLES = "user_roles"; - private final String userInfoUri; private final RestTemplate restTemplate; private final Cache cache; @@ -48,7 +48,7 @@ public class UserInfoAuthoritiesService { * @param userInfoUri userinfo Endpoint URI * @param restTemplateBuilder ein {@link RestTemplateBuilder} */ - public UserInfoAuthoritiesService(final String userInfoUri, final RestTemplateBuilder restTemplateBuilder) { + public UserInfoAuthoritiesConverter(final String userInfoUri, final RestTemplateBuilder restTemplateBuilder) { this.userInfoUri = userInfoUri; this.restTemplate = restTemplateBuilder.build(); this.cache = new CaffeineCache(NAME_AUTHENTICATION_CACHE, @@ -58,18 +58,24 @@ public UserInfoAuthoritiesService(final String userInfoUri, final RestTemplateBu .build()); } + @Override + public Collection convert(@NonNull Jwt source) { + return loadAuthorities(source); + } + + /** * Ruft den /userinfo Endpoint und extrahiert {@link GrantedAuthority}s aus dem "authorities" - * Claim. + * Claim und roles aus dem "user_roles" claim. * * @param jwt der JWT * @return die {@link GrantedAuthority}s gem. Claim "authorities" des /userinfo Endpoints */ - public Collection loadAuthorities(final Jwt jwt) { + public Collection loadAuthorities(final Jwt jwt) { final ValueWrapper valueWrapper = this.cache.get(jwt.getSubject()); if (valueWrapper != null) { // value present in cache - @SuppressWarnings("unchecked") final Collection authorities = (Collection) valueWrapper.get(); + @SuppressWarnings("unchecked") final Collection authorities = (Collection) valueWrapper.get(); log.debug("Resolved authorities (from cache): {}", authorities); return authorities; } @@ -78,32 +84,28 @@ public Collection loadAuthorities(final Jwt jwt) { final HttpHeaders headers = new HttpHeaders(); headers.set(HttpHeaders.AUTHORIZATION, "Bearer " + jwt.getTokenValue()); final HttpEntity entity = new HttpEntity<>(headers); - - Collection authorities = new ArrayList<>(); + Collection authorities = new ArrayList<>(); try { - @SuppressWarnings("unchecked") final Map map = this.restTemplate.exchange(this.userInfoUri, HttpMethod.GET, entity, - Map.class).getBody(); - + @SuppressWarnings("unchecked") + final Map map = this.restTemplate.exchange(this.userInfoUri, HttpMethod.GET, entity, Map.class).getBody(); log.debug("Response from user-info Endpoint: {}", map); - if (map != null && map.containsKey(CLAIM_AUTHORITIES)) { - authorities.addAll(asAuthorities(map.get(CLAIM_AUTHORITIES))); + if (map != null && map.containsKey(JwtClaims.AUTHORITIES)) { + authorities.addAll(asAuthorities(map.get(JwtClaims.AUTHORITIES))); } - if (map != null && map.containsKey(CLAIM_ROLES)) { - authorities.addAll(asAuthorities(map.get(CLAIM_ROLES))); + if (map != null && map.containsKey(JwtClaims.ROLES)) { + authorities.addAll(asAuthorities(map.get(JwtClaims.ROLES))); } log.debug("Resolved Authorities (from /userinfo Endpoint): {}", authorities); // store this.cache.put(jwt.getSubject(), authorities); } catch (final Exception e) { - log.error(String.format("Could not fetch user details from %s - user is granted NO authorities", - this.userInfoUri), e); + log.error(String.format("Could not fetch user details from %s - user is granted NO authorities", this.userInfoUri), e); } - return authorities; } - private static List asAuthorities(Object object) { - final List authorities = new ArrayList<>(); + private static List asAuthorities(Object object) { + final List authorities = new ArrayList<>(); if (object instanceof Collection) { final Collection collection = (Collection) object; object = collection.toArray(new Object[0]); diff --git a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-starter/src/main/resources/application-spring-security-starter.yaml b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-starter/src/main/resources/application-spring-security-starter.yaml index d90774669f..e258677fe2 100644 --- a/digiwf-libs/digiwf-spring-security/digiwf-spring-security-starter/src/main/resources/application-spring-security-starter.yaml +++ b/digiwf-libs/digiwf-spring-security/digiwf-spring-security-starter/src/main/resources/application-spring-security-starter.yaml @@ -6,6 +6,13 @@ digiwf: - /actuator/info # allow access to /actuator/info - /actuator/health # allow access to /actuator/health for OpenShift Health Check - /actuator/metrics # allow access to /actuator/metrics for Prometheus monitoring in OpenShift + - /swagger-ui/index.html # allow access to swagger + - /swagger-ui*/*swagger-initializer.js # allow access to swagger + - /swagger-ui*/** # allow access to swagger + - /v3/api-docs/* # allow access to swagger + - /v3/api-docs # allow access to swagger + service-account: true + spring: security: @@ -19,10 +26,17 @@ spring: issuer-uri: ${SSO_ISSUER_URL} user-info-uri: ${SSO_BASE_URL}/realms/${SSO_REALM}/protocol/openid-connect/userinfo jwk-set-uri: ${SSO_BASE_URL}/realms/${SSO_REALM}/protocol/openid-connect/certs - user-name-attribute: user_name + user-name-attribute: lhmObjectID registration: keycloak: provider: keycloak - client-id: ${SSO_ENGINE_CLIENT_ID} - client-secret: ${SSO_ENGINE_CLIENT_SECRET} - scope: email, profile, openid # needed for userInfo endpoint \ No newline at end of file + client-id: ${digiwf.security.client-id} + client-secret: ${digiwf.security.client-secret} + scope: email, profile, openid # needed for userInfo endpoint + keycloak-service-account: + provider: keycloak + authorization-grant-type: client_credentials + client-id: ${digiwf.security.client-id} + client-secret: ${digiwf.security.client-secret} + scope: email, profile, openid # needed for userInfo endpoint + diff --git a/digiwf-task/digiwf-task-api/src/main/java/de/muenchen/oss/digiwf/task/HttpHeaders.java b/digiwf-task/digiwf-task-api/src/main/java/de/muenchen/oss/digiwf/task/HttpHeaders.java deleted file mode 100644 index dae608f822..0000000000 --- a/digiwf-task/digiwf-task-api/src/main/java/de/muenchen/oss/digiwf/task/HttpHeaders.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.muenchen.oss.digiwf.task; - -/** - * HTTP headers. - */ -public class HttpHeaders { - /** - * Header to propagate username. - */ - public static final String HEADER_AUTHORIZED_USERNAME = "X-Authorization-Username"; -} diff --git a/digiwf-task/digiwf-tasklist-service/pom.xml b/digiwf-task/digiwf-tasklist-service/pom.xml index 7ac8367efc..f415d8f385 100644 --- a/digiwf-task/digiwf-tasklist-service/pom.xml +++ b/digiwf-task/digiwf-tasklist-service/pom.xml @@ -27,6 +27,11 @@ digiwf-task-api + + de.muenchen.oss.digiwf + digiwf-spring-security-starter + ${project.version} + de.muenchen.oss.digiwf digiwf-json-serialization-starter diff --git a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/adapter/out/auth/CurrentUserSpringSecurityAdapter.java b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/adapter/out/auth/CurrentUserSpringSecurityAdapter.java index b94dd5ba9d..aa50205d94 100644 --- a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/adapter/out/auth/CurrentUserSpringSecurityAdapter.java +++ b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/adapter/out/auth/CurrentUserSpringSecurityAdapter.java @@ -1,9 +1,13 @@ package de.muenchen.oss.digiwf.task.service.adapter.out.auth; +import de.muenchen.oss.digiwf.spring.security.PrincipalUtil; +import de.muenchen.oss.digiwf.spring.security.SpringSecurityProperties; import de.muenchen.oss.digiwf.task.service.application.port.out.auth.CurrentUserPort; import de.muenchen.oss.digiwf.task.service.application.port.out.user.UserGroupResolverPort; import io.holunda.polyflow.view.auth.User; import lombok.RequiredArgsConstructor; +import lombok.val; +import org.springframework.core.env.Environment; import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -14,25 +18,43 @@ import java.util.Objects; import java.util.stream.Collectors; +import static io.muenchendigital.digiwf.spring.security.client.ClientParameters.fromEnvironment; + /** * Service to resolve currently logged-in user. */ @Component -@RequiredArgsConstructor public class CurrentUserSpringSecurityAdapter implements CurrentUserPort { - public static final String USER_ID_CLAIM = "lhmObjectID"; - public static final String USERNAME_CLAIM = "user_name"; - private final UserGroupResolverPort userGroupResolver; + private final String userNameAttribute; + + public CurrentUserSpringSecurityAdapter(UserGroupResolverPort userGroupResolver, SpringSecurityProperties springSecurityProperties, Environment environment) { + this.userGroupResolver = userGroupResolver; + this.userNameAttribute = fromEnvironment(environment, springSecurityProperties.getClientRegistration()) + .getUserNameAttribute(); + } + + @Override + public String getCurrentUserToken() { + var authentication = getCurrentAuth(); + if (authentication instanceof JwtAuthenticationToken && authentication.getPrincipal() instanceof Jwt) { + var jwt = (Jwt) authentication.getPrincipal(); + return jwt.getTokenValue(); + } else { + throw new AuthenticationCredentialsNotFoundException("Could not detect current authorized user"); + } + } @Override public User getCurrentUser() { var authentication = getCurrentAuth(); if (authentication instanceof JwtAuthenticationToken && authentication.getPrincipal() instanceof Jwt) { var jwt = (Jwt) authentication.getPrincipal(); - var username = Objects.requireNonNull((String) jwt.getClaims().get(USER_ID_CLAIM)); + var username = Objects.requireNonNull((String) jwt.getClaims().get(userNameAttribute)); var groups = userGroupResolver.resolveGroups(username).stream().map(String::toLowerCase).collect(Collectors.toSet()); + val roles = PrincipalUtil.extractRoles(authentication); + groups.addAll(roles); return new User(username, groups); } else { throw new AuthenticationCredentialsNotFoundException("Could not detect current authorized user"); @@ -48,7 +70,7 @@ public String getCurrentUserUsername() { var authentication = getCurrentAuth(); if (authentication instanceof JwtAuthenticationToken && authentication.getPrincipal() instanceof Jwt) { var jwt = (Jwt) authentication.getPrincipal(); - return Objects.requireNonNull((String) jwt.getClaims().get(USERNAME_CLAIM)); + return Objects.requireNonNull((String) jwt.getClaims().get(userNameAttribute)); } else { throw new AuthenticationCredentialsNotFoundException("Could not detect current authorized user"); } diff --git a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/adapter/out/user/LdapUserGroupResolverAdapter.java b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/adapter/out/user/LdapUserGroupResolverAdapter.java index f260185c18..76b941debc 100644 --- a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/adapter/out/user/LdapUserGroupResolverAdapter.java +++ b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/adapter/out/user/LdapUserGroupResolverAdapter.java @@ -20,7 +20,7 @@ public class LdapUserGroupResolverAdapter implements UserGroupResolverPort { @Override public Set resolveGroups(@NonNull final String userId) { try { - return new HashSet<>(this.easyLdapClient.getOuTreeByUserId(userId).stream().map(String::toLowerCase).collect(Collectors.toList())); + return this.easyLdapClient.getOuTreeByUserId(userId).stream().map(String::toLowerCase).collect(Collectors.toSet()); } catch (final FeignException e) { return Collections.emptySet(); } diff --git a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/application/port/out/auth/CurrentUserPort.java b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/application/port/out/auth/CurrentUserPort.java index 61aa4004bb..dd1484275a 100644 --- a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/application/port/out/auth/CurrentUserPort.java +++ b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/application/port/out/auth/CurrentUserPort.java @@ -17,4 +17,10 @@ public interface CurrentUserPort { * @return username of the current user. */ String getCurrentUserUsername(); + + /** + * Retrieves the user JWT. + * @return user's JWT. + */ + String getCurrentUserToken(); } diff --git a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/engine/AuthRequestInterceptor.java b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/engine/AuthRequestInterceptor.java index c96f89418d..35c6ead74a 100644 --- a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/engine/AuthRequestInterceptor.java +++ b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/engine/AuthRequestInterceptor.java @@ -1,13 +1,10 @@ package de.muenchen.oss.digiwf.task.service.infra.engine; -import de.muenchen.oss.digiwf.task.HttpHeaders; +import de.muenchen.oss.digiwf.task.service.application.port.out.auth.CurrentUserPort; import feign.RequestInterceptor; import feign.RequestTemplate; -import de.muenchen.oss.digiwf.task.service.application.port.out.auth.CurrentUserPort; import lombok.RequiredArgsConstructor; -import org.springframework.security.oauth2.core.OAuth2AccessToken; import org.springframework.stereotype.Component; -import java.util.function.Supplier; /** * Feign request interceptor setting authorization token. @@ -16,15 +13,12 @@ @Component public class AuthRequestInterceptor implements RequestInterceptor { - private final Supplier oAuth2TokenProvider; - private final CurrentUserPort currentUserPort; @Override public void apply(RequestTemplate requestTemplate) { requestTemplate - .header("Authorization", "Bearer " + oAuth2TokenProvider.get().getTokenValue()) // service account token - .header(HttpHeaders.HEADER_AUTHORIZED_USERNAME, currentUserPort.getCurrentUserUsername()) // username of the real user + .header("Authorization", "Bearer " + currentUserPort.getCurrentUserToken()) // user token ; } } diff --git a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/GrantedAuthoritiesConverter.java b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/GrantedAuthoritiesConverter.java deleted file mode 100644 index 0a59613fb6..0000000000 --- a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/GrantedAuthoritiesConverter.java +++ /dev/null @@ -1,125 +0,0 @@ -package de.muenchen.oss.digiwf.task.service.infra.security; - -import com.nimbusds.jose.shaded.json.JSONObject; -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.oauth2.core.ClaimAccessor; -import org.springframework.security.oauth2.jwt.Jwt; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter; -import org.springframework.stereotype.Component; - -import java.security.Principal; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; - -import static java.util.Collections.emptyList; -import static java.util.stream.Collectors.toList; - -/** - * The {@link GrantedAuthoritiesConverter} parses the JWT and extracts the granted roles of the user. In the current - * Keycloak setup roles are provided under the claim "realm_access". Client roles are provided per client in the claim - * "resource_access".
- *
- * Please note, that the extractor does only extract the client roles of the given clientId. If no clientId is given in - * the configuration, only the Realm roles are used for checking authorization.
- *
- * Example:
- *

- * {
- *   ...
- *   "realm_access" : {
- *     "roles" : [
- *       "realm_role1",
- *       "realm_role2",
- *       "realm_roleN"
- *     ]
- *   },
- *   "resource_access" : {
- *       "client1" : {
- *           roles: [
- *            "client_role1",
- *            "client_role2"
- *            "client_role3"
- *           ]
- *       },
- *       "client2" : {
- *           roles: [
- *            "client_role4",
- *            "client_role5"
- *            "client_role6"
- *           ]
- *       }
- *    }
- * }
- * 
- */ -@Component -public class GrantedAuthoritiesConverter extends JwtAuthenticationConverter { - - public static final String SPRING_ROLE_PREFIX = "ROLE_"; - - private static final String ROLE_DECLARATIONS = "roles"; - private static final String REALM_ROLES_CLAIM = "realm_access"; - private static final String CLIENTS_CLAIM = "resource_access"; - private static final String CLIENT_ROLE_SEPARATOR = ":"; - - @SuppressWarnings("unchecked") - @Override - protected Collection extractAuthorities(Jwt jwt) { - - // Retrieve client roles of all clients - final Collection clientAuthorities = getClientAuthorities(jwt); - - // Retrieve realm roles - final Map realmAccess = jwt.getClaimAsMap(REALM_ROLES_CLAIM); - - Collection realmAuthorities = Collections.emptyList(); - if (realmAccess != null && realmAccess.containsKey(ROLE_DECLARATIONS)) { - realmAuthorities = (Collection) realmAccess.get(ROLE_DECLARATIONS); - } - - return Stream.concat(realmAuthorities.stream(), clientAuthorities.stream()) - .map(s -> SPRING_ROLE_PREFIX + s) - .map(SimpleGrantedAuthority::new) - .collect(toList()); - } - - public static List getClientAuthorities(ClaimAccessor jwt) { - // retrieve client roles of all clients - final List clientAuthorities = new ArrayList<>(); - Map clientClaims = jwt.getClaimAsMap(CLIENTS_CLAIM); - if (clientClaims != null) { - clientClaims.forEach((client, claims) -> clientAuthorities.addAll(extractRoles(client, (JSONObject) claims))); - } - return clientAuthorities; - } - - @SuppressWarnings("unchecked") - static List extractRoles(String client, JSONObject clientObject) { - final Collection clientRoles = (Collection) clientObject.get(ROLE_DECLARATIONS); - if (clientRoles != null) { - return clientRoles - .stream() - .map(role -> client + CLIENT_ROLE_SEPARATOR + role) - .collect(toList()); - } else { - return Collections.emptyList(); - } - } - - public static List extractRoles(Principal principal) { - if (principal instanceof Authentication) { - return ((Authentication) principal).getAuthorities().stream() - .map(GrantedAuthority::getAuthority) - .map(role -> StringUtils.removeStart(role, SPRING_ROLE_PREFIX)) - .collect(toList()); - } - return emptyList(); - } -} diff --git a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/SecurityConfig.java b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/SecurityConfig.java deleted file mode 100644 index 7f0b026737..0000000000 --- a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/SecurityConfig.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.muenchen.oss.digiwf.task.service.infra.security; - -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.web.SecurityFilterChain; - -@Configuration -@EnableGlobalMethodSecurity(prePostEnabled = true) -@RequiredArgsConstructor -public class SecurityConfig { - - private final GrantedAuthoritiesConverter grantedAuthoritiesExtractor; - - - @Bean - public SecurityFilterChain configure(HttpSecurity http) throws Exception { - // @formatter:off - return http - .logout().disable() - .formLogin().disable() - .csrf().disable() - // authorization block - .authorizeRequests() - .antMatchers(HttpMethod.OPTIONS).permitAll() - .antMatchers("/actuator/**").permitAll() - .anyRequest().authenticated() - .and() - // end of authorization block - .oauth2ResourceServer() - .jwt() - .jwtAuthenticationConverter(grantedAuthoritiesExtractor) - .and() - .and() - .build() - ; - // @formatter:on - } -} diff --git a/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/TaskServiceSecurityConfiguration.java b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/TaskServiceSecurityConfiguration.java new file mode 100644 index 0000000000..2026b36666 --- /dev/null +++ b/digiwf-task/digiwf-tasklist-service/src/main/java/de/muenchen/oss/digiwf/task/service/infra/security/TaskServiceSecurityConfiguration.java @@ -0,0 +1,15 @@ +package de.muenchen.oss.digiwf.task.service.infra.security; + +import de.muenchen.oss.digiwf.spring.security.SecurityConfiguration; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import( + SecurityConfiguration.class +) +@RequiredArgsConstructor +public class TaskServiceSecurityConfiguration { + +} diff --git a/digiwf-task/digiwf-tasklist-service/src/main/resources/application.yml b/digiwf-task/digiwf-tasklist-service/src/main/resources/application.yml index bab0a707e7..3ce032c69c 100644 --- a/digiwf-task/digiwf-tasklist-service/src/main/resources/application.yml +++ b/digiwf-task/digiwf-tasklist-service/src/main/resources/application.yml @@ -18,29 +18,6 @@ spring: flyway: enabled: true locations: "classpath:db/migration/{vendor}" - security: - oauth2: - resourceserver: - jwt: - issuer-uri: ${SSO_ISSUER_URL} - client: - provider: - keycloak: - issuer-uri: ${SSO_ISSUER_URL} - user-name-attribute: lhmObjectID - registration: - keycloak: - provider: keycloak - client-id: ${SSO_TASK_CLIENT_ID} - client-secret: ${SSO_TASK_CLIENT_SECRET} - scope: email, profile, openid # needed for userInfo endpoint - keycloak-service-account: - provider: keycloak - authorization-grant-type: client_credentials - client-id: ${SSO_TASK_CLIENT_ID} - client-secret: ${SSO_TASK_CLIENT_SECRET} - scope: email, profile, openid # needed for userInfo endpoint - feign: client: @@ -123,6 +100,10 @@ digiwf: s3service: topic: 'dwf-s3-${DIGIWF_ENV}' httpAPI: ${DIGIWF_S3_HTTPAPI:http://localhost:8086} + security: + client-id: ${SSO_TASK_CLIENT_ID} + client-secret: ${SSO_TASK_CLIENT_SECRET} + io: muenchendigital: diff --git a/digiwf-task/digiwf-tasklist-service/src/test/java/de/muenchen/oss/digiwf/task/service/infra/security/ControllerAuthorizationHelper.java b/digiwf-task/digiwf-tasklist-service/src/test/java/de/muenchen/oss/digiwf/task/service/infra/security/ControllerAuthorizationHelper.java index d23ef464f0..898ac1a9d9 100644 --- a/digiwf-task/digiwf-tasklist-service/src/test/java/de/muenchen/oss/digiwf/task/service/infra/security/ControllerAuthorizationHelper.java +++ b/digiwf-task/digiwf-tasklist-service/src/test/java/de/muenchen/oss/digiwf/task/service/infra/security/ControllerAuthorizationHelper.java @@ -15,9 +15,6 @@ import java.util.*; import java.util.stream.Collectors; -import static de.muenchen.oss.digiwf.task.service.adapter.out.auth.CurrentUserSpringSecurityAdapter.USERNAME_CLAIM; -import static de.muenchen.oss.digiwf.task.service.adapter.out.auth.CurrentUserSpringSecurityAdapter.USER_ID_CLAIM; - public class ControllerAuthorizationHelper { public static SecurityContext mockUser(TestUser user, String... roleNames) { @@ -30,8 +27,8 @@ public static SecurityContext mockUser(TestUser user, String... roleNames) { claims.put("given_name", user.getFirstName()); claims.put("family_name", user.getLastName()); claims.put("email", user.getEmail()); - claims.put(USER_ID_CLAIM, user.getUserId()); - claims.put(USERNAME_CLAIM, user.getUserName()); + claims.put("lhmObjectID", user.getUserId()); + claims.put("user_name", user.getUserName()); // user id claims.put(JwtClaimNames.SUB, user.getUserId()); @@ -58,15 +55,13 @@ public static Jwt createJwt(final Map claims) { final Map headers = new HashMap<>(); headers.put("alg", "RS256"); headers.put("typ", "JWT"); - - val token = new Jwt( + return new Jwt( "test-" + UUID.randomUUID(), Instant.now(), Instant.now().plus(60, ChronoUnit.MINUTES), headers, claims ); - return token; } } diff --git a/digiwf-task/digiwf-tasklist-service/src/test/java/de/muenchen/oss/digiwf/task/service/infra/security/SecurityTestConfiguration.java b/digiwf-task/digiwf-tasklist-service/src/test/java/de/muenchen/oss/digiwf/task/service/infra/security/SecurityTestConfiguration.java index 8549f93a5d..d420cfe012 100644 --- a/digiwf-task/digiwf-tasklist-service/src/test/java/de/muenchen/oss/digiwf/task/service/infra/security/SecurityTestConfiguration.java +++ b/digiwf-task/digiwf-tasklist-service/src/test/java/de/muenchen/oss/digiwf/task/service/infra/security/SecurityTestConfiguration.java @@ -38,22 +38,16 @@ public class SecurityTestConfiguration { } } + // needed because the auto config is excluded @MockBean private JwtDecoder jwtDecoder; + // needed because the auto config is excluded @MockBean private OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager; - @Bean - @Primary - public Supplier mockServiceAccessTokenSupplier() { - return new SingleTokenTestSupplier( - ControllerAuthorizationHelper.createServiceAccessToken() - ); - } - /** - * Sets test security. 1:1 copy of {@link SecurityConfig}, but without OAuth configured. + * Sets test security. 1:1 copy of {@link TaskServiceSecurityConfiguration}, but without OAuth configured. * @param http http security fluent builder. * @return filter chain * @throws Exception on any error. diff --git a/digiwf-task/digiwf-tasklist-service/src/test/resources/application-itest.yml b/digiwf-task/digiwf-tasklist-service/src/test/resources/application-itest.yml index e5a9e2e3b7..07e420a684 100644 --- a/digiwf-task/digiwf-tasklist-service/src/test/resources/application-itest.yml +++ b/digiwf-task/digiwf-tasklist-service/src/test/resources/application-itest.yml @@ -39,6 +39,9 @@ spring: provider: keycloak: issuer-uri: http://local-itest + user-info-uri: http://local-itest/realms/itest/protocol/openid-connect/userinfo + jwk-set-uri: http://local-itest/realms/itest/protocol/openid-connect/certs + feign: client: diff --git a/stack/keycloak/11_johndoe_webapp.yml b/stack/keycloak/11_johndoe_webapp.yml new file mode 100644 index 0000000000..0af686b2d9 --- /dev/null +++ b/stack/keycloak/11_johndoe_webapp.yml @@ -0,0 +1,13 @@ +id: johndoe_assign_webapp_role +author: Simon Zambrovski +realm: ${SSO_REALM} +changes: + - addRole: + clientId: ${SSO_ENGINE_CLIENT_ID} + clientRole: true + name: digiwf-webapp-user + description: Can use Camunda web apps. + - assignRole: + user: johndoe + clientId: ${SSO_ENGINE_CLIENT_ID} + role: digiwf-webapp-user diff --git a/stack/keycloak/keycloak-changelog.yml b/stack/keycloak/keycloak-changelog.yml index 9ba5a02b4b..4789f39561 100644 --- a/stack/keycloak/keycloak-changelog.yml +++ b/stack/keycloak/keycloak-changelog.yml @@ -10,3 +10,4 @@ includes: - path: 07_task-management_service_account.yml - path: 08_s3.yml - path: 10_johndoe.yml + - path: 11_johndoe_webapp.yml From 50c42dac2fbaed31c3ce5f11b624fb70874d0837 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Thu, 17 Aug 2023 18:55:32 +0200 Subject: [PATCH 05/30] inital implementation (#596) --- .../authorization/AuthorizationHelper.java | 256 ++++++++++++++++++ .../DefaultAuthorizationInitializer.java | 52 ++++ .../LocalAuthorizationInitializer.java | 50 ++++ .../DefaultAuthorizationInitializer.java | 55 ---- 4 files changed, 358 insertions(+), 55 deletions(-) create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/AuthorizationHelper.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/DefaultAuthorizationInitializer.java create mode 100644 digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/LocalAuthorizationInitializer.java delete mode 100644 digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/DefaultAuthorizationInitializer.java diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/AuthorizationHelper.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/AuthorizationHelper.java new file mode 100644 index 0000000000..cbc4ab65e6 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/AuthorizationHelper.java @@ -0,0 +1,256 @@ +package de.muenchen.oss.digiwf.cockpit.security.authorization; + +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.camunda.bpm.engine.AuthorizationService; +import org.camunda.bpm.engine.authorization.Permissions; +import org.camunda.bpm.engine.authorization.Resources; +import org.springframework.lang.NonNull; + +import static org.camunda.bpm.engine.authorization.Authorization.ANY; +import static org.camunda.bpm.engine.authorization.Authorization.AUTH_TYPE_GRANT; + +@Slf4j +public class AuthorizationHelper { + + public static void setupGroupAppPermissions(@NonNull AuthorizationService authorizationService, @NonNull String groupId) { + if (authorizationService.createAuthorizationQuery().groupIdIn(groupId).resourceType(Resources.APPLICATION).count() != 0) { + // there are permissions present, avoid initialization + return; + } + + log.info("Setting up Web App Permissions for group '{}'", groupId); + + val appAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + appAuth.setGroupId(groupId); + appAuth.addPermission(Permissions.ACCESS); + appAuth.setResource(Resources.APPLICATION); + appAuth.setResourceId(ANY); + authorizationService.saveAuthorization(appAuth); + + } + + public static void setupGroupAuthorizationPermissions(@NonNull AuthorizationService authorizationService, @NonNull String groupId) { + if (authorizationService.createAuthorizationQuery().groupIdIn(groupId).resourceType(Resources.AUTHORIZATION).count() != 0) { + // there are permissions present, avoid initialization + return; + } + + log.info("Setting up Authorization Permissions for group '{}'", groupId); + + val authorizationAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + authorizationAuth.setGroupId(groupId); + authorizationAuth.addPermission(Permissions.CREATE); + authorizationAuth.addPermission(Permissions.READ); + authorizationAuth.addPermission(Permissions.DELETE); + authorizationAuth.addPermission(Permissions.UPDATE); + authorizationAuth.setResource(Resources.AUTHORIZATION); + authorizationAuth.setResourceId(ANY); + authorizationService.saveAuthorization(authorizationAuth); + } + + public static void setupUserBatchPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.BATCH).count() != 0) { + // there are permissions present, avoid initialization + return; + } + + log.info("Setting up Batch Permissions for user '{}'", userId); + + val batchAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + batchAuth.setUserId(userId); + batchAuth.addPermission(Permissions.CREATE); + batchAuth.addPermission(Permissions.READ); + batchAuth.addPermission(Permissions.DELETE); + batchAuth.addPermission(Permissions.UPDATE); + batchAuth.setResource(Resources.BATCH); + batchAuth.setResourceId(ANY); + authorizationService.saveAuthorization(batchAuth); + } + + public static void setupUserAppPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.APPLICATION).count() != 0) { + // there are permissions present, avoid initialization + return; + } + + log.info("Setting up Web App Permissions for user '{}'", userId); + + val appAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + appAuth.setUserId(userId); + appAuth.addPermission(Permissions.ACCESS); + appAuth.setResource(Resources.APPLICATION); + appAuth.setResourceId(ANY); + authorizationService.saveAuthorization(appAuth); + } + + public static void setupUserTaskPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.TASK).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Task Permissions for user '{}'", userId); + val taskAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + taskAuth.setUserId(userId); + taskAuth.addPermission(Permissions.ALL); + taskAuth.setResource(Resources.TASK); + taskAuth.setResourceId(ANY); + authorizationService.saveAuthorization(taskAuth); + } + + public static void setupUserProcessDefinitionPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.PROCESS_DEFINITION).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Process Definition Permissions for user '{}'", userId); + + val processDefinitionAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + processDefinitionAuth.setUserId(userId); + processDefinitionAuth.addPermission(Permissions.ALL); + processDefinitionAuth.setResource(Resources.PROCESS_DEFINITION); + processDefinitionAuth.setResourceId(ANY); + authorizationService.saveAuthorization(processDefinitionAuth); + } + + public static void setupUserHistoricProcessInstancePermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.HISTORIC_PROCESS_INSTANCE).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Historic Process Instance Permissions for user '{}'", userId); + val historicProcessInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + historicProcessInstanceAuth.setUserId(userId); + historicProcessInstanceAuth.addPermission(Permissions.ALL); + historicProcessInstanceAuth.setResource(Resources.HISTORIC_PROCESS_INSTANCE); + historicProcessInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(historicProcessInstanceAuth); + } + + public static void setupUserDashboardPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.DASHBOARD).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Dashboard Permissions for user '{}'", userId); + val historicProcessInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + historicProcessInstanceAuth.setUserId(userId); + historicProcessInstanceAuth.addPermission(Permissions.ALL); + historicProcessInstanceAuth.setResource(Resources.DASHBOARD); + historicProcessInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(historicProcessInstanceAuth); + } + + public static void setupUserOpLogPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.OPERATION_LOG_CATEGORY).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Operation Log Permissions for user '{}'", userId); + val historicProcessInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + historicProcessInstanceAuth.setUserId(userId); + historicProcessInstanceAuth.addPermission(Permissions.ALL); + historicProcessInstanceAuth.setResource(Resources.OPERATION_LOG_CATEGORY); + historicProcessInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(historicProcessInstanceAuth); + } + + public static void setupUserReportPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.REPORT).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Report Permissions for user '{}'", userId); + val historicProcessInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + historicProcessInstanceAuth.setUserId(userId); + historicProcessInstanceAuth.addPermission(Permissions.ALL); + historicProcessInstanceAuth.setResource(Resources.REPORT); + historicProcessInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(historicProcessInstanceAuth); + } + + public static void setupUserDeploymentPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.DEPLOYMENT).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Deployment Permissions for user '{}'", userId); + val historicProcessInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + historicProcessInstanceAuth.setUserId(userId); + historicProcessInstanceAuth.addPermission(Permissions.ALL); + historicProcessInstanceAuth.setResource(Resources.DEPLOYMENT); + historicProcessInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(historicProcessInstanceAuth); + } + + public static void setupUserDecisionRequirementPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.DECISION_REQUIREMENTS_DEFINITION).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda DRD Permissions for user '{}'", userId); + val historicProcessInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + historicProcessInstanceAuth.setUserId(userId); + historicProcessInstanceAuth.addPermission(Permissions.ALL); + historicProcessInstanceAuth.setResource(Resources.DECISION_REQUIREMENTS_DEFINITION); + historicProcessInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(historicProcessInstanceAuth); + } + + public static void setupUserDecisionPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.DECISION_DEFINITION).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Decision Permissions for user '{}'", userId); + val historicProcessInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + historicProcessInstanceAuth.setUserId(userId); + historicProcessInstanceAuth.addPermission(Permissions.ALL); + historicProcessInstanceAuth.setResource(Resources.DECISION_DEFINITION); + historicProcessInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(historicProcessInstanceAuth); + } + + public static void setupUserSystemPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.SYSTEM).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda System Permissions for user '{}'", userId); + val historicProcessInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + historicProcessInstanceAuth.setUserId(userId); + historicProcessInstanceAuth.addPermission(Permissions.ALL); + historicProcessInstanceAuth.setResource(Resources.SYSTEM); + historicProcessInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(historicProcessInstanceAuth); + } + + public static void setupUserHistoricTaskPermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.HISTORIC_TASK).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Historic Task Permissions for user '{}'", userId); + val historicProcessInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + historicProcessInstanceAuth.setUserId(userId); + historicProcessInstanceAuth.addPermission(Permissions.ALL); + historicProcessInstanceAuth.setResource(Resources.HISTORIC_TASK); + historicProcessInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(historicProcessInstanceAuth); + } + + + public static void setupUserProcessInstancePermissions(@NonNull AuthorizationService authorizationService, @NonNull String userId) { + if (authorizationService.createAuthorizationQuery().userIdIn(userId).resourceType(Resources.PROCESS_INSTANCE).count() != 0) { + // there are permissions present, avoid initialization + return; + } + log.info("Setting up Camunda Process Instance Permissions for user '{}'", userId); + val processInstanceAuth = authorizationService.createNewAuthorization(AUTH_TYPE_GRANT); + processInstanceAuth.setUserId(userId); + processInstanceAuth.addPermission(Permissions.ALL); + processInstanceAuth.setResource(Resources.PROCESS_INSTANCE); + processInstanceAuth.setResourceId(ANY); + authorizationService.saveAuthorization(processInstanceAuth); + } +} diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/DefaultAuthorizationInitializer.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/DefaultAuthorizationInitializer.java new file mode 100644 index 0000000000..b0414e2d35 --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/DefaultAuthorizationInitializer.java @@ -0,0 +1,52 @@ +/* + * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 + */ + +package de.muenchen.oss.digiwf.cockpit.security.authorization; + +import de.muenchen.oss.digiwf.cockpit.CamundaWebappsProperties; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.camunda.bpm.engine.AuthorizationService; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +import static de.muenchen.oss.digiwf.cockpit.security.authorization.AuthorizationHelper.*; + +/** + * Authorization initializer. + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class DefaultAuthorizationInitializer { + + private final AuthorizationService authorizationService; + private final CamundaWebappsProperties camundaWebappsProperties; + private static final String LEGACY_ADMIN_USER = "digiwf"; + + @PostConstruct + public void init() { + // SSO role + setupGroupAppPermissions(authorizationService, camundaWebappsProperties.getWebAppRole()); + setupGroupAuthorizationPermissions(authorizationService, camundaWebappsProperties.getWebAppRole()); + + // admin user + setupUserAppPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserProcessDefinitionPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserProcessInstancePermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserTaskPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserHistoricTaskPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserHistoricProcessInstancePermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserBatchPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserDashboardPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserReportPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserOpLogPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserDeploymentPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserDecisionRequirementPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserDecisionPermissions(authorizationService, LEGACY_ADMIN_USER); + setupUserSystemPermissions(authorizationService, LEGACY_ADMIN_USER); + } + +} diff --git a/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/LocalAuthorizationInitializer.java b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/LocalAuthorizationInitializer.java new file mode 100644 index 0000000000..1f05a48a7d --- /dev/null +++ b/digiwf-engine/digiwf-engine-cockpit/src/main/java/de/muenchen/oss/digiwf/cockpit/security/authorization/LocalAuthorizationInitializer.java @@ -0,0 +1,50 @@ +/* + * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 + */ + +package de.muenchen.oss.digiwf.cockpit.security.authorization; + +import de.muenchen.oss.digiwf.cockpit.CamundaWebappsProperties; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.camunda.bpm.engine.AuthorizationService; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +import static de.muenchen.oss.digiwf.cockpit.security.authorization.AuthorizationHelper.*; + +/** + * Authorization initializer for local development. + */ +@Component +@RequiredArgsConstructor +@Slf4j +@Profile("local") +public class LocalAuthorizationInitializer { + + private final AuthorizationService authorizationService; + + @PostConstruct + public void init() { + // let local test user see everything + val johnDoe = "123456789"; + + setupUserProcessDefinitionPermissions(authorizationService, johnDoe); + setupUserProcessInstancePermissions(authorizationService, johnDoe); + setupUserTaskPermissions(authorizationService, johnDoe); + setupUserBatchPermissions(authorizationService, johnDoe); + setupUserHistoricTaskPermissions(authorizationService, johnDoe); + setupUserHistoricProcessInstancePermissions(authorizationService, johnDoe); + setupUserDashboardPermissions(authorizationService, johnDoe); + setupUserReportPermissions(authorizationService, johnDoe); + setupUserOpLogPermissions(authorizationService, johnDoe); + setupUserDeploymentPermissions(authorizationService, johnDoe); + setupUserDecisionRequirementPermissions(authorizationService, johnDoe); + setupUserSystemPermissions(authorizationService, johnDoe); + + } + +} diff --git a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/DefaultAuthorizationInitializer.java b/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/DefaultAuthorizationInitializer.java deleted file mode 100644 index ff4ba24f23..0000000000 --- a/digiwf-engine/digiwf-engine-service/src/main/java/de/muenchen/oss/digiwf/shared/security/DefaultAuthorizationInitializer.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c): it@M - Dienstleister für Informations- und Telekommunikationstechnik der Landeshauptstadt München, 2020 - */ - -package de.muenchen.oss.digiwf.shared.security; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -/** - * Authorization initializer for in-memory environments. - * - * @author externer.dl.horn - */ -@Component -@RequiredArgsConstructor -public class DefaultAuthorizationInitializer { - - // private final AuthorizationService authorizationService; - - // @PostConstruct - // public void init() { - // final AuthorizationEntity taskAuth = new AuthorizationEntity(AUTH_TYPE_GRANT); - // taskAuth.setUserId("admin"); - // taskAuth.addPermission(Permissions.ALL); - // taskAuth.setResource(Resources.TASK); - // taskAuth.setResourceId(ANY); - // this.authorizationService.saveAuthorization(taskAuth); - // - // final AuthorizationEntity processDefinitionAuth = new AuthorizationEntity(AUTH_TYPE_GRANT); - // processDefinitionAuth.setUserId("admin"); - // processDefinitionAuth.addPermission(Permissions.READ); - // processDefinitionAuth.addPermission(Permissions.READ_INSTANCE); - // processDefinitionAuth.addPermission(Permissions.CREATE_INSTANCE); - // processDefinitionAuth.addPermission(Permissions.READ_HISTORY); - // processDefinitionAuth.setResource(Resources.PROCESS_DEFINITION); - // processDefinitionAuth.setResourceId(ANY); - // this.authorizationService.saveAuthorization(processDefinitionAuth); - // - // final AuthorizationEntity processInstanceAuth = new AuthorizationEntity(AUTH_TYPE_GRANT); - // processInstanceAuth.setUserId("admin"); - // processInstanceAuth.addPermission(Permissions.CREATE); - // processInstanceAuth.addPermission(Permissions.READ); - // processInstanceAuth.setResource(Resources.PROCESS_INSTANCE); - // processInstanceAuth.setResourceId(ANY); - // this.authorizationService.saveAuthorization(processInstanceAuth); - // - // final AuthorizationEntity processInstanceAuth = new AuthorizationEntity(AUTH_TYPE_GRANT); - // processInstanceAuth.setUserId("admin"); - // processInstanceAuth.addPermission(Permissions.CREATE); - // processInstanceAuth.setResource(Resources.PROCESS_INSTANCE); - // processDefinitionAuth.setResourceId(ANY); - // this.authorizationService.saveAuthorization(processInstanceAuth); - //} -} From 5c27294b30d34ccb6916395e7de01db31f27513c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 15:47:26 +0200 Subject: [PATCH 06/30] chore(deps-dev): bump vuepress from 1.9.9 to 1.9.10 in /docs (#587) Bumps [vuepress](https://github.com/vuejs/vuepress/tree/HEAD/packages/vuepress) from 1.9.9 to 1.9.10. - [Release notes](https://github.com/vuejs/vuepress/releases) - [Changelog](https://github.com/vuejs/vuepress/blob/master/CHANGELOG.md) - [Commits](https://github.com/vuejs/vuepress/commits/v1.9.10/packages/vuepress) --- updated-dependencies: - dependency-name: vuepress dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 4221 +++++++++++++++++++++++----------------- docs/package.json | 2 +- 2 files changed, 2404 insertions(+), 1819 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 3054b7fc1c..5c5678c877 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -13,16 +13,16 @@ }, "devDependencies": { "markdown-it-footnote": "^3.0.3", - "vuepress": "^1.9.9" + "vuepress": "^1.9.10" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -30,47 +30,48 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -80,13 +81,22 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "dependencies": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -95,78 +105,70 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", + "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -175,14 +177,24 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -191,143 +203,138 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dev": true, "dependencies": { - "@babel/types": "^7.21.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" @@ -337,122 +344,121 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -460,9 +466,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -472,12 +478,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -487,14 +493,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -503,24 +509,6 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -537,35 +525,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz", + "integrity": "sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", - "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.21.0" - }, "engines": { "node": ">=6.9.0" }, @@ -573,46 +556,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -621,14 +595,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", + "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -637,49 +610,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -688,14 +649,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -704,31 +664,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -737,44 +703,58 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -783,22 +763,22 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { + "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -810,13 +790,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", - "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -825,37 +805,47 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", + "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -864,25 +854,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -891,85 +886,131 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -978,13 +1019,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -993,13 +1035,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1008,15 +1051,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1025,13 +1067,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1040,13 +1082,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1055,21 +1099,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1078,14 +1115,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1094,13 +1130,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1109,14 +1146,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1125,13 +1161,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1140,14 +1177,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1156,13 +1194,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1171,15 +1212,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1188,13 +1228,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1203,13 +1259,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1218,14 +1275,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1234,15 +1291,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1251,16 +1310,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1269,14 +1326,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1285,29 +1342,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", + "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1316,14 +1374,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1332,13 +1390,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1348,12 +1409,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1363,13 +1424,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1379,12 +1440,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1394,17 +1455,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz", - "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz", + "integrity": "sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1413,13 +1474,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1429,13 +1499,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1445,12 +1515,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1460,12 +1530,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1475,12 +1545,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1490,12 +1560,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1505,13 +1591,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1520,39 +1606,43 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", + "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1562,45 +1652,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.10", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.10", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.10", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1609,20 +1716,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/regjsgen": { @@ -1632,45 +1746,45 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1679,13 +1793,13 @@ } }, "node_modules/@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1699,22 +1813,23 @@ "deprecated": "Potential XSS vulnerability patched in v6.0.0." }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1730,19 +1845,19 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@mrmlnc/readdir-enhanced": { @@ -1859,9 +1974,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/linkify-it": { @@ -1994,26 +2109,29 @@ "dev": true }, "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", - "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", "dev": true }, "node_modules/@vue/babel-plugin-jsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", - "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "@vue/babel-helper-vue-transform-on": "^1.0.2", - "camelcase": "^6.0.0", - "html-tags": "^3.1.0", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@vue/babel-plugin-transform-vue-jsx": { @@ -2228,9 +2346,9 @@ "dev": true }, "node_modules/@vue/compiler-sfc/node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", "dev": true, "funding": [ { @@ -2240,10 +2358,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -2287,19 +2409,19 @@ "dev": true }, "node_modules/@vuepress/core": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.9.9.tgz", - "integrity": "sha512-Ekgu409ZSgvAV9n14F3DaEWtgkwrEicg1nWs0gbxGgUCdREeX/7rwxSfKwWwBjCwfCUKR2L3+6pXGjzxex0t+g==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.9.10.tgz", + "integrity": "sha512-H9ddo5fSinPb8QYl8OJFbZikMpOW84bm/U3Drzz8CnCXNtpda7CU2wX/XzOhe98G8jp45xhtZRkxOrqzBBAShA==", "dev": true, "dependencies": { "@babel/core": "^7.8.4", "@vue/babel-preset-app": "^4.1.2", - "@vuepress/markdown": "1.9.9", - "@vuepress/markdown-loader": "1.9.9", - "@vuepress/plugin-last-updated": "1.9.9", - "@vuepress/plugin-register-components": "1.9.9", - "@vuepress/shared-utils": "1.9.9", - "@vuepress/types": "1.9.9", + "@vuepress/markdown": "1.9.10", + "@vuepress/markdown-loader": "1.9.10", + "@vuepress/plugin-last-updated": "1.9.10", + "@vuepress/plugin-register-components": "1.9.10", + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10", "autoprefixer": "^9.5.1", "babel-loader": "^8.0.4", "bundle-require": "2.1.8", @@ -2338,13 +2460,24 @@ "node": ">=8.6" } }, + "node_modules/@vuepress/core/node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, "node_modules/@vuepress/markdown": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.9.tgz", - "integrity": "sha512-JzFdBdGe5aoiKSaEgF+h3JLDXNVfWPI5DJWXrIt7rhhkMJesF6HowIznPLdXqukzHfXHcPvo9oQ4o6eT0YmVGA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.10.tgz", + "integrity": "sha512-sXTLjeZzH8SQuAL5AEH0hhsMljjNJbzWbBvzaj5yQCCdf+3sp/dJ0kwnBSnQjFPPnzPg5t3tLKGUYHyW0KiKzA==", "dev": true, "dependencies": { - "@vuepress/shared-utils": "1.9.9", + "@vuepress/shared-utils": "1.9.10", "markdown-it": "^8.4.1", "markdown-it-anchor": "^5.0.2", "markdown-it-chain": "^1.3.0", @@ -2354,26 +2487,37 @@ } }, "node_modules/@vuepress/markdown-loader": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.9.9.tgz", - "integrity": "sha512-nyY+sytuQaDLEIk6Yj9JFUfSQpe9/sz30xQFkGCYqi0lQTRGQM6IcRDgfcTS7b25A0qRlwpDGBfKQiGGMZKSfg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.9.10.tgz", + "integrity": "sha512-94BlwKc+lOaN/A5DkyA9KWHvMlMC1sWunAXE3Tv0WYzgYLDs9QqCsx7L5kLkpcOOVVm/8kBJumnXvVBwhqJddw==", "dev": true, "dependencies": { - "@vuepress/markdown": "1.9.9", + "@vuepress/markdown": "1.9.10", "loader-utils": "^1.1.0", "lru-cache": "^5.1.1" } }, "node_modules/@vuepress/plugin-active-header-links": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.9.9.tgz", - "integrity": "sha512-lTnIhbuALjOjFts33jJD8r4ScNBxnZ6MtmePKEwvYlC3J9uvngs1Htpb1JzLEX9QCydt+bhLmZ92bTXn/PdTpg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.9.10.tgz", + "integrity": "sha512-2dRr3DE2UBFXhyMtLR3sGTdRyDM8YStuY6AOoQmoSgwy1IHt7PO7ypOuf1akF+1Nv8Q2aISU06q6TExZouu3Mw==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "lodash.debounce": "^4.0.8" } }, + "node_modules/@vuepress/plugin-active-header-links/node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, "node_modules/@vuepress/plugin-back-to-top": { "version": "1.9.9", "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.9.tgz", @@ -2384,15 +2528,26 @@ } }, "node_modules/@vuepress/plugin-last-updated": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.9.tgz", - "integrity": "sha512-MV4csmM0/lye83VtkOc+b8fs0roi7mvE7BmCCOE39Z6t8nv/ZmEPOwKeHD0+hXPT+ZfoATYvDcsYU7uxbdw0Pw==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.10.tgz", + "integrity": "sha512-YxzWGF/OfU6WsHSynZFn74NGGp7dY27Bjy9JyyFo8wF5+2V1gpyDjveHKHGKugS/pMXlxfjzhv9E2Wmy9R7Iog==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "cross-spawn": "^6.0.5" } }, + "node_modules/@vuepress/plugin-last-updated/node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, "node_modules/@vuepress/plugin-medium-zoom": { "version": "1.9.9", "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.9.tgz", @@ -2403,38 +2558,71 @@ } }, "node_modules/@vuepress/plugin-nprogress": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.9.tgz", - "integrity": "sha512-+3fLxjwTLH8MeU54E7i1ovRu9KzBom2lvSeUsu9B8PuLyrETAqW7Pe1H66awEEALEe0ZnnEU4d7SeVe9ljsLAQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.10.tgz", + "integrity": "sha512-I1kkm6yWUQd7vwiV3lEDVpVP0Lr04K0zlczU502lDUa1RufSZ7vt+mlF5fOM28GqT+pKTEToWmm+VNT/R3qvMQ==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "nprogress": "^0.2.0" } }, + "node_modules/@vuepress/plugin-nprogress/node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, "node_modules/@vuepress/plugin-register-components": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.9.tgz", - "integrity": "sha512-tddnAiSmJsIWWPzE7TcbGU8xzndXf4a8i4BfIev2QzSUnIOQFZDGXUAsCkw4/f9N9UFxQSObjFPzTeUUxb7EvA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.10.tgz", + "integrity": "sha512-sgdJ5OydTPZAoTkselpvVP3Xsd6bfZ0FpaxOTinal0gJ99h49lvLu9bvzMx13rdGRFO/kRXn0qQQpwKTAfTPqA==", + "dev": true, + "dependencies": { + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10" + } + }, + "node_modules/@vuepress/plugin-register-components/node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", "dev": true, "dependencies": { - "@vuepress/shared-utils": "1.9.9", - "@vuepress/types": "1.9.9" + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" } }, "node_modules/@vuepress/plugin-search": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.9.9.tgz", - "integrity": "sha512-W/FE+YHoXDD4qk2wu5yRMkti271TA4y+7UBMrmCavvVAGrLIRnaZfswRUgIiDlEthBc+Pn8/As/Dy1jFTLBa9A==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.9.10.tgz", + "integrity": "sha512-bn2XJikaRgQZXvu8upCjOWrxbLHIRTqnJ3w7G0mo6jCYWGVsHNo6XhVpqylpLR2PWnHT/ImO2bGo38/5Bag/tQ==", + "dev": true, + "dependencies": { + "@vuepress/types": "1.9.10" + } + }, + "node_modules/@vuepress/plugin-search/node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9" + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" } }, "node_modules/@vuepress/shared-utils": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.9.tgz", - "integrity": "sha512-qhk/7QF5LgMEXhEB1hlqreGFgkz4p2pmaBBNFxnAnYmSwmyO+u/oFOpZLI16QRx9Wg6ekR2ENmByQLxV7y4lJg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.10.tgz", + "integrity": "sha512-M9A3DocPih+V8dKK2Zg9FJQ/f3JZrYsdaM/vQ9F48l8bPlzxw5NvqXIYMK4kKcGEyerQNTWCudoCpLL5uiU0hg==", "dev": true, "dependencies": { "chalk": "^2.3.2", @@ -2449,15 +2637,15 @@ } }, "node_modules/@vuepress/theme-default": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.9.9.tgz", - "integrity": "sha512-de0FiOwM/h3rFTBSZK0NNBB117lA/e3IHusU7Xm2XeZRiZ/EE3yvbWclZnbbRNt3YjDMmrWXEW/kBTBxfiMuWQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.9.10.tgz", + "integrity": "sha512-XnXn9t+pYCIhWi3cZXJlighuy93FFm5yXdISAAlFlcNkshuGtqamkjacHV8q/QZMfOhSIs6wX7Hj88u2IsT5mw==", "dev": true, "dependencies": { - "@vuepress/plugin-active-header-links": "1.9.9", - "@vuepress/plugin-nprogress": "1.9.9", - "@vuepress/plugin-search": "1.9.9", - "@vuepress/types": "1.9.9", + "@vuepress/plugin-active-header-links": "1.9.10", + "@vuepress/plugin-nprogress": "1.9.10", + "@vuepress/plugin-search": "1.9.10", + "@vuepress/types": "1.9.10", "docsearch.js": "^2.5.2", "lodash": "^4.17.15", "stylus": "^0.54.8", @@ -2466,6 +2654,17 @@ "vuepress-plugin-smooth-scroll": "^0.0.3" } }, + "node_modules/@vuepress/theme-default/node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, "node_modules/@vuepress/types": { "version": "1.9.9", "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.9.tgz", @@ -2779,9 +2978,9 @@ "dev": true }, "node_modules/algoliasearch/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -2993,6 +3192,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -3209,42 +3428,51 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/balanced-match": { @@ -3684,9 +3912,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -3696,13 +3924,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -3948,9 +4180,9 @@ } }, "node_modules/cache-loader/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4094,9 +4326,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001470", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", - "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", + "version": "1.0.30001520", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", + "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", "dev": true, "funding": [ { @@ -4106,6 +4338,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -4599,6 +4835,7 @@ "version": "0.15.1", "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", "dev": true, "dependencies": { "bluebird": "^3.1.1" @@ -4860,9 +5097,9 @@ } }, "node_modules/copy-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4878,9 +5115,9 @@ } }, "node_modules/core-js": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", - "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", "dev": true, "hasInstallScript": true, "funding": { @@ -4889,12 +5126,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.21.9" }, "funding": { "type": "opencollective", @@ -4982,9 +5219,9 @@ } }, "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -5300,15 +5537,15 @@ "dev": true }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", "dev": true }, "node_modules/d3": { @@ -6212,9 +6449,9 @@ } }, "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, "dependencies": { "inherits": "^2.0.1", @@ -6458,9 +6695,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", - "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==", + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", "dev": true }, "node_modules/elliptic": { @@ -6597,18 +6834,19 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -6628,14 +6866,18 @@ "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -7696,7 +7938,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", "dev": true, "hasInstallScript": true, "optional": true, @@ -7763,13 +8005,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -8334,9 +8577,9 @@ } }, "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, "engines": { "node": ">=8" @@ -8983,9 +9226,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -9305,16 +9548,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -10368,9 +10607,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/nopt": { @@ -10620,15 +10859,16 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", - "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", "dev": true, "dependencies": { "array.prototype.reduce": "^1.0.5", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" }, "engines": { "node": ">= 0.8" @@ -11707,9 +11947,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -11769,9 +12009,9 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "optional": true, "bin": { @@ -11969,16 +12209,6 @@ "node": ">=0.10.0" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -12124,15 +12354,15 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", "dev": true }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -12177,14 +12407,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -12464,12 +12694,12 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": 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" }, @@ -12588,6 +12818,24 @@ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -14027,9 +14275,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -14271,7 +14519,58 @@ "mime-types": "~2.1.24" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { @@ -14532,9 +14831,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -14544,6 +14843,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -14551,7 +14854,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -14680,13 +14983,13 @@ "dev": true }, "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", "dev": true, "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.0" } }, "node_modules/url-loader": { @@ -14743,11 +15046,26 @@ } }, "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, + "node_modules/url/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -15047,15 +15365,15 @@ "dev": true }, "node_modules/vuepress": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.9.9.tgz", - "integrity": "sha512-CU94W3EdWaCavGx2VSvQJMI/hyv+m/YMdrvJJw67EVfmmJJDb1iTGrilDgLd0qsyrXzBy0Ru9Qi6rkf4IwcOTg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.9.10.tgz", + "integrity": "sha512-UnGm9vjQvG918SZVNvgiUlNimLqawdYPq0aPRXDpEB1VksvqegVFy/GKdA8ShXJaEpOMPSt7YD4uK21jaMs3kA==", "dev": true, "hasInstallScript": true, "dependencies": { - "@vuepress/core": "1.9.9", - "@vuepress/theme-default": "1.9.9", - "@vuepress/types": "1.9.9", + "@vuepress/core": "1.9.10", + "@vuepress/theme-default": "1.9.10", + "@vuepress/types": "1.9.10", "cac": "^6.5.6", "envinfo": "^7.2.0", "opencollective-postinstall": "^2.0.2", @@ -15165,6 +15483,17 @@ "smoothscroll-polyfill": "^0.4.3" } }, + "node_modules/vuepress/node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, "node_modules/watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", @@ -15670,23 +15999,22 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15979,374 +16307,365 @@ }, "dependencies": { "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" } }, "@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true }, "@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "requires": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.10" } }, "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", + "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dev": true, "requires": { - "@babel/types": "^7.21.0" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" } }, "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" } }, "@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" } }, "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "requires": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" } }, "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" } }, "@babel/plugin-proposal-class-properties": { @@ -16359,155 +16678,25 @@ "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, "@babel/plugin-proposal-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", - "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.21.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz", + "integrity": "sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } + "requires": {} }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -16537,12 +16726,12 @@ } }, "@babel/plugin-syntax-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", - "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", + "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-dynamic-import": { @@ -16564,12 +16753,30 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { @@ -16582,12 +16789,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -16662,368 +16869,543 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", + "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" } }, - "@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "@babel/plugin-transform-optional-chaining": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", + "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz", - "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz", + "integrity": "sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", + "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -17033,56 +17415,79 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.10", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.10", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.10", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" } @@ -17094,51 +17499,51 @@ "dev": true }, "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" } }, @@ -17148,19 +17553,20 @@ "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==" }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true }, "@jridgewell/set-array": { @@ -17170,19 +17576,19 @@ "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@mrmlnc/readdir-enhanced": { @@ -17287,9 +17693,9 @@ } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/linkify-it": { @@ -17421,25 +17827,25 @@ "dev": true }, "@vue/babel-helper-vue-transform-on": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", - "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", "dev": true }, "@vue/babel-plugin-jsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", - "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "@vue/babel-helper-vue-transform-on": "^1.0.2", - "camelcase": "^6.0.0", - "html-tags": "^3.1.0", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", "svg-tags": "^1.0.0" } }, @@ -17606,12 +18012,12 @@ "dev": true }, "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", "dev": true, "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -17654,19 +18060,19 @@ } }, "@vuepress/core": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.9.9.tgz", - "integrity": "sha512-Ekgu409ZSgvAV9n14F3DaEWtgkwrEicg1nWs0gbxGgUCdREeX/7rwxSfKwWwBjCwfCUKR2L3+6pXGjzxex0t+g==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.9.10.tgz", + "integrity": "sha512-H9ddo5fSinPb8QYl8OJFbZikMpOW84bm/U3Drzz8CnCXNtpda7CU2wX/XzOhe98G8jp45xhtZRkxOrqzBBAShA==", "dev": true, "requires": { "@babel/core": "^7.8.4", "@vue/babel-preset-app": "^4.1.2", - "@vuepress/markdown": "1.9.9", - "@vuepress/markdown-loader": "1.9.9", - "@vuepress/plugin-last-updated": "1.9.9", - "@vuepress/plugin-register-components": "1.9.9", - "@vuepress/shared-utils": "1.9.9", - "@vuepress/types": "1.9.9", + "@vuepress/markdown": "1.9.10", + "@vuepress/markdown-loader": "1.9.10", + "@vuepress/plugin-last-updated": "1.9.10", + "@vuepress/plugin-register-components": "1.9.10", + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10", "autoprefixer": "^9.5.1", "babel-loader": "^8.0.4", "bundle-require": "2.1.8", @@ -17700,15 +18106,28 @@ "webpack-dev-server": "^3.5.1", "webpack-merge": "^4.1.2", "webpackbar": "3.2.0" + }, + "dependencies": { + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + } } }, "@vuepress/markdown": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.9.tgz", - "integrity": "sha512-JzFdBdGe5aoiKSaEgF+h3JLDXNVfWPI5DJWXrIt7rhhkMJesF6HowIznPLdXqukzHfXHcPvo9oQ4o6eT0YmVGA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.10.tgz", + "integrity": "sha512-sXTLjeZzH8SQuAL5AEH0hhsMljjNJbzWbBvzaj5yQCCdf+3sp/dJ0kwnBSnQjFPPnzPg5t3tLKGUYHyW0KiKzA==", "dev": true, "requires": { - "@vuepress/shared-utils": "1.9.9", + "@vuepress/shared-utils": "1.9.10", "markdown-it": "^8.4.1", "markdown-it-anchor": "^5.0.2", "markdown-it-chain": "^1.3.0", @@ -17718,24 +18137,37 @@ } }, "@vuepress/markdown-loader": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.9.9.tgz", - "integrity": "sha512-nyY+sytuQaDLEIk6Yj9JFUfSQpe9/sz30xQFkGCYqi0lQTRGQM6IcRDgfcTS7b25A0qRlwpDGBfKQiGGMZKSfg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.9.10.tgz", + "integrity": "sha512-94BlwKc+lOaN/A5DkyA9KWHvMlMC1sWunAXE3Tv0WYzgYLDs9QqCsx7L5kLkpcOOVVm/8kBJumnXvVBwhqJddw==", "dev": true, "requires": { - "@vuepress/markdown": "1.9.9", + "@vuepress/markdown": "1.9.10", "loader-utils": "^1.1.0", "lru-cache": "^5.1.1" } }, "@vuepress/plugin-active-header-links": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.9.9.tgz", - "integrity": "sha512-lTnIhbuALjOjFts33jJD8r4ScNBxnZ6MtmePKEwvYlC3J9uvngs1Htpb1JzLEX9QCydt+bhLmZ92bTXn/PdTpg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.9.10.tgz", + "integrity": "sha512-2dRr3DE2UBFXhyMtLR3sGTdRyDM8YStuY6AOoQmoSgwy1IHt7PO7ypOuf1akF+1Nv8Q2aISU06q6TExZouu3Mw==", "dev": true, "requires": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "lodash.debounce": "^4.0.8" + }, + "dependencies": { + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + } } }, "@vuepress/plugin-back-to-top": { @@ -17748,13 +18180,26 @@ } }, "@vuepress/plugin-last-updated": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.9.tgz", - "integrity": "sha512-MV4csmM0/lye83VtkOc+b8fs0roi7mvE7BmCCOE39Z6t8nv/ZmEPOwKeHD0+hXPT+ZfoATYvDcsYU7uxbdw0Pw==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.10.tgz", + "integrity": "sha512-YxzWGF/OfU6WsHSynZFn74NGGp7dY27Bjy9JyyFo8wF5+2V1gpyDjveHKHGKugS/pMXlxfjzhv9E2Wmy9R7Iog==", "dev": true, "requires": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "cross-spawn": "^6.0.5" + }, + "dependencies": { + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + } } }, "@vuepress/plugin-medium-zoom": { @@ -17767,38 +18212,77 @@ } }, "@vuepress/plugin-nprogress": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.9.tgz", - "integrity": "sha512-+3fLxjwTLH8MeU54E7i1ovRu9KzBom2lvSeUsu9B8PuLyrETAqW7Pe1H66awEEALEe0ZnnEU4d7SeVe9ljsLAQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.10.tgz", + "integrity": "sha512-I1kkm6yWUQd7vwiV3lEDVpVP0Lr04K0zlczU502lDUa1RufSZ7vt+mlF5fOM28GqT+pKTEToWmm+VNT/R3qvMQ==", "dev": true, "requires": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "nprogress": "^0.2.0" + }, + "dependencies": { + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + } } }, "@vuepress/plugin-register-components": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.9.tgz", - "integrity": "sha512-tddnAiSmJsIWWPzE7TcbGU8xzndXf4a8i4BfIev2QzSUnIOQFZDGXUAsCkw4/f9N9UFxQSObjFPzTeUUxb7EvA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.10.tgz", + "integrity": "sha512-sgdJ5OydTPZAoTkselpvVP3Xsd6bfZ0FpaxOTinal0gJ99h49lvLu9bvzMx13rdGRFO/kRXn0qQQpwKTAfTPqA==", "dev": true, "requires": { - "@vuepress/shared-utils": "1.9.9", - "@vuepress/types": "1.9.9" + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10" + }, + "dependencies": { + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + } } }, "@vuepress/plugin-search": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.9.9.tgz", - "integrity": "sha512-W/FE+YHoXDD4qk2wu5yRMkti271TA4y+7UBMrmCavvVAGrLIRnaZfswRUgIiDlEthBc+Pn8/As/Dy1jFTLBa9A==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.9.10.tgz", + "integrity": "sha512-bn2XJikaRgQZXvu8upCjOWrxbLHIRTqnJ3w7G0mo6jCYWGVsHNo6XhVpqylpLR2PWnHT/ImO2bGo38/5Bag/tQ==", "dev": true, "requires": { - "@vuepress/types": "1.9.9" + "@vuepress/types": "1.9.10" + }, + "dependencies": { + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + } } }, "@vuepress/shared-utils": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.9.tgz", - "integrity": "sha512-qhk/7QF5LgMEXhEB1hlqreGFgkz4p2pmaBBNFxnAnYmSwmyO+u/oFOpZLI16QRx9Wg6ekR2ENmByQLxV7y4lJg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.10.tgz", + "integrity": "sha512-M9A3DocPih+V8dKK2Zg9FJQ/f3JZrYsdaM/vQ9F48l8bPlzxw5NvqXIYMK4kKcGEyerQNTWCudoCpLL5uiU0hg==", "dev": true, "requires": { "chalk": "^2.3.2", @@ -17813,21 +18297,34 @@ } }, "@vuepress/theme-default": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.9.9.tgz", - "integrity": "sha512-de0FiOwM/h3rFTBSZK0NNBB117lA/e3IHusU7Xm2XeZRiZ/EE3yvbWclZnbbRNt3YjDMmrWXEW/kBTBxfiMuWQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.9.10.tgz", + "integrity": "sha512-XnXn9t+pYCIhWi3cZXJlighuy93FFm5yXdISAAlFlcNkshuGtqamkjacHV8q/QZMfOhSIs6wX7Hj88u2IsT5mw==", "dev": true, "requires": { - "@vuepress/plugin-active-header-links": "1.9.9", - "@vuepress/plugin-nprogress": "1.9.9", - "@vuepress/plugin-search": "1.9.9", - "@vuepress/types": "1.9.9", + "@vuepress/plugin-active-header-links": "1.9.10", + "@vuepress/plugin-nprogress": "1.9.10", + "@vuepress/plugin-search": "1.9.10", + "@vuepress/types": "1.9.10", "docsearch.js": "^2.5.2", "lodash": "^4.17.15", "stylus": "^0.54.8", "stylus-loader": "^3.0.2", "vuepress-plugin-container": "^2.0.2", "vuepress-plugin-smooth-scroll": "^0.0.3" + }, + "dependencies": { + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + } } }, "@vuepress/types": { @@ -18120,9 +18617,9 @@ "dev": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -18278,6 +18775,20 @@ "is-string": "^1.0.7" } }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -18456,33 +18967,41 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.2" } }, "balanced-match": { @@ -18844,15 +19363,15 @@ } }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" } }, "buffer": { @@ -19053,9 +19572,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -19167,9 +19686,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001470", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", - "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", + "version": "1.0.30001520", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", + "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", "dev": true }, "caseless": { @@ -19788,9 +20307,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "slash": { @@ -19802,18 +20321,18 @@ } }, "core-js": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", - "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", "dev": true }, "core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", "dev": true, "requires": { - "browserslist": "^4.21.5" + "browserslist": "^4.21.9" } }, "core-util-is": { @@ -19893,9 +20412,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -20151,15 +20670,15 @@ } }, "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", "dev": true }, "d3": { @@ -20891,9 +21410,9 @@ "dev": true }, "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -21107,9 +21626,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", - "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==", + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", "dev": true }, "elliptic": { @@ -21226,18 +21745,19 @@ } }, "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -21257,14 +21777,18 @@ "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" } }, "es-array-method-boxes-properly": { @@ -22091,13 +22615,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -22529,9 +23054,9 @@ } }, "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true }, "htmlparser2": { @@ -23018,9 +23543,9 @@ } }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -23239,16 +23764,12 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-typedarray": { @@ -24132,9 +24653,9 @@ } }, "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "nopt": { @@ -24322,15 +24843,16 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", - "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", "dev": true, "requires": { "array.prototype.reduce": "^1.0.5", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" } }, "object.pick": { @@ -25232,9 +25754,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -25284,9 +25806,9 @@ "dev": true }, "prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "optional": true }, @@ -25451,12 +25973,6 @@ "strict-uri-encode": "^1.0.0" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "dev": true - }, "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -25585,15 +26101,15 @@ } }, "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", "dev": true }, "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -25631,14 +26147,14 @@ } }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, "regexpu-core": { @@ -25852,12 +26368,12 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -25954,6 +26470,18 @@ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -27139,9 +27667,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -27341,6 +27869,42 @@ "mime-types": "~2.1.24" } }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -27553,9 +28117,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -27664,20 +28228,29 @@ "dev": true }, "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.0" }, "dependencies": { "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, @@ -27970,18 +28543,31 @@ "dev": true }, "vuepress": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.9.9.tgz", - "integrity": "sha512-CU94W3EdWaCavGx2VSvQJMI/hyv+m/YMdrvJJw67EVfmmJJDb1iTGrilDgLd0qsyrXzBy0Ru9Qi6rkf4IwcOTg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.9.10.tgz", + "integrity": "sha512-UnGm9vjQvG918SZVNvgiUlNimLqawdYPq0aPRXDpEB1VksvqegVFy/GKdA8ShXJaEpOMPSt7YD4uK21jaMs3kA==", "dev": true, "requires": { - "@vuepress/core": "1.9.9", - "@vuepress/theme-default": "1.9.9", - "@vuepress/types": "1.9.9", + "@vuepress/core": "1.9.10", + "@vuepress/theme-default": "1.9.10", + "@vuepress/types": "1.9.10", "cac": "^6.5.6", "envinfo": "^7.2.0", "opencollective-postinstall": "^2.0.2", "update-notifier": "^4.0.0" + }, + "dependencies": { + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + } } }, "vuepress-html-webpack-plugin": { @@ -28452,23 +29038,22 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "widest-line": { diff --git a/docs/package.json b/docs/package.json index 8cd8e770bf..49eaf391cc 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,7 +10,7 @@ "license": "MIT", "devDependencies": { "markdown-it-footnote": "^3.0.3", - "vuepress": "^1.9.9" + "vuepress": "^1.9.10" }, "dependencies": { "@vuepress/plugin-back-to-top": "^1.9.9", From c7c9969c970706ace66925da2d80857163c60367 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 15:47:57 +0200 Subject: [PATCH 07/30] chore(deps): bump @vuepress/plugin-medium-zoom in /docs (#586) Bumps [@vuepress/plugin-medium-zoom](https://github.com/vuejs/vuepress/tree/HEAD/packages/@vuepress/plugin-medium-zoom) from 1.9.9 to 1.9.10. - [Release notes](https://github.com/vuejs/vuepress/releases) - [Changelog](https://github.com/vuejs/vuepress/blob/master/CHANGELOG.md) - [Commits](https://github.com/vuejs/vuepress/commits/v1.9.10/packages/@vuepress/plugin-medium-zoom) --- updated-dependencies: - dependency-name: "@vuepress/plugin-medium-zoom" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 40 +++++++++++++++++++++++++++++++--------- docs/package.json | 2 +- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 5c5678c877..df495f7fe9 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,7 +8,7 @@ "license": "MIT", "dependencies": { "@vuepress/plugin-back-to-top": "^1.9.9", - "@vuepress/plugin-medium-zoom": "^1.9.9", + "@vuepress/plugin-medium-zoom": "^1.9.10", "vuepress-plugin-mermaidjs": "^1.9.1" }, "devDependencies": { @@ -2549,14 +2549,24 @@ } }, "node_modules/@vuepress/plugin-medium-zoom": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.9.tgz", - "integrity": "sha512-P8UfqUv0l28Td2COhvhVinBMiHyams8KKQVwnr6ZboFcRVG5xOsghtDbO++jn78rnszOz8OsLXilPMoiJ8iECQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.10.tgz", + "integrity": "sha512-/MsICWZ/mUTs+ZdqqA1AVtWAtNL5ksgnnGR2X24LnXaPJp+M1IB2ETcyNKh264YVODSrmVsS/Y+kbCRK0qKkdg==", "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "medium-zoom": "^1.0.4" } }, + "node_modules/@vuepress/plugin-medium-zoom/node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dependencies": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, "node_modules/@vuepress/plugin-nprogress": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.10.tgz", @@ -18203,12 +18213,24 @@ } }, "@vuepress/plugin-medium-zoom": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.9.tgz", - "integrity": "sha512-P8UfqUv0l28Td2COhvhVinBMiHyams8KKQVwnr6ZboFcRVG5xOsghtDbO++jn78rnszOz8OsLXilPMoiJ8iECQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.10.tgz", + "integrity": "sha512-/MsICWZ/mUTs+ZdqqA1AVtWAtNL5ksgnnGR2X24LnXaPJp+M1IB2ETcyNKh264YVODSrmVsS/Y+kbCRK0qKkdg==", "requires": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "medium-zoom": "^1.0.4" + }, + "dependencies": { + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + } } }, "@vuepress/plugin-nprogress": { diff --git a/docs/package.json b/docs/package.json index 49eaf391cc..2b091a9035 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@vuepress/plugin-back-to-top": "^1.9.9", - "@vuepress/plugin-medium-zoom": "^1.9.9", + "@vuepress/plugin-medium-zoom": "^1.9.10", "vuepress-plugin-mermaidjs": "^1.9.1" } } From b1c83cdd7a7b72ec948dc6e75d6b0246ad82febb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 16:36:31 +0200 Subject: [PATCH 08/30] chore(deps): bump @vuepress/plugin-back-to-top in /docs (#585) Bumps [@vuepress/plugin-back-to-top](https://github.com/vuejs/vuepress/tree/HEAD/packages/@vuepress/plugin-back-to-top) from 1.9.9 to 1.9.10. - [Release notes](https://github.com/vuejs/vuepress/releases) - [Changelog](https://github.com/vuejs/vuepress/blob/master/CHANGELOG.md) - [Commits](https://github.com/vuejs/vuepress/commits/v1.9.10/packages/@vuepress/plugin-back-to-top) --- updated-dependencies: - dependency-name: "@vuepress/plugin-back-to-top" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 240 +++-------------------------------------- docs/package.json | 2 +- 2 files changed, 14 insertions(+), 228 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index df495f7fe9..5207262d14 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -7,7 +7,7 @@ "name": "digiwf-docs", "license": "MIT", "dependencies": { - "@vuepress/plugin-back-to-top": "^1.9.9", + "@vuepress/plugin-back-to-top": "^1.9.10", "@vuepress/plugin-medium-zoom": "^1.9.10", "vuepress-plugin-mermaidjs": "^1.9.1" }, @@ -2460,17 +2460,6 @@ "node": ">=8.6" } }, - "node_modules/@vuepress/core/node_modules/@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "dependencies": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - }, "node_modules/@vuepress/markdown": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.10.tgz", @@ -2507,23 +2496,12 @@ "lodash.debounce": "^4.0.8" } }, - "node_modules/@vuepress/plugin-active-header-links/node_modules/@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "dependencies": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - }, "node_modules/@vuepress/plugin-back-to-top": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.9.tgz", - "integrity": "sha512-8bNsdZ0Dr96OdcoJ67dxCx1ysXpeTHma8w+YSsqBJoWGEOucBr0nW9oaDH85yoOtpiriWBlhUO32/Q0ojJtMfA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.10.tgz", + "integrity": "sha512-iInIp66wu717CAnT2pyd9Bs/vAgrUBOBIQ7WMnfJo07cW/ZIothpyrSHnpCRSsfJ/jLivMPqW0pviqppt64BzQ==", "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "lodash.debounce": "^4.0.8" } }, @@ -2537,17 +2515,6 @@ "cross-spawn": "^6.0.5" } }, - "node_modules/@vuepress/plugin-last-updated/node_modules/@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "dependencies": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - }, "node_modules/@vuepress/plugin-medium-zoom": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.10.tgz", @@ -2557,16 +2524,6 @@ "medium-zoom": "^1.0.4" } }, - "node_modules/@vuepress/plugin-medium-zoom/node_modules/@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dependencies": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - }, "node_modules/@vuepress/plugin-nprogress": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.10.tgz", @@ -2577,17 +2534,6 @@ "nprogress": "^0.2.0" } }, - "node_modules/@vuepress/plugin-nprogress/node_modules/@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "dependencies": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - }, "node_modules/@vuepress/plugin-register-components": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.10.tgz", @@ -2598,17 +2544,6 @@ "@vuepress/types": "1.9.10" } }, - "node_modules/@vuepress/plugin-register-components/node_modules/@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "dependencies": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - }, "node_modules/@vuepress/plugin-search": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.9.10.tgz", @@ -2618,17 +2553,6 @@ "@vuepress/types": "1.9.10" } }, - "node_modules/@vuepress/plugin-search/node_modules/@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "dependencies": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - }, "node_modules/@vuepress/shared-utils": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.10.tgz", @@ -2664,21 +2588,10 @@ "vuepress-plugin-smooth-scroll": "^0.0.3" } }, - "node_modules/@vuepress/theme-default/node_modules/@vuepress/types": { + "node_modules/@vuepress/types": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "dependencies": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - }, - "node_modules/@vuepress/types": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.9.tgz", - "integrity": "sha512-ukGW49ILzLhIc7CltHMr+BeIjWKloJNN1mrvbDz3beycp9b9kgH+DXNdRIK9QCKr4fJsy7x08vNMwZr9Nq/PTQ==", "dependencies": { "@types/markdown-it": "^10.0.0", "@types/webpack-dev-server": "^3", @@ -15493,17 +15406,6 @@ "smoothscroll-polyfill": "^0.4.3" } }, - "node_modules/vuepress/node_modules/@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "dependencies": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - }, "node_modules/watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", @@ -18116,19 +18018,6 @@ "webpack-dev-server": "^3.5.1", "webpack-merge": "^4.1.2", "webpackbar": "3.2.0" - }, - "dependencies": { - "@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "requires": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - } } }, "@vuepress/markdown": { @@ -18165,27 +18054,14 @@ "requires": { "@vuepress/types": "1.9.10", "lodash.debounce": "^4.0.8" - }, - "dependencies": { - "@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "requires": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - } } }, "@vuepress/plugin-back-to-top": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.9.tgz", - "integrity": "sha512-8bNsdZ0Dr96OdcoJ67dxCx1ysXpeTHma8w+YSsqBJoWGEOucBr0nW9oaDH85yoOtpiriWBlhUO32/Q0ojJtMfA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.10.tgz", + "integrity": "sha512-iInIp66wu717CAnT2pyd9Bs/vAgrUBOBIQ7WMnfJo07cW/ZIothpyrSHnpCRSsfJ/jLivMPqW0pviqppt64BzQ==", "requires": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "lodash.debounce": "^4.0.8" } }, @@ -18197,19 +18073,6 @@ "requires": { "@vuepress/types": "1.9.10", "cross-spawn": "^6.0.5" - }, - "dependencies": { - "@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "requires": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - } } }, "@vuepress/plugin-medium-zoom": { @@ -18219,18 +18082,6 @@ "requires": { "@vuepress/types": "1.9.10", "medium-zoom": "^1.0.4" - }, - "dependencies": { - "@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "requires": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - } } }, "@vuepress/plugin-nprogress": { @@ -18241,19 +18092,6 @@ "requires": { "@vuepress/types": "1.9.10", "nprogress": "^0.2.0" - }, - "dependencies": { - "@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "requires": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - } } }, "@vuepress/plugin-register-components": { @@ -18264,19 +18102,6 @@ "requires": { "@vuepress/shared-utils": "1.9.10", "@vuepress/types": "1.9.10" - }, - "dependencies": { - "@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "requires": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - } } }, "@vuepress/plugin-search": { @@ -18286,19 +18111,6 @@ "dev": true, "requires": { "@vuepress/types": "1.9.10" - }, - "dependencies": { - "@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "requires": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - } } }, "@vuepress/shared-utils": { @@ -18334,25 +18146,12 @@ "stylus-loader": "^3.0.2", "vuepress-plugin-container": "^2.0.2", "vuepress-plugin-smooth-scroll": "^0.0.3" - }, - "dependencies": { - "@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "requires": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - } } }, "@vuepress/types": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.9.tgz", - "integrity": "sha512-ukGW49ILzLhIc7CltHMr+BeIjWKloJNN1mrvbDz3beycp9b9kgH+DXNdRIK9QCKr4fJsy7x08vNMwZr9Nq/PTQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", "requires": { "@types/markdown-it": "^10.0.0", "@types/webpack-dev-server": "^3", @@ -28577,19 +28376,6 @@ "envinfo": "^7.2.0", "opencollective-postinstall": "^2.0.2", "update-notifier": "^4.0.0" - }, - "dependencies": { - "@vuepress/types": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", - "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", - "dev": true, - "requires": { - "@types/markdown-it": "^10.0.0", - "@types/webpack-dev-server": "^3", - "webpack-chain": "^6.0.0" - } - } } }, "vuepress-html-webpack-plugin": { diff --git a/docs/package.json b/docs/package.json index 2b091a9035..856a29361b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -13,7 +13,7 @@ "vuepress": "^1.9.10" }, "dependencies": { - "@vuepress/plugin-back-to-top": "^1.9.9", + "@vuepress/plugin-back-to-top": "^1.9.10", "@vuepress/plugin-medium-zoom": "^1.9.10", "vuepress-plugin-mermaidjs": "^1.9.1" } From 18c73c70dd2e2eb5695f47e510b6ed77028633ed Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Tue, 22 Aug 2023 09:03:32 +0200 Subject: [PATCH 09/30] chore(#582): unversion h2 --- digiwf-engine/digiwf-engine-cockpit/pom.xml | 3 --- digiwf-engine/digiwf-engine-service/pom.xml | 2 -- 2 files changed, 5 deletions(-) diff --git a/digiwf-engine/digiwf-engine-cockpit/pom.xml b/digiwf-engine/digiwf-engine-cockpit/pom.xml index e335e081ea..1e29eee404 100644 --- a/digiwf-engine/digiwf-engine-cockpit/pom.xml +++ b/digiwf-engine/digiwf-engine-cockpit/pom.xml @@ -13,8 +13,6 @@ jar - - 1.4.200 18.15.0.0 42.5.1 @@ -42,7 +40,6 @@ com.h2database h2 - ${h2.version} diff --git a/digiwf-engine/digiwf-engine-service/pom.xml b/digiwf-engine/digiwf-engine-service/pom.xml index f3d375176e..43fc94a314 100644 --- a/digiwf-engine/digiwf-engine-service/pom.xml +++ b/digiwf-engine/digiwf-engine-service/pom.xml @@ -172,8 +172,6 @@ com.h2database h2 - - 1.4.200 From 1e0d8bc2e859acb169c3eee5a6213f1c52a24730 Mon Sep 17 00:00:00 2001 From: StephanStrehlerCGI <115698474+StephanStrehlerCGI@users.noreply.github.com> Date: Tue, 22 Aug 2023 10:12:36 +0200 Subject: [PATCH 10/30] Feature/#539 assign tasks to other users (#579) * #539: add jane as user * #539: add assign task dialog for group tasks * #539: add assign task dialog for group task details * #539: added display for tasks in assign process * #631: merged dev branch and resolve merge conflicts * #539: fix bug where assigned group task is not clickable * #539: add camunda permissions for jane doe --- .../digiwf-forms-example/package-lock.json | 5 - .../apps/digiwf-tasklist/components.d.ts | 3 + .../apps/digiwf-tasklist/package-lock.json | 128 --------------- .../apps/digiwf-tasklist/package.json | 2 +- .../src/components/task/AssignTaskDialog.vue | 125 +++++++++++++++ .../src/components/task/GroupTaskItem.vue | 92 +++++++---- .../src/components/task/TaskItem.vue | 8 +- .../middleware/tasks/finishedTaskFilter.ts | 21 --- ...lter.spec.ts => mutatedTaskFilter.spec.ts} | 28 +--- .../src/middleware/tasks/mutatedTaskFilter.ts | 28 ++++ .../src/middleware/tasks/taskMapper.ts | 8 +- .../src/middleware/tasks/taskMiddleware.ts | 36 ++++- .../src/middleware/tasks/tasksModels.ts | 1 + .../src/views/AssignedGroupTasks.vue | 23 ++- .../src/views/GroupTaskDetail.vue | 151 +++++++++++------- .../src/views/OpenGroupTasks.vue | 22 +-- .../authorization/AuthorizationHelper.java | 43 +++-- .../LocalAuthorizationInitializer.java | 45 +++--- .../domain/service/MockUserServiceImpl.java | 64 ++++++-- .../out/user/MockUserProfileAdapter.java | 21 ++- stack/keycloak/12_janedoe.yml | 26 +++ stack/keycloak/keycloak-changelog.yml | 1 + 22 files changed, 525 insertions(+), 356 deletions(-) create mode 100644 digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/AssignTaskDialog.vue delete mode 100644 digiwf-apps/packages/apps/digiwf-tasklist/src/middleware/tasks/finishedTaskFilter.ts rename digiwf-apps/packages/apps/digiwf-tasklist/src/middleware/tasks/{finishedTaskFilter.spec.ts => mutatedTaskFilter.spec.ts} (78%) create mode 100644 digiwf-apps/packages/apps/digiwf-tasklist/src/middleware/tasks/mutatedTaskFilter.ts create mode 100644 stack/keycloak/12_janedoe.yml diff --git a/digiwf-apps/packages/apps/digiwf-forms-example/package-lock.json b/digiwf-apps/packages/apps/digiwf-forms-example/package-lock.json index d58ee20ef6..bd7ea1e2cb 100644 --- a/digiwf-apps/packages/apps/digiwf-forms-example/package-lock.json +++ b/digiwf-apps/packages/apps/digiwf-forms-example/package-lock.json @@ -8,11 +8,6 @@ "name": "@muenchen/digiwf-forms-example", "version": "0.21.11", "dependencies": { - "@muenchen/digiwf-date-input": "^0.21.11", - "@muenchen/digiwf-form-builder": "^0.21.11", - "@muenchen/digiwf-form-builder-settings": "^0.21.11", - "@muenchen/digiwf-form-renderer": "^0.21.11", - "@muenchen/digiwf-multi-file-input": "^0.21.11", "@muenchen/vjsf": "^2.21.7", "vue": "^2.7.10", "vuetify": "^2.6.9" diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/components.d.ts b/digiwf-apps/packages/apps/digiwf-tasklist/components.d.ts index f871c1f15b..70d1ba589a 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/components.d.ts +++ b/digiwf-apps/packages/apps/digiwf-tasklist/components.d.ts @@ -17,6 +17,7 @@ declare module '@vue/runtime-core' { AppToast: typeof import('./src/components/UI/AppToast.vue')['default'] AppViewLayout: typeof import('./src/components/UI/AppViewLayout.vue')['default'] AppYesNoDialog: typeof import('./src/components/common/AppYesNoDialog.vue')['default'] + AssignTaskDialog: typeof import('./src/components/task/AssignTaskDialog.vue')['default'] BaseAlwDocumentInput: typeof import('./src/components/form/BaseAlwDocumentInput.vue')['default'] BaseDocumentInput: typeof import('./src/components/form/BaseDocumentInput.vue')['default'] BaseForm: typeof import('./src/components/form/BaseForm.vue')['default'] @@ -50,6 +51,7 @@ declare module '@vue/runtime-core' { VCardTitle: typeof import('vuetify/lib')['VCardTitle'] VCheckbox: typeof import('vuetify/lib')['VCheckbox'] VChip: typeof import('vuetify/lib')['VChip'] + VCol: typeof import('vuetify/lib')['VCol'] VCombobox: typeof import('vuetify/lib')['VCombobox'] VContainer: typeof import('vuetify/lib')['VContainer'] VDataIterator: typeof import('vuetify/lib')['VDataIterator'] @@ -74,6 +76,7 @@ declare module '@vue/runtime-core' { VListItemTitle: typeof import('vuetify/lib')['VListItemTitle'] VMain: typeof import('vuetify/lib')['VMain'] VMenu: typeof import('vuetify/lib')['VMenu'] + VMessages: typeof import('vuetify/lib')['VMessages'] VMultiUserInput: typeof import('./src/components/schema/VMultiUserInput.vue')['default'] VNavigationDrawer: typeof import('vuetify/lib')['VNavigationDrawer'] VProgressCircular: typeof import('vuetify/lib')['VProgressCircular'] diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/package-lock.json b/digiwf-apps/packages/apps/digiwf-tasklist/package-lock.json index a7a340d59c..de600ebbef 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/package-lock.json +++ b/digiwf-apps/packages/apps/digiwf-tasklist/package-lock.json @@ -8,11 +8,6 @@ "name": "@muenchen/digiwf-tasklist", "version": "0.21.11", "dependencies": { - "@muenchen/digiwf-date-input": "^0.21.11", - "@muenchen/digiwf-engine-api-internal": "^0.21.11", - "@muenchen/digiwf-form-renderer": "^0.21.11", - "@muenchen/digiwf-multi-file-input": "^0.21.11", - "@muenchen/digiwf-task-api-internal": "^0.21.11", "@muenchen/vjsf": "^2.21.7", "@tanstack/vue-query": "^4.19.1", "core-js": "^3.8.3", @@ -1375,78 +1370,6 @@ "integrity": "sha512-rK0/vLFaiItYS2W7uVmaKPKnhNQE4XVkylpk5njtVwENnp8elwY5uRL6qvdj2esuvUHG7DwygE4Qu3eKxxuJiQ==", "optional": true }, - "node_modules/@muenchen/digiwf-date-input": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-date-input/-/digiwf-date-input-0.21.11.tgz", - "integrity": "sha512-Et7BIxyHEkbbNiy0BGhjZz1Av+amtxZtzhAVpFGVRRSQcJzLETI9qixAbiXvPv60N92Xnx/7pKKDgZZUokPIvw==", - "peerDependencies": { - "vue": "^2.7.0", - "vuetify": "^2.6.0" - } - }, - "node_modules/@muenchen/digiwf-engine-api-internal": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-engine-api-internal/-/digiwf-engine-api-internal-0.21.11.tgz", - "integrity": "sha512-6ioFiR4+wCVQMnj1dPs/kMSt2Dvz1A6Ew2xehaW+NO+XgyHzy0abnQeT6+T6rZ6q1R0Xn1OnrU7X0YdHcSUnvA==", - "dependencies": { - "typescript": "^4.8.2" - } - }, - "node_modules/@muenchen/digiwf-engine-api-internal/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@muenchen/digiwf-form-renderer": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-form-renderer/-/digiwf-form-renderer-0.21.11.tgz", - "integrity": "sha512-j8KJoVtbkvLQSw/pL35j+SdLgUEcpntW7jZIf1lJbmsWXK0nK4Yy5mM+cgWuk+62pS0qLnLlzFFbwFA2X/PvNQ==", - "peerDependencies": { - "@muenchen/vjsf": "^2.21.7", - "vue": "^2.7.0", - "vuetify": "^2.6.0" - } - }, - "node_modules/@muenchen/digiwf-multi-file-input": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-multi-file-input/-/digiwf-multi-file-input-0.21.11.tgz", - "integrity": "sha512-okzuTzhjck54ZH+VKm+TUfAplcchgOuzjFgziUEXI2mTH5nLEfRIzZabFWs/N16K6oSKvCk6L3fLuV3aGK4JKA==", - "dependencies": { - "@muenchen/digiwf-engine-api-internal": "^0.21.11", - "@muenchen/digiwf-task-api-internal": "^0.21.11" - }, - "peerDependencies": { - "vue": "^2.7.0", - "vuetify": "^2.6.0" - } - }, - "node_modules/@muenchen/digiwf-task-api-internal": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-task-api-internal/-/digiwf-task-api-internal-0.21.11.tgz", - "integrity": "sha512-Jhu4iSaOCkNroKnYBewg7sH8UOuwtHMn2WXY0RbLbpmbsVbjPmlRWwjF7Ctd+lNC1JXodj/+RYK8bye3feMamw==", - "dependencies": { - "typescript": "^4.8.2" - } - }, - "node_modules/@muenchen/digiwf-task-api-internal/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/@muenchen/vjsf": { "version": "2.21.7", "resolved": "https://registry.npmjs.org/@muenchen/vjsf/-/vjsf-2.21.7.tgz", @@ -11146,57 +11069,6 @@ "integrity": "sha512-rK0/vLFaiItYS2W7uVmaKPKnhNQE4XVkylpk5njtVwENnp8elwY5uRL6qvdj2esuvUHG7DwygE4Qu3eKxxuJiQ==", "optional": true }, - "@muenchen/digiwf-date-input": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-date-input/-/digiwf-date-input-0.21.11.tgz", - "integrity": "sha512-Et7BIxyHEkbbNiy0BGhjZz1Av+amtxZtzhAVpFGVRRSQcJzLETI9qixAbiXvPv60N92Xnx/7pKKDgZZUokPIvw==", - "requires": {} - }, - "@muenchen/digiwf-engine-api-internal": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-engine-api-internal/-/digiwf-engine-api-internal-0.21.11.tgz", - "integrity": "sha512-6ioFiR4+wCVQMnj1dPs/kMSt2Dvz1A6Ew2xehaW+NO+XgyHzy0abnQeT6+T6rZ6q1R0Xn1OnrU7X0YdHcSUnvA==", - "requires": { - "typescript": "^4.8.2" - }, - "dependencies": { - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - } - } - }, - "@muenchen/digiwf-form-renderer": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-form-renderer/-/digiwf-form-renderer-0.21.11.tgz", - "integrity": "sha512-j8KJoVtbkvLQSw/pL35j+SdLgUEcpntW7jZIf1lJbmsWXK0nK4Yy5mM+cgWuk+62pS0qLnLlzFFbwFA2X/PvNQ==", - "requires": {} - }, - "@muenchen/digiwf-multi-file-input": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-multi-file-input/-/digiwf-multi-file-input-0.21.11.tgz", - "integrity": "sha512-okzuTzhjck54ZH+VKm+TUfAplcchgOuzjFgziUEXI2mTH5nLEfRIzZabFWs/N16K6oSKvCk6L3fLuV3aGK4JKA==", - "requires": { - "@muenchen/digiwf-engine-api-internal": "^0.21.11", - "@muenchen/digiwf-task-api-internal": "^0.21.11" - } - }, - "@muenchen/digiwf-task-api-internal": { - "version": "0.21.11", - "resolved": "https://registry.npmjs.org/@muenchen/digiwf-task-api-internal/-/digiwf-task-api-internal-0.21.11.tgz", - "integrity": "sha512-Jhu4iSaOCkNroKnYBewg7sH8UOuwtHMn2WXY0RbLbpmbsVbjPmlRWwjF7Ctd+lNC1JXodj/+RYK8bye3feMamw==", - "requires": { - "typescript": "^4.8.2" - }, - "dependencies": { - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - } - } - }, "@muenchen/vjsf": { "version": "2.21.7", "resolved": "https://registry.npmjs.org/@muenchen/vjsf/-/vjsf-2.21.7.tgz", diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/package.json b/digiwf-apps/packages/apps/digiwf-tasklist/package.json index 07256ad245..7a0130b1d2 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/package.json +++ b/digiwf-apps/packages/apps/digiwf-tasklist/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "vite", "build": "vite build", - "test": "jest src" + "test": "jest src --coverage" }, "dependencies": { "@muenchen/digiwf-date-input": "^0.21.11", diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/AssignTaskDialog.vue b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/AssignTaskDialog.vue new file mode 100644 index 0000000000..7af80c9e85 --- /dev/null +++ b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/AssignTaskDialog.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/GroupTaskItem.vue b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/GroupTaskItem.vue index 2fb4ceb036..cb2eacba9e 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/GroupTaskItem.vue +++ b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/GroupTaskItem.vue @@ -1,18 +1,26 @@ - - + + diff --git a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/TaskItem.vue b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/TaskItem.vue index 9df3d4be42..9e9e1ba608 100644 --- a/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/TaskItem.vue +++ b/digiwf-apps/packages/apps/digiwf-tasklist/src/components/task/TaskItem.vue @@ -1,6 +1,6 @@