From 1c34e5cebb19eaed47672922289921a727931dcf Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Wed, 17 Aug 2022 21:45:16 +0200 Subject: [PATCH 01/53] Update for next development version --- bom/bom/pom.xml | 2 +- bom/parent/pom.xml | 2 +- example/axon/flight-axon/pom.xml | 2 +- example/axon/hotel-axon/pom.xml | 2 +- example/axon/reservation-axon/pom.xml | 2 +- example/common/pom.xml | 2 +- example/pom.xml | 2 +- example/spring-cloud/flight-kafka/pom.xml | 2 +- example/spring-cloud/hotel-kafka/pom.xml | 2 +- example/spring-cloud/reservation-kafka/pom.xml | 2 +- extension/axon/pom.xml | 2 +- extension/core/pom.xml | 2 +- extension/spring-boot-starter/pom.xml | 2 +- extension/spring-cloud-stream/pom.xml | 2 +- pom.xml | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/bom/bom/pom.xml b/bom/bom/pom.xml index 86daa5c..e22c709 100644 --- a/bom/bom/pom.xml +++ b/bom/bom/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-parent - 0.0.2 + 0.0.3-SNAPSHOT ../parent/pom.xml diff --git a/bom/parent/pom.xml b/bom/parent/pom.xml index d5c8235..dd547fd 100644 --- a/bom/parent/pom.xml +++ b/bom/parent/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-root - 0.0.2 + 0.0.3-SNAPSHOT ../../pom.xml diff --git a/example/axon/flight-axon/pom.xml b/example/axon/flight-axon/pom.xml index 5e06e4c..19d3f98 100644 --- a/example/axon/flight-axon/pom.xml +++ b/example/axon/flight-axon/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-example-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../pom.xml diff --git a/example/axon/hotel-axon/pom.xml b/example/axon/hotel-axon/pom.xml index e7b4176..d855449 100644 --- a/example/axon/hotel-axon/pom.xml +++ b/example/axon/hotel-axon/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-example-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../pom.xml diff --git a/example/axon/reservation-axon/pom.xml b/example/axon/reservation-axon/pom.xml index d85482c..1312320 100644 --- a/example/axon/reservation-axon/pom.xml +++ b/example/axon/reservation-axon/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-example-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../pom.xml diff --git a/example/common/pom.xml b/example/common/pom.xml index 88b1901..9cd28a6 100644 --- a/example/common/pom.xml +++ b/example/common/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-example-parent - 0.0.2 + 0.0.3-SNAPSHOT ../pom.xml diff --git a/example/pom.xml b/example/pom.xml index e8ad25b..be487bd 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-parent - 0.0.2 + 0.0.3-SNAPSHOT ../bom/parent/pom.xml diff --git a/example/spring-cloud/flight-kafka/pom.xml b/example/spring-cloud/flight-kafka/pom.xml index e7d735c..22cf7cc 100644 --- a/example/spring-cloud/flight-kafka/pom.xml +++ b/example/spring-cloud/flight-kafka/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-example-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../pom.xml diff --git a/example/spring-cloud/hotel-kafka/pom.xml b/example/spring-cloud/hotel-kafka/pom.xml index 184ed2c..ee4dce2 100644 --- a/example/spring-cloud/hotel-kafka/pom.xml +++ b/example/spring-cloud/hotel-kafka/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-example-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../pom.xml diff --git a/example/spring-cloud/reservation-kafka/pom.xml b/example/spring-cloud/reservation-kafka/pom.xml index cc44338..10f613b 100644 --- a/example/spring-cloud/reservation-kafka/pom.xml +++ b/example/spring-cloud/reservation-kafka/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-example-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../pom.xml diff --git a/extension/axon/pom.xml b/extension/axon/pom.xml index 548cdbc..be9c512 100644 --- a/extension/axon/pom.xml +++ b/extension/axon/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../bom/parent/pom.xml diff --git a/extension/core/pom.xml b/extension/core/pom.xml index 81fd4ba..2c4bab2 100644 --- a/extension/core/pom.xml +++ b/extension/core/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../bom/parent/pom.xml diff --git a/extension/spring-boot-starter/pom.xml b/extension/spring-boot-starter/pom.xml index ec6ec58..70f9a71 100644 --- a/extension/spring-boot-starter/pom.xml +++ b/extension/spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../bom/parent/pom.xml diff --git a/extension/spring-cloud-stream/pom.xml b/extension/spring-cloud-stream/pom.xml index 69253a5..613b7ae 100644 --- a/extension/spring-cloud-stream/pom.xml +++ b/extension/spring-cloud-stream/pom.xml @@ -5,7 +5,7 @@ io.holunda camunda-bpm-correlate-parent - 0.0.2 + 0.0.3-SNAPSHOT ../../bom/parent/pom.xml diff --git a/pom.xml b/pom.xml index c51044e..19f5f6b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ io.holunda camunda-bpm-correlate-root - 0.0.2 + 0.0.3-SNAPSHOT pom ${project.artifactId} https://github.com/holunda-io/camunda-bpm-correlate/ From 1dc6e99c4b1f46cd5e2fb0d783a81d638488784e Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Wed, 17 Aug 2022 21:57:46 +0200 Subject: [PATCH 02/53] fixing the docs --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 3ecb6fd..f782201 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -61,7 +61,7 @@ jobs: # This is for a tagged version - name: Create a new version of documentation and push to GH pages. if: startsWith(github.ref, 'refs/tags/') - run: mike deploy ${{ steps.get_tag_name.outputs.TAG_NAME }} stable --push --rebase + run: mike deploy ${{ steps.get_tag_name.outputs.TAG_NAME }} stable --push --rebase --update-aliases - name: Make stable to default. if: startsWith(github.ref, 'refs/tags/') From c75456833bead33ba8fb03a40d1164d09dbc14b9 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Thu, 18 Aug 2022 09:27:45 +0200 Subject: [PATCH 03/53] initial cockpit plugin structure --- bom/bom/pom.xml | 6 +- .../spring-cloud/reservation-kafka/pom.xml | 6 ++ extension/cockpit-plugin/pom.xml | 56 +++++++++++++++++++ .../CamundaBpmCorrelateCockpitPlugin.kt | 22 ++++++++ .../bpm/correlate/db/CorrelateMessageDto.kt | 21 +++++++ ...daBpmCorrelateCockpitPluginRootResource.kt | 14 +++++ .../resources/CorrelateMessageResource.kt | 18 ++++++ ...munda.bpm.cockpit.plugin.spi.CockpitPlugin | 1 + .../bpm/correlate/cockpit-plugin-query.xml | 23 ++++++++ .../resources/plugin-webapp/app/plugin.css | 0 .../resources/plugin-webapp/app/plugin.js | 42 ++++++++++++++ pom.xml | 1 + 12 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 extension/cockpit-plugin/pom.xml create mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt create mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/db/CorrelateMessageDto.kt create mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt create mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt create mode 100644 extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin create mode 100644 extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml create mode 100644 extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.css create mode 100644 extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.js diff --git a/bom/bom/pom.xml b/bom/bom/pom.xml index e22c709..4eeffb3 100644 --- a/bom/bom/pom.xml +++ b/bom/bom/pom.xml @@ -35,7 +35,11 @@ camunda-bpm-correlate-axon-framework ${project.version} - + + io.holunda + camunda-bpm-correlate-cockpit-plugin + ${project.version} + diff --git a/example/spring-cloud/reservation-kafka/pom.xml b/example/spring-cloud/reservation-kafka/pom.xml index 10f613b..a67da6c 100644 --- a/example/spring-cloud/reservation-kafka/pom.xml +++ b/example/spring-cloud/reservation-kafka/pom.xml @@ -36,6 +36,12 @@ camunda-bpm-correlate-example-common + + + io.holunda + camunda-bpm-correlate-cockpit-plugin + runtime + diff --git a/extension/cockpit-plugin/pom.xml b/extension/cockpit-plugin/pom.xml new file mode 100644 index 0000000..81750b9 --- /dev/null +++ b/extension/cockpit-plugin/pom.xml @@ -0,0 +1,56 @@ + + 4.0.0 + + + io.holunda + camunda-bpm-correlate-parent + 0.0.3-SNAPSHOT + ../../bom/parent/pom.xml + + + camunda-bpm-correlate-cockpit-plugin + Extension / Cockpit plugin + jar + + + Monitoring + screenshot.png + + ${camunda-7.version} + + EN + + + + + + org.camunda.bpm + camunda-engine + provided + + + + + org.camunda.bpm.webapp + camunda-webapp + classes + + ${camunda-7.version} + provided + + + + + javax + javaee-api + 6.0 + provided + + + + + + ${project.artifactId} + + diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt new file mode 100644 index 0000000..3e252bb --- /dev/null +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt @@ -0,0 +1,22 @@ +package io.holunda.camunda.bpm.correlate + +import io.holunda.camunda.bpm.correlate.resources.CamundaBpmCorrelateCockpitPluginRootResource +import org.camunda.bpm.cockpit.plugin.spi.impl.AbstractCockpitPlugin + +class CamundaBpmCorrelateCockpitPlugin : AbstractCockpitPlugin() { + + companion object { + const val PREFIX = "io.holunda.camunda.bpm.correlate" + const val ID = "correlate-cockpit-plugin" + } + + override fun getId(): String = ID + + override fun getResourceClasses(): Set> = hashSetOf>( + CamundaBpmCorrelateCockpitPluginRootResource::class.java + ) + + override fun getMappingFiles(): List { + return listOf("${PREFIX.replace(".", "/")}/cockpit-plugin-query.xml") + } +} diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/db/CorrelateMessageDto.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/db/CorrelateMessageDto.kt new file mode 100644 index 0000000..f325582 --- /dev/null +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/db/CorrelateMessageDto.kt @@ -0,0 +1,21 @@ +package io.holunda.camunda.bpm.correlate.db + +import java.time.Instant + +/** + * Message DTO. + */ +class CorrelateMessageDto( + var id: String, + var payloadEncoding: String, + var payloadTypeNamespace: String, + var payloadTypeName: String, + var payloadTypeRevision: String?, + var payload: ByteArray, + var inserted: Instant, + var timeToLiveDuration: String?, + var expiration: Instant?, + var retries: Int = 0, + var nextRetry: Instant? = null, + var error: String? = null +) diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt new file mode 100644 index 0000000..adc875c --- /dev/null +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt @@ -0,0 +1,14 @@ +package io.holunda.camunda.bpm.correlate.resources + +import io.holunda.camunda.bpm.correlate.CamundaBpmCorrelateCockpitPlugin +import org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginRootResource +import javax.ws.rs.Path +import javax.ws.rs.PathParam + +@Path("plugin/" + CamundaBpmCorrelateCockpitPlugin.ID) +class CamundaBpmCorrelateCockpitPluginRootResource: AbstractCockpitPluginRootResource(CamundaBpmCorrelateCockpitPlugin.ID) { + @Path("{engineName}/messages") + fun getProcessInstanceResource(@PathParam("engineName") engineName: String): CorrelateMessageResource { + return subResource(CorrelateMessageResource(engineName), engineName) + } +} diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt new file mode 100644 index 0000000..dfbe25e --- /dev/null +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt @@ -0,0 +1,18 @@ +package io.holunda.camunda.bpm.correlate.resources + +import io.holunda.camunda.bpm.correlate.CamundaBpmCorrelateCockpitPlugin +import io.holunda.camunda.bpm.correlate.db.CorrelateMessageDto +import org.camunda.bpm.cockpit.db.QueryParameters +import org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginResource +import javax.ws.rs.GET +import javax.ws.rs.Produces +import javax.ws.rs.core.MediaType + +class CorrelateMessageResource(engineName: String) : AbstractCockpitPluginResource(engineName) { + + @GET + @Produces(MediaType.APPLICATION_JSON) + fun getCorrelateMessages(): List { + return queryService.executeQuery("${CamundaBpmCorrelateCockpitPlugin.PREFIX}.selectCorrelateMessages", QueryParameters()) + } +} diff --git a/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin b/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin new file mode 100644 index 0000000..9510d28 --- /dev/null +++ b/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin @@ -0,0 +1 @@ +io.holunda.camunda.bpm.correlate.CamundaBpmCorrelateCockpitPlugin diff --git a/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml b/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml new file mode 100644 index 0000000..bf8999b --- /dev/null +++ b/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.css b/extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.css new file mode 100644 index 0000000..e69de29 diff --git a/extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.js b/extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.js new file mode 100644 index 0000000..a955b56 --- /dev/null +++ b/extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.js @@ -0,0 +1,42 @@ +function generateHTML(messages) { + const body = messages + .map( + element => ` + ${element.id} + ${element.payloadEncoding} + ` + ) + .join("\n"); + + return ` +
+
+

Camunda Cockpit Plugin

+ + + + + + + + + ${body} + +
Message IDEncoding
+
+
`; +} + +export default { + id: "correlate-cockpit-plugin", + pluginPoint: "cockpit.processes.dashboard", + priority: 12, + render: (container, { api }) => { + fetch( + `${api.cockpitApi}/plugin/cockpit-plugin/${api.engine}/messages` + ).then(async res => { + const messages = await res.json(); + container.innerHTML = generateHTML(messages); + }); + } +}; diff --git a/pom.xml b/pom.xml index 19f5f6b..3f5ba5e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ bom/parent bom/bom extension/core + extension/cockpit-plugin extension/spring-boot-starter extension/spring-cloud-stream extension/axon From d08a999bcd55f4f710bc004a98f46ab867372afb Mon Sep 17 00:00:00 2001 From: Jan Rohwer Date: Thu, 18 Aug 2022 10:44:40 +0200 Subject: [PATCH 04/53] move files to subdirectory and fix URL for resources --- .../{ => correlate-cockpit-plugin}/app/plugin.css | 0 .../{ => correlate-cockpit-plugin}/app/plugin.js | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename extension/cockpit-plugin/src/main/resources/plugin-webapp/{ => correlate-cockpit-plugin}/app/plugin.css (100%) rename extension/cockpit-plugin/src/main/resources/plugin-webapp/{ => correlate-cockpit-plugin}/app/plugin.js (87%) diff --git a/extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.css b/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.css similarity index 100% rename from extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.css rename to extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.css diff --git a/extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.js b/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js similarity index 87% rename from extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.js rename to extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js index a955b56..c0d776b 100644 --- a/extension/cockpit-plugin/src/main/resources/plugin-webapp/app/plugin.js +++ b/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js @@ -29,11 +29,11 @@ function generateHTML(messages) { export default { id: "correlate-cockpit-plugin", - pluginPoint: "cockpit.processes.dashboard", + pluginPoint: "cockpit.dashboard", priority: 12, render: (container, { api }) => { fetch( - `${api.cockpitApi}/plugin/cockpit-plugin/${api.engine}/messages` + `${api.cockpitApi}/plugin/correlate-cockpit-plugin/${api.engine}/messages` ).then(async res => { const messages = await res.json(); container.innerHTML = generateHTML(messages); From cc3767322c09a84a367c7121c34baa3eb1487f51 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Thu, 18 Aug 2022 17:22:52 +0200 Subject: [PATCH 05/53] ongoing implementation of the plugin --- .../application-camunda-correlate.yml | 2 +- extension/cockpit-plugin/pom.xml | 19 ++ .../CamundaBpmCorrelateCockpitPlugin.kt | 27 ++- .../bpm/correlate/db/CorrelateMessageDto.kt | 21 --- .../bpm/correlate/dto/ConfigurationDto.kt | 5 + .../camunda/bpm/correlate/dto/MessageDto.kt | 38 ++++ ...daBpmCorrelateCockpitPluginRootResource.kt | 11 +- .../resources/ConfigurationResource.kt | 26 +++ .../resources/CorrelateMessageResource.kt | 18 +- .../bpm/correlate/cockpit-plugin-query.xml | 2 +- .../correlate-cockpit-plugin/app/plugin.css | 14 ++ .../correlate-cockpit-plugin/app/plugin.js | 165 ++++++++++++++---- .../bpm/correlate/persist/MessageEntity.kt | 2 +- .../correlate/persist/MessageRepository.kt | 12 +- .../impl/DefaultMessagePersistenceService.kt | 2 +- .../persist/impl/InMemMessageRepository.kt | 8 +- .../persist/impl/MessageManagementService.kt | 4 +- .../persist/impl/MyBatisMessageMapper.kt | 21 ++- .../persist/impl/MyBatisMessageRepository.kt | 19 +- .../CamundaBpmCorrelateConfiguration.kt | 32 +++- .../correlate/CamundaBpmCorrelateServices.kt | 12 ++ 21 files changed, 380 insertions(+), 80 deletions(-) delete mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/db/CorrelateMessageDto.kt create mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/ConfigurationDto.kt create mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/MessageDto.kt create mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/ConfigurationResource.kt create mode 100644 extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateServices.kt diff --git a/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml b/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml index e738837..023bc3c 100644 --- a/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml +++ b/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml @@ -30,6 +30,6 @@ correlate: messageFetchPageSize: 100 # default 100 retry: retryMaxBackoffMinutes: 5 # default 180 -> maximum 5 minutes between retries - retryBackoffBase: 2.0 # value in minutes default 2.0 -> base in the power of retry to calculate the next retry + retryBackoffBase: 5.0 # value in minutes default 2.0 -> base in the power of retry to calculate the next retry diff --git a/extension/cockpit-plugin/pom.xml b/extension/cockpit-plugin/pom.xml index 81750b9..274c0b2 100644 --- a/extension/cockpit-plugin/pom.xml +++ b/extension/cockpit-plugin/pom.xml @@ -29,6 +29,12 @@ camunda-engine provided
+ + + org.camunda.bpm.springboot + camunda-bpm-spring-boot-starter + provided + @@ -48,6 +54,19 @@ provided + + + io.holunda + camunda-bpm-correlate-spring-boot-starter + ${project.version} + provided + + + org.springframework + spring-web + provided + + diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt index 3e252bb..f3cf343 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt @@ -1,15 +1,24 @@ package io.holunda.camunda.bpm.correlate import io.holunda.camunda.bpm.correlate.resources.CamundaBpmCorrelateCockpitPluginRootResource +import mu.KLogging +import org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginResource +import org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginRootResource import org.camunda.bpm.cockpit.plugin.spi.impl.AbstractCockpitPlugin +import org.springframework.context.ApplicationContext +import kotlin.reflect.KClass class CamundaBpmCorrelateCockpitPlugin : AbstractCockpitPlugin() { - companion object { + companion object : KLogging() { const val PREFIX = "io.holunda.camunda.bpm.correlate" const val ID = "correlate-cockpit-plugin" } + init { + logger.info { "[Camunda CORRELATE] Cockpit plugin activated." } + } + override fun getId(): String = ID override fun getResourceClasses(): Set> = hashSetOf>( @@ -20,3 +29,19 @@ class CamundaBpmCorrelateCockpitPlugin : AbstractCockpitPlugin() { return listOf("${PREFIX.replace(".", "/")}/cockpit-plugin-query.xml") } } + +/** + * Retrieves spring application context via static in-JVM hack. + * @return spring application context. + */ +fun getApplicationContext(): ApplicationContext { + return requireNotNull(CamundaBpmCorrelateConfiguration.applicationContext) { "Spring application context could not be found." } +} + +inline fun AbstractCockpitPluginResource.getBean(clazz: KClass): T { + return getApplicationContext().getBean(clazz.java) +} + +inline fun AbstractCockpitPluginRootResource.getBean(clazz: KClass): T { + return getApplicationContext().getBean(clazz.java) +} diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/db/CorrelateMessageDto.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/db/CorrelateMessageDto.kt deleted file mode 100644 index f325582..0000000 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/db/CorrelateMessageDto.kt +++ /dev/null @@ -1,21 +0,0 @@ -package io.holunda.camunda.bpm.correlate.db - -import java.time.Instant - -/** - * Message DTO. - */ -class CorrelateMessageDto( - var id: String, - var payloadEncoding: String, - var payloadTypeNamespace: String, - var payloadTypeName: String, - var payloadTypeRevision: String?, - var payload: ByteArray, - var inserted: Instant, - var timeToLiveDuration: String?, - var expiration: Instant?, - var retries: Int = 0, - var nextRetry: Instant? = null, - var error: String? = null -) diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/ConfigurationDto.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/ConfigurationDto.kt new file mode 100644 index 0000000..2e8d800 --- /dev/null +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/ConfigurationDto.kt @@ -0,0 +1,5 @@ +package io.holunda.camunda.bpm.correlate.dto + +data class ConfigurationDto( + val maxRetries: Int +) diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/MessageDto.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/MessageDto.kt new file mode 100644 index 0000000..361be26 --- /dev/null +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/MessageDto.kt @@ -0,0 +1,38 @@ +package io.holunda.camunda.bpm.correlate.dto + +import io.holunda.camunda.bpm.correlate.persist.MessageEntity +import java.time.Instant + +/** + * Message DTO. + */ +data class MessageDto( + val id: String, + val payloadEncoding: String, + val payloadTypeNamespace: String, + val payloadTypeName: String, + val payloadTypeRevision: String?, + val inserted: Instant, + val timeToLiveDuration: String?, + val expiration: Instant?, + val retries: Int = 0, + val nextRetry: Instant? = null, + val error: String? = null +) + +/** + * Mapper. + */ +fun MessageEntity.toDto() = MessageDto( + id, + payloadEncoding, + payloadTypeNamespace, + payloadTypeName, + payloadTypeRevision, + inserted, + timeToLiveDuration, + expiration, + retries, + nextRetry, + error +) diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt index adc875c..502c1ca 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt @@ -6,9 +6,16 @@ import javax.ws.rs.Path import javax.ws.rs.PathParam @Path("plugin/" + CamundaBpmCorrelateCockpitPlugin.ID) -class CamundaBpmCorrelateCockpitPluginRootResource: AbstractCockpitPluginRootResource(CamundaBpmCorrelateCockpitPlugin.ID) { +class CamundaBpmCorrelateCockpitPluginRootResource : AbstractCockpitPluginRootResource(CamundaBpmCorrelateCockpitPlugin.ID) { + @Path("{engineName}/messages") - fun getProcessInstanceResource(@PathParam("engineName") engineName: String): CorrelateMessageResource { + fun getMessagesResource(@PathParam("engineName") engineName: String): CorrelateMessageResource { return subResource(CorrelateMessageResource(engineName), engineName) } + + @Path("{engineName}/configuration") + fun getConfigurationResource(@PathParam("engineName") engineName: String): ConfigurationResource { + return subResource(ConfigurationResource(engineName), engineName) + } + } diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/ConfigurationResource.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/ConfigurationResource.kt new file mode 100644 index 0000000..4a0cc68 --- /dev/null +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/ConfigurationResource.kt @@ -0,0 +1,26 @@ +package io.holunda.camunda.bpm.correlate.resources + +import io.holunda.camunda.bpm.correlate.CamundaBpmCorrelateServices +import io.holunda.camunda.bpm.correlate.dto.ConfigurationDto +import io.holunda.camunda.bpm.correlate.getBean +import org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginResource +import javax.ws.rs.GET +import javax.ws.rs.Produces +import javax.ws.rs.core.MediaType + +/** + * Resource to work with configuration of the camunda-correlate. + */ +class ConfigurationResource(engineName: String) : AbstractCockpitPluginResource(engineName) { + + private val services = getBean(CamundaBpmCorrelateServices::class) + + @GET + @Produces(MediaType.APPLICATION_JSON) + fun getConfiguration(): ConfigurationDto { + return ConfigurationDto( + maxRetries = services.configuration.persistence.messageMaxRetries + ) + } + +} diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt index dfbe25e..2776fff 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt @@ -1,18 +1,26 @@ package io.holunda.camunda.bpm.correlate.resources -import io.holunda.camunda.bpm.correlate.CamundaBpmCorrelateCockpitPlugin -import io.holunda.camunda.bpm.correlate.db.CorrelateMessageDto -import org.camunda.bpm.cockpit.db.QueryParameters +import io.holunda.camunda.bpm.correlate.CamundaBpmCorrelateServices +import io.holunda.camunda.bpm.correlate.dto.MessageDto +import io.holunda.camunda.bpm.correlate.dto.toDto +import io.holunda.camunda.bpm.correlate.getBean import org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginResource import javax.ws.rs.GET import javax.ws.rs.Produces +import javax.ws.rs.QueryParam import javax.ws.rs.core.MediaType +/** + * Resource for access to correlate messages. + */ class CorrelateMessageResource(engineName: String) : AbstractCockpitPluginResource(engineName) { + private val services = getBean(CamundaBpmCorrelateServices::class) + @GET @Produces(MediaType.APPLICATION_JSON) - fun getCorrelateMessages(): List { - return queryService.executeQuery("${CamundaBpmCorrelateCockpitPlugin.PREFIX}.selectCorrelateMessages", QueryParameters()) + fun getMessages(@QueryParam("faultsOnly") faults: Boolean, @QueryParam("page") page: Int, @QueryParam("size") size: Int): List { + return services.messageRepository.findAllLight(page, size).map { it.toDto() } } + } diff --git a/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml b/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml index bf8999b..67e08a2 100644 --- a/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml +++ b/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml @@ -2,7 +2,7 @@ - + diff --git a/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.css b/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.css index e69de29..af873e9 100644 --- a/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.css +++ b/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.css @@ -0,0 +1,14 @@ +.message-id { + white-space: nowrap; +} + +.action-button { + width: 40px; + margin: 5px; +} + +.no-content { + text-align: center; + font-style: italic; + margin: 5px; +} \ No newline at end of file diff --git a/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js b/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js index c0d776b..07e3f97 100644 --- a/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js +++ b/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js @@ -1,42 +1,145 @@ -function generateHTML(messages) { - const body = messages - .map( - element => ` - ${element.id} - ${element.payloadEncoding} - ` - ) - .join("\n"); +function showStacktrace(stackTrace) { + console.log('stacktrace is: ', stackTrace); +} + +function modifyNextRetry(messageId) { + console.log('should modify the next retry for message', messageId); +} + +function decreaseRetries(messageId) { + console.log('should modify retries for message', messageId); +} + +function formatDate(date) { + if (!date) { + return null; + } + let split = date.split('T'); + return split[0] + ' ' + split[1].split('.')[0]; +} + + +function generatePage(configuration, messages) { + let messageTableBody = messages + .map(element => { + + let actionButtons = ''; + let nextRetry = ''; + let retries = element.retries; + + if (element.error) { + const stackTrace = element.error ? element.error : ''; + actionButtons += ``; + } + + if (element.nextRetry) { + nextRetry = formatDate(element.nextRetry); + actionButtons += ``; + } + + if (element.retries === configuration.maxRetries) { + actionButtons += ``; + } + + const insertedDate = formatDate(element.inserted); + + return ` + ${element.id} + ${element.payloadTypeNamespace}
.${element.payloadTypeName} + ${insertedDate} + ${retries} + ${nextRetry} + ${actionButtons} + `; + }) + .join('\n'); + + if (messageTableBody.length === 0) { + messageTableBody = `No messages in the inbox`; + } return ` -
-
-

Camunda Cockpit Plugin

- - - - - - - - - ${body} - -
Message IDEncoding
+
+
+
+
+
+

Messages

+ + + + + + + + + + + + + ${messageTableBody} + +
IDTypeInsertedRetriesNext RetryActions
+
+
+
-
`; +`; } -export default { - id: "correlate-cockpit-plugin", - pluginPoint: "cockpit.dashboard", - priority: 12, +const correlateTab = { + id: 'correlate-cockpit-plugin-route', + pluginPoint: 'cockpit.route', + priority: 4, + properties: { + path: '/correlation' + }, render: (container, { api }) => { + const urlPrefix = `${api.cockpitApi}/plugin/correlate-cockpit-plugin/${api.engine}` fetch( - `${api.cockpitApi}/plugin/correlate-cockpit-plugin/${api.engine}/messages` + `${urlPrefix}/configuration` ).then(async res => { - const messages = await res.json(); - container.innerHTML = generateHTML(messages); + const configuration = await res.json(); + fetch( + `${urlPrefix}/messages?page=0&size=100` + ).then(async res => { + const json = await res.json(); + container.innerHTML = generatePage(configuration.maxRetries, json); + }).catch(err => { + console.error(err); + }); + }).catch(err => { + console.error(err); }); } }; + +const navigation = { + id: 'correlate-cockpit-plugin-navigation', + pluginPoint: 'cockpit.navigation', + priority: 4, + properties: { + path: '/correlation' + }, + render: (container) => { + container.innerHTML = 'Correlation'; + } +}; + +// TODO: add metrics +const metrics = { + id: 'correlate-cockpit-plugin-metrics', + pluginPoint: 'cockpit.metrics', + priority: 4, + render: (container) => { + container.innerHTML = '
Metrics
'; + } +}; + +export default [correlateTab, navigation]; diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt index 4768177..82a4ba3 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt @@ -9,7 +9,7 @@ class MessageEntity( var payloadTypeNamespace: String, var payloadTypeName: String, var payloadTypeRevision: String?, - var payload: ByteArray, + var payload: ByteArray = ByteArray(0), var inserted: Instant, var timeToLiveDuration: String?, var expiration: Instant?, diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageRepository.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageRepository.kt index d59270f..bd00056 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageRepository.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageRepository.kt @@ -8,10 +8,18 @@ interface MessageRepository { /** * Finds all messages. + * @param page number start element to fetch from. * @param pageSize number elements to fetch. - * @return list of all messages with no expiration or expiration set to a future date. + * @return list of all messages. */ - fun findAll(pageSize: Int): List + fun findAll(page: Int, pageSize: Int): List + /** + * Finds all messages without payload. + * @param page number start element to fetch from. + * @param pageSize number elements to fetch. + * @return list of all messages. + */ + fun findAllLight(page: Int, pageSize: Int): List /** * Finds a message by id. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/DefaultMessagePersistenceService.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/DefaultMessagePersistenceService.kt index fa5d672..df14057 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/DefaultMessagePersistenceService.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/DefaultMessagePersistenceService.kt @@ -36,7 +36,7 @@ class DefaultMessagePersistenceService( override fun fetchMessageBatches(): List { // retrieve messages. - val allMessages: List = messageRepository.findAll(messagePersistenceConfig.getPageSize()) + val allMessages: List = messageRepository.findAll(0, messagePersistenceConfig.getPageSize()) logger.debug { "Found ${allMessages.size} messages, building batches." } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/InMemMessageRepository.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/InMemMessageRepository.kt index b2cacbc..45e786d 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/InMemMessageRepository.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/InMemMessageRepository.kt @@ -13,8 +13,12 @@ class InMemMessageRepository() : MessageRepository { private val store: MutableMap = mutableMapOf() - override fun findAll(pageSize: Int): List { - return store.values.take(pageSize) + override fun findAll(page: Int, pageSize: Int): List { + return store.values.toList().subList(page * pageSize, pageSize) + } + + override fun findAllLight(page: Int, pageSize: Int): List { + return store.values.toList().subList(page * pageSize, pageSize) } override fun findByIdOrNull(id: String): MessageEntity? { diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt index f083ca3..9a144eb 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt @@ -18,13 +18,13 @@ class MessageManagementService( fun cleanupExpired() { messageRepository.deleteAllById( - messageRepository.findAll(pageSize = persistenceConfig.getPageSize()) + messageRepository.findAllLight(page = 0, pageSize = persistenceConfig.getPageSize()) .filter { it.isExpired(clock) } .map { it.id } ) } fun listAllMessages(): List { - return messageRepository.findAll(pageSize = persistenceConfig.getPageSize()) + return messageRepository.findAll(page = 0, pageSize = persistenceConfig.getPageSize()) } } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt index 5ae3f89..d733f08 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt @@ -2,10 +2,29 @@ package io.holunda.camunda.bpm.correlate.persist.impl import io.holunda.camunda.bpm.correlate.persist.MessageEntity import org.apache.ibatis.annotations.* +import org.apache.ibatis.session.RowBounds import org.apache.ibatis.type.JdbcType interface MyBatisMessageMapper { + @Select("SELECT * FROM COR_MESSAGE message") + @Results( + value = [ + Result(property = "id", column = "ID", jdbcType = JdbcType.VARCHAR), + Result(property = "payloadEncoding", column = "PAYLOAD_ENCODING", jdbcType = JdbcType.VARCHAR), + Result(property = "payloadTypeNamespace", column = "PAYLOAD_TYPE_NAMESPACE", jdbcType = JdbcType.VARCHAR), + Result(property = "payloadTypeName", column = "PAYLOAD_TYPE_NAME", jdbcType = JdbcType.VARCHAR), + Result(property = "payloadTypeRevision", column = "PAYLOAD_TYPE_REVISION", jdbcType = JdbcType.VARCHAR), + Result(property = "inserted", column = "INSERTED", jdbcType = JdbcType.TIMESTAMP_WITH_TIMEZONE), + Result(property = "timeToLiveDuration", column = "TTL_DURATION", jdbcType = JdbcType.VARCHAR), + Result(property = "expiration", column = "EXPIRATION", jdbcType = JdbcType.TIMESTAMP_WITH_TIMEZONE), + Result(property = "retries", column = "RETRIES", jdbcType = JdbcType.INTEGER), + Result(property = "nextRetry", column = "NEXT_RETRY", jdbcType = JdbcType.TIMESTAMP_WITH_TIMEZONE), + Result(property = "error", column = "ERROR", jdbcType = JdbcType.VARCHAR), + ] + ) + fun findAllLightPaged(rowBounds: RowBounds): List + @Select("SELECT * FROM COR_MESSAGE message") @Results( value = [ @@ -23,7 +42,7 @@ interface MyBatisMessageMapper { Result(property = "error", column = "ERROR", jdbcType = JdbcType.VARCHAR), ] ) - fun findAll(): List + fun findAll(rowBounds: RowBounds): List @Select("SELECT * from COR_MESSAGE WHERE ID=#{id}") @Results( diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepository.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepository.kt index 8459d7e..1b1b484 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepository.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepository.kt @@ -3,9 +3,8 @@ package io.holunda.camunda.bpm.correlate.persist.impl import io.holunda.camunda.bpm.correlate.persist.MessageEntity import io.holunda.camunda.bpm.correlate.persist.MessageRepository import mu.KLogging -import org.apache.ibatis.annotations.Mapper +import org.apache.ibatis.session.RowBounds import org.apache.ibatis.session.SqlSessionFactory -import org.apache.ibatis.transaction.TransactionFactory /** * MyBatis implementation of the message repository. @@ -15,11 +14,17 @@ class MyBatisMessageRepository( private val sqlSessionFactory: SqlSessionFactory ) : MessageRepository { - companion object: KLogging() + companion object : KLogging() - override fun findAll(pageSize: Int): List { + override fun findAllLight(page: Int, pageSize: Int): List { return sqlSessionFactory.openSession().use { - it.getMapper(MyBatisMessageMapper::class.java).findAll() + it.getMapper(MyBatisMessageMapper::class.java).findAllLightPaged(RowBounds(pageSize * page, pageSize)) + } + } + + override fun findAll(page: Int, pageSize: Int): List { + return sqlSessionFactory.openSession().use { + it.getMapper(MyBatisMessageMapper::class.java).findAll(RowBounds(pageSize * page, pageSize)) } } @@ -33,7 +38,7 @@ class MyBatisMessageRepository( return sqlSessionFactory.openSession().use { val mapper = it.getMapper(MyBatisMessageMapper::class.java) val existing = mapper.findById(message.id) - require (existing == null) { "Message with id ${message.id} already exists." } + require(existing == null) { "Message with id ${message.id} already exists." } mapper.insert(message) it.commit() } @@ -43,7 +48,7 @@ class MyBatisMessageRepository( return sqlSessionFactory.openSession().use { val mapper = it.getMapper(MyBatisMessageMapper::class.java) val existing = mapper.findById(message.id) - requireNotNull (existing) { "Could not find message with id ${message.id}" } + requireNotNull(existing) { "Could not find message with id ${message.id}" } mapper.update(message) it.commit() } diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt index 541dce8..ad594a4 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt @@ -1,6 +1,7 @@ package io.holunda.camunda.bpm.correlate import io.holunda.camunda.bpm.correlate.correlation.BatchConfigurationProperties +import io.holunda.camunda.bpm.correlate.correlation.BatchCorrelationService import io.holunda.camunda.bpm.correlate.correlation.CorrelationMetrics import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaDataSnippetExtractor import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.ChannelConfig @@ -9,6 +10,8 @@ import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.MessageMe import io.holunda.camunda.bpm.correlate.event.CamundaCorrelationEventFactory import io.holunda.camunda.bpm.correlate.event.CamundaCorrelationEventFactoryRegistry import io.holunda.camunda.bpm.correlate.ingres.IngresMetrics +import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceService +import io.holunda.camunda.bpm.correlate.persist.MessageRepository import io.holunda.camunda.bpm.correlate.persist.error.RetryingErrorHandlingProperties import io.holunda.camunda.bpm.correlate.persist.impl.MessagePersistenceProperties import mu.KLogging @@ -17,6 +20,8 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.boot.context.properties.EnableConfigurationProperties +import org.springframework.context.ApplicationContext +import org.springframework.context.ApplicationContextAware import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.core.annotation.Order @@ -31,9 +36,14 @@ import java.time.Clock ) @AutoConfigureAfter(CamundaBpmAutoConfiguration::class) @EnableConfigurationProperties(CorrelateConfigurationProperties::class) -class CamundaBpmCorrelateConfiguration { +class CamundaBpmCorrelateConfiguration : ApplicationContextAware { - companion object : KLogging() + companion object : KLogging() { + /** + * This is a dirty hack to access application context from cockpit plugins instantiated by the SPI. + */ + lateinit var applicationContext: ApplicationContext + } @ConditionalOnMissingBean @Bean @@ -80,4 +90,22 @@ class CamundaBpmCorrelateConfiguration { fun batchConfigurationProperties(correlateConfigurationProperties: CorrelateConfigurationProperties): BatchConfigurationProperties = correlateConfigurationProperties.batch + @Bean + fun camundaBpmCorrelateService( + configuration: CorrelateConfigurationProperties, + messagePersistenceService: MessagePersistenceService, + batchCorrelationService: BatchCorrelationService, + messageRepository: MessageRepository + ) = CamundaBpmCorrelateServices( + configuration, + messagePersistenceService, + batchCorrelationService, + messageRepository + ) + + + override fun setApplicationContext(applicationContext: ApplicationContext) { + CamundaBpmCorrelateConfiguration.applicationContext = applicationContext + } + } diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateServices.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateServices.kt new file mode 100644 index 0000000..b765364 --- /dev/null +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateServices.kt @@ -0,0 +1,12 @@ +package io.holunda.camunda.bpm.correlate + +import io.holunda.camunda.bpm.correlate.correlation.BatchCorrelationService +import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceService +import io.holunda.camunda.bpm.correlate.persist.MessageRepository + +class CamundaBpmCorrelateServices( + val configuration: CorrelateConfigurationProperties, + val messagePersistenceService: MessagePersistenceService, + val batchCorrelationService: BatchCorrelationService, + val messageRepository: MessageRepository +) \ No newline at end of file From 1b8e3bab8be1904aae35827162daaa52ba3060b8 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Mon, 22 Aug 2022 23:47:49 +0200 Subject: [PATCH 06/53] further react implementation of the plugin --- extension/cockpit-plugin/.babelrc | 10 + extension/cockpit-plugin/.gitignore | 2 + extension/cockpit-plugin/package-lock.json | 4836 +++++++++++++++++ extension/cockpit-plugin/package.json | 27 + extension/cockpit-plugin/pom.xml | 113 + extension/cockpit-plugin/rollup.config.js | 26 + .../frontend/correlate-message-actions.js | 31 + .../main/frontend/correlate-messages-view.js | 69 + .../src/main/frontend/correlate-table.js | 27 + .../app => frontend}/plugin.css | 2 +- .../src/main/frontend/plugin.js | 49 + .../camunda/bpm/correlate/dto/NextRetryDto.kt | 5 + .../camunda/bpm/correlate/dto/RetriesDto.kt | 3 + .../resources/CorrelateMessageResource.kt | 25 +- .../correlate-cockpit-plugin/app/plugin.js | 145 - .../persist/impl/MessageManagementService.kt | 54 +- .../CamundaBpmCorrelateConfiguration.kt | 13 +- .../correlate/CamundaBpmCorrelateServices.kt | 4 +- .../BatchCorrelationSchedulerConfiguration.kt | 11 +- 19 files changed, 5288 insertions(+), 164 deletions(-) create mode 100644 extension/cockpit-plugin/.babelrc create mode 100644 extension/cockpit-plugin/.gitignore create mode 100644 extension/cockpit-plugin/package-lock.json create mode 100644 extension/cockpit-plugin/package.json create mode 100644 extension/cockpit-plugin/rollup.config.js create mode 100644 extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js create mode 100644 extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js create mode 100644 extension/cockpit-plugin/src/main/frontend/correlate-table.js rename extension/cockpit-plugin/src/main/{resources/plugin-webapp/correlate-cockpit-plugin/app => frontend}/plugin.css (98%) create mode 100644 extension/cockpit-plugin/src/main/frontend/plugin.js create mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/NextRetryDto.kt create mode 100644 extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/RetriesDto.kt delete mode 100644 extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js diff --git a/extension/cockpit-plugin/.babelrc b/extension/cockpit-plugin/.babelrc new file mode 100644 index 0000000..93e6a93 --- /dev/null +++ b/extension/cockpit-plugin/.babelrc @@ -0,0 +1,10 @@ +{ + "presets": [ + "@babel/preset-env", + "@babel/preset-react" + ], + "exclude": "node_modules/**", + "plugins": [ + "@babel/plugin-transform-runtime" + ] +} diff --git a/extension/cockpit-plugin/.gitignore b/extension/cockpit-plugin/.gitignore new file mode 100644 index 0000000..e7f62f0 --- /dev/null +++ b/extension/cockpit-plugin/.gitignore @@ -0,0 +1,2 @@ +node/ +node_modules/ diff --git a/extension/cockpit-plugin/package-lock.json b/extension/cockpit-plugin/package-lock.json new file mode 100644 index 0000000..8216e7d --- /dev/null +++ b/extension/cockpit-plugin/package-lock.json @@ -0,0 +1,4836 @@ +{ + "name": "correlate-cokpit-plugin", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "correlate-cokpit-plugin", + "version": "1.0.0", + "license": "APACHE 2.0", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@babel/core": "~7.18.10", + "@babel/plugin-transform-runtime": "~7.18.10", + "@babel/preset-env": "~7.18.10", + "@babel/preset-react": "~7.18.6", + "@rollup/plugin-babel": "~5.3.1", + "@rollup/plugin-commonjs": "~22.0.2", + "@rollup/plugin-node-resolve": "~13.3.0", + "@rollup/plugin-replace": "~4.0.0", + "rollup": "~2.78.1", + "rollup-plugin-scss": "~3.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", + "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "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==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", + "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.11", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", + "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@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", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "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-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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "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-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-plugin-utils": "^7.10.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-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" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@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" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "dev": true, + "dependencies": { + "@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" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", + "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", + "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "dependencies": { + "@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" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", + "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@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.18.10", + "@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.18.9", + "@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", + "@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.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-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.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", + "@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.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@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.18.9", + "@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.18.10", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "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" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "22.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz", + "integrity": "sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^2.42.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-4.0.0.tgz", + "integrity": "sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.7.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.9.tgz", + "integrity": "sha512-0N5Y1XAdcl865nDdjbO0m3T6FdmQ4ijE89/urOHLREyTXbpMWbSafx9y7XIsgWGtwUP2iYTinLyyW3FatAxBLQ==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", + "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.2", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", + "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001381", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001381.tgz", + "integrity": "sha512-fEnkDOKpvp6qc+olg7+NzE1SqyfiyKf4uci7fAU38M3zxs0YOyKOxW/nMZ2l9sJbt7KZHcDIxUnbI0Iime7V4w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/core-js-compat": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", + "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.3", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.225", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz", + "integrity": "sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.78.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", + "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-scss": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-scss/-/rollup-plugin-scss-3.0.0.tgz", + "integrity": "sha512-UldNaNHEon2a5IusHvj/Nnwc7q13YDvbFxz5pfNbHBNStxGoUNyM+0XwAA/UafJ1u8XRPGdBMrhWFthrrGZdWQ==", + "dev": true, + "dependencies": { + "rollup-pluginutils": "^2.3.3" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true + }, + "@babel/core": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", + "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "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==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.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==", + "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.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "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==", + "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-replace-supers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", + "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.11", + "@babel/types": "^7.18.10" + } + }, + "@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", + "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@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", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@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.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@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.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + } + }, + "@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.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@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==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@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==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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==", + "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/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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", + "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.10" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", + "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", + "semver": "^6.3.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", + "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@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.18.10", + "@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.18.9", + "@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", + "@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.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-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.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", + "@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.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@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.18.9", + "@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.18.10", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + } + }, + "@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==", + "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" + } + }, + "@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@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==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "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==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-commonjs": { + "version": "22.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz", + "integrity": "sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/plugin-replace": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-4.0.0.tgz", + "integrity": "sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/node": { + "version": "18.7.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.9.tgz", + "integrity": "sha512-0N5Y1XAdcl865nDdjbO0m3T6FdmQ4ijE89/urOHLREyTXbpMWbSafx9y7XIsgWGtwUP2iYTinLyyW3FatAxBLQ==", + "dev": true + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", + "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.2", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.2", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", + "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.2" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + } + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caniuse-lite": { + "version": "1.0.30001381", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001381.tgz", + "integrity": "sha512-fEnkDOKpvp6qc+olg7+NzE1SqyfiyKf4uci7fAU38M3zxs0YOyKOxW/nMZ2l9sJbt7KZHcDIxUnbI0Iime7V4w==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js-compat": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", + "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "dev": true, + "requires": { + "browserslist": "^4.21.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "electron-to-chromium": { + "version": "1.4.225", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz", + "integrity": "sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpu-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rollup": { + "version": "2.78.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", + "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-scss": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-scss/-/rollup-plugin-scss-3.0.0.tgz", + "integrity": "sha512-UldNaNHEon2a5IusHvj/Nnwc7q13YDvbFxz5pfNbHBNStxGoUNyM+0XwAA/UafJ1u8XRPGdBMrhWFthrrGZdWQ==", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.3.3" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + } +} diff --git a/extension/cockpit-plugin/package.json b/extension/cockpit-plugin/package.json new file mode 100644 index 0000000..177d1bd --- /dev/null +++ b/extension/cockpit-plugin/package.json @@ -0,0 +1,27 @@ +{ + "name": "correlate-cokpit-plugin", + "version": "1.0.0", + "description": "", + "main": "plugin.js", + "scripts": { + "build": "rollup -c" + }, + "author": "Holunda.io", + "license": "APACHE 2.0", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@babel/core": "~7.18.10", + "@babel/plugin-transform-runtime": "~7.18.10", + "@babel/preset-env": "~7.18.10", + "@babel/preset-react": "~7.18.6", + "@rollup/plugin-babel": "~5.3.1", + "@rollup/plugin-commonjs": "~22.0.2", + "@rollup/plugin-node-resolve": "~13.3.0", + "@rollup/plugin-replace": "~4.0.0", + "rollup": "~2.78.1", + "rollup-plugin-scss": "~3.0.0" + } +} diff --git a/extension/cockpit-plugin/pom.xml b/extension/cockpit-plugin/pom.xml index 274c0b2..066b37b 100644 --- a/extension/cockpit-plugin/pom.xml +++ b/extension/cockpit-plugin/pom.xml @@ -14,6 +14,9 @@ jar + 8.1.2 + v16.13.2 + Monitoring screenshot.png @@ -71,5 +74,115 @@ ${project.artifactId} + + + + org.apache.maven.plugins + maven-resources-plugin + 3.2.0 + + + com.github.eirslett + frontend-maven-plugin + 1.12.1 + + + + + + + com.github.eirslett + frontend-maven-plugin + + + npm build + compile + + npm + + + run build + + + + + + + + + src/main/frontend/ + plugin-webapp/correlate-cockpit-plugin/app + + *.* + + + *.js + + + + + + + + node-and-npm + + + node + + + + + + + com.github.eirslett + frontend-maven-plugin + + + install node and npm + + install-node-and-npm + + initialize + + ${npm.version} + ${node.version} + + + + + + + + + + npm-install + + + node_modules + + + + + + com.github.eirslett + frontend-maven-plugin + + + npm install + + npm + + initialize + + install + + + + + + + + + diff --git a/extension/cockpit-plugin/rollup.config.js b/extension/cockpit-plugin/rollup.config.js new file mode 100644 index 0000000..b08312f --- /dev/null +++ b/extension/cockpit-plugin/rollup.config.js @@ -0,0 +1,26 @@ +import resolve from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; +import replace from "@rollup/plugin-replace"; +import babel from "@rollup/plugin-babel"; + +export default { + input: "src/main/frontend/plugin.js", + output: { + file: "target/classes/plugin-webapp/correlate-cockpit-plugin/app/plugin.js" + }, + plugins: [ + resolve(), + babel({ + babelHelpers: "runtime", + skipPreflightCheck: true, + compact: true + }), + commonjs({ + include: "node_modules/**" + }), + replace({ + "process.env.NODE_ENV": JSON.stringify("production"), + preventAssignment: true + }) + ] +}; diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js new file mode 100644 index 0000000..d37820f --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js @@ -0,0 +1,31 @@ +import React, {useEffect, useState} from "react"; + +function CorrelateMessageActions({camundaRestPrefix, message, maxRetries}) { + + return ( + {message.error ? () : null} + {message.nextRetry ? () : null} + {message.retries === maxRetries ? () : null} + ); +} + +function showStacktrace(stackTrace) { + console.log('stacktrace', stackTrace); +} + +function modifyNextRetry(messageId) { + console.log('nextRetry', messageId); +} + +function decreaseRetries(messageId) { + console.log('decrease', messageId); +} + + +export default CorrelateMessageActions; diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js new file mode 100644 index 0000000..4b96d34 --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js @@ -0,0 +1,69 @@ +import React, {useEffect, useState} from "react"; +import CorrelateMessagesTable from "./correlate-table"; +import CorrelateMessageActions from "./correlate-message-actions"; + +function formatDate(date) { + if (!date) { + return null; + } + let split = date.split('T'); + return split[0] + ' ' + split[1].split('.')[0]; +} + +function CorrelateMessagesView({camundaRestPrefix}) { + + const [opLog, setOpLog] = useState(); + + useEffect(() => { + fetch( + `${camundaRestPrefix}/configuration` + ).then(async res => { + const configuration = await res.json(); + fetch( + `${camundaRestPrefix}/messages?page=0&size=100` + ).then(async res => { + setOpLog({messages: await res.json(), configuration: configuration}); + }).catch(err => { + console.error(err); + }); + }).catch(err => { + console.error(err); + }); + }); + + if (!opLog) { + return
Loading...
; + } + + return (
+
+
+
+
+

Messages

+ { + const insertedDate = formatDate(element.inserted); + let nextRetry = ''; + if (element.nextRetry) { + nextRetry = formatDate(element.nextRetry); + } + return ( + {element.id} + {element.payloadTypeNamespace}
.{element.payloadTypeName} + {insertedDate} + {element.retries} + {nextRetry} + + ); + }) + }/> +
+
+
+
+
); +} + +export default CorrelateMessagesView; diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.js b/extension/cockpit-plugin/src/main/frontend/correlate-table.js new file mode 100644 index 0000000..d4c9b39 --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/correlate-table.js @@ -0,0 +1,27 @@ +import React from "react"; + + +function CorrelateMessagesTable({ children }) { + + if (!children || children.length === 0) { + children = ( + No messages in the inbox + ); + } + + return ( + + + + + + + + + + + {children} +
IDTypeInsertedRetriesNext RetryActions
); +} + +export default CorrelateMessagesTable; diff --git a/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.css b/extension/cockpit-plugin/src/main/frontend/plugin.css similarity index 98% rename from extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.css rename to extension/cockpit-plugin/src/main/frontend/plugin.css index af873e9..f080903 100644 --- a/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.css +++ b/extension/cockpit-plugin/src/main/frontend/plugin.css @@ -11,4 +11,4 @@ text-align: center; font-style: italic; margin: 5px; -} \ No newline at end of file +} diff --git a/extension/cockpit-plugin/src/main/frontend/plugin.js b/extension/cockpit-plugin/src/main/frontend/plugin.js new file mode 100644 index 0000000..50b89cf --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/plugin.js @@ -0,0 +1,49 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import CorrelateMessagesView from "./correlate-messages-view"; + +let container; + +const correlateView = { + id: 'correlate-cockpit-plugin-route', + pluginPoint: 'cockpit.route', + priority: 4, + properties: { + path: '/correlation' + }, + render: (node, {api}) => { + container = node; + const urlPrefix = `${api.cockpitApi}/plugin/correlate-cockpit-plugin/${api.engine}`; + ReactDOM.render( + , + container + ); + }, + unmount: () => { + ReactDOM.unmountComponentAtNode(container); + } +}; + +const navigation = { + id: 'correlate-cockpit-plugin-navigation', + pluginPoint: 'cockpit.navigation', + priority: 4, + properties: { + path: '/correlation' + }, + render: (container) => { + container.innerHTML = 'Correlation'; + } +}; + +// TODO: add metrics +const metrics = { + id: 'correlate-cockpit-plugin-metrics', + pluginPoint: 'cockpit.metrics', + priority: 4, + render: (container) => { + container.innerHTML = '
Metrics
'; + } +}; + +export default [correlateView, navigation]; diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/NextRetryDto.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/NextRetryDto.kt new file mode 100644 index 0000000..c7b94f3 --- /dev/null +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/NextRetryDto.kt @@ -0,0 +1,5 @@ +package io.holunda.camunda.bpm.correlate.dto + +import java.time.Instant + +data class NextRetryDto(var nextRetry: Instant) diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/RetriesDto.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/RetriesDto.kt new file mode 100644 index 0000000..4a8f069 --- /dev/null +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/RetriesDto.kt @@ -0,0 +1,3 @@ +package io.holunda.camunda.bpm.correlate.dto + +data class RetriesDto(var retries: Int) diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt index 2776fff..c141e37 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt @@ -2,12 +2,12 @@ package io.holunda.camunda.bpm.correlate.resources import io.holunda.camunda.bpm.correlate.CamundaBpmCorrelateServices import io.holunda.camunda.bpm.correlate.dto.MessageDto +import io.holunda.camunda.bpm.correlate.dto.NextRetryDto +import io.holunda.camunda.bpm.correlate.dto.RetriesDto import io.holunda.camunda.bpm.correlate.dto.toDto import io.holunda.camunda.bpm.correlate.getBean import org.camunda.bpm.cockpit.plugin.resource.AbstractCockpitPluginResource -import javax.ws.rs.GET -import javax.ws.rs.Produces -import javax.ws.rs.QueryParam +import javax.ws.rs.* import javax.ws.rs.core.MediaType /** @@ -23,4 +23,23 @@ class CorrelateMessageResource(engineName: String) : AbstractCockpitPluginResour return services.messageRepository.findAllLight(page, size).map { it.toDto() } } + @POST + @Path("{messageId}/nextRetry") + @Consumes(MediaType.APPLICATION_JSON) + fun changeMassageNextRetry(@PathParam("messageId") messageId: String, nextRetryDto: NextRetryDto) { + services.messageManagementService.changeMessageNextRetry(messageId, nextRetryDto.nextRetry) + } + + @POST + @Path("{messageId}/retries") + @Consumes(MediaType.APPLICATION_JSON) + fun changeMassageRetries(@PathParam("messageId") messageId: String, retriesDto: RetriesDto) { + services.messageManagementService.changeMessageRetryAttempt(messageId, retriesDto.retries) + } + + @DELETE + @Path("{messageId}") + fun deleteMessage(@PathParam("messageId") messageId: String) { + services.messageManagementService.deleteMessage(messageId) + } } diff --git a/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js b/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js deleted file mode 100644 index 07e3f97..0000000 --- a/extension/cockpit-plugin/src/main/resources/plugin-webapp/correlate-cockpit-plugin/app/plugin.js +++ /dev/null @@ -1,145 +0,0 @@ -function showStacktrace(stackTrace) { - console.log('stacktrace is: ', stackTrace); -} - -function modifyNextRetry(messageId) { - console.log('should modify the next retry for message', messageId); -} - -function decreaseRetries(messageId) { - console.log('should modify retries for message', messageId); -} - -function formatDate(date) { - if (!date) { - return null; - } - let split = date.split('T'); - return split[0] + ' ' + split[1].split('.')[0]; -} - - -function generatePage(configuration, messages) { - let messageTableBody = messages - .map(element => { - - let actionButtons = ''; - let nextRetry = ''; - let retries = element.retries; - - if (element.error) { - const stackTrace = element.error ? element.error : ''; - actionButtons += ``; - } - - if (element.nextRetry) { - nextRetry = formatDate(element.nextRetry); - actionButtons += ``; - } - - if (element.retries === configuration.maxRetries) { - actionButtons += ``; - } - - const insertedDate = formatDate(element.inserted); - - return ` - ${element.id} - ${element.payloadTypeNamespace}
.${element.payloadTypeName} - ${insertedDate} - ${retries} - ${nextRetry} - ${actionButtons} - `; - }) - .join('\n'); - - if (messageTableBody.length === 0) { - messageTableBody = `No messages in the inbox`; - } - - return ` -
-
-
-
-
-

Messages

- - - - - - - - - - - - - ${messageTableBody} - -
IDTypeInsertedRetriesNext RetryActions
-
-
-
-
-
`; -} - -const correlateTab = { - id: 'correlate-cockpit-plugin-route', - pluginPoint: 'cockpit.route', - priority: 4, - properties: { - path: '/correlation' - }, - render: (container, { api }) => { - const urlPrefix = `${api.cockpitApi}/plugin/correlate-cockpit-plugin/${api.engine}` - fetch( - `${urlPrefix}/configuration` - ).then(async res => { - const configuration = await res.json(); - fetch( - `${urlPrefix}/messages?page=0&size=100` - ).then(async res => { - const json = await res.json(); - container.innerHTML = generatePage(configuration.maxRetries, json); - }).catch(err => { - console.error(err); - }); - }).catch(err => { - console.error(err); - }); - } -}; - -const navigation = { - id: 'correlate-cockpit-plugin-navigation', - pluginPoint: 'cockpit.navigation', - priority: 4, - properties: { - path: '/correlation' - }, - render: (container) => { - container.innerHTML = 'Correlation'; - } -}; - -// TODO: add metrics -const metrics = { - id: 'correlate-cockpit-plugin-metrics', - pluginPoint: 'cockpit.metrics', - priority: 4, - render: (container) => { - container.innerHTML = '
Metrics
'; - } -}; - -export default [correlateTab, navigation]; diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt index 9a144eb..60d3c3d 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt @@ -4,6 +4,7 @@ import io.holunda.camunda.bpm.correlate.persist.MessageEntity import io.holunda.camunda.bpm.correlate.persist.MessageRepository import mu.KLogging import java.time.Clock +import java.time.Instant /** * Message management. @@ -14,8 +15,11 @@ class MessageManagementService( private val clock: Clock ) { - companion object: KLogging() + companion object : KLogging() + /** + * Delete expired messages. + */ fun cleanupExpired() { messageRepository.deleteAllById( messageRepository.findAllLight(page = 0, pageSize = persistenceConfig.getPageSize()) @@ -24,7 +28,55 @@ class MessageManagementService( ) } + /** + * Retrieve all messages. + */ fun listAllMessages(): List { return messageRepository.findAll(page = 0, pageSize = persistenceConfig.getPageSize()) } + + /** + * Changes next retry time of a message. + */ + fun pauseMessageProcessing(messageId: String) { + changeMessageNextRetry(messageId = messageId, nextRetry = Instant.MAX) + } + + /** + * Deletes a message. + */ + fun deleteMessage(messageId: String) { + getMessageById(messageId).also { + messageRepository.deleteAllById(listOf(messageId)) + } + } + + /** + * Changes next retry time of a message. + */ + fun changeMessageNextRetry(messageId: String, nextRetry: Instant): MessageEntity { + return getMessageById(messageId) + .also { + requireNotNull(it.nextRetry) { "Message with id $messageId has is not due for retry. Ignoring the change." } + it.nextRetry = nextRetry + messageRepository.save(it) + } + } + + /** + * Changes retry attempt count of a message. + */ + fun changeMessageRetryAttempt(messageId: String, retries: Int): MessageEntity { + return getMessageById(messageId) + .also { + it.retries = retries + messageRepository.save(it) + } + } + + fun getMessageById(messageId: String): MessageEntity { + return requireNotNull(messageRepository.findByIdOrNull(messageId)) { "Could not find message with id $messageId" } + } + } + diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt index ad594a4..9ed5665 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt @@ -13,6 +13,7 @@ import io.holunda.camunda.bpm.correlate.ingres.IngresMetrics import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceService import io.holunda.camunda.bpm.correlate.persist.MessageRepository import io.holunda.camunda.bpm.correlate.persist.error.RetryingErrorHandlingProperties +import io.holunda.camunda.bpm.correlate.persist.impl.MessageManagementService import io.holunda.camunda.bpm.correlate.persist.impl.MessagePersistenceProperties import mu.KLogging import org.camunda.bpm.spring.boot.starter.CamundaBpmAutoConfiguration @@ -95,12 +96,14 @@ class CamundaBpmCorrelateConfiguration : ApplicationContextAware { configuration: CorrelateConfigurationProperties, messagePersistenceService: MessagePersistenceService, batchCorrelationService: BatchCorrelationService, - messageRepository: MessageRepository + messageRepository: MessageRepository, + messageManagementService: MessageManagementService ) = CamundaBpmCorrelateServices( - configuration, - messagePersistenceService, - batchCorrelationService, - messageRepository + configuration = configuration, + messagePersistenceService = messagePersistenceService, + batchCorrelationService = batchCorrelationService, + messageManagementService = messageManagementService, + messageRepository = messageRepository ) diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateServices.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateServices.kt index b765364..ea3d0de 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateServices.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateServices.kt @@ -3,10 +3,12 @@ package io.holunda.camunda.bpm.correlate import io.holunda.camunda.bpm.correlate.correlation.BatchCorrelationService import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceService import io.holunda.camunda.bpm.correlate.persist.MessageRepository +import io.holunda.camunda.bpm.correlate.persist.impl.MessageManagementService class CamundaBpmCorrelateServices( val configuration: CorrelateConfigurationProperties, val messagePersistenceService: MessagePersistenceService, val batchCorrelationService: BatchCorrelationService, + val messageManagementService: MessageManagementService, val messageRepository: MessageRepository -) \ No newline at end of file +) diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt index bdafd51..e201dba 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt @@ -3,23 +3,18 @@ package io.holunda.camunda.bpm.correlate.correlation import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceConfiguration import io.holunda.camunda.bpm.correlate.persist.impl.MessageManagementService import mu.KLogging -import net.javacrumbs.shedlock.core.LockProvider -import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider import net.javacrumbs.shedlock.spring.annotation.SchedulerLock import org.springframework.beans.factory.annotation.Qualifier import org.springframework.boot.autoconfigure.AutoConfigureAfter import org.springframework.boot.autoconfigure.condition.ConditionalOnBean -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.jdbc.core.JdbcTemplate import org.springframework.scheduling.annotation.EnableScheduling import org.springframework.scheduling.annotation.Scheduled import org.springframework.scheduling.annotation.SchedulingConfigurer import org.springframework.scheduling.config.ScheduledTaskRegistrar import java.util.concurrent.Executor import java.util.concurrent.Executors -import javax.sql.DataSource @Configuration @@ -28,7 +23,7 @@ import javax.sql.DataSource @ConditionalOnBean(name = ["batchConfigurationProperties"]) class BatchCorrelationSchedulerConfiguration( private val batchCorrelationProcessor: BatchCorrelationProcessor, - private val messageCleanupService: MessageManagementService, + private val messageManagementService: MessageManagementService, private val batchConfigurationProperties: BatchConfigurationProperties ) : SchedulingConfigurer { @@ -47,7 +42,7 @@ class BatchCorrelationSchedulerConfiguration( fun runCorrelation() { batchCorrelationProcessor.correlate() - val remaining = messageCleanupService.listAllMessages() + val remaining = messageManagementService.listAllMessages() if (remaining.isNotEmpty()) { logger.debug { "There are ${remaining.size} messages in the message inbox." } } @@ -61,7 +56,7 @@ class BatchCorrelationSchedulerConfiguration( fixedRateString = "#{batchConfigurationProperties.cleanupPollInterval}" ) fun cleanupExpired() { - messageCleanupService.cleanupExpired() + messageManagementService.cleanupExpired() } @Bean(destroyMethod = "shutdown") From c43e5f5ddbec878633dca278bbfc0a6ae6e89731 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Tue, 23 Aug 2022 10:45:13 +0200 Subject: [PATCH 07/53] Update docs Fix #25 --- .github/workflows/docs.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f782201..cdf0a2f 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,6 +1,19 @@ name: Build the docs -on: +on:### Steps to reproduce + +* Library version: +* JDK version: +* Operating system: +* Complete executable reproducer: (e.g. GitHub Repo) +* Steps: (what exactly are you doing with the above reproducer?) + +### Expected behaviour + +### Actual behaviour + +(In case of exceptions provide full stack trace) + push: branches: - develop @@ -70,4 +83,4 @@ jobs: # This is for develop - name: Deploy latest develop snapshot docs to GH pages. if: github.ref == 'refs/heads/develop' - run: mike deploy snapshot --push --rebase + run: mike deploy snapshot --push --rebase --update-aliases From b61d156144aae48bd58e3b6f0835b059cf250073 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Tue, 23 Aug 2022 13:31:33 +0200 Subject: [PATCH 08/53] better react --- extension/cockpit-plugin/pom.xml | 2 +- .../frontend/correlate-message-actions.js | 10 +- .../main/frontend/correlate-messages-view.js | 91 +++++++++---------- .../src/main/frontend/correlate-table.js | 42 +++++++-- .../CamundaBpmCorrelateCockpitPlugin.kt | 8 +- ...munda.bpm.cockpit.plugin.spi.CockpitPlugin | 1 + 6 files changed, 92 insertions(+), 62 deletions(-) diff --git a/extension/cockpit-plugin/pom.xml b/extension/cockpit-plugin/pom.xml index 066b37b..9713533 100644 --- a/extension/cockpit-plugin/pom.xml +++ b/extension/cockpit-plugin/pom.xml @@ -113,7 +113,7 @@ src/main/frontend/ plugin-webapp/correlate-cockpit-plugin/app - *.* + **/*.* *.js diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js index d37820f..9fd6e88 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js @@ -1,6 +1,11 @@ import React, {useEffect, useState} from "react"; -function CorrelateMessageActions({camundaRestPrefix, message, maxRetries}) { +function CorrelateMessageActions({camundaRestPrefix, message, maxRetries, reload}) { + + const handleDelete = async () => { + await fetch(`${camundaRestPrefix}/messages/${message.id}`, { method: 'DELETE' }) + reload(); + } return ( {message.error ? () : null} + ); } diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js index 4b96d34..b22aaa8 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js @@ -1,35 +1,8 @@ -import React, {useEffect, useState} from "react"; +import React, {useEffect, useState, useCallback} from "react"; import CorrelateMessagesTable from "./correlate-table"; -import CorrelateMessageActions from "./correlate-message-actions"; - -function formatDate(date) { - if (!date) { - return null; - } - let split = date.split('T'); - return split[0] + ' ' + split[1].split('.')[0]; -} function CorrelateMessagesView({camundaRestPrefix}) { - - const [opLog, setOpLog] = useState(); - - useEffect(() => { - fetch( - `${camundaRestPrefix}/configuration` - ).then(async res => { - const configuration = await res.json(); - fetch( - `${camundaRestPrefix}/messages?page=0&size=100` - ).then(async res => { - setOpLog({messages: await res.json(), configuration: configuration}); - }).catch(err => { - console.error(err); - }); - }).catch(err => { - console.error(err); - }); - }); + const { opLog, reload } = useOpLog(camundaRestPrefix); if (!opLog) { return
Loading...
; @@ -41,24 +14,12 @@ function CorrelateMessagesView({camundaRestPrefix}) {

Messages

- { - const insertedDate = formatDate(element.inserted); - let nextRetry = ''; - if (element.nextRetry) { - nextRetry = formatDate(element.nextRetry); - } - return ( - {element.id} - {element.payloadTypeNamespace}
.{element.payloadTypeName} - {insertedDate} - {element.retries} - {nextRetry} - - ); - }) - }/> +
@@ -66,4 +27,40 @@ function CorrelateMessagesView({camundaRestPrefix}) { ); } +function useOpLog(camundaRestPrefix) { + const [opLog, setOpLog] = useState(); + + const loadOpLog = useCallback(async () => { + setOpLog(await loadMessages(camundaRestPrefix)); + }, [camundaRestPrefix]) + + useEffect(() => { + loadOpLog(); + }, []); + + return { + opLog, + reload: loadOpLog + }; +} + +async function loadMessages(camundaRestPrefix) { + try { + const [configurationRes, messagesRes] = await Promise.all([ + fetch( + `${camundaRestPrefix}/configuration` + ), + fetch( + `${camundaRestPrefix}/messages?page=0&size=100` + ) + ]); + return { + messages: await messagesRes.json(), + configuration: await configurationRes.json(), + } + } catch (error) { + console.error(error); + } +} + export default CorrelateMessagesView; diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.js b/extension/cockpit-plugin/src/main/frontend/correlate-table.js index d4c9b39..8c85d30 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-table.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-table.js @@ -1,14 +1,8 @@ import React from "react"; +import CorrelateMessageActions from "./correlate-message-actions"; -function CorrelateMessagesTable({ children }) { - - if (!children || children.length === 0) { - children = ( - No messages in the inbox - ); - } - +function CorrelateMessagesTable({ messages, maxRetries, camundaRestPrefix }) { return ( @@ -20,8 +14,38 @@ function CorrelateMessagesTable({ children }) { - {children} + + {!messages || messages.length === 0 ? ( + + + + ) : null} + {messages?.map(element => ( + + ))} +
Actions
No messages in the inbox
); } +function MessageRow({ camundaRestPrefix, maxRetries, element }) { + return ( + + {element.id} + {element.payloadTypeNamespace}
.{element.payloadTypeName} + {formatDate(element.inserted)} + {element.retries} + {element.nextRetry ? formatDate(element.nextRetry) : null} + + + ) +} + +function formatDate(date) { + if (!date) { + return null; + } + let split = date.split('T'); + return split[0] + ' ' + split[1].split('.')[0]; +} + export default CorrelateMessagesTable; diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt index f3cf343..bb032d5 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt @@ -16,7 +16,7 @@ class CamundaBpmCorrelateCockpitPlugin : AbstractCockpitPlugin() { } init { - logger.info { "[Camunda CORRELATE] Cockpit plugin activated." } + logger.warn { "[Camunda CORRELATE] Cockpit plugin activated." } } override fun getId(): String = ID @@ -26,7 +26,7 @@ class CamundaBpmCorrelateCockpitPlugin : AbstractCockpitPlugin() { ) override fun getMappingFiles(): List { - return listOf("${PREFIX.replace(".", "/")}/cockpit-plugin-query.xml") + return listOf() } } @@ -38,10 +38,10 @@ fun getApplicationContext(): ApplicationContext { return requireNotNull(CamundaBpmCorrelateConfiguration.applicationContext) { "Spring application context could not be found." } } -inline fun AbstractCockpitPluginResource.getBean(clazz: KClass): T { +inline fun AbstractCockpitPluginResource.getBean(clazz: KClass): T { return getApplicationContext().getBean(clazz.java) } -inline fun AbstractCockpitPluginRootResource.getBean(clazz: KClass): T { +inline fun AbstractCockpitPluginRootResource.getBean(clazz: KClass): T { return getApplicationContext().getBean(clazz.java) } diff --git a/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin b/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin index 9510d28..4c53290 100644 --- a/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin +++ b/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin @@ -1 +1,2 @@ io.holunda.camunda.bpm.correlate.CamundaBpmCorrelateCockpitPlugin + From ae3126d19cd2782a407039d341ceb4766a8797bf Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Tue, 23 Aug 2022 19:08:13 +0200 Subject: [PATCH 09/53] more cockpit functionality --- .../application-camunda-correlate.yml | 2 +- .../example/kafka/domain/SerializationTest.kt | 2 +- extension/cockpit-plugin/package-lock.json | 159 ++++++++++++++++++ extension/cockpit-plugin/package.json | 3 +- extension/cockpit-plugin/pom.xml | 41 ++--- .../src/main/{frontend => assets}/plugin.css | 16 ++ .../frontend/correlate-message-actions.js | 49 ++++-- .../main/frontend/correlate-messages-view.js | 60 ++++--- .../src/main/frontend/correlate-table.js | 44 ++++- .../CamundaBpmCorrelateCockpitPlugin.kt | 2 +- .../camunda/bpm/correlate/dto/MessageDto.kt | 39 +++-- ...daBpmCorrelateCockpitPluginRootResource.kt | 4 +- .../resources/CorrelateMessageResource.kt | 26 ++- ...munda.bpm.cockpit.plugin.spi.CockpitPlugin | 1 - .../bpm/correlate/cockpit-plugin-query.xml | 23 --- .../bpm/correlate/persist/MessageEntity.kt | 27 +++ .../bpm/correlate/persist/MessageStatus.kt | 11 ++ .../bpm/correlate/persist/RetryInfo.kt | 7 +- .../persist/impl/MessageManagementService.kt | 12 +- .../persist/MessageEntityStatusTest.kt | 62 +++++++ .../CamundaBpmCorrelateConfiguration.kt | 14 ++ 21 files changed, 477 insertions(+), 127 deletions(-) rename example/spring-cloud/reservation-kafka/src/test/kotlin/io/holunda/camunda/{bpm => }/example/kafka/domain/SerializationTest.kt (98%) rename extension/cockpit-plugin/src/main/{frontend => assets}/plugin.css (60%) delete mode 100644 extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml create mode 100644 extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageStatus.kt create mode 100644 extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntityStatusTest.kt diff --git a/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml b/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml index 023bc3c..d80de53 100644 --- a/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml +++ b/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml @@ -15,7 +15,7 @@ correlate: # timeToLiveAsString: PT10S # errors during TTL seconds after receiving are ignored payloadEncoding: jackson # our bytes are actually JSON written by Jackson. batch: - mode: all # default fail_first -> 'all' will correlate one message after another, resulting in ignoring the order of receiving + mode: fail_first # default fail_first -> 'all' will correlate one message after another, resulting in ignoring the order of receiving query: # query scheduler pollInitialDelay: PT10S pollInterval: PT6S diff --git a/example/spring-cloud/reservation-kafka/src/test/kotlin/io/holunda/camunda/bpm/example/kafka/domain/SerializationTest.kt b/example/spring-cloud/reservation-kafka/src/test/kotlin/io/holunda/camunda/example/kafka/domain/SerializationTest.kt similarity index 98% rename from example/spring-cloud/reservation-kafka/src/test/kotlin/io/holunda/camunda/bpm/example/kafka/domain/SerializationTest.kt rename to example/spring-cloud/reservation-kafka/src/test/kotlin/io/holunda/camunda/example/kafka/domain/SerializationTest.kt index 4a6a4e4..e2df8e6 100644 --- a/example/spring-cloud/reservation-kafka/src/test/kotlin/io/holunda/camunda/bpm/example/kafka/domain/SerializationTest.kt +++ b/example/spring-cloud/reservation-kafka/src/test/kotlin/io/holunda/camunda/example/kafka/domain/SerializationTest.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.example.kafka.domain +package io.holunda.camunda.example.kafka.domain import com.fasterxml.jackson.databind.SerializationFeature import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper diff --git a/extension/cockpit-plugin/package-lock.json b/extension/cockpit-plugin/package-lock.json index 8216e7d..8fae5c1 100644 --- a/extension/cockpit-plugin/package-lock.json +++ b/extension/cockpit-plugin/package-lock.json @@ -10,6 +10,7 @@ "license": "APACHE 2.0", "dependencies": { "react": "^18.2.0", + "react-cookie": "^4.1.1", "react-dom": "^18.2.0" }, "devDependencies": { @@ -1890,18 +1891,47 @@ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "node_modules/@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" + }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/node": { "version": "18.7.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.9.tgz", "integrity": "sha512-0N5Y1XAdcl865nDdjbO0m3T6FdmQ4ijE89/urOHLREyTXbpMWbSafx9y7XIsgWGtwUP2iYTinLyyW3FatAxBLQ==", "dev": true }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/react": { + "version": "18.0.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.17.tgz", + "integrity": "sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -1911,6 +1941,11 @@ "@types/node": "*" } }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -2106,6 +2141,14 @@ "safe-buffer": "~5.1.1" } }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/core-js-compat": { "version": "3.24.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", @@ -2129,6 +2172,11 @@ "semver": "bin/semver.js" } }, + "node_modules/csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2333,6 +2381,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2550,6 +2606,19 @@ "node": ">=0.10.0" } }, + "node_modules/react-cookie": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz", + "integrity": "sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.0.1", + "hoist-non-react-statics": "^3.0.0", + "universal-cookie": "^4.0.0" + }, + "peerDependencies": { + "react": ">= 16.3.0" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -2562,6 +2631,11 @@ "react": "^18.2.0" } }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -2797,6 +2871,15 @@ "node": ">=4" } }, + "node_modules/universal-cookie": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", + "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", + "dependencies": { + "@types/cookie": "^0.3.3", + "cookie": "^0.4.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", @@ -4125,18 +4208,47 @@ } } }, + "@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" + }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "@types/node": { "version": "18.7.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.9.tgz", "integrity": "sha512-0N5Y1XAdcl865nDdjbO0m3T6FdmQ4ijE89/urOHLREyTXbpMWbSafx9y7XIsgWGtwUP2iYTinLyyW3FatAxBLQ==", "dev": true }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/react": { + "version": "18.0.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.17.tgz", + "integrity": "sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -4146,6 +4258,11 @@ "@types/node": "*" } }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -4291,6 +4408,11 @@ "safe-buffer": "~5.1.1" } }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, "core-js-compat": { "version": "3.24.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", @@ -4309,6 +4431,11 @@ } } }, + "csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4450,6 +4577,14 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4619,6 +4754,16 @@ "loose-envify": "^1.1.0" } }, + "react-cookie": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz", + "integrity": "sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A==", + "requires": { + "@types/hoist-non-react-statics": "^3.0.1", + "hoist-non-react-statics": "^3.0.0", + "universal-cookie": "^4.0.0" + } + }, "react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -4628,6 +4773,11 @@ "scheduler": "^0.23.0" } }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -4816,6 +4966,15 @@ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, + "universal-cookie": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", + "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", + "requires": { + "@types/cookie": "^0.3.3", + "cookie": "^0.4.0" + } + }, "update-browserslist-db": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", diff --git a/extension/cockpit-plugin/package.json b/extension/cockpit-plugin/package.json index 177d1bd..2e7e202 100644 --- a/extension/cockpit-plugin/package.json +++ b/extension/cockpit-plugin/package.json @@ -10,7 +10,8 @@ "license": "APACHE 2.0", "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-cookie": "^4.1.1" }, "devDependencies": { "@babel/core": "~7.18.10", diff --git a/extension/cockpit-plugin/pom.xml b/extension/cockpit-plugin/pom.xml index 9713533..3203c37 100644 --- a/extension/cockpit-plugin/pom.xml +++ b/extension/cockpit-plugin/pom.xml @@ -62,24 +62,39 @@ io.holunda camunda-bpm-correlate-spring-boot-starter ${project.version} - provided - - - org.springframework - spring-web - provided + + compile ${project.artifactId} + clean install org.apache.maven.plugins maven-resources-plugin 3.2.0 + + + copy-assets + process-resources + + copy-resources + + + ${project.build.directory}/classes/plugin-webapp/correlate-cockpit-plugin/app + + + src/main/assets + false + + + + + com.github.eirslett @@ -107,20 +122,6 @@ - - - - src/main/frontend/ - plugin-webapp/correlate-cockpit-plugin/app - - **/*.* - - - *.js - - - - diff --git a/extension/cockpit-plugin/src/main/frontend/plugin.css b/extension/cockpit-plugin/src/main/assets/plugin.css similarity index 60% rename from extension/cockpit-plugin/src/main/frontend/plugin.css rename to extension/cockpit-plugin/src/main/assets/plugin.css index f080903..b8f90bb 100644 --- a/extension/cockpit-plugin/src/main/frontend/plugin.css +++ b/extension/cockpit-plugin/src/main/assets/plugin.css @@ -12,3 +12,19 @@ font-style: italic; margin: 5px; } + +.green { + color: green; +} + +.blue { + color: blue; +} + +.red { + color: red; +} + +.orange { + color: orange; +} \ No newline at end of file diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js index 9fd6e88..fdecf10 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js @@ -1,39 +1,52 @@ import React, {useEffect, useState} from "react"; +import { useCookies } from 'react-cookie'; -function CorrelateMessageActions({camundaRestPrefix, message, maxRetries, reload}) { +function CorrelateMessageActions({camundaRestPrefix, message, reload}) { + + const [cookies] = useCookies(['XSRF-TOKEN']); const handleDelete = async () => { - await fetch(`${camundaRestPrefix}/messages/${message.id}`, { method: 'DELETE' }) + await fetch(`${camundaRestPrefix}/messages/${message.id}`, { method: 'DELETE', headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); reload(); } + const handlePause = async () => { + const method = (message.status === 'PAUSED') ? 'DELETE' : 'PUT' + await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, { method: method, headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); + reload(); + } + + const showStacktrace = () => { + console.log('stacktrace', message.error); + } + + const modifyNextRetry = () => { + console.log('nextRetry', message.id); + } + + const decreaseRetries = () => { + console.log('decrease', message.id); + } + + return ( - {message.error ? () : null} - {message.nextRetry ? () : null} - {message.retries === maxRetries ? () : null} - ); -} - -function showStacktrace(stackTrace) { - console.log('stacktrace', stackTrace); -} - -function modifyNextRetry(messageId) { - console.log('nextRetry', messageId); -} + -function decreaseRetries(messageId) { - console.log('decrease', messageId); + ); } - export default CorrelateMessageActions; diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js index b22aaa8..adc1bf8 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js @@ -1,12 +1,9 @@ -import React, {useEffect, useState, useCallback} from "react"; -import CorrelateMessagesTable from "./correlate-table"; +import React, {useCallback, useEffect, useState} from 'react'; +import CorrelateMessagesTable from './correlate-table'; -function CorrelateMessagesView({camundaRestPrefix}) { - const { opLog, reload } = useOpLog(camundaRestPrefix); +function CorrelateMessagesView({ camundaRestPrefix }) { - if (!opLog) { - return
Loading...
; - } + const { opLog, reload } = useOpLog(camundaRestPrefix); return (
@@ -14,12 +11,13 @@ function CorrelateMessagesView({camundaRestPrefix}) {

Messages

- + {opLog ? + :
Loading...
+ }
@@ -30,12 +28,13 @@ function CorrelateMessagesView({camundaRestPrefix}) { function useOpLog(camundaRestPrefix) { const [opLog, setOpLog] = useState(); - const loadOpLog = useCallback(async () => { - setOpLog(await loadMessages(camundaRestPrefix)); - }, [camundaRestPrefix]) + const loadOpLog = useCallback(async (parameters) => { + setOpLog(await fetchMessagesAndConfig(camundaRestPrefix, parameters)); + }, [camundaRestPrefix]); useEffect(() => { - loadOpLog(); + const parameters = { page: 0, size: 100 }; + loadOpLog(parameters); }, []); return { @@ -44,20 +43,25 @@ function useOpLog(camundaRestPrefix) { }; } -async function loadMessages(camundaRestPrefix) { +async function fetchMessagesAndConfig(camundaRestPrefix, parameters) { + if (!parameters) { + parameters = { page: 0, size: 100 }; + } try { - const [configurationRes, messagesRes] = await Promise.all([ - fetch( - `${camundaRestPrefix}/configuration` - ), - fetch( - `${camundaRestPrefix}/messages?page=0&size=100` - ) - ]); + const [configurationRes, messagesRes] = await Promise.all( + [ + fetch( + `${camundaRestPrefix}/configuration` + ), + fetch( + `${camundaRestPrefix}/messages?page=${parameters.page}&size=${parameters.size}` + ) + ] + ); return { messages: await messagesRes.json(), - configuration: await configurationRes.json(), - } + configuration: await configurationRes.json() + }; } catch (error) { console.error(error); } diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.js b/extension/cockpit-plugin/src/main/frontend/correlate-table.js index 8c85d30..17956bb 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-table.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-table.js @@ -1,11 +1,13 @@ -import React from "react"; -import CorrelateMessageActions from "./correlate-message-actions"; +import React from 'react'; +import CorrelateMessageActions from './correlate-message-actions'; -function CorrelateMessagesTable({ messages, maxRetries, camundaRestPrefix }) { +function CorrelateMessagesTable({ messages, camundaRestPrefix }) { + return ( + @@ -17,27 +19,28 @@ function CorrelateMessagesTable({ messages, maxRetries, camundaRestPrefix }) { {!messages || messages.length === 0 ? ( - + ) : null} {messages?.map(element => ( - + ))}
State ID Type Inserted
No messages in the inboxNo messages to correlate in the inbox
); } -function MessageRow({ camundaRestPrefix, maxRetries, element }) { +function MessageRow({ camundaRestPrefix, element }) { return ( + {statusToGlyph(element.status)} {element.id} - {element.payloadTypeNamespace}
.{element.payloadTypeName} + {element.payloadTypeNamespace}
.{element.payloadTypeName} {formatDate(element.inserted)} {element.retries} {element.nextRetry ? formatDate(element.nextRetry) : null} - + - ) + ); } function formatDate(date) { @@ -48,4 +51,27 @@ function formatDate(date) { return split[0] + ' ' + split[1].split('.')[0]; } +function statusToGlyph(state) { + let stateClass = []; + console.log('State is: ', state); + switch (state) { + case 'IN_PROGRESS': + stateClass = ['glyphicon', 'glyphicon-ok-sign', 'green']; + break; + case 'MAX_RETRIES_REACHED': + stateClass = ['glyphicon', 'glyphicon-remove-sign', 'red']; + break; + case 'PAUSED': + stateClass = ['glyphicon', 'glyphicon-remove-record', 'orange']; + break; + case 'RETRYING': + stateClass = ['glyphicon', 'glyphicon-circle-arrow-right', 'blue']; + break; + default: + break; + } + + return ; +} + export default CorrelateMessagesTable; diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt index bb032d5..7c90f3b 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateCockpitPlugin.kt @@ -16,7 +16,7 @@ class CamundaBpmCorrelateCockpitPlugin : AbstractCockpitPlugin() { } init { - logger.warn { "[Camunda CORRELATE] Cockpit plugin activated." } + logger.info { "[Camunda CORRELATE] Cockpit plugin activated." } } override fun getId(): String = ID diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/MessageDto.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/MessageDto.kt index 361be26..4ca04ce 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/MessageDto.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/dto/MessageDto.kt @@ -2,37 +2,46 @@ package io.holunda.camunda.bpm.correlate.dto import io.holunda.camunda.bpm.correlate.persist.MessageEntity import java.time.Instant +import java.time.LocalDateTime +import java.time.ZoneId /** * Message DTO. */ data class MessageDto( val id: String, + val status: String, val payloadEncoding: String, val payloadTypeNamespace: String, val payloadTypeName: String, val payloadTypeRevision: String?, - val inserted: Instant, + val inserted: LocalDateTime, val timeToLiveDuration: String?, - val expiration: Instant?, + val expiration: LocalDateTime?, val retries: Int = 0, - val nextRetry: Instant? = null, + val nextRetry: LocalDateTime? = null, val error: String? = null ) /** * Mapper. */ -fun MessageEntity.toDto() = MessageDto( - id, - payloadEncoding, - payloadTypeNamespace, - payloadTypeName, - payloadTypeRevision, - inserted, - timeToLiveDuration, - expiration, - retries, - nextRetry, - error +fun MessageEntity.toDto(maxRetries: Int) = MessageDto( + id = id, + status = this.status(maxRetries).name, + payloadEncoding = payloadEncoding, + payloadTypeNamespace = payloadTypeNamespace, + payloadTypeName = payloadTypeName, + payloadTypeRevision = payloadTypeRevision, + inserted = inserted.atLocalTimeZone(), + timeToLiveDuration = timeToLiveDuration, + expiration = expiration?.atLocalTimeZone(), + retries = retries, + nextRetry = nextRetry?.atLocalTimeZone(), + error = error ) + +/** + * Format date to local dates, as Camunda does it in cockpit. + */ +fun Instant.atLocalTimeZone(): LocalDateTime = this.atZone(ZoneId.systemDefault()).toLocalDateTime() \ No newline at end of file diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt index 502c1ca..325e01a 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CamundaBpmCorrelateCockpitPluginRootResource.kt @@ -8,12 +8,12 @@ import javax.ws.rs.PathParam @Path("plugin/" + CamundaBpmCorrelateCockpitPlugin.ID) class CamundaBpmCorrelateCockpitPluginRootResource : AbstractCockpitPluginRootResource(CamundaBpmCorrelateCockpitPlugin.ID) { - @Path("{engineName}/messages") + @Path("/{engineName}/messages") fun getMessagesResource(@PathParam("engineName") engineName: String): CorrelateMessageResource { return subResource(CorrelateMessageResource(engineName), engineName) } - @Path("{engineName}/configuration") + @Path("/{engineName}/configuration") fun getConfigurationResource(@PathParam("engineName") engineName: String): ConfigurationResource { return subResource(ConfigurationResource(engineName), engineName) } diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt index c141e37..38d7d74 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt @@ -20,25 +20,43 @@ class CorrelateMessageResource(engineName: String) : AbstractCockpitPluginResour @GET @Produces(MediaType.APPLICATION_JSON) fun getMessages(@QueryParam("faultsOnly") faults: Boolean, @QueryParam("page") page: Int, @QueryParam("size") size: Int): List { - return services.messageRepository.findAllLight(page, size).map { it.toDto() } + return services + .messageRepository + .findAllLight(page, size) + .map { it.toDto(services.configuration.persistence.messageMaxRetries) } } @POST - @Path("{messageId}/nextRetry") + @Path("/{messageId}/nextRetry") @Consumes(MediaType.APPLICATION_JSON) fun changeMassageNextRetry(@PathParam("messageId") messageId: String, nextRetryDto: NextRetryDto) { services.messageManagementService.changeMessageNextRetry(messageId, nextRetryDto.nextRetry) } + @PUT + @Path("/{messageId}/pause") + @Consumes(MediaType.APPLICATION_JSON) + fun pauseMessage(@PathParam("messageId") messageId: String) { + services.messageManagementService.pauseMessageProcessing(messageId) + } + + @DELETE + @Path("/{messageId}/pause") + @Consumes(MediaType.APPLICATION_JSON) + fun resumeMessage(@PathParam("messageId") messageId: String) { + services.messageManagementService.resumeMessageProcessing(messageId) + } + @POST - @Path("{messageId}/retries") + @Path("/{messageId}/retries") @Consumes(MediaType.APPLICATION_JSON) fun changeMassageRetries(@PathParam("messageId") messageId: String, retriesDto: RetriesDto) { services.messageManagementService.changeMessageRetryAttempt(messageId, retriesDto.retries) } @DELETE - @Path("{messageId}") + @Path("/{messageId}") + @Consumes(MediaType.APPLICATION_JSON) fun deleteMessage(@PathParam("messageId") messageId: String) { services.messageManagementService.deleteMessage(messageId) } diff --git a/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin b/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin index 4c53290..9510d28 100644 --- a/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin +++ b/extension/cockpit-plugin/src/main/resources/META-INF/services/org.camunda.bpm.cockpit.plugin.spi.CockpitPlugin @@ -1,2 +1 @@ io.holunda.camunda.bpm.correlate.CamundaBpmCorrelateCockpitPlugin - diff --git a/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml b/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml deleted file mode 100644 index 67e08a2..0000000 --- a/extension/cockpit-plugin/src/main/resources/io/holunda/camunda/bpm/correlate/cockpit-plugin-query.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt index 82a4ba3..b863e14 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt @@ -23,4 +23,31 @@ class MessageEntity( fun isExpired(clock: Clock): Boolean { return expiration != null && clock.instant() >= expiration } + + fun status(maxRetries: Int): MessageStatus { + return if (error == null && retries == 0) { + // since the error is null and the retries are zero, we are good. + if (nextRetry == RetryInfo.FAR_FUTURE) { + // paused + MessageStatus.PAUSED + } else { + // waiting for correlation + MessageStatus.IN_PROGRESS + } + } else { + if (retries == maxRetries) { + // max retries are reached, no correlation will take place + MessageStatus.MAX_RETRIES_REACHED + } else { + if (nextRetry == RetryInfo.FAR_FUTURE) { + // paused + MessageStatus.PAUSED + } else { + // waiting for correlation + MessageStatus.RETRYING + } + } + } + } + } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageStatus.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageStatus.kt new file mode 100644 index 0000000..c39b999 --- /dev/null +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageStatus.kt @@ -0,0 +1,11 @@ +package io.holunda.camunda.bpm.correlate.persist + +/** + * Current status of the message. + */ +enum class MessageStatus { + IN_PROGRESS, + RETRYING, + PAUSED, + MAX_RETRIES_REACHED +} \ No newline at end of file diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/RetryInfo.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/RetryInfo.kt index f7049c7..3172f89 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/RetryInfo.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/RetryInfo.kt @@ -1,6 +1,7 @@ package io.holunda.camunda.bpm.correlate.persist import java.time.Instant +import java.time.temporal.ChronoUnit /** * Information about retries. @@ -8,4 +9,8 @@ import java.time.Instant data class RetryInfo( val retries: Int, val nextRetry: Instant? -) +) { + companion object { + val FAR_FUTURE: Instant = Instant.MAX.minus(72, ChronoUnit.HOURS) + } +} diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt index 60d3c3d..bdee651 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt @@ -2,6 +2,7 @@ package io.holunda.camunda.bpm.correlate.persist.impl import io.holunda.camunda.bpm.correlate.persist.MessageEntity import io.holunda.camunda.bpm.correlate.persist.MessageRepository +import io.holunda.camunda.bpm.correlate.persist.RetryInfo import mu.KLogging import java.time.Clock import java.time.Instant @@ -36,10 +37,17 @@ class MessageManagementService( } /** - * Changes next retry time of a message. + * Pauses the message processing setting the time of processing to infinity. */ fun pauseMessageProcessing(messageId: String) { - changeMessageNextRetry(messageId = messageId, nextRetry = Instant.MAX) + changeMessageNextRetry(messageId = messageId, nextRetry = RetryInfo.FAR_FUTURE) + } + + /** + * Resume the message correlation. + */ + fun resumeMessageProcessing(messageId: String) { + changeMessageNextRetry(messageId = messageId, nextRetry = Instant.now()) } /** diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntityStatusTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntityStatusTest.kt new file mode 100644 index 0000000..65a0f72 --- /dev/null +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntityStatusTest.kt @@ -0,0 +1,62 @@ +package io.holunda.camunda.bpm.correlate.persist + +import io.holunda.camunda.bpm.correlate.persist.RetryInfo.Companion.FAR_FUTURE +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.time.Instant +import java.time.temporal.ChronoUnit +import java.util.* + +internal class MessageEntityStatusTest { + + private lateinit var message: MessageEntity + + @BeforeEach + fun `init message`() { + message = MessageEntity( + id = UUID.randomUUID().toString(), + payloadEncoding = "jackson", + payloadTypeNamespace = "io.holunda", + payloadTypeName = "Typea", + payloadTypeRevision = null, + payload = ByteArray(0), + inserted = Instant.now(), + timeToLiveDuration = null, + expiration = null + ) + } + + + @Test + fun `should map status IN_PROGRESS`() { + assertThat(message.status(10)).isEqualTo(MessageStatus.IN_PROGRESS) + } + + @Test + fun `should map status PAUSED`() { + message.nextRetry = FAR_FUTURE + assertThat(message.status(10)).isEqualTo(MessageStatus.PAUSED) + } + + @Test + fun `should map status MAX_RETRIES_REACHED`() { + message.retries = 10 + assertThat(message.status(10)).isEqualTo(MessageStatus.MAX_RETRIES_REACHED) + } + + @Test + fun `should map status RETRYING`() { + message.retries = 2 + message.nextRetry = Instant.now().plus(12, ChronoUnit.MINUTES) + assertThat(message.status(10)).isEqualTo(MessageStatus.RETRYING) + } + + @Test + fun `should map status PAUSED with error`() { + message.retries = 2 + message.nextRetry = FAR_FUTURE + assertThat(message.status(10)).isEqualTo(MessageStatus.PAUSED) + } + +} \ No newline at end of file diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt index 9ed5665..2f81b8d 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt @@ -106,6 +106,20 @@ class CamundaBpmCorrelateConfiguration : ApplicationContextAware { messageRepository = messageRepository ) +// @Order(Int.MAX_VALUE) +// @EnableWebSecurity +// @ConditionalOnProperty("correlate.configure-csrf-behavior", havingValue = "true", matchIfMissing = false) +// class CsrfSecurityAdapter : WebSecurityConfigurerAdapter() { +// init { +// logger.info { "[Camunda CORRELATE]: Using Cookie-based CSRF repository." } +// } +// override fun configure(http: HttpSecurity) { +// http +// .csrf() +// .disable() +// // .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) +// } +// } override fun setApplicationContext(applicationContext: ApplicationContext) { CamundaBpmCorrelateConfiguration.applicationContext = applicationContext From 6811664a895b661d42e2abeebba291684aed17a5 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Tue, 23 Aug 2022 20:18:03 +0200 Subject: [PATCH 10/53] improved pause handling --- .../frontend/correlate-message-actions.js | 29 +++++++++++-------- .../src/main/frontend/correlate-table.js | 4 +-- .../bpm/correlate/persist/MessageEntity.kt | 9 ++++-- .../bpm/correlate/persist/RetryInfo.kt | 7 +---- .../persist/impl/MessageManagementService.kt | 22 ++++++++++---- .../persist/MessageEntityStatusTest.kt | 9 +++--- 6 files changed, 48 insertions(+), 32 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js index fdecf10..2e59ed1 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js @@ -1,19 +1,20 @@ -import React, {useEffect, useState} from "react"; -import { useCookies } from 'react-cookie'; +import React from "react"; +import {useCookies} from 'react-cookie'; function CorrelateMessageActions({camundaRestPrefix, message, reload}) { const [cookies] = useCookies(['XSRF-TOKEN']); const handleDelete = async () => { - await fetch(`${camundaRestPrefix}/messages/${message.id}`, { method: 'DELETE', headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); - reload(); + await fetch(`${camundaRestPrefix}/messages/${message.id}`, {method: 'DELETE', headers: {'X-XSRF-TOKEN': cookies['XSRF-TOKEN']}}); } const handlePause = async () => { - const method = (message.status === 'PAUSED') ? 'DELETE' : 'PUT' - await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, { method: method, headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); - reload(); + await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, {method: 'PUT', headers: {'X-XSRF-TOKEN': cookies['XSRF-TOKEN']}}); + } + + const handleResume = async () => { + await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, {method: 'DELETE', headers: {'X-XSRF-TOKEN': cookies['XSRF-TOKEN']}}); } const showStacktrace = () => { @@ -36,15 +37,19 @@ function CorrelateMessageActions({camundaRestPrefix, message, reload}) { {message.nextRetry ? () : null} - {message.status === 'MAX_RETRIES_REACHED' ? () : null} + {message.status === 'MAX_RETRIES_REACHED' ? ( + ) : null} - ) : ( + )} + ); } diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.js b/extension/cockpit-plugin/src/main/frontend/correlate-table.js index 17956bb..a1a4734 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-table.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-table.js @@ -37,7 +37,7 @@ function MessageRow({ camundaRestPrefix, element }) { {element.payloadTypeNamespace}
.{element.payloadTypeName} {formatDate(element.inserted)} {element.retries} - {element.nextRetry ? formatDate(element.nextRetry) : null} + {element.nextRetry && element.status !== 'PAUSED' ? formatDate(element.nextRetry) : null} ); @@ -62,7 +62,7 @@ function statusToGlyph(state) { stateClass = ['glyphicon', 'glyphicon-remove-sign', 'red']; break; case 'PAUSED': - stateClass = ['glyphicon', 'glyphicon-remove-record', 'orange']; + stateClass = ['glyphicon', 'glyphicon-record', 'orange']; break; case 'RETRYING': stateClass = ['glyphicon', 'glyphicon-circle-arrow-right', 'blue']; diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt index b863e14..a51afd8 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt @@ -2,6 +2,7 @@ package io.holunda.camunda.bpm.correlate.persist import java.time.Clock import java.time.Instant +import java.time.temporal.ChronoUnit class MessageEntity( var id: String, @@ -17,6 +18,10 @@ class MessageEntity( var nextRetry: Instant? = null, var error: String? = null ) { + companion object { + val FAR_FUTURE: Instant = Instant.parse("4999-12-03T10:15:30Z") // taking a value that will pass into every DB. + } + /** * Checks if the message is expired. */ @@ -27,7 +32,7 @@ class MessageEntity( fun status(maxRetries: Int): MessageStatus { return if (error == null && retries == 0) { // since the error is null and the retries are zero, we are good. - if (nextRetry == RetryInfo.FAR_FUTURE) { + if (nextRetry == FAR_FUTURE) { // paused MessageStatus.PAUSED } else { @@ -39,7 +44,7 @@ class MessageEntity( // max retries are reached, no correlation will take place MessageStatus.MAX_RETRIES_REACHED } else { - if (nextRetry == RetryInfo.FAR_FUTURE) { + if (nextRetry == FAR_FUTURE) { // paused MessageStatus.PAUSED } else { diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/RetryInfo.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/RetryInfo.kt index 3172f89..f7049c7 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/RetryInfo.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/RetryInfo.kt @@ -1,7 +1,6 @@ package io.holunda.camunda.bpm.correlate.persist import java.time.Instant -import java.time.temporal.ChronoUnit /** * Information about retries. @@ -9,8 +8,4 @@ import java.time.temporal.ChronoUnit data class RetryInfo( val retries: Int, val nextRetry: Instant? -) { - companion object { - val FAR_FUTURE: Instant = Instant.MAX.minus(72, ChronoUnit.HOURS) - } -} +) diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt index bdee651..4e09f31 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt @@ -1,8 +1,8 @@ package io.holunda.camunda.bpm.correlate.persist.impl import io.holunda.camunda.bpm.correlate.persist.MessageEntity +import io.holunda.camunda.bpm.correlate.persist.MessageEntity.Companion.FAR_FUTURE import io.holunda.camunda.bpm.correlate.persist.MessageRepository -import io.holunda.camunda.bpm.correlate.persist.RetryInfo import mu.KLogging import java.time.Clock import java.time.Instant @@ -38,16 +38,28 @@ class MessageManagementService( /** * Pauses the message processing setting the time of processing to infinity. + * @param messageId message id. + * @return message. */ - fun pauseMessageProcessing(messageId: String) { - changeMessageNextRetry(messageId = messageId, nextRetry = RetryInfo.FAR_FUTURE) + fun pauseMessageProcessing(messageId: String): MessageEntity { + return getMessageById(messageId) + .also { + it.nextRetry = FAR_FUTURE + messageRepository.save(it) + } } /** * Resume the message correlation. + * @param messageId message id. + * @return message. */ - fun resumeMessageProcessing(messageId: String) { - changeMessageNextRetry(messageId = messageId, nextRetry = Instant.now()) + fun resumeMessageProcessing(messageId: String): MessageEntity { + return getMessageById(messageId) + .also { + it.nextRetry = Instant.now(clock) + messageRepository.save(it) + } } /** diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntityStatusTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntityStatusTest.kt index 65a0f72..7dbc741 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntityStatusTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntityStatusTest.kt @@ -1,6 +1,5 @@ package io.holunda.camunda.bpm.correlate.persist -import io.holunda.camunda.bpm.correlate.persist.RetryInfo.Companion.FAR_FUTURE import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -35,7 +34,7 @@ internal class MessageEntityStatusTest { @Test fun `should map status PAUSED`() { - message.nextRetry = FAR_FUTURE + message.nextRetry = MessageEntity.FAR_FUTURE assertThat(message.status(10)).isEqualTo(MessageStatus.PAUSED) } @@ -53,10 +52,10 @@ internal class MessageEntityStatusTest { } @Test - fun `should map status PAUSED with error`() { + fun `should map status PAUSED for error`() { message.retries = 2 - message.nextRetry = FAR_FUTURE + message.nextRetry = MessageEntity.FAR_FUTURE assertThat(message.status(10)).isEqualTo(MessageStatus.PAUSED) } -} \ No newline at end of file +} From 437d7399eab6b345db8216c383d496544d3e83d4 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Tue, 23 Aug 2022 22:39:50 +0200 Subject: [PATCH 11/53] component restyling --- .../main/frontend/correlate-message-actions.js | 15 ++++++--------- .../main/frontend/correlate-messages-view.js | 18 +++++++++--------- .../src/main/frontend/correlate-table.js | 2 +- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js index 2e59ed1..6cdcddd 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js @@ -32,23 +32,20 @@ function CorrelateMessageActions({camundaRestPrefix, message, reload}) { return ( {message.error ? () : null} - {message.nextRetry ? () : null} - {message.status === 'MAX_RETRIES_REACHED' ? ( - ) : null} - {message.status === 'PAUSED' ? () : ()} + ); diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js index adc1bf8..760fb22 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js @@ -1,9 +1,9 @@ import React, {useCallback, useEffect, useState} from 'react'; import CorrelateMessagesTable from './correlate-table'; -function CorrelateMessagesView({ camundaRestPrefix }) { +function CorrelateMessagesView({camundaRestPrefix}) { - const { opLog, reload } = useOpLog(camundaRestPrefix); + const {opLog, reload} = useOpLog(camundaRestPrefix); return (
@@ -12,11 +12,11 @@ function CorrelateMessagesView({ camundaRestPrefix }) {

Messages

{opLog ? - :
Loading...
+ :
Loading...
}
@@ -33,7 +33,7 @@ function useOpLog(camundaRestPrefix) { }, [camundaRestPrefix]); useEffect(() => { - const parameters = { page: 0, size: 100 }; + const parameters = {page: 0, size: 100}; loadOpLog(parameters); }, []); @@ -45,7 +45,7 @@ function useOpLog(camundaRestPrefix) { async function fetchMessagesAndConfig(camundaRestPrefix, parameters) { if (!parameters) { - parameters = { page: 0, size: 100 }; + parameters = {page: 0, size: 100}; } try { const [configurationRes, messagesRes] = await Promise.all( diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.js b/extension/cockpit-plugin/src/main/frontend/correlate-table.js index a1a4734..1d36d86 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-table.js +++ b/extension/cockpit-plugin/src/main/frontend/correlate-table.js @@ -62,7 +62,7 @@ function statusToGlyph(state) { stateClass = ['glyphicon', 'glyphicon-remove-sign', 'red']; break; case 'PAUSED': - stateClass = ['glyphicon', 'glyphicon-record', 'orange']; + stateClass = ['glyphicon', 'glyphicon-hourglass', 'orange']; break; case 'RETRYING': stateClass = ['glyphicon', 'glyphicon-circle-arrow-right', 'blue']; From 7952248af53252cba9051cd15ec3914c725ce533 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 07:31:05 +0200 Subject: [PATCH 12/53] add typescript support --- extension/cockpit-plugin/package-lock.json | 78 ++++++++++++- extension/cockpit-plugin/package.json | 12 +- extension/cockpit-plugin/rollup.config.js | 8 +- ...tions.js => correlate-message-actions.tsx} | 0 ...es-view.js => correlate-messages-view.tsx} | 0 ...correlate-table.js => correlate-table.tsx} | 0 .../main/frontend/{plugin.js => plugin.tsx} | 0 extension/cockpit-plugin/tsconfig.json | 103 ++++++++++++++++++ 8 files changed, 192 insertions(+), 9 deletions(-) rename extension/cockpit-plugin/src/main/frontend/{correlate-message-actions.js => correlate-message-actions.tsx} (100%) rename extension/cockpit-plugin/src/main/frontend/{correlate-messages-view.js => correlate-messages-view.tsx} (100%) rename extension/cockpit-plugin/src/main/frontend/{correlate-table.js => correlate-table.tsx} (100%) rename extension/cockpit-plugin/src/main/frontend/{plugin.js => plugin.tsx} (100%) create mode 100644 extension/cockpit-plugin/tsconfig.json diff --git a/extension/cockpit-plugin/package-lock.json b/extension/cockpit-plugin/package-lock.json index 8fae5c1..cefb6fd 100644 --- a/extension/cockpit-plugin/package-lock.json +++ b/extension/cockpit-plugin/package-lock.json @@ -22,8 +22,12 @@ "@rollup/plugin-commonjs": "~22.0.2", "@rollup/plugin-node-resolve": "~13.3.0", "@rollup/plugin-replace": "~4.0.0", - "rollup": "~2.78.1", - "rollup-plugin-scss": "~3.0.0" + "@rollup/plugin-typescript": "8.4.0", + "@types/react": "18.0.17", + "@types/react-dom": "18.0.6", + "rollup": "2.78.1", + "rollup-plugin-scss": "~3.0.0", + "typescript": "4.7.4" } }, "node_modules/@ampproject/remapping": { @@ -1868,6 +1872,29 @@ "rollup": "^1.20.0 || ^2.0.0" } }, + "node_modules/@rollup/plugin-typescript": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.4.0.tgz", + "integrity": "sha512-QssfoOP6V4/6skX12EfOW5UzJAv/c334F4OJWmQpe2kg3agEa0JwVCckwmfuvEgDixyX+XyxjFenH7M2rDKUyQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "tslib": { + "optional": true + } + } + }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", @@ -1932,6 +1959,15 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-dom": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", + "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -2831,6 +2867,19 @@ "node": ">=4" } }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -4189,6 +4238,16 @@ "magic-string": "^0.25.7" } }, + "@rollup/plugin-typescript": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.4.0.tgz", + "integrity": "sha512-QssfoOP6V4/6skX12EfOW5UzJAv/c334F4OJWmQpe2kg3agEa0JwVCckwmfuvEgDixyX+XyxjFenH7M2rDKUyQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + } + }, "@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", @@ -4249,6 +4308,15 @@ "csstype": "^3.0.2" } }, + "@types/react-dom": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", + "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -4938,6 +5006,12 @@ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", diff --git a/extension/cockpit-plugin/package.json b/extension/cockpit-plugin/package.json index 2e7e202..2d2ee81 100644 --- a/extension/cockpit-plugin/package.json +++ b/extension/cockpit-plugin/package.json @@ -10,8 +10,8 @@ "license": "APACHE 2.0", "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-cookie": "^4.1.1" + "react-cookie": "^4.1.1", + "react-dom": "^18.2.0" }, "devDependencies": { "@babel/core": "~7.18.10", @@ -22,7 +22,11 @@ "@rollup/plugin-commonjs": "~22.0.2", "@rollup/plugin-node-resolve": "~13.3.0", "@rollup/plugin-replace": "~4.0.0", - "rollup": "~2.78.1", - "rollup-plugin-scss": "~3.0.0" + "@rollup/plugin-typescript": "8.4.0", + "@types/react": "18.0.17", + "@types/react-dom": "18.0.6", + "rollup": "2.78.1", + "rollup-plugin-scss": "~3.0.0", + "typescript": "4.7.4" } } diff --git a/extension/cockpit-plugin/rollup.config.js b/extension/cockpit-plugin/rollup.config.js index b08312f..ba1976e 100644 --- a/extension/cockpit-plugin/rollup.config.js +++ b/extension/cockpit-plugin/rollup.config.js @@ -1,15 +1,17 @@ -import resolve from "@rollup/plugin-node-resolve"; +import babel from "@rollup/plugin-babel"; import commonjs from "@rollup/plugin-commonjs"; +import resolve from "@rollup/plugin-node-resolve"; import replace from "@rollup/plugin-replace"; -import babel from "@rollup/plugin-babel"; +import typescript from '@rollup/plugin-typescript'; export default { - input: "src/main/frontend/plugin.js", + input: "src/main/frontend/plugin.ts", output: { file: "target/classes/plugin-webapp/correlate-cockpit-plugin/app/plugin.js" }, plugins: [ resolve(), + typescript(), babel({ babelHelpers: "runtime", skipPreflightCheck: true, diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx similarity index 100% rename from extension/cockpit-plugin/src/main/frontend/correlate-message-actions.js rename to extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx similarity index 100% rename from extension/cockpit-plugin/src/main/frontend/correlate-messages-view.js rename to extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.js b/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx similarity index 100% rename from extension/cockpit-plugin/src/main/frontend/correlate-table.js rename to extension/cockpit-plugin/src/main/frontend/correlate-table.tsx diff --git a/extension/cockpit-plugin/src/main/frontend/plugin.js b/extension/cockpit-plugin/src/main/frontend/plugin.tsx similarity index 100% rename from extension/cockpit-plugin/src/main/frontend/plugin.js rename to extension/cockpit-plugin/src/main/frontend/plugin.tsx diff --git a/extension/cockpit-plugin/tsconfig.json b/extension/cockpit-plugin/tsconfig.json new file mode 100644 index 0000000..a18d120 --- /dev/null +++ b/extension/cockpit-plugin/tsconfig.json @@ -0,0 +1,103 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "jsx": "react", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": false, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From 6279c11e45c72e7034f62eee0016589769d10830 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 07:42:00 +0200 Subject: [PATCH 13/53] add eslint --- extension/cockpit-plugin/.eslintrc.js | 25 + extension/cockpit-plugin/package-lock.json | 3547 +++++++++++++++++++- extension/cockpit-plugin/package.json | 4 + 3 files changed, 3519 insertions(+), 57 deletions(-) create mode 100644 extension/cockpit-plugin/.eslintrc.js diff --git a/extension/cockpit-plugin/.eslintrc.js b/extension/cockpit-plugin/.eslintrc.js new file mode 100644 index 0000000..9c388ee --- /dev/null +++ b/extension/cockpit-plugin/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "react", + "@typescript-eslint" + ], + "rules": { + } +} diff --git a/extension/cockpit-plugin/package-lock.json b/extension/cockpit-plugin/package-lock.json index cefb6fd..733381b 100644 --- a/extension/cockpit-plugin/package-lock.json +++ b/extension/cockpit-plugin/package-lock.json @@ -25,6 +25,10 @@ "@rollup/plugin-typescript": "8.4.0", "@types/react": "18.0.17", "@types/react-dom": "18.0.6", + "@typescript-eslint/eslint-plugin": "5.34.0", + "@typescript-eslint/parser": "5.34.0", + "eslint": "8.22.0", + "eslint-plugin-react": "7.30.1", "rollup": "2.78.1", "rollup-plugin-scss": "~3.0.0", "typescript": "4.7.4" @@ -1748,6 +1752,71 @@ "node": ">=6.9.0" } }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -1795,6 +1864,41 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -1938,6 +2042,12 @@ "hoist-non-react-statics": "^3.3.0" } }, + "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==", + "dev": true + }, "node_modules/@types/node": { "version": "18.7.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.9.tgz", @@ -1982,6 +2092,266 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.34.0.tgz", + "integrity": "sha512-eRfPPcasO39iwjlUAMtjeueRGuIrW3TQ9WseIDl7i5UWuFbf83yYaU7YPs4j8+4CxUMIsj1k+4kV+E+G+6ypDQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.34.0", + "@typescript-eslint/type-utils": "5.34.0", + "@typescript-eslint/utils": "5.34.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.34.0.tgz", + "integrity": "sha512-SZ3NEnK4usd2CXkoV3jPa/vo1mWX1fqRyIVUQZR4As1vyp4fneknBNJj+OFtV8WAVgGf+rOHMSqQbs2Qn3nFZQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.34.0", + "@typescript-eslint/types": "5.34.0", + "@typescript-eslint/typescript-estree": "5.34.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.34.0.tgz", + "integrity": "sha512-HNvASMQlah5RsBW6L6c7IJ0vsm+8Sope/wu5sEAf7joJYWNb1LDbJipzmdhdUOnfrDFE6LR1j57x1EYVxrY4ow==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.34.0", + "@typescript-eslint/visitor-keys": "5.34.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.34.0.tgz", + "integrity": "sha512-Pxlno9bjsQ7hs1pdWRUv9aJijGYPYsHpwMeCQ/Inavhym3/XaKt1ZKAA8FIw4odTBfowBdZJDMxf2aavyMDkLg==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.34.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.34.0.tgz", + "integrity": "sha512-49fm3xbbUPuzBIOcy2CDpYWqy/X7VBkxVN+DC21e0zIm3+61Z0NZi6J9mqPmSW1BDVk9FIOvuCFyUPjXz93sjA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.34.0.tgz", + "integrity": "sha512-mXHAqapJJDVzxauEkfJI96j3D10sd567LlqroyCeJaHnu42sDbjxotGb3XFtGPYKPD9IyLjhsoULML1oI3M86A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.34.0", + "@typescript-eslint/visitor-keys": "5.34.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.34.0.tgz", + "integrity": "sha512-kWRYybU4Rn++7lm9yu8pbuydRyQsHRoBDIo11k7eqBWTldN4xUdVUMCsHBiE7aoEkFzrUEaZy3iH477vr4xHAQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.34.0", + "@typescript-eslint/types": "5.34.0", + "@typescript-eslint/typescript-estree": "5.34.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.34.0.tgz", + "integrity": "sha512-O1moYjOSrab0a2fUvFpsJe0QHtvTC+cR+ovYpgKrAVXzqQyc74mv76TgY6z+aEtjQE2vgZux3CQVtGryqdcOAw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.34.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -1994,6 +2364,58 @@ "node": ">=4" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -2058,6 +2480,18 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.21.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", @@ -2111,6 +2545,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001381", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001381.tgz", @@ -2208,6 +2651,20 @@ "semver": "bin/semver.js" } }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/csstype": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", @@ -2230,6 +2687,12 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -2255,34 +2718,452 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.225", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz", - "integrity": "sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.0.0" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "node_modules/electron-to-chromium": { + "version": "1.4.225", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz", + "integrity": "sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", + "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", + "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "node_modules/esutils": { @@ -2294,6 +3175,120 @@ "node": ">=0.10.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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==", + "dev": true + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2320,6 +3315,39 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2343,6 +3371,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2363,6 +3407,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2372,6 +3428,32 @@ "node": ">=4" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2384,6 +3466,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2417,6 +3508,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -2425,6 +3531,40 @@ "react-is": "^16.7.0" } }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2441,53 +3581,267 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "builtin-modules": "^3.3.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { - "has": "^1.0.3" + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "@types/estree": "*" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -2500,6 +3854,18 @@ "node": ">=4" } }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -2512,12 +3878,59 @@ "node": ">=6" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2529,6 +3942,18 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -2538,6 +3963,28 @@ "sourcemap-codec": "^1.4.8" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2556,12 +4003,36 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -2589,6 +4060,67 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2598,6 +4130,74 @@ "wrappy": "1" } }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2607,12 +4207,30 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -2631,6 +4249,55 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -2705,6 +4372,35 @@ "@babel/runtime": "^7.8.4" } }, + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/regexpu-core": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", @@ -2755,15 +4451,49 @@ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" }, "bin": { - "resolve": "bin/resolve" + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rollup": { @@ -2805,6 +4535,29 @@ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2828,12 +4581,127 @@ "semver": "bin/semver.js" } }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2858,6 +4726,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -2867,6 +4741,63 @@ "node": ">=4" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", @@ -2880,6 +4811,21 @@ "node": ">=4.2.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -2955,11 +4901,84 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -4151,6 +6170,57 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -4189,6 +6259,32 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -4287,6 +6383,12 @@ "hoist-non-react-statics": "^3.3.0" } }, + "@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==", + "dev": true + }, "@types/node": { "version": "18.7.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.9.tgz", @@ -4326,10 +6428,158 @@ "@types/node": "*" } }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.34.0.tgz", + "integrity": "sha512-eRfPPcasO39iwjlUAMtjeueRGuIrW3TQ9WseIDl7i5UWuFbf83yYaU7YPs4j8+4CxUMIsj1k+4kV+E+G+6ypDQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.34.0", + "@typescript-eslint/type-utils": "5.34.0", + "@typescript-eslint/utils": "5.34.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.34.0.tgz", + "integrity": "sha512-SZ3NEnK4usd2CXkoV3jPa/vo1mWX1fqRyIVUQZR4As1vyp4fneknBNJj+OFtV8WAVgGf+rOHMSqQbs2Qn3nFZQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.34.0", + "@typescript-eslint/types": "5.34.0", + "@typescript-eslint/typescript-estree": "5.34.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.34.0.tgz", + "integrity": "sha512-HNvASMQlah5RsBW6L6c7IJ0vsm+8Sope/wu5sEAf7joJYWNb1LDbJipzmdhdUOnfrDFE6LR1j57x1EYVxrY4ow==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.34.0", + "@typescript-eslint/visitor-keys": "5.34.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.34.0.tgz", + "integrity": "sha512-Pxlno9bjsQ7hs1pdWRUv9aJijGYPYsHpwMeCQ/Inavhym3/XaKt1ZKAA8FIw4odTBfowBdZJDMxf2aavyMDkLg==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.34.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.34.0.tgz", + "integrity": "sha512-49fm3xbbUPuzBIOcy2CDpYWqy/X7VBkxVN+DC21e0zIm3+61Z0NZi6J9mqPmSW1BDVk9FIOvuCFyUPjXz93sjA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.34.0.tgz", + "integrity": "sha512-mXHAqapJJDVzxauEkfJI96j3D10sd567LlqroyCeJaHnu42sDbjxotGb3XFtGPYKPD9IyLjhsoULML1oI3M86A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.34.0", + "@typescript-eslint/visitor-keys": "5.34.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.34.0.tgz", + "integrity": "sha512-kWRYybU4Rn++7lm9yu8pbuydRyQsHRoBDIo11k7eqBWTldN4xUdVUMCsHBiE7aoEkFzrUEaZy3iH477vr4xHAQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.34.0", + "@typescript-eslint/types": "5.34.0", + "@typescript-eslint/typescript-estree": "5.34.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.34.0.tgz", + "integrity": "sha512-O1moYjOSrab0a2fUvFpsJe0QHtvTC+cR+ovYpgKrAVXzqQyc74mv76TgY6z+aEtjQE2vgZux3CQVtGryqdcOAw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.34.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, "ansi-styles": { "version": "3.2.1", @@ -4340,6 +6590,43 @@ "color-convert": "^1.9.0" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -4395,6 +6682,15 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "browserslist": { "version": "4.21.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", @@ -4423,6 +6719,12 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "caniuse-lite": { "version": "1.0.30001381", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001381.tgz", @@ -4499,6 +6801,17 @@ } } }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "csstype": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", @@ -4513,6 +6826,12 @@ "ms": "2.1.2" } }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -4529,12 +6848,81 @@ "object-keys": "^1.1.1" } }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "electron-to-chromium": { "version": "1.4.225", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz", "integrity": "sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw==", "dev": true }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4547,6 +6935,249 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, + "eslint": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", + "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-plugin-react": { + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", + "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -4559,6 +7190,101 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4578,6 +7304,30 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4595,6 +7345,16 @@ "has-symbols": "^1.0.3" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4609,12 +7369,41 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4624,6 +7413,12 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -4645,6 +7440,15 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -4653,6 +7457,28 @@ "react-is": "^16.7.0" } }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4669,6 +7495,36 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-builtin-module": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", @@ -4678,13 +7534,43 @@ "builtin-modules": "^3.3.0" } }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { - "has": "^1.0.3" + "is-extglob": "^2.1.1" } }, "is-module": { @@ -4693,6 +7579,27 @@ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -4702,29 +7609,137 @@ "@types/estree": "*" } }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4733,6 +7748,15 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -4742,6 +7766,22 @@ "sourcemap-codec": "^1.4.8" } }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4757,12 +7797,30 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -4781,6 +7839,49 @@ "object-keys": "^1.1.1" } }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4790,18 +7891,77 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4814,6 +7974,35 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -4876,6 +8065,23 @@ "@babel/runtime": "^7.8.4" } }, + "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==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "regexpu-core": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", @@ -4924,6 +8130,27 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "rollup": { "version": "2.78.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", @@ -4959,6 +8186,15 @@ } } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -4979,12 +8215,97 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5000,18 +8321,75 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, "typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -5059,11 +8437,66 @@ "picocolors": "^1.0.0" } }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/extension/cockpit-plugin/package.json b/extension/cockpit-plugin/package.json index 2d2ee81..539363e 100644 --- a/extension/cockpit-plugin/package.json +++ b/extension/cockpit-plugin/package.json @@ -25,6 +25,10 @@ "@rollup/plugin-typescript": "8.4.0", "@types/react": "18.0.17", "@types/react-dom": "18.0.6", + "@typescript-eslint/eslint-plugin": "5.34.0", + "@typescript-eslint/parser": "5.34.0", + "eslint": "8.22.0", + "eslint-plugin-react": "7.30.1", "rollup": "2.78.1", "rollup-plugin-scss": "~3.0.0", "typescript": "4.7.4" From 1da6fa0ac791dd029aa1d44376e60fa50f8ad97e Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 08:10:18 +0200 Subject: [PATCH 14/53] fix typo in package name --- extension/cockpit-plugin/package-lock.json | 4 ++-- extension/cockpit-plugin/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extension/cockpit-plugin/package-lock.json b/extension/cockpit-plugin/package-lock.json index 733381b..b0fda6b 100644 --- a/extension/cockpit-plugin/package-lock.json +++ b/extension/cockpit-plugin/package-lock.json @@ -1,11 +1,11 @@ { - "name": "correlate-cokpit-plugin", + "name": "correlate-cockpit-plugin", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "correlate-cokpit-plugin", + "name": "correlate-cockpit-plugin", "version": "1.0.0", "license": "APACHE 2.0", "dependencies": { diff --git a/extension/cockpit-plugin/package.json b/extension/cockpit-plugin/package.json index 539363e..21e0b11 100644 --- a/extension/cockpit-plugin/package.json +++ b/extension/cockpit-plugin/package.json @@ -1,5 +1,5 @@ { - "name": "correlate-cokpit-plugin", + "name": "correlate-cockpit-plugin", "version": "1.0.0", "description": "", "main": "plugin.js", From 01540549daabfe6191aebad76b10f0497e37666d Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 08:14:25 +0200 Subject: [PATCH 15/53] fix rollup build --- extension/cockpit-plugin/rollup.config.js | 2 +- extension/cockpit-plugin/tsconfig.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extension/cockpit-plugin/rollup.config.js b/extension/cockpit-plugin/rollup.config.js index ba1976e..4ef3e6a 100644 --- a/extension/cockpit-plugin/rollup.config.js +++ b/extension/cockpit-plugin/rollup.config.js @@ -5,7 +5,7 @@ import replace from "@rollup/plugin-replace"; import typescript from '@rollup/plugin-typescript'; export default { - input: "src/main/frontend/plugin.ts", + input: "src/main/frontend/plugin.tsx", output: { file: "target/classes/plugin-webapp/correlate-cockpit-plugin/app/plugin.js" }, diff --git a/extension/cockpit-plugin/tsconfig.json b/extension/cockpit-plugin/tsconfig.json index a18d120..f8b9391 100644 --- a/extension/cockpit-plugin/tsconfig.json +++ b/extension/cockpit-plugin/tsconfig.json @@ -25,9 +25,9 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ + "module": "ESNext", /* Specify what module code is generated. */ // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ @@ -76,7 +76,7 @@ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ /* Type Checking */ - "strict": false, /* Enable all strict type-checking options. */ + "strict": true, /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ From bb13adc19175f808cb3a006362e97d6afff52aa8 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 08:23:27 +0200 Subject: [PATCH 16/53] use className instead of class --- .../frontend/correlate-message-actions.tsx | 31 +++++++++++-------- .../main/frontend/correlate-messages-view.tsx | 12 +++---- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx index 6cdcddd..97830f2 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx @@ -30,25 +30,30 @@ function CorrelateMessageActions({camundaRestPrefix, message, reload}) { } - return ( - {message.error ? () : null} + return (<> + {message.error ? ( + + ) : null} {message.status === 'MAX_RETRIES_REACHED' || message.nextRetry ? ( ) : null} - {message.status === 'PAUSED' ? () : ()} + + ) : null} + {message.status === 'PAUSED' ? ( + + ) : ( + + )} - - - ); + ); } export default CorrelateMessageActions; diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx index 760fb22..d4db017 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx @@ -5,12 +5,12 @@ function CorrelateMessagesView({camundaRestPrefix}) { const {opLog, reload} = useOpLog(camundaRestPrefix); - return (
-
-
-
-
-

Messages

+ return (
+
+
+
+
+

Messages

{opLog ? Date: Wed, 24 Aug 2022 08:30:25 +0200 Subject: [PATCH 17/53] fix colSpan type, add missing key prop --- .../src/main/frontend/correlate-table.tsx | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx index 1d36d86..cc1516f 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx @@ -18,27 +18,28 @@ function CorrelateMessagesTable({ messages, camundaRestPrefix }) { {!messages || messages.length === 0 ? ( - - No messages to correlate in the inbox - + + No messages to correlate in the inbox + ) : null} - {messages?.map(element => ( - - ))} + {messages?.map(message => ( + + ))} ); } -function MessageRow({ camundaRestPrefix, element }) { + +function MessageRow({ camundaRestPrefix, message, reload }) { return ( - {statusToGlyph(element.status)} - {element.id} - {element.payloadTypeNamespace}
.{element.payloadTypeName} - {formatDate(element.inserted)} - {element.retries} - {element.nextRetry && element.status !== 'PAUSED' ? formatDate(element.nextRetry) : null} - + {statusToGlyph(message.status)} + {message.id} + {message.payloadTypeNamespace}
.{message.payloadTypeName} + {formatDate(message.inserted)} + {message.retries} + {message.nextRetry && message.status !== 'PAUSED' ? formatDate(message.nextRetry) : null} + ); } From 5376a01275ab5d957adb5a389e47dd8bf297f5ee Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 08:33:41 +0200 Subject: [PATCH 18/53] supress rollup warning --- extension/cockpit-plugin/rollup.config.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/extension/cockpit-plugin/rollup.config.js b/extension/cockpit-plugin/rollup.config.js index 4ef3e6a..4349132 100644 --- a/extension/cockpit-plugin/rollup.config.js +++ b/extension/cockpit-plugin/rollup.config.js @@ -24,5 +24,10 @@ export default { "process.env.NODE_ENV": JSON.stringify("production"), preventAssignment: true }) - ] + ], + onwarn: (warning) => { + // see https://stackoverflow.com/a/43556986/7189991 + if ( warning.code === 'THIS_IS_UNDEFINED' ) { return; } + console.warn( warning.message ); +} }; From 1383cefc0a2e620affec7c59bec406e83561a060 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 08:33:47 +0200 Subject: [PATCH 19/53] add types --- .../src/main/frontend/camunda-plugin.d.ts | 15 +++++ .../src/main/frontend/configuration.ts | 3 + .../frontend/correlate-message-actions.tsx | 16 +++-- .../main/frontend/correlate-messages-view.tsx | 41 +++++++++---- .../src/main/frontend/correlate-table.tsx | 60 +++++++++++-------- .../src/main/frontend/message.ts | 18 ++++++ .../src/main/frontend/plugin.tsx | 11 ++-- 7 files changed, 119 insertions(+), 45 deletions(-) create mode 100644 extension/cockpit-plugin/src/main/frontend/camunda-plugin.d.ts create mode 100644 extension/cockpit-plugin/src/main/frontend/configuration.ts create mode 100644 extension/cockpit-plugin/src/main/frontend/message.ts diff --git a/extension/cockpit-plugin/src/main/frontend/camunda-plugin.d.ts b/extension/cockpit-plugin/src/main/frontend/camunda-plugin.d.ts new file mode 100644 index 0000000..c179a1e --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/camunda-plugin.d.ts @@ -0,0 +1,15 @@ +export type Plugin = { + id: string; + pluginPoint: 'cockpit.route' | 'cockpit.navigation' | 'cockpit.metrics'; + priority: number; + properties?: { + path?: string; + }; + render: (node: HTMLElement, { api }: { api: API }) => void; + unmount?: () => void; +}; + +export type API = { + cockpitApi: string; + engine: string; +} diff --git a/extension/cockpit-plugin/src/main/frontend/configuration.ts b/extension/cockpit-plugin/src/main/frontend/configuration.ts new file mode 100644 index 0000000..65f6b8c --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/configuration.ts @@ -0,0 +1,3 @@ +export type Configuration = { + maxRetries: number; +}; diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx index 97830f2..841136f 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx @@ -1,20 +1,26 @@ import React from "react"; -import {useCookies} from 'react-cookie'; +import { useCookies } from 'react-cookie'; +import { Message } from "./message"; -function CorrelateMessageActions({camundaRestPrefix, message, reload}) { +type CorrelateMessageActionsProps = { + camundaRestPrefix: string; + message: Message; + reload: () => void; +}; +function CorrelateMessageActions({ camundaRestPrefix, message, reload }: CorrelateMessageActionsProps) { const [cookies] = useCookies(['XSRF-TOKEN']); const handleDelete = async () => { - await fetch(`${camundaRestPrefix}/messages/${message.id}`, {method: 'DELETE', headers: {'X-XSRF-TOKEN': cookies['XSRF-TOKEN']}}); + await fetch(`${camundaRestPrefix}/messages/${message.id}`, { method: 'DELETE', headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); } const handlePause = async () => { - await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, {method: 'PUT', headers: {'X-XSRF-TOKEN': cookies['XSRF-TOKEN']}}); + await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, { method: 'PUT', headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); } const handleResume = async () => { - await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, {method: 'DELETE', headers: {'X-XSRF-TOKEN': cookies['XSRF-TOKEN']}}); + await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, { method: 'DELETE', headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); } const showStacktrace = () => { diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx index d4db017..32425c5 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx @@ -1,9 +1,14 @@ -import React, {useCallback, useEffect, useState} from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; +import { Configuration } from './configuration'; import CorrelateMessagesTable from './correlate-table'; +import { Message } from './message'; -function CorrelateMessagesView({camundaRestPrefix}) { +type CorrelateMessagesViewProps = { + camundaRestPrefix: string; +} - const {opLog, reload} = useOpLog(camundaRestPrefix); +function CorrelateMessagesView({ camundaRestPrefix }: CorrelateMessagesViewProps) { + const { opLog, reload } = useOpLog(camundaRestPrefix); return (
@@ -11,12 +16,15 @@ function CorrelateMessagesView({camundaRestPrefix}) {

Messages

- {opLog ? + {opLog ? ( :
Loading...
+ /> + ) : ( +
Loading...
+ ) }
@@ -25,15 +33,20 @@ function CorrelateMessagesView({camundaRestPrefix}) {
); } -function useOpLog(camundaRestPrefix) { - const [opLog, setOpLog] = useState(); +type OpLog = { + messages: Message[]; + configuration: Configuration; +}; + +function useOpLog(camundaRestPrefix: string) { + const [opLog, setOpLog] = useState(null); - const loadOpLog = useCallback(async (parameters) => { + const loadOpLog = useCallback(async (parameters?: MessageParams) => { setOpLog(await fetchMessagesAndConfig(camundaRestPrefix, parameters)); }, [camundaRestPrefix]); useEffect(() => { - const parameters = {page: 0, size: 100}; + const parameters = { page: 0, size: 100 }; loadOpLog(parameters); }, []); @@ -43,9 +56,14 @@ function useOpLog(camundaRestPrefix) { }; } -async function fetchMessagesAndConfig(camundaRestPrefix, parameters) { +type MessageParams = { + page: number; + size: number; +}; + +async function fetchMessagesAndConfig(camundaRestPrefix: string, parameters?: MessageParams): Promise { if (!parameters) { - parameters = {page: 0, size: 100}; + parameters = { page: 0, size: 100 }; } try { const [configurationRes, messagesRes] = await Promise.all( @@ -64,6 +82,7 @@ async function fetchMessagesAndConfig(camundaRestPrefix, parameters) { }; } catch (error) { console.error(error); + return null; } } diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx index cc1516f..d1f6e50 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx @@ -1,36 +1,48 @@ import React from 'react'; import CorrelateMessageActions from './correlate-message-actions'; +import { Message, MessageStatus } from './message'; +type CorrelateMessagesTableProps = { + camundaRestPrefix: string; + messages: Message[]; + reload: () => void; +}; -function CorrelateMessagesTable({ messages, camundaRestPrefix }) { - - return ( - - - - - - - - - - - - - {!messages || messages.length === 0 ? ( +function CorrelateMessagesTable({ messages, camundaRestPrefix, reload }: CorrelateMessagesTableProps) { + return ( +
StateIDTypeInsertedRetriesNext RetryActions
+ + + + + + + + + + + + + {!messages || messages.length === 0 ? ( - ) : null} + ) : null} {messages?.map(message => ( ))} - -
StateIDTypeInsertedRetriesNext RetryActions
No messages to correlate in the inbox
); + + + ); } +type MessageRowProps = { + camundaRestPrefix: string; + message: Message; + reload: () => void; +}; -function MessageRow({ camundaRestPrefix, message, reload }) { +function MessageRow({ camundaRestPrefix, message, reload }: MessageRowProps) { return ( {statusToGlyph(message.status)} @@ -44,16 +56,16 @@ function MessageRow({ camundaRestPrefix, message, reload }) { ); } -function formatDate(date) { +function formatDate(date: string | null) { if (!date) { return null; } - let split = date.split('T'); + const split = date.split('T'); return split[0] + ' ' + split[1].split('.')[0]; } -function statusToGlyph(state) { - let stateClass = []; +function statusToGlyph(state: MessageStatus) { + let stateClass: string[] = []; console.log('State is: ', state); switch (state) { case 'IN_PROGRESS': diff --git a/extension/cockpit-plugin/src/main/frontend/message.ts b/extension/cockpit-plugin/src/main/frontend/message.ts new file mode 100644 index 0000000..0b4f13f --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/message.ts @@ -0,0 +1,18 @@ +export type MessageStatus = 'IN_PROGRESS' | 'MAX_RETRIES_REACHED' | 'PAUSED' | 'RETRYING'; + +type LocalDateTimeString = string; + +export type Message = { + id: string; + status: MessageStatus; + payloadEncoding: string; + payloadTypeNamespace: string; + payloadTypeName: string; + payloadTypeRevision: string | null; + inserted: LocalDateTimeString; + timeToLiveDuration: string | null; + expiration: LocalDateTimeString | null; + retries: number; + nextRetry: LocalDateTimeString | null; + error: string | null; +}; diff --git a/extension/cockpit-plugin/src/main/frontend/plugin.tsx b/extension/cockpit-plugin/src/main/frontend/plugin.tsx index 50b89cf..267125e 100644 --- a/extension/cockpit-plugin/src/main/frontend/plugin.tsx +++ b/extension/cockpit-plugin/src/main/frontend/plugin.tsx @@ -1,17 +1,18 @@ import React from "react"; import ReactDOM from "react-dom"; +import { Plugin } from './camunda-plugin'; import CorrelateMessagesView from "./correlate-messages-view"; -let container; +let container: HTMLElement; -const correlateView = { +const correlateView: Plugin = { id: 'correlate-cockpit-plugin-route', pluginPoint: 'cockpit.route', priority: 4, properties: { path: '/correlation' }, - render: (node, {api}) => { + render: (node: HTMLElement, { api }) => { container = node; const urlPrefix = `${api.cockpitApi}/plugin/correlate-cockpit-plugin/${api.engine}`; ReactDOM.render( @@ -24,7 +25,7 @@ const correlateView = { } }; -const navigation = { +const navigation: Plugin = { id: 'correlate-cockpit-plugin-navigation', pluginPoint: 'cockpit.navigation', priority: 4, @@ -37,7 +38,7 @@ const navigation = { }; // TODO: add metrics -const metrics = { +const metrics: Plugin = { id: 'correlate-cockpit-plugin-metrics', pluginPoint: 'cockpit.metrics', priority: 4, From 78993c4906452a688c917a2afaacc3cfc58de180 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 09:00:14 +0200 Subject: [PATCH 20/53] refactor statusToGlyph to Component --- extension/cockpit-plugin/package-lock.json | 11 ++++++ extension/cockpit-plugin/package.json | 1 + .../src/main/frontend/correlate-table.tsx | 37 ++++++++----------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/extension/cockpit-plugin/package-lock.json b/extension/cockpit-plugin/package-lock.json index b0fda6b..c2405eb 100644 --- a/extension/cockpit-plugin/package-lock.json +++ b/extension/cockpit-plugin/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "APACHE 2.0", "dependencies": { + "classnames": "2.3.1", "react": "^18.2.0", "react-cookie": "^4.1.1", "react-dom": "^18.2.0" @@ -2584,6 +2585,11 @@ "node": ">=4" } }, + "node_modules/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -6742,6 +6748,11 @@ "supports-color": "^5.3.0" } }, + "classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", diff --git a/extension/cockpit-plugin/package.json b/extension/cockpit-plugin/package.json index 21e0b11..eeba3dd 100644 --- a/extension/cockpit-plugin/package.json +++ b/extension/cockpit-plugin/package.json @@ -9,6 +9,7 @@ "author": "Holunda.io", "license": "APACHE 2.0", "dependencies": { + "classnames": "2.3.1", "react": "^18.2.0", "react-cookie": "^4.1.1", "react-dom": "^18.2.0" diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx index d1f6e50..ebb2da3 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx @@ -1,3 +1,4 @@ +import classNames from 'classnames'; import React from 'react'; import CorrelateMessageActions from './correlate-message-actions'; import { Message, MessageStatus } from './message'; @@ -45,7 +46,9 @@ type MessageRowProps = { function MessageRow({ camundaRestPrefix, message, reload }: MessageRowProps) { return ( - {statusToGlyph(message.status)} + + + {message.id} {message.payloadTypeNamespace}
.{message.payloadTypeName} {formatDate(message.inserted)} @@ -64,27 +67,17 @@ function formatDate(date: string | null) { return split[0] + ' ' + split[1].split('.')[0]; } -function statusToGlyph(state: MessageStatus) { - let stateClass: string[] = []; - console.log('State is: ', state); - switch (state) { - case 'IN_PROGRESS': - stateClass = ['glyphicon', 'glyphicon-ok-sign', 'green']; - break; - case 'MAX_RETRIES_REACHED': - stateClass = ['glyphicon', 'glyphicon-remove-sign', 'red']; - break; - case 'PAUSED': - stateClass = ['glyphicon', 'glyphicon-hourglass', 'orange']; - break; - case 'RETRYING': - stateClass = ['glyphicon', 'glyphicon-circle-arrow-right', 'blue']; - break; - default: - break; - } +type StatusProps = { + status: MessageStatus; +}; - return ; -} +const MessageStatus = ({ status }: StatusProps) => ( + +); export default CorrelateMessagesTable; From 3d3f9df9a5b03b026f6c99de09c0332cb59b2f5c Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 09:21:38 +0200 Subject: [PATCH 21/53] use Intl to format date, wrap date rendering in component --- .../src/main/frontend/correlate-table.tsx | 34 +++++++++++++------ .../src/main/frontend/message.ts | 2 +- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx index ebb2da3..823e188 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames'; import React from 'react'; import CorrelateMessageActions from './correlate-message-actions'; -import { Message, MessageStatus } from './message'; +import { LocalDateTimeString, Message, MessageStatus } from './message'; type CorrelateMessagesTableProps = { camundaRestPrefix: string; @@ -51,21 +51,35 @@ function MessageRow({ camundaRestPrefix, message, reload }: MessageRowProps) { {message.id} {message.payloadTypeNamespace}
.{message.payloadTypeName} - {formatDate(message.inserted)} + + + {message.retries} - {message.nextRetry && message.status !== 'PAUSED' ? formatDate(message.nextRetry) : null} + + {(message.nextRetry && message.status !== 'PAUSED') ? ( + + ) : null} + ); } -function formatDate(date: string | null) { - if (!date) { - return null; - } - const split = date.split('T'); - return split[0] + ' ' + split[1].split('.')[0]; -} +type DateTimeProps = { + value: LocalDateTimeString | null; +}; + +const DateTime = ({ value }: DateTimeProps) => value ? ( + +) : null; + +const formatDate = (dateString: string | null) => dateString ? + new Date(dateString).toLocaleDateString(undefined, { day: '2-digit', month: '2-digit', year: 'numeric' }) : + null; + +const formatTime = (dateString: string | null) => dateString ? + new Date(dateString).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' }) : + null; type StatusProps = { status: MessageStatus; diff --git a/extension/cockpit-plugin/src/main/frontend/message.ts b/extension/cockpit-plugin/src/main/frontend/message.ts index 0b4f13f..3de2dc4 100644 --- a/extension/cockpit-plugin/src/main/frontend/message.ts +++ b/extension/cockpit-plugin/src/main/frontend/message.ts @@ -1,6 +1,6 @@ export type MessageStatus = 'IN_PROGRESS' | 'MAX_RETRIES_REACHED' | 'PAUSED' | 'RETRYING'; -type LocalDateTimeString = string; +export type LocalDateTimeString = string; export type Message = { id: string; From 1a6f5389bfaa04fe4b310c4a767d21083f1f6553 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 09:36:06 +0200 Subject: [PATCH 22/53] separate lib and component from plugin and view --- .../correlate-message-actions.tsx | 2 +- .../{ => components}/correlate-table.tsx | 2 +- .../main/frontend/correlate-messages-view.tsx | 47 ++++++++++--------- .../frontend/{ => lib}/camunda-plugin.d.ts | 0 .../main/frontend/{ => lib}/configuration.ts | 0 .../src/main/frontend/{ => lib}/message.ts | 0 .../src/main/frontend/plugin.tsx | 2 +- 7 files changed, 27 insertions(+), 26 deletions(-) rename extension/cockpit-plugin/src/main/frontend/{ => components}/correlate-message-actions.tsx (98%) rename extension/cockpit-plugin/src/main/frontend/{ => components}/correlate-table.tsx (97%) rename extension/cockpit-plugin/src/main/frontend/{ => lib}/camunda-plugin.d.ts (100%) rename extension/cockpit-plugin/src/main/frontend/{ => lib}/configuration.ts (100%) rename extension/cockpit-plugin/src/main/frontend/{ => lib}/message.ts (100%) diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx b/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx similarity index 98% rename from extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx rename to extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx index 841136f..0bce9de 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-message-actions.tsx +++ b/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx @@ -1,6 +1,6 @@ import React from "react"; import { useCookies } from 'react-cookie'; -import { Message } from "./message"; +import { Message } from "./lib/message"; type CorrelateMessageActionsProps = { camundaRestPrefix: string; diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx b/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx similarity index 97% rename from extension/cockpit-plugin/src/main/frontend/correlate-table.tsx rename to extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx index 823e188..43508b1 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-table.tsx +++ b/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames'; import React from 'react'; +import { LocalDateTimeString, Message, MessageStatus } from '../lib/message'; import CorrelateMessageActions from './correlate-message-actions'; -import { LocalDateTimeString, Message, MessageStatus } from './message'; type CorrelateMessagesTableProps = { camundaRestPrefix: string; diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx index 32425c5..5bd48cd 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx @@ -1,7 +1,7 @@ -import React, { useCallback, useEffect, useState } from 'react'; -import { Configuration } from './configuration'; -import CorrelateMessagesTable from './correlate-table'; -import { Message } from './message'; +import { default as React, useCallback, useEffect, useState } from 'react'; +import CorrelateMessagesTable from './components/correlate-table'; +import { Configuration } from './lib/configuration'; +import { Message } from './lib/message'; type CorrelateMessagesViewProps = { camundaRestPrefix: string; @@ -10,27 +10,28 @@ type CorrelateMessagesViewProps = { function CorrelateMessagesView({ camundaRestPrefix }: CorrelateMessagesViewProps) { const { opLog, reload } = useOpLog(camundaRestPrefix); - return (
-
-
-
-
-

Messages

- {opLog ? ( - - ) : ( -
Loading...
- ) - } -
-
+ return ( +
+
+
+
+
+

Messages

+ {opLog ? ( + + ) : ( +
Loading...
+ )} +
+
+
-
); + ); } type OpLog = { diff --git a/extension/cockpit-plugin/src/main/frontend/camunda-plugin.d.ts b/extension/cockpit-plugin/src/main/frontend/lib/camunda-plugin.d.ts similarity index 100% rename from extension/cockpit-plugin/src/main/frontend/camunda-plugin.d.ts rename to extension/cockpit-plugin/src/main/frontend/lib/camunda-plugin.d.ts diff --git a/extension/cockpit-plugin/src/main/frontend/configuration.ts b/extension/cockpit-plugin/src/main/frontend/lib/configuration.ts similarity index 100% rename from extension/cockpit-plugin/src/main/frontend/configuration.ts rename to extension/cockpit-plugin/src/main/frontend/lib/configuration.ts diff --git a/extension/cockpit-plugin/src/main/frontend/message.ts b/extension/cockpit-plugin/src/main/frontend/lib/message.ts similarity index 100% rename from extension/cockpit-plugin/src/main/frontend/message.ts rename to extension/cockpit-plugin/src/main/frontend/lib/message.ts diff --git a/extension/cockpit-plugin/src/main/frontend/plugin.tsx b/extension/cockpit-plugin/src/main/frontend/plugin.tsx index 267125e..0d10c24 100644 --- a/extension/cockpit-plugin/src/main/frontend/plugin.tsx +++ b/extension/cockpit-plugin/src/main/frontend/plugin.tsx @@ -1,7 +1,7 @@ import React from "react"; import ReactDOM from "react-dom"; -import { Plugin } from './camunda-plugin'; import CorrelateMessagesView from "./correlate-messages-view"; +import { Plugin } from './lib/camunda-plugin'; let container: HTMLElement; From d77e4e1e981f0ec69b63ddad468448271819f827 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 09:38:45 +0200 Subject: [PATCH 23/53] refactor messages and configuration into separate hooks --- .../main/frontend/correlate-messages-view.tsx | 65 ++----------------- .../src/main/frontend/lib/configuration.ts | 29 +++++++++ .../src/main/frontend/lib/message.ts | 37 +++++++++++ 3 files changed, 72 insertions(+), 59 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx index 5bd48cd..3a2874b 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx @@ -1,14 +1,14 @@ -import { default as React, useCallback, useEffect, useState } from 'react'; +import { default as React } from 'react'; import CorrelateMessagesTable from './components/correlate-table'; -import { Configuration } from './lib/configuration'; -import { Message } from './lib/message'; +import { useMessages } from './lib/message'; type CorrelateMessagesViewProps = { camundaRestPrefix: string; } function CorrelateMessagesView({ camundaRestPrefix }: CorrelateMessagesViewProps) { - const { opLog, reload } = useOpLog(camundaRestPrefix); + const { messages, reload } = useMessages(camundaRestPrefix); + // const { configuration } = useConfiguration(camundaRestPrefix); return (
@@ -17,10 +17,10 @@ function CorrelateMessagesView({ camundaRestPrefix }: CorrelateMessagesViewProps

Messages

- {opLog ? ( + {messages.length > 0 ? ( ) : ( @@ -34,57 +34,4 @@ function CorrelateMessagesView({ camundaRestPrefix }: CorrelateMessagesViewProps ); } -type OpLog = { - messages: Message[]; - configuration: Configuration; -}; - -function useOpLog(camundaRestPrefix: string) { - const [opLog, setOpLog] = useState(null); - - const loadOpLog = useCallback(async (parameters?: MessageParams) => { - setOpLog(await fetchMessagesAndConfig(camundaRestPrefix, parameters)); - }, [camundaRestPrefix]); - - useEffect(() => { - const parameters = { page: 0, size: 100 }; - loadOpLog(parameters); - }, []); - - return { - opLog, - reload: loadOpLog - }; -} - -type MessageParams = { - page: number; - size: number; -}; - -async function fetchMessagesAndConfig(camundaRestPrefix: string, parameters?: MessageParams): Promise { - if (!parameters) { - parameters = { page: 0, size: 100 }; - } - try { - const [configurationRes, messagesRes] = await Promise.all( - [ - fetch( - `${camundaRestPrefix}/configuration` - ), - fetch( - `${camundaRestPrefix}/messages?page=${parameters.page}&size=${parameters.size}` - ) - ] - ); - return { - messages: await messagesRes.json(), - configuration: await configurationRes.json() - }; - } catch (error) { - console.error(error); - return null; - } -} - export default CorrelateMessagesView; diff --git a/extension/cockpit-plugin/src/main/frontend/lib/configuration.ts b/extension/cockpit-plugin/src/main/frontend/lib/configuration.ts index 65f6b8c..ab07d5f 100644 --- a/extension/cockpit-plugin/src/main/frontend/lib/configuration.ts +++ b/extension/cockpit-plugin/src/main/frontend/lib/configuration.ts @@ -1,3 +1,32 @@ +import { useCallback, useEffect, useState } from "react"; + export type Configuration = { maxRetries: number; }; + +export function useConfiguration(camundaRestPrefix: string) { + const [configuration, setConfiguration] = useState(null); + + const loadConfiguration = useCallback(async () => { + setConfiguration(await fetchConfiguration(camundaRestPrefix)); + }, [camundaRestPrefix]); + + useEffect(() => { + loadConfiguration(); + }, []); + + return { + configuration, + reload: loadConfiguration + }; +} + +async function fetchConfiguration(camundaRestPrefix: string): Promise { + try { + const response = await fetch(`${camundaRestPrefix}/configuration`); + return response.json(); + } catch (error) { + console.error(`Fetching configuration failed`, error); + return null; + } +} diff --git a/extension/cockpit-plugin/src/main/frontend/lib/message.ts b/extension/cockpit-plugin/src/main/frontend/lib/message.ts index 3de2dc4..5c15ea9 100644 --- a/extension/cockpit-plugin/src/main/frontend/lib/message.ts +++ b/extension/cockpit-plugin/src/main/frontend/lib/message.ts @@ -1,3 +1,5 @@ +import { useCallback, useEffect, useState } from "react"; + export type MessageStatus = 'IN_PROGRESS' | 'MAX_RETRIES_REACHED' | 'PAUSED' | 'RETRYING'; export type LocalDateTimeString = string; @@ -16,3 +18,38 @@ export type Message = { nextRetry: LocalDateTimeString | null; error: string | null; }; + +export function useMessages(camundaRestPrefix: string) { + const [messages, setMessages] = useState([]); + + const loadMessages = useCallback(async (parameters?: MessageParams) => { + setMessages(await fetchMessages(camundaRestPrefix, parameters) ?? []); + }, [camundaRestPrefix]); + + useEffect(() => { + loadMessages(); + }, []); + + return { + messages, + reload: loadMessages + }; +} + +type MessageParams = { + page: number; + size: number; +}; + +async function fetchMessages( + camundaRestPrefix: string, + parameters: MessageParams = { page: 0, size: 100 } +): Promise { + try { + const response = await fetch(`${camundaRestPrefix}/messages?page=${parameters.page}&size=${parameters.size}`); + return response.json(); + } catch (error) { + console.error(`Fetching messages failed`, error); + return null; + } +} From 3a6fb54b2940029dd6dfa7cd09226a4bfc8d5021 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 10:03:38 +0200 Subject: [PATCH 24/53] move logic from UI components to lib --- .../components/correlate-message-actions.tsx | 31 +++++-------------- .../frontend/components/correlate-table.tsx | 30 +++++++++++++----- .../main/frontend/correlate-messages-view.tsx | 6 ++-- .../src/main/frontend/lib/message.ts | 20 +++++++++++- 4 files changed, 53 insertions(+), 34 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx b/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx index 0bce9de..8da4de5 100644 --- a/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx +++ b/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx @@ -1,28 +1,14 @@ import React from "react"; -import { useCookies } from 'react-cookie'; -import { Message } from "./lib/message"; +import { Message } from "../lib/message"; type CorrelateMessageActionsProps = { - camundaRestPrefix: string; message: Message; - reload: () => void; + onDeleteMessage: (messageId: Message['id']) => Promise; + onPauseCorrelation: (messageId: Message['id']) => Promise; + onResumeCorrelation: (messageId: Message['id']) => Promise; }; -function CorrelateMessageActions({ camundaRestPrefix, message, reload }: CorrelateMessageActionsProps) { - const [cookies] = useCookies(['XSRF-TOKEN']); - - const handleDelete = async () => { - await fetch(`${camundaRestPrefix}/messages/${message.id}`, { method: 'DELETE', headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); - } - - const handlePause = async () => { - await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, { method: 'PUT', headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); - } - - const handleResume = async () => { - await fetch(`${camundaRestPrefix}/messages/${message.id}/pause`, { method: 'DELETE', headers: { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] } }); - } - +function CorrelateMessageActions({ message, onDeleteMessage, onPauseCorrelation, onResumeCorrelation }: CorrelateMessageActionsProps) { const showStacktrace = () => { console.log('stacktrace', message.error); } @@ -35,7 +21,6 @@ function CorrelateMessageActions({ camundaRestPrefix, message, reload }: Correla console.log('decrease', message.id); } - return (<> {message.error ? ( ) : null} {message.status === 'PAUSED' ? ( - ) : ( - )} - ); diff --git a/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx b/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx index 43508b1..81f3220 100644 --- a/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx +++ b/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx @@ -4,12 +4,13 @@ import { LocalDateTimeString, Message, MessageStatus } from '../lib/message'; import CorrelateMessageActions from './correlate-message-actions'; type CorrelateMessagesTableProps = { - camundaRestPrefix: string; messages: Message[]; - reload: () => void; + onDeleteMessage: (messageId: Message['id']) => Promise; + onPauseCorrelation: (messageId: Message['id']) => Promise; + onResumeCorrelation: (messageId: Message['id']) => Promise; }; -function CorrelateMessagesTable({ messages, camundaRestPrefix, reload }: CorrelateMessagesTableProps) { +function CorrelateMessagesTable({ messages, onDeleteMessage, onPauseCorrelation, onResumeCorrelation }: CorrelateMessagesTableProps) { return ( @@ -30,7 +31,12 @@ function CorrelateMessagesTable({ messages, camundaRestPrefix, reload }: Correla ) : null} {messages?.map(message => ( - + ))}
@@ -38,12 +44,13 @@ function CorrelateMessagesTable({ messages, camundaRestPrefix, reload }: Correla } type MessageRowProps = { - camundaRestPrefix: string; message: Message; - reload: () => void; + onDeleteMessage: (messageId: Message['id']) => Promise; + onPauseCorrelation: (messageId: Message['id']) => Promise; + onResumeCorrelation: (messageId: Message['id']) => Promise; }; -function MessageRow({ camundaRestPrefix, message, reload }: MessageRowProps) { +function MessageRow({ message, onDeleteMessage, onPauseCorrelation, onResumeCorrelation }: MessageRowProps) { return ( @@ -60,7 +67,14 @@ function MessageRow({ camundaRestPrefix, message, reload }: MessageRowProps) { ) : null} - + + + ); } diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx index 3a2874b..d65b70e 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx @@ -7,7 +7,7 @@ type CorrelateMessagesViewProps = { } function CorrelateMessagesView({ camundaRestPrefix }: CorrelateMessagesViewProps) { - const { messages, reload } = useMessages(camundaRestPrefix); + const { messages, deleteMessage, pauseCorrelation, resumeCorrelation } = useMessages(camundaRestPrefix); // const { configuration } = useConfiguration(camundaRestPrefix); return ( @@ -21,7 +21,9 @@ function CorrelateMessagesView({ camundaRestPrefix }: CorrelateMessagesViewProps ) : (
Loading...
diff --git a/extension/cockpit-plugin/src/main/frontend/lib/message.ts b/extension/cockpit-plugin/src/main/frontend/lib/message.ts index 5c15ea9..92e9af6 100644 --- a/extension/cockpit-plugin/src/main/frontend/lib/message.ts +++ b/extension/cockpit-plugin/src/main/frontend/lib/message.ts @@ -1,4 +1,5 @@ import { useCallback, useEffect, useState } from "react"; +import { useCookies } from "react-cookie"; export type MessageStatus = 'IN_PROGRESS' | 'MAX_RETRIES_REACHED' | 'PAUSED' | 'RETRYING'; @@ -20,19 +21,36 @@ export type Message = { }; export function useMessages(camundaRestPrefix: string) { + const [cookies] = useCookies(['XSRF-TOKEN']); + const headers = { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] }; + const [messages, setMessages] = useState([]); const loadMessages = useCallback(async (parameters?: MessageParams) => { setMessages(await fetchMessages(camundaRestPrefix, parameters) ?? []); }, [camundaRestPrefix]); + const deleteMessage = useCallback(async (messageId: Message['id']) => { + await fetch(`${camundaRestPrefix}/messages/${messageId}`, { method: 'DELETE', headers }); + }, [camundaRestPrefix, headers]); + + const pauseCorrelation = useCallback(async (messageId: Message['id']) => { + await fetch(`${camundaRestPrefix}/messages/${messageId}/pause`, { method: 'PUT', headers }); + }, [camundaRestPrefix, headers]); + + const resumeCorrelation = useCallback(async (messageId: Message['id']) => { + await fetch(`${camundaRestPrefix}/messages/${messageId}/pause`, { method: 'DELETE', headers }); + }, [camundaRestPrefix, headers]); + useEffect(() => { loadMessages(); }, []); return { messages, - reload: loadMessages + deleteMessage, + pauseCorrelation, + resumeCorrelation }; } From 9d79126d88443189089ac2efd523b23e883504da Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 10:12:09 +0200 Subject: [PATCH 25/53] extract Button component --- .../src/main/frontend/components/button.tsx | 14 +++++++++++ .../components/correlate-message-actions.tsx | 24 +++++++------------ 2 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 extension/cockpit-plugin/src/main/frontend/components/button.tsx diff --git a/extension/cockpit-plugin/src/main/frontend/components/button.tsx b/extension/cockpit-plugin/src/main/frontend/components/button.tsx new file mode 100644 index 0000000..cc2e20b --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/components/button.tsx @@ -0,0 +1,14 @@ +import React from "react"; + +type ButtonProps = { + label: string; + icon: string; + onClick: () => void; +}; + +export const Button = ({ label, icon, onClick }: ButtonProps) => ( + +); diff --git a/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx b/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx index 8da4de5..faf8b75 100644 --- a/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx +++ b/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx @@ -1,5 +1,6 @@ import React from "react"; import { Message } from "../lib/message"; +import { Button } from "./button"; type CorrelateMessageActionsProps = { message: Message; @@ -23,27 +24,20 @@ function CorrelateMessageActions({ message, onDeleteMessage, onPauseCorrelation, return (<> {message.error ? ( - + + + + + +
From 733fcad6955a3c8ad2096d6b65993559b670890e Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 23:23:47 +0200 Subject: [PATCH 28/53] remove camundaRestPrefix from CorrelateMessagesTable props --- .../cockpit-plugin/src/main/frontend/correlate-messages-view.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx index 331bd1b..c285d0e 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx @@ -18,7 +18,6 @@ function CorrelateMessagesView({ camundaRestPrefix }: CorrelateMessagesViewProps

Messages

Date: Wed, 24 Aug 2022 23:24:09 +0200 Subject: [PATCH 29/53] reload messages after delete/pause/resume --- extension/cockpit-plugin/src/main/frontend/lib/message.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extension/cockpit-plugin/src/main/frontend/lib/message.ts b/extension/cockpit-plugin/src/main/frontend/lib/message.ts index 92e9af6..38fe538 100644 --- a/extension/cockpit-plugin/src/main/frontend/lib/message.ts +++ b/extension/cockpit-plugin/src/main/frontend/lib/message.ts @@ -32,14 +32,17 @@ export function useMessages(camundaRestPrefix: string) { const deleteMessage = useCallback(async (messageId: Message['id']) => { await fetch(`${camundaRestPrefix}/messages/${messageId}`, { method: 'DELETE', headers }); + loadMessages(); }, [camundaRestPrefix, headers]); const pauseCorrelation = useCallback(async (messageId: Message['id']) => { await fetch(`${camundaRestPrefix}/messages/${messageId}/pause`, { method: 'PUT', headers }); + loadMessages(); }, [camundaRestPrefix, headers]); const resumeCorrelation = useCallback(async (messageId: Message['id']) => { await fetch(`${camundaRestPrefix}/messages/${messageId}/pause`, { method: 'DELETE', headers }); + loadMessages(); }, [camundaRestPrefix, headers]); useEffect(() => { From c16df2e76b95c1206d69ba64cf9a02384583af14 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 23:27:23 +0200 Subject: [PATCH 30/53] persist message query params between reloads --- .../src/main/frontend/lib/message.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/lib/message.ts b/extension/cockpit-plugin/src/main/frontend/lib/message.ts index 38fe538..af33a64 100644 --- a/extension/cockpit-plugin/src/main/frontend/lib/message.ts +++ b/extension/cockpit-plugin/src/main/frontend/lib/message.ts @@ -20,14 +20,22 @@ export type Message = { error: string | null; }; -export function useMessages(camundaRestPrefix: string) { +type MessageParams = { + page: number; + size: number; +}; + +export function useMessages( + camundaRestPrefix: string, + params: MessageParams = { page: 0, size: 100 } +) { const [cookies] = useCookies(['XSRF-TOKEN']); const headers = { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] }; const [messages, setMessages] = useState([]); - const loadMessages = useCallback(async (parameters?: MessageParams) => { - setMessages(await fetchMessages(camundaRestPrefix, parameters) ?? []); + const loadMessages = useCallback(async () => { + setMessages(await fetchMessages(camundaRestPrefix, params) ?? []); }, [camundaRestPrefix]); const deleteMessage = useCallback(async (messageId: Message['id']) => { @@ -57,15 +65,7 @@ export function useMessages(camundaRestPrefix: string) { }; } -type MessageParams = { - page: number; - size: number; -}; - -async function fetchMessages( - camundaRestPrefix: string, - parameters: MessageParams = { page: 0, size: 100 } -): Promise { +async function fetchMessages(camundaRestPrefix: string, parameters: MessageParams): Promise { try { const response = await fetch(`${camundaRestPrefix}/messages?page=${parameters.page}&size=${parameters.size}`); return response.json(); From 789ffbaf939fa9192c5713aa990a1ab37396c170 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 23:32:09 +0200 Subject: [PATCH 31/53] render "Loading" indicator when no messages have been loaded yet --- .../main/frontend/correlate-messages-view.tsx | 16 ++++++++++------ .../src/main/frontend/lib/message.ts | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx index c285d0e..8b390bd 100644 --- a/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx +++ b/extension/cockpit-plugin/src/main/frontend/correlate-messages-view.tsx @@ -17,12 +17,16 @@ function CorrelateMessagesView({ camundaRestPrefix }: CorrelateMessagesViewProps

Messages

- + {messages ? ( + + ) : ( +
Loading...
+ )}
diff --git a/extension/cockpit-plugin/src/main/frontend/lib/message.ts b/extension/cockpit-plugin/src/main/frontend/lib/message.ts index af33a64..cf0e38d 100644 --- a/extension/cockpit-plugin/src/main/frontend/lib/message.ts +++ b/extension/cockpit-plugin/src/main/frontend/lib/message.ts @@ -32,10 +32,10 @@ export function useMessages( const [cookies] = useCookies(['XSRF-TOKEN']); const headers = { 'X-XSRF-TOKEN': cookies['XSRF-TOKEN'] }; - const [messages, setMessages] = useState([]); + const [messages, setMessages] = useState(null); const loadMessages = useCallback(async () => { - setMessages(await fetchMessages(camundaRestPrefix, params) ?? []); + setMessages(await fetchMessages(camundaRestPrefix, params)); }, [camundaRestPrefix]); const deleteMessage = useCallback(async (messageId: Message['id']) => { From 260a5cbf42721b05322f760a9608989f85b220b6 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 23:50:06 +0200 Subject: [PATCH 32/53] extract datetime into separate file --- .../frontend/components/correlate-table.tsx | 19 ++----------------- .../main/frontend/components/date-time.tsx | 10 ++++++++++ .../src/main/frontend/lib/date.ts | 9 +++++++++ .../src/main/frontend/lib/message.ts | 3 +-- 4 files changed, 22 insertions(+), 19 deletions(-) create mode 100644 extension/cockpit-plugin/src/main/frontend/components/date-time.tsx create mode 100644 extension/cockpit-plugin/src/main/frontend/lib/date.ts diff --git a/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx b/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx index 81f3220..1bebb11 100644 --- a/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx +++ b/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx @@ -1,7 +1,8 @@ import classNames from 'classnames'; import React from 'react'; -import { LocalDateTimeString, Message, MessageStatus } from '../lib/message'; +import { Message, MessageStatus } from '../lib/message'; import CorrelateMessageActions from './correlate-message-actions'; +import { DateTime } from './date-time'; type CorrelateMessagesTableProps = { messages: Message[]; @@ -79,22 +80,6 @@ function MessageRow({ message, onDeleteMessage, onPauseCorrelation, onResumeCorr ); } -type DateTimeProps = { - value: LocalDateTimeString | null; -}; - -const DateTime = ({ value }: DateTimeProps) => value ? ( - -) : null; - -const formatDate = (dateString: string | null) => dateString ? - new Date(dateString).toLocaleDateString(undefined, { day: '2-digit', month: '2-digit', year: 'numeric' }) : - null; - -const formatTime = (dateString: string | null) => dateString ? - new Date(dateString).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' }) : - null; - type StatusProps = { status: MessageStatus; }; diff --git a/extension/cockpit-plugin/src/main/frontend/components/date-time.tsx b/extension/cockpit-plugin/src/main/frontend/components/date-time.tsx new file mode 100644 index 0000000..313be21 --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/components/date-time.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import { formatDate, formatTime, LocalDateTimeString } from "../lib/date"; + +type DateTimeProps = { + value: LocalDateTimeString | null; +}; + +export const DateTime = ({ value }: DateTimeProps) => value ? ( + +) : null; diff --git a/extension/cockpit-plugin/src/main/frontend/lib/date.ts b/extension/cockpit-plugin/src/main/frontend/lib/date.ts new file mode 100644 index 0000000..e50c9bb --- /dev/null +++ b/extension/cockpit-plugin/src/main/frontend/lib/date.ts @@ -0,0 +1,9 @@ +export type LocalDateTimeString = string; + +export const formatDate = (dateString: string | null) => dateString ? + new Date(dateString).toLocaleDateString(undefined, { day: '2-digit', month: '2-digit', year: 'numeric' }) : + null; + +export const formatTime = (dateString: string | null) => dateString ? + new Date(dateString).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' }) : + null; diff --git a/extension/cockpit-plugin/src/main/frontend/lib/message.ts b/extension/cockpit-plugin/src/main/frontend/lib/message.ts index cf0e38d..6ef5c75 100644 --- a/extension/cockpit-plugin/src/main/frontend/lib/message.ts +++ b/extension/cockpit-plugin/src/main/frontend/lib/message.ts @@ -1,10 +1,9 @@ import { useCallback, useEffect, useState } from "react"; import { useCookies } from "react-cookie"; +import type { LocalDateTimeString } from "./date"; export type MessageStatus = 'IN_PROGRESS' | 'MAX_RETRIES_REACHED' | 'PAUSED' | 'RETRYING'; -export type LocalDateTimeString = string; - export type Message = { id: string; status: MessageStatus; From 27516c4377380366731b540bd4b891f3264df416 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 24 Aug 2022 23:50:12 +0200 Subject: [PATCH 33/53] make MessageStatus accessible --- .../src/main/frontend/components/correlate-table.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx b/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx index 1bebb11..f3ef255 100644 --- a/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx +++ b/extension/cockpit-plugin/src/main/frontend/components/correlate-table.tsx @@ -84,13 +84,16 @@ type StatusProps = { status: MessageStatus; }; -const MessageStatus = ({ status }: StatusProps) => ( +const MessageStatus = ({ status }: StatusProps) => (<> -); + + {status.toLowerCase().replace('_', ' ')} + +); export default CorrelateMessagesTable; From 8ef709f2298a259dbd98a765d7b3959fecb67655 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Tue, 27 Sep 2022 11:04:27 +0200 Subject: [PATCH 34/53] kill typo in ingress --- README.md | 3 +- docs/assets/component-diagram.graphml | 2 +- docs/assets/components.plantuml | 2 +- docs/getting-started.md | 10 +-- docs/introduction/features.md | 2 +- docs/introduction/further-outlook.md | 2 +- docs/introduction/solution.md | 2 +- docs/user-guide/filtering-messages.md | 4 +- docs/user-guide/index.md | 2 +- docs/user-guide/ingres-spring-cloud.md | 6 -- docs/user-guide/ingres.md | 8 -- .../{ingres-axon.md => ingress-axon.md} | 4 +- docs/user-guide/ingress-spring-cloud.md | 6 ++ docs/user-guide/ingress.md | 8 ++ docs/user-guide/message-acceptor.md | 8 +- example/axon/reservation-axon/pom.xml | 2 +- example/spring-cloud/docker-compose.yml | 6 +- example/spring-cloud/example.sh | 4 +- example/spring-cloud/flight-kafka/env.env | 2 +- .../src/main/resources/application.yml | 2 +- example/spring-cloud/hotel-kafka/env.env | 2 +- .../src/main/resources/application.yml | 2 +- .../spring-cloud/reservation-kafka/env.env | 2 +- .../spring-cloud/reservation-kafka/pom.xml | 2 +- .../src/main/resources/application.yml | 4 +- extension/axon/pom.xml | 2 +- .../axon/AxonChannelConfiguration.kt | 10 +-- .../axon/AxonEventHeaderConverter.kt | 2 +- .../axon/AxonEventMessageHandler.kt | 13 ++-- .../axon/AxonHandlerConfiguration.kt | 2 +- .../axon/DefaultAxonEventHeaderConverter.kt | 2 +- .../main/resources/META-INF/spring.factories | 4 +- .../MessageMetaDataSnippetExtractor.kt | 2 +- ...elConfigMessageMetaDataSnippetExtractor.kt | 2 +- .../HeaderMessageMetaDataSnippetExtractor.kt | 2 +- .../MessageMetadataExtractorChain.kt | 2 +- .../ChannelMessageAcceptor.kt | 4 +- .../bpm/correlate/ingress/IngressMetrics.kt | 78 +++++++++++++++++++ .../{ingres => ingress}/MessageFilter.kt | 4 +- .../filter/AllMessageFilter.kt | 6 +- .../filter/AndCompositeMessageFilter.kt | 6 +- .../filter/NotMessageFilter.kt | 6 +- .../filter/OrCompositeMessageFilter.kt | 6 +- .../TypeExistsOnClasspathMessageFilter.kt | 6 +- .../filter/TypeListMessageFilter.kt | 7 +- .../PersistingChannelMessageAcceptorImpl.kt | 16 ++-- .../message/ByteMessage.kt | 2 +- .../message/ChannelMessage.kt | 2 +- .../message/DelegatingChannelMessage.kt | 2 +- .../message/ObjectMessage.kt | 2 +- .../persist/MessagePersistenceService.kt | 2 +- .../impl/DefaultMessagePersistenceService.kt | 6 +- .../camunda/bpm/correlate/TestFixtures.kt | 7 +- .../filter/AllMessageFilterTest.kt | 2 +- .../filter/AndCompositeMessageFilterTest.kt | 2 +- .../filter/NotMessageFilterTest.kt | 2 +- .../filter/OrCompositeMessageFilterTest.kt | 2 +- .../TypeExistsOnClasspathMessageFilterTest.kt | 2 +- .../filter/TypeListMessageFilterTest.kt | 2 +- ...ersistingChannelMessageAcceptorImplTest.kt | 8 +- .../message/DelegatingChannelMessageTest.kt | 8 +- .../CamundaBpmCorrelateConfiguration.kt | 4 +- .../ChannelMessageAcceptorConfiguration.kt | 10 +-- .../main/resources/META-INF/spring.factories | 2 +- extension/spring-cloud-stream/pom.xml | 2 +- .../ChannelMessageHeaderConverter.kt | 2 +- .../DefaultKafkaMessageHeaderConverter.kt | 2 +- .../SpringCloudStreamChannelConfiguration.kt | 10 +-- .../cloudstream/StreamByteMessageConsumer.kt | 15 ++-- .../main/resources/META-INF/spring.factories | 2 +- mkdocs.yml | 6 +- 71 files changed, 232 insertions(+), 153 deletions(-) delete mode 100644 docs/user-guide/ingres-spring-cloud.md delete mode 100644 docs/user-guide/ingres.md rename docs/user-guide/{ingres-axon.md => ingress-axon.md} (67%) create mode 100644 docs/user-guide/ingress-spring-cloud.md create mode 100644 docs/user-guide/ingress.md rename extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/axon/AxonChannelConfiguration.kt (89%) rename extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/axon/AxonEventHeaderConverter.kt (86%) rename extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/axon/AxonEventMessageHandler.kt (80%) rename extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/axon/AxonHandlerConfiguration.kt (88%) rename extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/axon/DefaultAxonEventHeaderConverter.kt (96%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/ChannelMessageAcceptor.kt (79%) create mode 100644 extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/MessageFilter.kt (80%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/AllMessageFilter.kt (57%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/AndCompositeMessageFilter.kt (70%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/NotMessageFilter.kt (65%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/OrCompositeMessageFilter.kt (69%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/TypeExistsOnClasspathMessageFilter.kt (75%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/TypeListMessageFilter.kt (71%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/impl/PersistingChannelMessageAcceptorImpl.kt (71%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/message/ByteMessage.kt (74%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/message/ChannelMessage.kt (73%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/message/DelegatingChannelMessage.kt (91%) rename extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/message/ObjectMessage.kt (82%) rename extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/AllMessageFilterTest.kt (87%) rename extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/AndCompositeMessageFilterTest.kt (94%) rename extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/NotMessageFilterTest.kt (94%) rename extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/OrCompositeMessageFilterTest.kt (94%) rename extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/TypeExistsOnClasspathMessageFilterTest.kt (93%) rename extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/filter/TypeListMessageFilterTest.kt (96%) rename extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/impl/PersistingChannelMessageAcceptorImplTest.kt (93%) rename extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/message/DelegatingChannelMessageTest.kt (89%) rename extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/ChannelMessageAcceptorConfiguration.kt (82%) rename extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/cloudstream/ChannelMessageHeaderConverter.kt (86%) rename extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/cloudstream/DefaultKafkaMessageHeaderConverter.kt (95%) rename extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/cloudstream/SpringCloudStreamChannelConfiguration.kt (85%) rename extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/{ingres => ingress}/cloudstream/StreamByteMessageConsumer.kt (61%) diff --git a/README.md b/README.md index 45873c0..3ccd28c 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,9 @@ you to solve integration problems around correlation of messages with processes. ## Main Features -* Ingres adapters for: +* Ingress adapters for: * Spring Cloud Streams (e.g. Kafka Streams, Rabbit MQ, Azure Event Hubs, AWS SQS, AWS SNS, Solace PubSub+, Google PubSub) + * Axon Framework (Axon Event Bus) * Inbox pattern on message receiving * Message storage in the Camunda Platform 7 database * MyBatis repository diff --git a/docs/assets/component-diagram.graphml b/docs/assets/component-diagram.graphml index b3dfbaf..a8b92e5 100644 --- a/docs/assets/component-diagram.graphml +++ b/docs/assets/component-diagram.graphml @@ -32,7 +32,7 @@ - Ingres Adapter + Ingress Adapter diff --git a/docs/assets/components.plantuml b/docs/assets/components.plantuml index 1ac8231..998b71d 100644 --- a/docs/assets/components.plantuml +++ b/docs/assets/components.plantuml @@ -9,7 +9,7 @@ skinparam component { interface "Channel Message Acceptor" as CMA -package "Ingres Adapter" { +package "Ingress Adapter" { [ Kafka ] } diff --git a/docs/getting-started.md b/docs/getting-started.md index 8176712..6690033 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,11 +1,11 @@ ## Install Dependency -First install the extension using the corresponding ingres adapter (in this example we use Kafka): +First install the extension using the corresponding ingress adapter (in this example we use Kafka): ```xml - 0.0.1 + 0.0.2 @@ -42,12 +42,12 @@ spring: function: definition: streamByteMessageConsumer bindings: - streamByteMessageConsumer-in-0: correlate-ingres-binding + streamByteMessageConsumer-in-0: correlate-ingress-binding bindings: correlate-ingres-binding: content-type: application/json - destination: ${KAFKA_TOPIC_CORRELATE_INGRES:correlate-ingres} - binder: correlate-ingres-binder + destination: ${KAFKA_TOPIC_CORRELATE_INGRES:correlate-ingress} + binder: correlate-ingress-binder group: ${KAFKA_GROUP_ID} binders: correlate-ingres-binder: diff --git a/docs/introduction/features.md b/docs/introduction/features.md index 3a9dbe2..e598ed3 100644 --- a/docs/introduction/features.md +++ b/docs/introduction/features.md @@ -2,7 +2,7 @@ Currently, the library supports the following features: ## General -* Ingres Adapters: +* Ingress Adapters: * Spring Cloud Kafka * Axon Framework * MetaData extractors: diff --git a/docs/introduction/further-outlook.md b/docs/introduction/further-outlook.md index 1c534b0..0fcfdc9 100644 --- a/docs/introduction/further-outlook.md +++ b/docs/introduction/further-outlook.md @@ -2,7 +2,7 @@ * Plugin for Camunda Cockpit * More metrics for Prometheus -* More ingres adapters: +* More ingress adapters: * Apache Camel * REST implementing Camunda API diff --git a/docs/introduction/solution.md b/docs/introduction/solution.md index b952866..c6d1af9 100644 --- a/docs/introduction/solution.md +++ b/docs/introduction/solution.md @@ -2,4 +2,4 @@ The library provides a core that is responsible for accepting the message, stori and processing it scheduled. If any errors occur during the correlation, these are handled by one of the pre-configured error strategies, like retry, ignore or drop... -In addition, there are a set of several ingres adapters to support different communication technologies. +In addition, there are a set of several ingress adapters to support different communication technologies. diff --git a/docs/user-guide/filtering-messages.md b/docs/user-guide/filtering-messages.md index 3df92c1..2b8780d 100644 --- a/docs/user-guide/filtering-messages.md +++ b/docs/user-guide/filtering-messages.md @@ -1,6 +1,6 @@ In messaging scenarios it is not uncommon that the message bus is transporting more types of message than the current system should consume. In this case, it is important to filter out and ignore the irrelevant messages and take only the relevant messages into consideration. In the same time, -all messages still needs to be consumed in order not to block the follow-up messages. In order to filter the messages between the [Ingres Adapter](ingres.md) +all messages still needs to be consumed in order not to block the follow-up messages. In order to filter the messages between the [Ingress Adapter](ingress.md) and the [Message Acceptor](message-acceptor.md) we supply a special `MessageFilter` to filter out the supported messaged. ```kotlin @@ -22,7 +22,7 @@ Feel free to implement your own filters and supply them as a Spring Bean or choo ### AllMessageFilter -The `AllMessageFilter` accepts all messages received from the Ingres adapter. +The `AllMessageFilter` accepts all messages received from the Ingress adapter. ### AndCompositeMessageFilter diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index 1e37bf3..a7c63c4 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -3,7 +3,7 @@ The user guide consists of several sections. ## Concepts and Components * [Architecture](architecture.md) -* [Ingres Adapter](ingres.md) +* [Ingress Adapter](ingress.md) * [Message Acceptor](message-acceptor.md) * [Message Persistence](message-persistence.md) * [Scheduled Processing](scheduled-processing.md) diff --git a/docs/user-guide/ingres-spring-cloud.md b/docs/user-guide/ingres-spring-cloud.md deleted file mode 100644 index df3135a..0000000 --- a/docs/user-guide/ingres-spring-cloud.md +++ /dev/null @@ -1,6 +0,0 @@ -The Spring Cloud Ingres Adapter is a component responsible for receiving Spring Cloud messages (using configured binding like Kafka, AMQP or others) and -convert them into message format used by the library. - -### Message - -Kafka Message is received and the Kafka headers are converted to message headers. diff --git a/docs/user-guide/ingres.md b/docs/user-guide/ingres.md deleted file mode 100644 index fef8a3d..0000000 --- a/docs/user-guide/ingres.md +++ /dev/null @@ -1,8 +0,0 @@ -The ingres adapter is a component responsible for the adaptation of the communication technology to the uniform message format used in the library. -It is responsible for creation the instance of a message including message headers and serialized message payload. - -The following Ingres Adapter are available out of the box: - -* [Axon Framework](ingres-axon.md) -* [Spring Cloud Stream](ingres-spring-cloud.md) - diff --git a/docs/user-guide/ingres-axon.md b/docs/user-guide/ingress-axon.md similarity index 67% rename from docs/user-guide/ingres-axon.md rename to docs/user-guide/ingress-axon.md index aad0b4c..1f5ce45 100644 --- a/docs/user-guide/ingres-axon.md +++ b/docs/user-guide/ingress-axon.md @@ -1,7 +1,7 @@ -The Axon Framework Ingres Adapter is responsible for receiving events on Axon Event bus and sending them for the correlation to the library. +The Axon Framework Ingress Adapter is responsible for receiving events on Axon Event bus and sending them for the correlation to the library. ### Message -Axon Event Message is received and deserialized by Axon Framework, using the configured message de-serializer and passed to the ingres adapter. +Axon Event Message is received and deserialized by Axon Framework, using the configured message de-serializer and passed to the ingress adapter. The adapter is reading headers from message `MetaData` and converts them into message headers. The payload is encoded into serializable payload using the configured encoder (currently Jackson). diff --git a/docs/user-guide/ingress-spring-cloud.md b/docs/user-guide/ingress-spring-cloud.md new file mode 100644 index 0000000..68a45d5 --- /dev/null +++ b/docs/user-guide/ingress-spring-cloud.md @@ -0,0 +1,6 @@ +The Spring Cloud Ingress Adapter is a component responsible for receiving Spring Cloud messages (using configured binding like Kafka, AMQP or others) and +convert them into message format used by the library. + +### Message + +Kafka Message is received and the Kafka headers are converted to message headers. diff --git a/docs/user-guide/ingress.md b/docs/user-guide/ingress.md new file mode 100644 index 0000000..0c8ef5b --- /dev/null +++ b/docs/user-guide/ingress.md @@ -0,0 +1,8 @@ +The ingress adapter is a component responsible for the adaptation of the communication technology to the uniform message format used in the library. +It is responsible for creation the instance of a message including message headers and serialized message payload. + +The following Ingress Adapter are available out of the box: + +* [Axon Framework](ingress-axon.md) +* [Spring Cloud Stream](ingress-spring-cloud.md) + diff --git a/docs/user-guide/message-acceptor.md b/docs/user-guide/message-acceptor.md index e20c606..d713346 100644 --- a/docs/user-guide/message-acceptor.md +++ b/docs/user-guide/message-acceptor.md @@ -1,4 +1,4 @@ -The message acceptor is a component responsible to receive the message from the Ingres adapter and store it into the database. +The message acceptor is a component responsible to receive the message from the Ingress adapter and store it into the database. ## Message Metadata Along with the payload the message must contain metadata represented by the `MessageMetadata`. This metadata is extracted from the channel settings, @@ -16,13 +16,13 @@ like message encoding are extracted that way. ### HeaderMessageMessageMetaDataSnippetExtractor The `HeaderMessageMessageMetaDataSnippetExtractor` is responsible for reading metadata from message headers. Most communication technologies support some concept -of message headers and the corresponding [Ingres Adapter](./ingres-axon.md) is mapping those headers to message headers used in the library. By doing so, -you can influence message attributes on a message level. For example, if you are receiving different types of messages by the same ingres adapter, this is +of message headers and the corresponding [Ingress Adapter](./ingress-axon.md) is mapping those headers to message headers used in the library. By doing so, +you can influence message attributes on a message level. For example, if you are receiving different types of messages by the same ingress adapter, this is the easiest way to detect the type of the message. ## Message filtering -Sometimes, more messages are sent through the channel as needed to be received by the Ingres Adapter and needs to be accepted and stored by the library. +Sometimes, more messages are sent through the channel as needed to be received by the Ingress Adapter and needs to be accepted and stored by the library. For this purpose, a special filtering component `MessageFilter` is configured in the `MessageAcceptor`. For more details, how to use the filter please check the [Filtering messages](filtering-messages.md) section. You can diff --git a/example/axon/reservation-axon/pom.xml b/example/axon/reservation-axon/pom.xml index 1312320..1135477 100644 --- a/example/axon/reservation-axon/pom.xml +++ b/example/axon/reservation-axon/pom.xml @@ -19,7 +19,7 @@ io.holunda camunda-bpm-correlate-spring-boot-starter - + io.holunda camunda-bpm-correlate-axon-framework diff --git a/example/spring-cloud/docker-compose.yml b/example/spring-cloud/docker-compose.yml index ea422fd..e9fc780 100644 --- a/example/spring-cloud/docker-compose.yml +++ b/example/spring-cloud/docker-compose.yml @@ -15,7 +15,7 @@ services: depends_on: - zookeeper environment: - KAFKA_CREATE_TOPICS: "flight:1:1, hotel:1:1, correlate-ingres:1:1" + KAFKA_CREATE_TOPICS: "flight:1:1, hotel:1:1, correlate-ingress:1:1" KAFKA_BROKER_ID: 1 KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092" KAFKA_LISTENERS: "PLAINTEXT://:9092" @@ -35,7 +35,7 @@ services: KAFKA_BOOTSTRAP_SERVER_PORT: 9092 KAFKA_SECURITY_PROTOCOL_OVERRIDE: PLAINTEXT KAFKA_TOPIC_CORRELATE_HOTEL: hotel - KAFKA_TOPIC_CORRELATE_HOTEL_RESULT: correlate-ingres + KAFKA_TOPIC_CORRELATE_HOTEL_RESULT: correlate-ingress KAFKA_GROUP_ID: hotel @@ -49,7 +49,7 @@ services: KAFKA_BOOTSTRAP_SERVER_PORT: 9092 KAFKA_SECURITY_PROTOCOL_OVERRIDE: PLAINTEXT KAFKA_TOPIC_CORRELATE_HOTEL: flight - KAFKA_TOPIC_CORRELATE_HOTEL_RESULT: correlate-ingres + KAFKA_TOPIC_CORRELATE_HOTEL_RESULT: correlate-ingress KAFKA_GROUP_ID: flight networks: diff --git a/example/spring-cloud/example.sh b/example/spring-cloud/example.sh index 2f87a9c..b22b416 100755 --- a/example/spring-cloud/example.sh +++ b/example/spring-cloud/example.sh @@ -28,7 +28,7 @@ case "$1" in ;; "show") $CLIENT_BIN -b $KAFKA_BOOTSTRAP_SERVER_HOST:$KAFKA_BOOTSTRAP_SERVER_PORT \ - -t $KAFKA_TOPIC_CORRELATE_INGRES \ + -t $KAFKA_TOPIC_CORRELATE_INGRESS \ -C exit 0 ;; @@ -45,6 +45,6 @@ esac echo $JSON | $CLIENT_BIN \ -b $KAFKA_BOOTSTRAP_SERVER_HOST:$KAFKA_BOOTSTRAP_SERVER_PORT \ - -t $KAFKA_TOPIC_CORRELATE_INGRES \ + -t $KAFKA_TOPIC_CORRELATE_INGRESS \ -P \ -H X-CORRELATE-PayloadType-FQCN=$EVENT_TYPE diff --git a/example/spring-cloud/flight-kafka/env.env b/example/spring-cloud/flight-kafka/env.env index 5e1a0bf..9a4c042 100644 --- a/example/spring-cloud/flight-kafka/env.env +++ b/example/spring-cloud/flight-kafka/env.env @@ -2,6 +2,6 @@ KAFKA_BOOTSTRAP_SERVER_HOST=localhost KAFKA_BOOTSTRAP_SERVER_PORT=9092 KAFKA_SECURITY_PROTOCOL_OVERRIDE=PLAINTEXT KAFKA_TOPIC_CORRELATE_FLIGHTS=flight -KAFKA_TOPIC_CORRELATE_FLIGHTS_RESULT=correlate-ingres +KAFKA_TOPIC_CORRELATE_FLIGHTS_RESULT=correlate-ingress KAFKA_GROUP_ID=flight PROCESSING_DELAY=5 diff --git a/example/spring-cloud/flight-kafka/src/main/resources/application.yml b/example/spring-cloud/flight-kafka/src/main/resources/application.yml index e24abe6..ec3e01e 100644 --- a/example/spring-cloud/flight-kafka/src/main/resources/application.yml +++ b/example/spring-cloud/flight-kafka/src/main/resources/application.yml @@ -20,7 +20,7 @@ spring: binder: flights group: ${KAFKA_GROUP_ID:flight} flights-result-binding: - destination: ${KAFKA_TOPIC_FLIGHTS_RESULT:correlate-ingres} + destination: ${KAFKA_TOPIC_FLIGHTS_RESULT:correlate-ingress} binder: flights group: ${KAFKA_GROUP_ID:flight} binders: diff --git a/example/spring-cloud/hotel-kafka/env.env b/example/spring-cloud/hotel-kafka/env.env index eb96ef3..68bfd70 100644 --- a/example/spring-cloud/hotel-kafka/env.env +++ b/example/spring-cloud/hotel-kafka/env.env @@ -2,6 +2,6 @@ KAFKA_BOOTSTRAP_SERVER_HOST=localhost KAFKA_BOOTSTRAP_SERVER_PORT=9092 KAFKA_SECURITY_PROTOCOL_OVERRIDE=PLAINTEXT KAFKA_TOPIC_CORRELATE_HOTEL=hotel -KAFKA_TOPIC_CORRELATE_HOTEL_RESULT=correlate-ingres +KAFKA_TOPIC_CORRELATE_HOTEL_RESULT=correlate-ingress KAFKA_GROUP_ID=hotel PROCESSING_DELAY=1 diff --git a/example/spring-cloud/hotel-kafka/src/main/resources/application.yml b/example/spring-cloud/hotel-kafka/src/main/resources/application.yml index 82d4ee7..7240c3f 100644 --- a/example/spring-cloud/hotel-kafka/src/main/resources/application.yml +++ b/example/spring-cloud/hotel-kafka/src/main/resources/application.yml @@ -20,7 +20,7 @@ spring: binder: hotels group: ${KAFKA_GROUP_ID:hotel} hotels-result-binding: - destination: ${KAFKA_TOPIC_HOTEL_RESULT:correlate-ingres} + destination: ${KAFKA_TOPIC_HOTEL_RESULT:correlate-ingress} binder: hotels group: ${KAFKA_GROUP_ID:hotel} binders: diff --git a/example/spring-cloud/reservation-kafka/env.env b/example/spring-cloud/reservation-kafka/env.env index 6423faa..fde27a7 100644 --- a/example/spring-cloud/reservation-kafka/env.env +++ b/example/spring-cloud/reservation-kafka/env.env @@ -1,6 +1,6 @@ KAFKA_BOOTSTRAP_SERVER_HOST=localhost KAFKA_BOOTSTRAP_SERVER_PORT=9092 KAFKA_SECURITY_PROTOCOL_OVERRIDE=PLAINTEXT -KAFKA_TOPIC_CORRELATE_INGRES=correlate-ingres +KAFKA_TOPIC_CORRELATE_INGRESS=correlate-ingress KAFKA_GROUP_ID=correlate diff --git a/example/spring-cloud/reservation-kafka/pom.xml b/example/spring-cloud/reservation-kafka/pom.xml index a67da6c..da52049 100644 --- a/example/spring-cloud/reservation-kafka/pom.xml +++ b/example/spring-cloud/reservation-kafka/pom.xml @@ -19,7 +19,7 @@ io.holunda camunda-bpm-correlate-spring-boot-starter - + io.holunda camunda-bpm-correlate-spring-cloud-stream diff --git a/example/spring-cloud/reservation-kafka/src/main/resources/application.yml b/example/spring-cloud/reservation-kafka/src/main/resources/application.yml index 07d3f5b..d2b70ac 100644 --- a/example/spring-cloud/reservation-kafka/src/main/resources/application.yml +++ b/example/spring-cloud/reservation-kafka/src/main/resources/application.yml @@ -15,8 +15,8 @@ spring: bindings: correlate-ingres-binding: content-type: application/json - destination: ${KAFKA_TOPIC_CORRELATE_INGRES:correlate-ingres} - binder: correlate-ingres-binder + destination: ${KAFKA_TOPIC_CORRELATE_INGRES:correlate-ingress} + binder: correlate-ingress-binder group: ${KAFKA_GROUP_ID} binders: correlate-ingres-binder: diff --git a/extension/axon/pom.xml b/extension/axon/pom.xml index be9c512..b9e7cc7 100644 --- a/extension/axon/pom.xml +++ b/extension/axon/pom.xml @@ -11,7 +11,7 @@ camunda-bpm-correlate-axon-framework jar - Extension / Ingres Adapter Axon Framework + Extension / Ingress Adapter Axon Framework 4.5.12 diff --git a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonChannelConfiguration.kt b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonChannelConfiguration.kt similarity index 89% rename from extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonChannelConfiguration.kt rename to extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonChannelConfiguration.kt index 56df6ae..bb654b1 100644 --- a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonChannelConfiguration.kt +++ b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonChannelConfiguration.kt @@ -1,11 +1,11 @@ -package io.holunda.camunda.bpm.correlate.ingres.axon +package io.holunda.camunda.bpm.correlate.ingress.axon import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaDataSnippetExtractor import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.ChannelConfig import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.ChannelConfigMessageMetaDataSnippetExtractor -import io.holunda.camunda.bpm.correlate.ingres.ChannelMessageAcceptor -import io.holunda.camunda.bpm.correlate.ingres.ChannelMessageAcceptorConfiguration -import io.holunda.camunda.bpm.correlate.ingres.IngresMetrics +import io.holunda.camunda.bpm.correlate.ingress.ChannelMessageAcceptor +import io.holunda.camunda.bpm.correlate.ingress.ChannelMessageAcceptorConfiguration +import io.holunda.camunda.bpm.correlate.ingress.IngressMetrics import io.holunda.camunda.bpm.correlate.persist.encoding.PayloadDecoder import org.axonframework.springboot.autoconfig.AxonAutoConfiguration import org.springframework.boot.autoconfigure.AutoConfigureAfter @@ -29,7 +29,7 @@ class AxonChannelConfiguration { @Bean fun axonEventMessageHandler( channelMessageAcceptor: ChannelMessageAcceptor, - metrics: IngresMetrics, + metrics: IngressMetrics, axonEventHeaderConverter: AxonEventHeaderConverter, payloadDecoders: List, channelConfigs: Map diff --git a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonEventHeaderConverter.kt b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventHeaderConverter.kt similarity index 86% rename from extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonEventHeaderConverter.kt rename to extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventHeaderConverter.kt index 2409973..7c3a7a0 100644 --- a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonEventHeaderConverter.kt +++ b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventHeaderConverter.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.axon +package io.holunda.camunda.bpm.correlate.ingress.axon import org.axonframework.eventhandling.EventMessage diff --git a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonEventMessageHandler.kt b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventMessageHandler.kt similarity index 80% rename from extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonEventMessageHandler.kt rename to extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventMessageHandler.kt index 7c37a35..9dc9499 100644 --- a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonEventMessageHandler.kt +++ b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventMessageHandler.kt @@ -1,9 +1,9 @@ -package io.holunda.camunda.bpm.correlate.ingres.axon +package io.holunda.camunda.bpm.correlate.ingress.axon -import io.holunda.camunda.bpm.correlate.ingres.ChannelMessageAcceptor -import io.holunda.camunda.bpm.correlate.ingres.IngresMetrics -import io.holunda.camunda.bpm.correlate.ingres.message.DelegatingChannelMessage -import io.holunda.camunda.bpm.correlate.ingres.message.ObjectMessage +import io.holunda.camunda.bpm.correlate.ingress.ChannelMessageAcceptor +import io.holunda.camunda.bpm.correlate.ingress.IngressMetrics +import io.holunda.camunda.bpm.correlate.ingress.message.DelegatingChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ObjectMessage import io.holunda.camunda.bpm.correlate.persist.encoding.PayloadDecoder import mu.KLogging import org.axonframework.eventhandling.EventMessage @@ -14,7 +14,7 @@ import org.axonframework.eventhandling.EventMessageHandler */ class AxonEventMessageHandler( private val messageAcceptor: ChannelMessageAcceptor, - private val metrics: IngresMetrics, + private val metrics: IngressMetrics, private val axonEventHeaderConverter: AxonEventHeaderConverter, private val encoder: PayloadDecoder ) : EventMessageHandler { @@ -24,6 +24,7 @@ class AxonEventMessageHandler( override fun handle(eventMessage: EventMessage<*>) { metrics.incrementReceived() val headers = axonEventHeaderConverter.extractHeaders(eventMessage) + logger.debug { "Received message $headers" } // The message acceptor will only get supported messages. // This question is answered by the [MessageMetadataExtractorChain] - a message is supported if all message metadata snippet extractors support them. if (messageAcceptor.supports(headers)) { diff --git a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonHandlerConfiguration.kt b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonHandlerConfiguration.kt similarity index 88% rename from extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonHandlerConfiguration.kt rename to extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonHandlerConfiguration.kt index c625ae4..f183d73 100644 --- a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/AxonHandlerConfiguration.kt +++ b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonHandlerConfiguration.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.axon +package io.holunda.camunda.bpm.correlate.ingress.axon import org.axonframework.config.EventProcessingConfigurer import org.springframework.beans.factory.annotation.Autowired diff --git a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/DefaultAxonEventHeaderConverter.kt b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/DefaultAxonEventHeaderConverter.kt similarity index 96% rename from extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/DefaultAxonEventHeaderConverter.kt rename to extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/DefaultAxonEventHeaderConverter.kt index e57f6e4..7b7e1c8 100644 --- a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/axon/DefaultAxonEventHeaderConverter.kt +++ b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/DefaultAxonEventHeaderConverter.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.axon +package io.holunda.camunda.bpm.correlate.ingress.axon import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMessageMetaDataSnippetExtractor.Companion.HEADER_MESSAGE_ID import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMessageMetaDataSnippetExtractor.Companion.HEADER_MESSAGE_PAYLOAD_TYPE_CLASS_NAME diff --git a/extension/axon/src/main/resources/META-INF/spring.factories b/extension/axon/src/main/resources/META-INF/spring.factories index 25ac634..06b9f77 100644 --- a/extension/axon/src/main/resources/META-INF/spring.factories +++ b/extension/axon/src/main/resources/META-INF/spring.factories @@ -1,4 +1,4 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - io.holunda.camunda.bpm.correlate.ingres.axon.AxonChannelConfiguration, \ - io.holunda.camunda.bpm.correlate.ingres.axon.AxonHandlerConfiguration + io.holunda.camunda.bpm.correlate.ingress.axon.AxonChannelConfiguration, \ + io.holunda.camunda.bpm.correlate.ingress.axon.AxonHandlerConfiguration diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/MessageMetaDataSnippetExtractor.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/MessageMetaDataSnippetExtractor.kt index e3cba91..d786e5b 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/MessageMetaDataSnippetExtractor.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/MessageMetaDataSnippetExtractor.kt @@ -1,6 +1,6 @@ package io.holunda.camunda.bpm.correlate.correlation.metadata -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage /** * Extractor for the metadata. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/ChannelConfigMessageMetaDataSnippetExtractor.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/ChannelConfigMessageMetaDataSnippetExtractor.kt index 624d5ce..6a6ef41 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/ChannelConfigMessageMetaDataSnippetExtractor.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/ChannelConfigMessageMetaDataSnippetExtractor.kt @@ -2,7 +2,7 @@ package io.holunda.camunda.bpm.correlate.correlation.metadata.extractor import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaDataSnippet import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaDataSnippetExtractor -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage /** * Extracts metadata from channel config. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/HeaderMessageMetaDataSnippetExtractor.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/HeaderMessageMetaDataSnippetExtractor.kt index ab13a07..9aba6bc 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/HeaderMessageMetaDataSnippetExtractor.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/HeaderMessageMetaDataSnippetExtractor.kt @@ -12,7 +12,7 @@ import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMes import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMessageMetaDataSnippetExtractor.HeaderNames.PAYLOAD_TYPE_REVISION import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMessageMetaDataSnippetExtractor.HeaderNames.TIMESTAMP import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMessageMetaDataSnippetExtractor.HeaderNames.TTL -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage import io.holunda.camunda.bpm.data.CamundaBpmData.reader import io.holunda.camunda.bpm.data.CamundaBpmData.stringVariable import org.camunda.bpm.engine.variable.Variables.createVariables diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/MessageMetadataExtractorChain.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/MessageMetadataExtractorChain.kt index 5551488..ecec507 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/MessageMetadataExtractorChain.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/metadata/extractor/MessageMetadataExtractorChain.kt @@ -3,7 +3,7 @@ package io.holunda.camunda.bpm.correlate.correlation.metadata.extractor import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaDataSnippet import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaDataSnippetExtractor -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage import io.holunda.camunda.bpm.correlate.util.ComponentLike /** diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/ChannelMessageAcceptor.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/ChannelMessageAcceptor.kt similarity index 79% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/ChannelMessageAcceptor.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/ChannelMessageAcceptor.kt index bdbd27f..7ea7e4d 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/ChannelMessageAcceptor.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/ChannelMessageAcceptor.kt @@ -1,6 +1,6 @@ -package io.holunda.camunda.bpm.correlate.ingres +package io.holunda.camunda.bpm.correlate.ingress -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage /** * Accepts messages from channels. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt new file mode 100644 index 0000000..8dbea12 --- /dev/null +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt @@ -0,0 +1,78 @@ +package io.holunda.camunda.bpm.correlate.ingress + +import io.holunda.camunda.bpm.correlate.util.ComponentLike +import io.micrometer.core.instrument.Counter +import io.micrometer.core.instrument.MeterRegistry +import mu.KLogging + +/** + * Metrics for ingress. + */ +@ComponentLike +class IngressMetrics( + registry: MeterRegistry +) { + companion object : KLogging() + + private val acceptedCounter = Counter + .builder("camunda_bpm_correlate_ingress_accepted") + .description("Messages accepted by the ingress adapter") + .register(registry) + + private val receivedCounter = Counter + .builder("camunda_bpm_correlate_ingress_received") + .description("Messages received by the ingress adapter") + .register(registry) + + private val ignoredCounter = Counter + .builder("camunda_bpm_correlate_ingress_ignored") + .description("Messages ignored by the ingress adapter") + .register(registry) + + private val persistedCounter = Counter + .builder("camunda_bpm_correlate_acceptor_persisted") + .description("Messages persisted by the acceptor") + .register(registry) + + private val droppedCounter = Counter + .builder("camunda_bpm_correlate_acceptor_dropped") + .description("Messages dropped by the acceptor") + .register(registry) + + + /** + * Received by the ingress adapter. + */ + fun incrementReceived() { + receivedCounter.increment() + } + + /** + * Accepted by acceptor. + */ + fun incrementAccepted() { + acceptedCounter.increment() + } + + /** + * Ignored by acceptor. + */ + fun incrementIgnored() { + ignoredCounter.increment() + } + + /** + * Passed through message filter and persisted in inbox. + */ + fun incrementPersisted() { + persistedCounter.increment() + } + + /** + * Ignored by message filter (instead of persisted). + */ + fun incrementDropped() { + droppedCounter.increment() + } + +} diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/MessageFilter.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/MessageFilter.kt similarity index 80% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/MessageFilter.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/MessageFilter.kt index 5ae6068..f4401c4 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/MessageFilter.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/MessageFilter.kt @@ -1,7 +1,7 @@ -package io.holunda.camunda.bpm.correlate.ingres +package io.holunda.camunda.bpm.correlate.ingress import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage /** * Message filter to filter messages delivered to the message acceptor. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AllMessageFilter.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AllMessageFilter.kt similarity index 57% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AllMessageFilter.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AllMessageFilter.kt index 7279348..d7df9cd 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AllMessageFilter.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AllMessageFilter.kt @@ -1,8 +1,8 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData -import io.holunda.camunda.bpm.correlate.ingres.MessageFilter -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.MessageFilter +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage /** * Accepts all messages. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AndCompositeMessageFilter.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AndCompositeMessageFilter.kt similarity index 70% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AndCompositeMessageFilter.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AndCompositeMessageFilter.kt index 044e612..af0c616 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AndCompositeMessageFilter.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AndCompositeMessageFilter.kt @@ -1,8 +1,8 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData -import io.holunda.camunda.bpm.correlate.ingres.MessageFilter -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.MessageFilter +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage /** * Composite filter implementing the AND operator of all contained filters. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/NotMessageFilter.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/NotMessageFilter.kt similarity index 65% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/NotMessageFilter.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/NotMessageFilter.kt index c66faa7..14fe9dd 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/NotMessageFilter.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/NotMessageFilter.kt @@ -1,8 +1,8 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData -import io.holunda.camunda.bpm.correlate.ingres.MessageFilter -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.MessageFilter +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage /** * Filter implementing the NOT operator. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/OrCompositeMessageFilter.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/OrCompositeMessageFilter.kt similarity index 69% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/OrCompositeMessageFilter.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/OrCompositeMessageFilter.kt index 0057e64..08ab73e 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/OrCompositeMessageFilter.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/OrCompositeMessageFilter.kt @@ -1,8 +1,8 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData -import io.holunda.camunda.bpm.correlate.ingres.MessageFilter -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.MessageFilter +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage /** * Composite filter implementing the OR operator of all contained filters. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeExistsOnClasspathMessageFilter.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeExistsOnClasspathMessageFilter.kt similarity index 75% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeExistsOnClasspathMessageFilter.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeExistsOnClasspathMessageFilter.kt index f73bcea..6d087de 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeExistsOnClasspathMessageFilter.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeExistsOnClasspathMessageFilter.kt @@ -1,8 +1,8 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData -import io.holunda.camunda.bpm.correlate.ingres.MessageFilter -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.MessageFilter +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage import org.springframework.util.ClassUtils /** diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeListMessageFilter.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeListMessageFilter.kt similarity index 71% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeListMessageFilter.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeListMessageFilter.kt index 9fefa75..27f2ef5 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeListMessageFilter.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeListMessageFilter.kt @@ -1,9 +1,8 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData -import io.holunda.camunda.bpm.correlate.ingres.MessageFilter -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage -import kotlin.reflect.KClass +import io.holunda.camunda.bpm.correlate.ingress.MessageFilter +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage /** * Accepts all messages having payloads of specified types. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/impl/PersistingChannelMessageAcceptorImpl.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/impl/PersistingChannelMessageAcceptorImpl.kt similarity index 71% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/impl/PersistingChannelMessageAcceptorImpl.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/impl/PersistingChannelMessageAcceptorImpl.kt index c8d50d8..d8d1dc4 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/impl/PersistingChannelMessageAcceptorImpl.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/impl/PersistingChannelMessageAcceptorImpl.kt @@ -1,11 +1,11 @@ -package io.holunda.camunda.bpm.correlate.ingres.impl +package io.holunda.camunda.bpm.correlate.ingress.impl import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.MessageMetadataExtractorChain -import io.holunda.camunda.bpm.correlate.ingres.ChannelMessageAcceptor -import io.holunda.camunda.bpm.correlate.ingres.IngresMetrics -import io.holunda.camunda.bpm.correlate.ingres.MessageFilter -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.ChannelMessageAcceptor +import io.holunda.camunda.bpm.correlate.ingress.IngressMetrics +import io.holunda.camunda.bpm.correlate.ingress.MessageFilter +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceService import io.holunda.camunda.bpm.correlate.util.ComponentLike @@ -17,7 +17,7 @@ class PersistingChannelMessageAcceptorImpl( private val messagePersistenceService: MessagePersistenceService, private val messageMetadataExtractorChain: MessageMetadataExtractorChain, private val messageFilter: MessageFilter, - private val ingresMetrics: IngresMetrics + private val ingressMetrics: IngressMetrics ) : ChannelMessageAcceptor { override fun supports(headers: Map): Boolean { @@ -28,9 +28,9 @@ class PersistingChannelMessageAcceptorImpl( val messageMetaData: MessageMetaData = messageMetadataExtractorChain.extractChainedMetaData(message) if (messageFilter.accepts(channelMessage = message, metaData = messageMetaData)) { messagePersistenceService.persistMessage(channelMessage = message, metaData = messageMetaData) - ingresMetrics.incrementPersisted() + ingressMetrics.incrementPersisted() } else { - ingresMetrics.incrementFilteredOut() + ingressMetrics.incrementDropped() } } } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/ByteMessage.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/ByteMessage.kt similarity index 74% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/ByteMessage.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/ByteMessage.kt index 1e51d31..2d60c35 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/ByteMessage.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/ByteMessage.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.message +package io.holunda.camunda.bpm.correlate.ingress.message /** * Message using binary payload. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/ChannelMessage.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/ChannelMessage.kt similarity index 73% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/ChannelMessage.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/ChannelMessage.kt index 90f9b04..d0e9744 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/ChannelMessage.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/ChannelMessage.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.message +package io.holunda.camunda.bpm.correlate.ingress.message /** * Base class for implementation of messages received via channel. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/DelegatingChannelMessage.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/DelegatingChannelMessage.kt similarity index 91% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/DelegatingChannelMessage.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/DelegatingChannelMessage.kt index 1f68f54..d8cd163 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/DelegatingChannelMessage.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/DelegatingChannelMessage.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.message +package io.holunda.camunda.bpm.correlate.ingress.message /** * Message implementation based on a delegate-pattern using a payload supplier function to retrieve the payload on access. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/ObjectMessage.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/ObjectMessage.kt similarity index 82% rename from extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/ObjectMessage.kt rename to extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/ObjectMessage.kt index 91b2a2f..67f8422 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/ObjectMessage.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/ObjectMessage.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.message +package io.holunda.camunda.bpm.correlate.ingress.message /** * Message using not nullable object payload. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessagePersistenceService.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessagePersistenceService.kt index d46a757..4109582 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessagePersistenceService.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessagePersistenceService.kt @@ -2,7 +2,7 @@ package io.holunda.camunda.bpm.correlate.persist import io.holunda.camunda.bpm.correlate.correlation.CorrelationBatch import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage interface MessagePersistenceService { /** diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/DefaultMessagePersistenceService.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/DefaultMessagePersistenceService.kt index df14057..fb2601a 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/DefaultMessagePersistenceService.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/DefaultMessagePersistenceService.kt @@ -5,9 +5,9 @@ import io.holunda.camunda.bpm.correlate.correlation.CorrelationMessage import io.holunda.camunda.bpm.correlate.correlation.SingleMessageCorrelationStrategy import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData import io.holunda.camunda.bpm.correlate.correlation.metadata.TypeInfo -import io.holunda.camunda.bpm.correlate.ingres.message.ByteMessage -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage -import io.holunda.camunda.bpm.correlate.ingres.message.DelegatingChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ByteMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.DelegatingChannelMessage import io.holunda.camunda.bpm.correlate.persist.* import io.holunda.camunda.bpm.correlate.persist.MessageErrorHandlingResult.* import io.holunda.camunda.bpm.correlate.persist.encoding.PayloadDecoder diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/TestFixtures.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/TestFixtures.kt index 5d4adc4..700c875 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/TestFixtures.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/TestFixtures.kt @@ -4,10 +4,9 @@ import io.holunda.camunda.bpm.correlate.correlation.CorrelationMessage import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaData import io.holunda.camunda.bpm.correlate.correlation.metadata.TypeInfo import io.holunda.camunda.bpm.correlate.event.CorrelationHint -import io.holunda.camunda.bpm.correlate.ingres.MessageFilter -import io.holunda.camunda.bpm.correlate.ingres.message.ByteMessage -import io.holunda.camunda.bpm.correlate.ingres.message.ChannelMessage -import io.holunda.camunda.bpm.correlate.ingres.message.ObjectMessage +import io.holunda.camunda.bpm.correlate.ingress.MessageFilter +import io.holunda.camunda.bpm.correlate.ingress.message.ChannelMessage +import io.holunda.camunda.bpm.correlate.ingress.message.ObjectMessage import java.util.* fun messageId() = UUID.randomUUID().toString() diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AllMessageFilterTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AllMessageFilterTest.kt similarity index 87% rename from extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AllMessageFilterTest.kt rename to extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AllMessageFilterTest.kt index 7065d12..b461834 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AllMessageFilterTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AllMessageFilterTest.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.emptyMessage import io.holunda.camunda.bpm.correlate.emptyMessageMetadata diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AndCompositeMessageFilterTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AndCompositeMessageFilterTest.kt similarity index 94% rename from extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AndCompositeMessageFilterTest.kt rename to extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AndCompositeMessageFilterTest.kt index 49b5690..64f7880 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/AndCompositeMessageFilterTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/AndCompositeMessageFilterTest.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.acceptingFilter import io.holunda.camunda.bpm.correlate.emptyMessage diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/NotMessageFilterTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/NotMessageFilterTest.kt similarity index 94% rename from extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/NotMessageFilterTest.kt rename to extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/NotMessageFilterTest.kt index 9694072..5a1c9ad 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/NotMessageFilterTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/NotMessageFilterTest.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.acceptingFilter import io.holunda.camunda.bpm.correlate.emptyMessage diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/OrCompositeMessageFilterTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/OrCompositeMessageFilterTest.kt similarity index 94% rename from extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/OrCompositeMessageFilterTest.kt rename to extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/OrCompositeMessageFilterTest.kt index 0c215ab..4c2f803 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/OrCompositeMessageFilterTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/OrCompositeMessageFilterTest.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.acceptingFilter import io.holunda.camunda.bpm.correlate.emptyMessage diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeExistsOnClasspathMessageFilterTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeExistsOnClasspathMessageFilterTest.kt similarity index 93% rename from extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeExistsOnClasspathMessageFilterTest.kt rename to extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeExistsOnClasspathMessageFilterTest.kt index 68fce64..7cb0535 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeExistsOnClasspathMessageFilterTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeExistsOnClasspathMessageFilterTest.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.PayloadType import io.holunda.camunda.bpm.correlate.correlation.metadata.TypeInfo diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeListMessageFilterTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeListMessageFilterTest.kt similarity index 96% rename from extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeListMessageFilterTest.kt rename to extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeListMessageFilterTest.kt index 4d7b20d..5a7ffcc 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/filter/TypeListMessageFilterTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/filter/TypeListMessageFilterTest.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.filter +package io.holunda.camunda.bpm.correlate.ingress.filter import io.holunda.camunda.bpm.correlate.PayloadType import io.holunda.camunda.bpm.correlate.PayloadType2 diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/impl/PersistingChannelMessageAcceptorImplTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/impl/PersistingChannelMessageAcceptorImplTest.kt similarity index 93% rename from extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/impl/PersistingChannelMessageAcceptorImplTest.kt rename to extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/impl/PersistingChannelMessageAcceptorImplTest.kt index 5c3817c..ade6fe1 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/impl/PersistingChannelMessageAcceptorImplTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/impl/PersistingChannelMessageAcceptorImplTest.kt @@ -1,11 +1,11 @@ -package io.holunda.camunda.bpm.correlate.ingres.impl +package io.holunda.camunda.bpm.correlate.ingress.impl import io.holunda.camunda.bpm.correlate.PayloadType import io.holunda.camunda.bpm.correlate.correlation.metadata.TypeInfo import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.MessageMetadataExtractorChain import io.holunda.camunda.bpm.correlate.emptyMessageMetadata -import io.holunda.camunda.bpm.correlate.ingres.MessageFilter -import io.holunda.camunda.bpm.correlate.ingres.message.ByteMessage +import io.holunda.camunda.bpm.correlate.ingress.MessageFilter +import io.holunda.camunda.bpm.correlate.ingress.message.ByteMessage import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceService import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -22,7 +22,7 @@ internal class PersistingChannelMessageAcceptorImplTest { messageMetadataExtractorChain = messageMetadataExtractorChainMock, messagePersistenceService = persistenceServiceMock, messageFilter = messageFilterMock, - ingresMetrics = mock() + ingressMetrics = mock() ) @Test diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/DelegatingChannelMessageTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/DelegatingChannelMessageTest.kt similarity index 89% rename from extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/DelegatingChannelMessageTest.kt rename to extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/DelegatingChannelMessageTest.kt index 333a969..7e746bc 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingres/message/DelegatingChannelMessageTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/ingress/message/DelegatingChannelMessageTest.kt @@ -1,12 +1,12 @@ -package io.holunda.camunda.bpm.correlate.ingres.message +package io.holunda.camunda.bpm.correlate.ingress.message import io.holunda.camunda.bpm.correlate.LazyLoadingMessage import io.holunda.camunda.bpm.correlate.PayloadType import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMessageMetaDataSnippetExtractor import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMessageMetaDataSnippetExtractor.HeaderNames import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.MessageMetadataExtractorChain -import io.holunda.camunda.bpm.correlate.ingres.filter.TypeListMessageFilter -import io.holunda.camunda.bpm.correlate.ingres.impl.PersistingChannelMessageAcceptorImpl +import io.holunda.camunda.bpm.correlate.ingress.filter.TypeListMessageFilter +import io.holunda.camunda.bpm.correlate.ingress.impl.PersistingChannelMessageAcceptorImpl import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.mockito.kotlin.* @@ -41,7 +41,7 @@ internal class DelegatingChannelMessageTest { HeaderMessageMetaDataSnippetExtractor(enforceMessageId = true, enforceTypeInfo = true) ), messageFilter = messageFilter, - ingresMetrics = mock() + ingressMetrics = mock() ) @Test diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt index 2f81b8d..708e51a 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt @@ -9,7 +9,7 @@ import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMes import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.MessageMetadataExtractorChain import io.holunda.camunda.bpm.correlate.event.CamundaCorrelationEventFactory import io.holunda.camunda.bpm.correlate.event.CamundaCorrelationEventFactoryRegistry -import io.holunda.camunda.bpm.correlate.ingres.IngresMetrics +import io.holunda.camunda.bpm.correlate.ingress.IngressMetrics import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceService import io.holunda.camunda.bpm.correlate.persist.MessageRepository import io.holunda.camunda.bpm.correlate.persist.error.RetryingErrorHandlingProperties @@ -52,7 +52,7 @@ class CamundaBpmCorrelateConfiguration : ApplicationContextAware { @ConditionalOnMissingBean @Bean - fun ingresMetrics() = IngresMetrics() + fun ingresMetrics() = IngressMetrics() @ConditionalOnMissingBean @Bean diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/ChannelMessageAcceptorConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/ChannelMessageAcceptorConfiguration.kt similarity index 82% rename from extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/ChannelMessageAcceptorConfiguration.kt rename to extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/ChannelMessageAcceptorConfiguration.kt index 58fa3c7..6006fb1 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/ChannelMessageAcceptorConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/ChannelMessageAcceptorConfiguration.kt @@ -1,8 +1,8 @@ -package io.holunda.camunda.bpm.correlate.ingres +package io.holunda.camunda.bpm.correlate.ingress import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.MessageMetadataExtractorChain -import io.holunda.camunda.bpm.correlate.ingres.filter.AllMessageFilter -import io.holunda.camunda.bpm.correlate.ingres.impl.PersistingChannelMessageAcceptorImpl +import io.holunda.camunda.bpm.correlate.ingress.filter.AllMessageFilter +import io.holunda.camunda.bpm.correlate.ingress.impl.PersistingChannelMessageAcceptorImpl import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceConfiguration import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceService import org.springframework.boot.autoconfigure.AutoConfigureAfter @@ -22,12 +22,12 @@ class ChannelMessageAcceptorConfiguration { messageMetadataExtractorChain: MessageMetadataExtractorChain, messagePersistenceService: MessagePersistenceService, messageFilter: MessageFilter, - ingresMetrics: IngresMetrics + ingressMetrics: IngressMetrics ): ChannelMessageAcceptor = PersistingChannelMessageAcceptorImpl( messageMetadataExtractorChain = messageMetadataExtractorChain, messagePersistenceService = messagePersistenceService, messageFilter = messageFilter, - ingresMetrics = ingresMetrics + ingressMetrics = ingressMetrics ) @ConditionalOnMissingBean diff --git a/extension/spring-boot-starter/src/main/resources/META-INF/spring.factories b/extension/spring-boot-starter/src/main/resources/META-INF/spring.factories index fe37495..e45d773 100644 --- a/extension/spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/extension/spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -4,4 +4,4 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ io.holunda.camunda.bpm.correlate.correlation.BatchCorrelationSchedulerConfiguration,\ io.holunda.camunda.bpm.correlate.correlation.BatchCorrelationConfiguration,\ io.holunda.camunda.bpm.correlate.correlation.ClusterSetupConfiguration,\ - io.holunda.camunda.bpm.correlate.ingres.ChannelMessageAcceptorConfiguration + io.holunda.camunda.bpm.correlate.ingress.ChannelMessageAcceptorConfiguration diff --git a/extension/spring-cloud-stream/pom.xml b/extension/spring-cloud-stream/pom.xml index 613b7ae..f10da99 100644 --- a/extension/spring-cloud-stream/pom.xml +++ b/extension/spring-cloud-stream/pom.xml @@ -11,7 +11,7 @@ camunda-bpm-correlate-spring-cloud-stream jar - Extension / Ingres Adapter Spring Cloud Stream + Extension / Ingress Adapter Spring Cloud Stream 2021.0.1 diff --git a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/ChannelMessageHeaderConverter.kt b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/ChannelMessageHeaderConverter.kt similarity index 86% rename from extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/ChannelMessageHeaderConverter.kt rename to extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/ChannelMessageHeaderConverter.kt index 6fb55aa..2ebd3d1 100644 --- a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/ChannelMessageHeaderConverter.kt +++ b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/ChannelMessageHeaderConverter.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.cloudstream +package io.holunda.camunda.bpm.correlate.ingress.cloudstream import org.springframework.messaging.Message diff --git a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/DefaultKafkaMessageHeaderConverter.kt b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/DefaultKafkaMessageHeaderConverter.kt similarity index 95% rename from extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/DefaultKafkaMessageHeaderConverter.kt rename to extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/DefaultKafkaMessageHeaderConverter.kt index ee6ae1f..a36674c 100644 --- a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/DefaultKafkaMessageHeaderConverter.kt +++ b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/DefaultKafkaMessageHeaderConverter.kt @@ -1,4 +1,4 @@ -package io.holunda.camunda.bpm.correlate.ingres.cloudstream +package io.holunda.camunda.bpm.correlate.ingress.cloudstream import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMessageMetaDataSnippetExtractor.Companion.HEADER_MESSAGE_ID import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.HeaderMessageMetaDataSnippetExtractor.Companion.HEADER_MESSAGE_TIMESTAMP diff --git a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/SpringCloudStreamChannelConfiguration.kt b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/SpringCloudStreamChannelConfiguration.kt similarity index 85% rename from extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/SpringCloudStreamChannelConfiguration.kt rename to extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/SpringCloudStreamChannelConfiguration.kt index d7a12bc..db65251 100644 --- a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/SpringCloudStreamChannelConfiguration.kt +++ b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/SpringCloudStreamChannelConfiguration.kt @@ -1,11 +1,11 @@ -package io.holunda.camunda.bpm.correlate.ingres.cloudstream +package io.holunda.camunda.bpm.correlate.ingress.cloudstream import io.holunda.camunda.bpm.correlate.correlation.metadata.MessageMetaDataSnippetExtractor import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.ChannelConfig import io.holunda.camunda.bpm.correlate.correlation.metadata.extractor.ChannelConfigMessageMetaDataSnippetExtractor -import io.holunda.camunda.bpm.correlate.ingres.ChannelMessageAcceptor -import io.holunda.camunda.bpm.correlate.ingres.ChannelMessageAcceptorConfiguration -import io.holunda.camunda.bpm.correlate.ingres.IngresMetrics +import io.holunda.camunda.bpm.correlate.ingress.ChannelMessageAcceptor +import io.holunda.camunda.bpm.correlate.ingress.ChannelMessageAcceptorConfiguration +import io.holunda.camunda.bpm.correlate.ingress.IngressMetrics import org.springframework.boot.autoconfigure.AutoConfigureAfter import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty @@ -31,7 +31,7 @@ class SpringCloudStreamChannelConfiguration { @Bean fun streamByteMessageConsumer( channelMessageAcceptor: ChannelMessageAcceptor, - metrics: IngresMetrics, + metrics: IngressMetrics, channelMessageHeaderConverter: ChannelMessageHeaderConverter ) = StreamByteMessageConsumer( messageAcceptor = channelMessageAcceptor, diff --git a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/StreamByteMessageConsumer.kt b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/StreamByteMessageConsumer.kt similarity index 61% rename from extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/StreamByteMessageConsumer.kt rename to extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/StreamByteMessageConsumer.kt index 3dac908..e9d3ba9 100644 --- a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/cloudstream/StreamByteMessageConsumer.kt +++ b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/StreamByteMessageConsumer.kt @@ -1,8 +1,8 @@ -package io.holunda.camunda.bpm.correlate.ingres.cloudstream +package io.holunda.camunda.bpm.correlate.ingress.cloudstream -import io.holunda.camunda.bpm.correlate.ingres.ChannelMessageAcceptor -import io.holunda.camunda.bpm.correlate.ingres.IngresMetrics -import io.holunda.camunda.bpm.correlate.ingres.message.ByteMessage +import io.holunda.camunda.bpm.correlate.ingress.ChannelMessageAcceptor +import io.holunda.camunda.bpm.correlate.ingress.IngressMetrics +import io.holunda.camunda.bpm.correlate.ingress.message.ByteMessage import mu.KLogging import org.springframework.messaging.Message import java.util.function.Consumer @@ -12,7 +12,7 @@ import java.util.function.Consumer */ class StreamByteMessageConsumer( private val messageAcceptor: ChannelMessageAcceptor, - private val metrics: IngresMetrics, + private val metrics: IngressMetrics, private val channelMessageHeaderConverter: ChannelMessageHeaderConverter ) : Consumer> { @@ -21,12 +21,13 @@ class StreamByteMessageConsumer( override fun accept(message: Message) { metrics.incrementReceived() val headers = channelMessageHeaderConverter.extractMessageHeaders(message) + logger.debug { "Received message $headers" } if (messageAcceptor.supports(headers)) { messageAcceptor.accept(ByteMessage(headers = headers, payload = message.payload)) - logger.trace { "Accepted message $headers" } + logger.debug { "Accepted message $headers" } metrics.incrementAccepted() } else { - logger.warn { "Ignored message $headers, it is not supported by client." } + logger.debug { "Ignored message $headers, it is not supported by client." } metrics.incrementIgnored() } } diff --git a/extension/spring-cloud-stream/src/main/resources/META-INF/spring.factories b/extension/spring-cloud-stream/src/main/resources/META-INF/spring.factories index a08758f..5e5de7d 100644 --- a/extension/spring-cloud-stream/src/main/resources/META-INF/spring.factories +++ b/extension/spring-cloud-stream/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - io.holunda.camunda.bpm.correlate.ingres.cloudstream.SpringCloudStreamChannelConfiguration + io.holunda.camunda.bpm.correlate.ingress.cloudstream.SpringCloudStreamChannelConfiguration diff --git a/mkdocs.yml b/mkdocs.yml index d0a962f..18ce87d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -103,9 +103,9 @@ nav: - Overview: user-guide/index.md - Architecture: user-guide/architecture.md - Components: - - Ingres Adapter: user-guide/ingres.md - - Spring Cloud Ingres Adapter: user-guide/ingres-spring-cloud.md - - Axon Framework Ingres Adapter: user-guide/ingres-axon.md + - Ingress Adapter: user-guide/ingress.md + - Spring Cloud Ingress Adapter: user-guide/ingress-spring-cloud.md + - Axon Framework Ingress Adapter: user-guide/ingress-axon.md - Message Acceptor: user-guide/message-acceptor.md - Message Filter: user-guide/filtering-messages.md - Message Persistence: user-guide/message-persistence.md From 4920e7b1bac72d4eb169492fa5dba4c7f5789395 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Tue, 27 Sep 2022 11:05:16 +0200 Subject: [PATCH 35/53] implement metrics, #29 --- .../bpm/correlate/ingres/IngresMetrics.kt | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/IngresMetrics.kt diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/IngresMetrics.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/IngresMetrics.kt deleted file mode 100644 index 16f9174..0000000 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingres/IngresMetrics.kt +++ /dev/null @@ -1,55 +0,0 @@ -package io.holunda.camunda.bpm.correlate.ingres - -import io.holunda.camunda.bpm.correlate.util.ComponentLike -import mu.KLogging - -/** - * Metrics for ingres. - */ -@ComponentLike -class IngresMetrics( - // TODO metrics -) { - companion object : KLogging() - - var accepted = 0 - var ignored = 0 - var received = 0 - var filteredOut = 0 - var persisted = 0 - - /** - * Received by the ingres adapter. - */ - fun incrementReceived() { - received = received.inc() - logger.info { "Received $received" } - } - - /** - * Accepted by acceptor. - */ - fun incrementAccepted() { - accepted = accepted.inc() - logger.info { "Accepted $accepted" } - } - - /** - * Ignored by acceptor. - */ - fun incrementIgnored() { - ignored = ignored.inc() - logger.info { "Ignored $ignored" } - } - - fun incrementPersisted() { - persisted = persisted.inc() - logger.info { "Persisted $persisted" } - } - - fun incrementFilteredOut() { - filteredOut = filteredOut.inc() - logger.info { "Filtered out by message filter $filteredOut" } - } - -} From 78bfb3b2f2ac3c41734eadbdec3b463314a1fc8c Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Tue, 27 Sep 2022 20:49:31 +0200 Subject: [PATCH 36/53] working on metrics --- docs/getting-started.md | 4 +- .../spring-cloud/reservation-kafka/pom.xml | 9 ++++ .../application-camunda-correlate.yml | 2 +- .../src/main/resources/application-direct.yml | 2 +- .../src/main/resources/application.yml | 25 ++++++++- .../ingress/axon/AxonChannelConfiguration.kt | 11 ++-- .../ingress/axon/AxonEventMessageHandler.kt | 9 ++-- .../resources/CorrelateMessageResource.kt | 2 +- extension/core/pom.xml | 6 ++- .../correlation/BatchCorrelationProcessor.kt | 2 +- .../correlation/CorrelationMetrics.kt | 54 +++++++++++++++++-- .../bpm/correlate/ingress/IngressMetrics.kt | 54 ++++++++++--------- .../bpm/correlate/persist/CountByStatus.kt | 13 +++++ .../bpm/correlate/persist/MessageEntity.kt | 10 +++- .../correlate/persist/MessageRepository.kt | 19 ++++++- .../persist/impl/InMemMessageRepository.kt | 20 +++++-- .../persist/impl/MessageManagementService.kt | 17 +++++- .../persist/impl/MyBatisMessageMapper.kt | 44 +++++++++++++++ .../persist/impl/MyBatisMessageRepository.kt | 17 +++++- .../BatchCorrelationProcessorTest.kt | 3 +- extension/spring-boot-starter/pom.xml | 7 +-- .../CamundaBpmCorrelateConfiguration.kt | 5 +- .../BatchCorrelationSchedulerConfiguration.kt | 20 ++++--- .../SpringCloudStreamChannelConfiguration.kt | 3 +- .../cloudstream/StreamByteMessageConsumer.kt | 9 ++-- pom.xml | 4 +- 26 files changed, 293 insertions(+), 78 deletions(-) create mode 100644 extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/CountByStatus.kt diff --git a/docs/getting-started.md b/docs/getting-started.md index 6690033..bedc43e 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -44,13 +44,13 @@ spring: bindings: streamByteMessageConsumer-in-0: correlate-ingress-binding bindings: - correlate-ingres-binding: + correlate-ingress-binding: content-type: application/json destination: ${KAFKA_TOPIC_CORRELATE_INGRES:correlate-ingress} binder: correlate-ingress-binder group: ${KAFKA_GROUP_ID} binders: - correlate-ingres-binder: + correlate-ingress-binder: type: kafka defaultCandidate: false inheritEnvironment: false diff --git a/example/spring-cloud/reservation-kafka/pom.xml b/example/spring-cloud/reservation-kafka/pom.xml index da52049..40dca4b 100644 --- a/example/spring-cloud/reservation-kafka/pom.xml +++ b/example/spring-cloud/reservation-kafka/pom.xml @@ -57,6 +57,15 @@ org.camunda.bpm.springboot camunda-bpm-spring-boot-starter-rest + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-registry-prometheus + + org.camunda.bpm.springboot camunda-bpm-spring-boot-starter-webapp diff --git a/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml b/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml index d80de53..ed41177 100644 --- a/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml +++ b/example/spring-cloud/reservation-kafka/src/main/resources/application-camunda-correlate.yml @@ -4,7 +4,7 @@ spring: function: definition: streamByteMessageConsumer bindings: - streamByteMessageConsumer-in-0: correlate-ingres-binding + streamByteMessageConsumer-in-0: correlate-ingress-binding correlate: enabled: true diff --git a/example/spring-cloud/reservation-kafka/src/main/resources/application-direct.yml b/example/spring-cloud/reservation-kafka/src/main/resources/application-direct.yml index a305eb7..3dcd155 100644 --- a/example/spring-cloud/reservation-kafka/src/main/resources/application-direct.yml +++ b/example/spring-cloud/reservation-kafka/src/main/resources/application-direct.yml @@ -4,6 +4,6 @@ spring: function: definition: directIngressMessageConsumer bindings: - directIngressMessageConsumer-in-0: correlate-ingres-binding + directIngressMessageConsumer-in-0: correlate-ingress-binding correlate: enabled: false diff --git a/example/spring-cloud/reservation-kafka/src/main/resources/application.yml b/example/spring-cloud/reservation-kafka/src/main/resources/application.yml index d2b70ac..972986e 100644 --- a/example/spring-cloud/reservation-kafka/src/main/resources/application.yml +++ b/example/spring-cloud/reservation-kafka/src/main/resources/application.yml @@ -13,13 +13,13 @@ spring: cloud: stream: bindings: - correlate-ingres-binding: + correlate-ingress-binding: content-type: application/json destination: ${KAFKA_TOPIC_CORRELATE_INGRES:correlate-ingress} binder: correlate-ingress-binder group: ${KAFKA_GROUP_ID} binders: - correlate-ingres-binder: + correlate-ingress-binder: type: kafka defaultCandidate: false inheritEnvironment: false @@ -54,3 +54,24 @@ camunda: metrics: enabled: false db-reporter-activate: false + +management: + server: + port: ${MANAGEMENT_PORT:9005} + endpoint: + prometheus: + enabled: true + endpoints: + web: + exposure: + include: 'prometheus,health,info,loggers' + metrics: + export: + prometheus: + enabled: true + enable: + jvm: false + tomcat: false + cache: false + logback: false + process: false diff --git a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonChannelConfiguration.kt b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonChannelConfiguration.kt index bb654b1..1f1e0e4 100644 --- a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonChannelConfiguration.kt +++ b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonChannelConfiguration.kt @@ -25,6 +25,10 @@ import org.springframework.core.annotation.Order @AutoConfigureAfter(AxonAutoConfiguration::class, ChannelMessageAcceptorConfiguration::class) class AxonChannelConfiguration { + companion object { + const val TYPE = "axon" + } + @ConditionalOnMissingBean @Bean fun axonEventMessageHandler( @@ -35,14 +39,15 @@ class AxonChannelConfiguration { channelConfigs: Map ): AxonEventMessageHandler { - val config = requireNotNull(channelConfigs["axon"]) { "Configuration for channel 'axon' is required." } + val config = requireNotNull(channelConfigs[TYPE]) { "Configuration for channel 'axon' is required." } val encoding = requireNotNull(config.getMessagePayloadEncoding()) { "Channel encoding is required, please set message-payload-encoding." } val encoder = requireNotNull(payloadDecoders.find { it.supports(encoding) }) { "Could not find decoder for configured message encoding '$encoding'." } return AxonEventMessageHandler( messageAcceptor = channelMessageAcceptor, metrics = metrics, axonEventHeaderConverter = axonEventHeaderConverter, - encoder = encoder + encoder = encoder, + channel = TYPE ) } @@ -54,6 +59,6 @@ class AxonChannelConfiguration { @Order(10) fun axonChannelConfigMessageMetaDataSnippetExtractor(channelConfigs: Map): MessageMetaDataSnippetExtractor = ChannelConfigMessageMetaDataSnippetExtractor( - channelConfig = requireNotNull(channelConfigs["axon"]) { "Configuration for channel 'axon' is required." } + channelConfig = requireNotNull(channelConfigs[TYPE]) { "Configuration for channel 'axon' is required." } ) } diff --git a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventMessageHandler.kt b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventMessageHandler.kt index 9dc9499..d4d2577 100644 --- a/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventMessageHandler.kt +++ b/extension/axon/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/axon/AxonEventMessageHandler.kt @@ -16,13 +16,14 @@ class AxonEventMessageHandler( private val messageAcceptor: ChannelMessageAcceptor, private val metrics: IngressMetrics, private val axonEventHeaderConverter: AxonEventHeaderConverter, - private val encoder: PayloadDecoder + private val encoder: PayloadDecoder, + private val channel: String, ) : EventMessageHandler { companion object : KLogging() override fun handle(eventMessage: EventMessage<*>) { - metrics.incrementReceived() + metrics.incrementReceived(channel) val headers = axonEventHeaderConverter.extractHeaders(eventMessage) logger.debug { "Received message $headers" } // The message acceptor will only get supported messages. @@ -38,10 +39,10 @@ class AxonEventMessageHandler( ) ) logger.debug { "Accepted message $headers" } - metrics.incrementAccepted() + metrics.incrementAccepted(channel) } else { logger.debug { "Ignored message $headers, it is not supported by client." } - metrics.incrementIgnored() + metrics.incrementIgnored(channel) } } diff --git a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt index 38d7d74..ee2bd56 100644 --- a/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt +++ b/extension/cockpit-plugin/src/main/kotlin/io/holunda/camunda/bpm/correlate/resources/CorrelateMessageResource.kt @@ -22,7 +22,7 @@ class CorrelateMessageResource(engineName: String) : AbstractCockpitPluginResour fun getMessages(@QueryParam("faultsOnly") faults: Boolean, @QueryParam("page") page: Int, @QueryParam("size") size: Int): List { return services .messageRepository - .findAllLight(page, size) + .findAllLight(page, size, faults) .map { it.toDto(services.configuration.persistence.messageMaxRetries) } } diff --git a/extension/core/pom.xml b/extension/core/pom.xml index 2c4bab2..01da25c 100644 --- a/extension/core/pom.xml +++ b/extension/core/pom.xml @@ -20,13 +20,17 @@ io.micrometer - micrometer-core + micrometer-registry-prometheus org.camunda.bpm camunda-engine provided + + org.springframework.data + spring-data-jpa + diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationProcessor.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationProcessor.kt index 2bb9eca..5737ade 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationProcessor.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationProcessor.kt @@ -45,7 +45,7 @@ class BatchCorrelationProcessor( ) ) ) - correlationMetrics.incrementError(1) + correlationMetrics.incrementError() logger.trace(e) { "Error processing for batch ${batch.correlationHint}" } } } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt index 91a5abf..abff62b 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt @@ -1,19 +1,63 @@ package io.holunda.camunda.bpm.correlate.correlation +import io.holunda.camunda.bpm.correlate.persist.CountByStatus import io.holunda.camunda.bpm.correlate.util.ComponentLike +import io.prometheus.client.CollectorRegistry +import io.prometheus.client.Counter +import io.prometheus.client.Gauge import mu.KLogging @ComponentLike -class CorrelationMetrics { +class CorrelationMetrics( + registry: CollectorRegistry +) { - // FIXME: integrate metrics library - companion object: KLogging() + companion object : KLogging() + + private val correlatedMessagesCounter: Counter = Counter.build() + .name("camunda_bpm_correlate_correlation_success_total") + .labelNames() + .help("Messages successfully correlated") + .register(registry) + + private val errorsMessagesCounter: Counter = Counter.build() + .name("camunda_bpm_correlate_correlation_error_total") + .labelNames() + .help("Messages producing an error during correlation") + .register(registry) + + private val totalMessages: Gauge = Gauge.build() + .name("camunda_bpm_correlate_messages") + .labelNames("status") + .help("Handling messages currently waiting to be processed. Label: status - total, retrying, error, paused, inProgress or maxRetriesReached") + .register(registry) + + + fun reportMessageCounts(countByStatus: CountByStatus) { + if (countByStatus.total == 0L) { + logger.debug { "No messages found - table is clean." } + } else { + logger.debug { "Message counts: Total ${countByStatus.total}, eligible for processing ${countByStatus.retrying}, error ${countByStatus.error}, retries exhausted ${countByStatus.maxRetriesReached}" } + } + totalMessages.labels("total").set(countByStatus.total.toDouble()) + totalMessages.labels("retrying").set(countByStatus.retrying.toDouble()) + totalMessages.labels("error").set(countByStatus.error.toDouble()) + totalMessages.labels("maxRetriesReached").set(countByStatus.maxRetriesReached.toDouble()) + totalMessages.labels("paused").set(countByStatus.paused.toDouble()) + totalMessages.labels("inProgress").set(countByStatus.inProgress.toDouble()) + } fun incrementSuccess(size: Int) { - logger.debug { "Correlated $size messages" } + correlatedMessagesCounter.inc(size.toDouble()) } fun incrementError(size: Int) { - logger.debug { "Error during correlation of $size messages" } + errorsMessagesCounter.inc(size.toDouble()) + } + + fun incrementError() { + incrementError(1) } + + } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt index 8dbea12..61276ce 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt @@ -1,78 +1,82 @@ package io.holunda.camunda.bpm.correlate.ingress import io.holunda.camunda.bpm.correlate.util.ComponentLike -import io.micrometer.core.instrument.Counter -import io.micrometer.core.instrument.MeterRegistry -import mu.KLogging +import io.prometheus.client.CollectorRegistry +import io.prometheus.client.Counter /** * Metrics for ingress. */ @ComponentLike class IngressMetrics( - registry: MeterRegistry + registry: CollectorRegistry ) { - companion object : KLogging() private val acceptedCounter = Counter - .builder("camunda_bpm_correlate_ingress_accepted") - .description("Messages accepted by the ingress adapter") + .build() + .name("camunda_bpm_correlate_ingress_accepted_total") + .labelNames("channel") + .help("Messages accepted by the ingress adapter") .register(registry) private val receivedCounter = Counter - .builder("camunda_bpm_correlate_ingress_received") - .description("Messages received by the ingress adapter") + .build() + .name("camunda_bpm_correlate_ingress_received_total") + .labelNames("channel") + .help("Messages received by the ingress adapter") .register(registry) private val ignoredCounter = Counter - .builder("camunda_bpm_correlate_ingress_ignored") - .description("Messages ignored by the ingress adapter") + .build() + .name("camunda_bpm_correlate_ingress_ignored_total") + .labelNames("channel") + .help("Messages ignored by the ingress adapter") .register(registry) private val persistedCounter = Counter - .builder("camunda_bpm_correlate_acceptor_persisted") - .description("Messages persisted by the acceptor") + .build() + .name("camunda_bpm_correlate_acceptor_persisted_total") + .help("Messages persisted by the acceptor") .register(registry) private val droppedCounter = Counter - .builder("camunda_bpm_correlate_acceptor_dropped") - .description("Messages dropped by the acceptor") + .build() + .name("camunda_bpm_correlate_acceptor_dropped_total") + .help("Messages dropped by the acceptor") .register(registry) - /** * Received by the ingress adapter. */ - fun incrementReceived() { - receivedCounter.increment() + fun incrementReceived(channel: String) { + receivedCounter.labels(channel).inc() } /** * Accepted by acceptor. */ - fun incrementAccepted() { - acceptedCounter.increment() + fun incrementAccepted(channel: String) { + acceptedCounter.labels(channel).inc() } /** * Ignored by acceptor. */ - fun incrementIgnored() { - ignoredCounter.increment() + fun incrementIgnored(channel: String) { + ignoredCounter.labels(channel).inc() } /** * Passed through message filter and persisted in inbox. */ fun incrementPersisted() { - persistedCounter.increment() + persistedCounter.inc() } /** * Ignored by message filter (instead of persisted). */ fun incrementDropped() { - droppedCounter.increment() + droppedCounter.inc() } - } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/CountByStatus.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/CountByStatus.kt new file mode 100644 index 0000000..c86b63d --- /dev/null +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/CountByStatus.kt @@ -0,0 +1,13 @@ +package io.holunda.camunda.bpm.correlate.persist + +/** + * Count of messages by status. + */ +class CountByStatus( + var total: Long, + var maxRetriesReached: Long, + var error: Long, + var retrying: Long, + var inProgress: Long, + var paused: Long +) \ No newline at end of file diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt index a51afd8..ea22201 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt @@ -26,9 +26,17 @@ class MessageEntity( * Checks if the message is expired. */ fun isExpired(clock: Clock): Boolean { - return expiration != null && clock.instant() >= expiration + return isExpired(clock.instant()) } + /** + * Checks if the message is expired. + */ + fun isExpired(now: Instant): Boolean { + return expiration != null && now >= expiration + } + + fun status(maxRetries: Int): MessageStatus { return if (error == null && retries == 0) { // since the error is null and the retries are zero, we are good. diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageRepository.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageRepository.kt index bd00056..73a766f 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageRepository.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageRepository.kt @@ -1,5 +1,7 @@ package io.holunda.camunda.bpm.correlate.persist +import java.time.Instant + /** * Repository to store and retrieve messages. @@ -13,13 +15,15 @@ interface MessageRepository { * @return list of all messages. */ fun findAll(page: Int, pageSize: Int): List + /** * Finds all messages without payload. * @param page number start element to fetch from. * @param pageSize number elements to fetch. + * @param faultsOnly flag fetching the errors only. * @return list of all messages. */ - fun findAllLight(page: Int, pageSize: Int): List + fun findAllLight(page: Int, pageSize: Int, faultsOnly: Boolean): List /** * Finds a message by id. @@ -33,6 +37,7 @@ interface MessageRepository { * @param message message to save. */ fun insert(message: MessageEntity) + /** * Saves modified message. * @param message message to save. @@ -44,4 +49,16 @@ interface MessageRepository { * @param ids list of ids of messages to delete. */ fun deleteAllById(ids: List) + + + /** + * Count by status and report. + * @param maxRetries max retries configured in the system. + * @param now current time. + * @param farFuture time considered as far future (to detect pauses). + * @return current count. + */ + fun countByStatus(maxRetries: Int, now: Instant, farFuture: Instant): CountByStatus + } + diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/InMemMessageRepository.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/InMemMessageRepository.kt index 45e786d..f658e35 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/InMemMessageRepository.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/InMemMessageRepository.kt @@ -1,8 +1,11 @@ package io.holunda.camunda.bpm.correlate.persist.impl +import io.holunda.camunda.bpm.correlate.persist.CountByStatus import io.holunda.camunda.bpm.correlate.persist.MessageEntity import io.holunda.camunda.bpm.correlate.persist.MessageRepository +import io.holunda.camunda.bpm.correlate.persist.MessageStatus import mu.KLogging +import java.time.Instant /** * In-memory implementation. @@ -16,9 +19,9 @@ class InMemMessageRepository() : MessageRepository { override fun findAll(page: Int, pageSize: Int): List { return store.values.toList().subList(page * pageSize, pageSize) } - - override fun findAllLight(page: Int, pageSize: Int): List { - return store.values.toList().subList(page * pageSize, pageSize) + + override fun findAllLight(page: Int, pageSize: Int, faultsOnly: Boolean): List { + return store.values.filter { if (faultsOnly) { it.error != null } else { true } }.toList().subList(page * pageSize, pageSize) } override fun findByIdOrNull(id: String): MessageEntity? { @@ -38,4 +41,15 @@ class InMemMessageRepository() : MessageRepository { store.remove(it) } } + + override fun countByStatus(maxRetries: Int, now: Instant, farFuture: Instant): CountByStatus { + return CountByStatus( + total = store.count().toLong(), + error = store.values.count { it.error != null }.toLong(), + maxRetriesReached = store.values.count { it.status(maxRetries) == MessageStatus.MAX_RETRIES_REACHED }.toLong(), + retrying = store.values.count { it.status(maxRetries) == MessageStatus.RETRYING }.toLong(), + inProgress = store.values.count { it.status(maxRetries) == MessageStatus.IN_PROGRESS }.toLong(), + paused = store.values.count { it.status(maxRetries) == MessageStatus.PAUSED }.toLong(), + ) + } } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt index f649e34..a82e9bd 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MessageManagementService.kt @@ -1,5 +1,6 @@ package io.holunda.camunda.bpm.correlate.persist.impl +import io.holunda.camunda.bpm.correlate.persist.CountByStatus import io.holunda.camunda.bpm.correlate.persist.MessageEntity import io.holunda.camunda.bpm.correlate.persist.MessageEntity.Companion.FAR_FUTURE import io.holunda.camunda.bpm.correlate.persist.MessageRepository @@ -23,7 +24,7 @@ class MessageManagementService( */ fun cleanupExpired() { messageRepository.deleteAllById( - messageRepository.findAllLight(page = 0, pageSize = persistenceConfig.getPageSize()) + messageRepository.findAllLight(page = 0, pageSize = persistenceConfig.getPageSize(), faultsOnly = true) .filter { it.isExpired(clock) } .map { it.id } ) @@ -100,7 +101,19 @@ class MessageManagementService( } } - fun getMessageById(messageId: String): MessageEntity { + /** + * Count messages by status. + */ + fun countMessagesByStatus(): CountByStatus { + return messageRepository.countByStatus(persistenceConfig.getMaxRetries(), clock.instant(), MessageEntity.FAR_FUTURE) + } + + /** + * Retrieves a message by id. + * @param messageId message id. + * @return message. + */ + internal fun getMessageById(messageId: String): MessageEntity { return requireNotNull(messageRepository.findByIdOrNull(messageId)) { "Could not find message with id $messageId" } } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt index d733f08..a9c33a7 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt @@ -1,9 +1,11 @@ package io.holunda.camunda.bpm.correlate.persist.impl +import io.holunda.camunda.bpm.correlate.persist.CountByStatus import io.holunda.camunda.bpm.correlate.persist.MessageEntity import org.apache.ibatis.annotations.* import org.apache.ibatis.session.RowBounds import org.apache.ibatis.type.JdbcType +import java.time.Instant interface MyBatisMessageMapper { @@ -25,6 +27,24 @@ interface MyBatisMessageMapper { ) fun findAllLightPaged(rowBounds: RowBounds): List + @Select("SELECT * FROM COR_MESSAGE message M WHERE M.ERROR IS NOT NULL") + @Results( + value = [ + Result(property = "id", column = "ID", jdbcType = JdbcType.VARCHAR), + Result(property = "payloadEncoding", column = "PAYLOAD_ENCODING", jdbcType = JdbcType.VARCHAR), + Result(property = "payloadTypeNamespace", column = "PAYLOAD_TYPE_NAMESPACE", jdbcType = JdbcType.VARCHAR), + Result(property = "payloadTypeName", column = "PAYLOAD_TYPE_NAME", jdbcType = JdbcType.VARCHAR), + Result(property = "payloadTypeRevision", column = "PAYLOAD_TYPE_REVISION", jdbcType = JdbcType.VARCHAR), + Result(property = "inserted", column = "INSERTED", jdbcType = JdbcType.TIMESTAMP_WITH_TIMEZONE), + Result(property = "timeToLiveDuration", column = "TTL_DURATION", jdbcType = JdbcType.VARCHAR), + Result(property = "expiration", column = "EXPIRATION", jdbcType = JdbcType.TIMESTAMP_WITH_TIMEZONE), + Result(property = "retries", column = "RETRIES", jdbcType = JdbcType.INTEGER), + Result(property = "nextRetry", column = "NEXT_RETRY", jdbcType = JdbcType.TIMESTAMP_WITH_TIMEZONE), + Result(property = "error", column = "ERROR", jdbcType = JdbcType.VARCHAR), + ] + ) + fun findAllFaultsLightPaged(rowBounds: RowBounds): List + @Select("SELECT * FROM COR_MESSAGE message") @Results( value = [ @@ -63,6 +83,30 @@ interface MyBatisMessageMapper { ) fun findById(id: String): MessageEntity? + @Select(""" +SELECT COUNT(ID) TOTAL, + COUNT(CASE WHEN ERROR IS NOT NULL THEN 1 END) ERROR, + COUNT(CASE WHEN ERROR IS NULL AND NEXT_RETRY IS NULL THEN 1 END) IN_PROGRESS, + COUNT(CASE WHEN RETRIES = #{maxRetries} THEN 1 END) MAX_RETRIES_REACHED, + COUNT(CASE WHEN RETRIES > 0 AND RETRIES < #{maxRetries} AND NEXT_RETRY < #{now} THEN 1 END) RETRYING, + COUNT(CASE WHEN NEXT_RETRY = #{farFuture}) THEN 1 END) PAUSED +FROM COR_MESSAGE +""") + @Results( + value = [ + Result(property = "total", column = "TOTAL"), + Result(property = "error", column = "ERROR"), + Result(property = "inProgress", column = "IN_PROGRESS"), + Result(property = "maxRetriesReached", column = "MAX_RETRIES_REACHED"), + Result(property = "retrying", column = "RETRYING"), + Result(property = "paused", column = "PAUSED"), + ] + ) + fun countByStatus(@Param("maxRetries") maxRetries: Int, + @Param("now") now: Instant, + @Param("farFuture") farFuture: Instant + ): CountByStatus + @Delete("DELETE FROM COR_MESSAGE WHERE ID=#{id}") fun deleteById(id: String) diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepository.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepository.kt index 1b1b484..181c572 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepository.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepository.kt @@ -1,10 +1,12 @@ package io.holunda.camunda.bpm.correlate.persist.impl +import io.holunda.camunda.bpm.correlate.persist.CountByStatus import io.holunda.camunda.bpm.correlate.persist.MessageEntity import io.holunda.camunda.bpm.correlate.persist.MessageRepository import mu.KLogging import org.apache.ibatis.session.RowBounds import org.apache.ibatis.session.SqlSessionFactory +import java.time.Instant /** * MyBatis implementation of the message repository. @@ -16,9 +18,13 @@ class MyBatisMessageRepository( companion object : KLogging() - override fun findAllLight(page: Int, pageSize: Int): List { + override fun findAllLight(page: Int, pageSize: Int, faultsOnly: Boolean): List { return sqlSessionFactory.openSession().use { - it.getMapper(MyBatisMessageMapper::class.java).findAllLightPaged(RowBounds(pageSize * page, pageSize)) + if (faultsOnly) { + it.getMapper(MyBatisMessageMapper::class.java).findAllFaultsLightPaged(RowBounds(pageSize * page, pageSize)) + } else { + it.getMapper(MyBatisMessageMapper::class.java).findAllLightPaged(RowBounds(pageSize * page, pageSize)) + } } } @@ -34,6 +40,13 @@ class MyBatisMessageRepository( } } + override fun countByStatus(maxRetries: Int, now: Instant, farFuture: Instant): CountByStatus { + return sqlSessionFactory.openSession().use { + it.getMapper(MyBatisMessageMapper::class.java).countByStatus(maxRetries, now, farFuture) + } + } + + override fun insert(message: MessageEntity) { return sqlSessionFactory.openSession().use { val mapper = it.getMapper(MyBatisMessageMapper::class.java) diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationProcessorTest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationProcessorTest.kt index a75d278..01b9c5f 100644 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationProcessorTest.kt +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationProcessorTest.kt @@ -5,7 +5,6 @@ import io.holunda.camunda.bpm.correlate.persist.MessagePersistenceService import io.holunda.camunda.bpm.correlate.runningInstanceHint import org.junit.jupiter.api.Test import org.mockito.kotlin.* -import java.lang.IllegalArgumentException internal class BatchCorrelationProcessorTest { @@ -94,7 +93,7 @@ internal class BatchCorrelationProcessorTest { verifyNoMoreInteractions(persistenceService) verify(correlationMetrics).incrementSuccess(batches[0].correlationMessages.size) - verify(correlationMetrics).incrementError(1) + verify(correlationMetrics).incrementError() verifyNoMoreInteractions(correlationMetrics) } diff --git a/extension/spring-boot-starter/pom.xml b/extension/spring-boot-starter/pom.xml index 70f9a71..82a341a 100644 --- a/extension/spring-boot-starter/pom.xml +++ b/extension/spring-boot-starter/pom.xml @@ -19,10 +19,6 @@ camunda-bpm-correlate ${project.version} - - org.springframework.boot - spring-boot - org.springframework.boot spring-boot-autoconfigure @@ -39,6 +35,8 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 + + net.javacrumbs.shedlock shedlock-spring @@ -54,7 +52,6 @@ provided - org.springframework.boot spring-boot-configuration-processor diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt index 708e51a..f8f03e0 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt @@ -15,6 +15,7 @@ import io.holunda.camunda.bpm.correlate.persist.MessageRepository import io.holunda.camunda.bpm.correlate.persist.error.RetryingErrorHandlingProperties import io.holunda.camunda.bpm.correlate.persist.impl.MessageManagementService import io.holunda.camunda.bpm.correlate.persist.impl.MessagePersistenceProperties +import io.prometheus.client.CollectorRegistry import mu.KLogging import org.camunda.bpm.spring.boot.starter.CamundaBpmAutoConfiguration import org.springframework.boot.autoconfigure.AutoConfigureAfter @@ -52,11 +53,11 @@ class CamundaBpmCorrelateConfiguration : ApplicationContextAware { @ConditionalOnMissingBean @Bean - fun ingresMetrics() = IngressMetrics() + fun ingressMetrics(registry: CollectorRegistry) = IngressMetrics(registry = registry) @ConditionalOnMissingBean @Bean - fun correlationMetrics(): CorrelationMetrics = CorrelationMetrics() + fun correlationMetrics(registry: CollectorRegistry): CorrelationMetrics = CorrelationMetrics(registry = registry) @ConditionalOnMissingBean @Bean diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt index e201dba..06f3c20 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt @@ -24,7 +24,8 @@ import java.util.concurrent.Executors class BatchCorrelationSchedulerConfiguration( private val batchCorrelationProcessor: BatchCorrelationProcessor, private val messageManagementService: MessageManagementService, - private val batchConfigurationProperties: BatchConfigurationProperties + private val batchConfigurationProperties: BatchConfigurationProperties, + private val correlationMetrics: CorrelationMetrics ) : SchedulingConfigurer { companion object : KLogging() @@ -42,12 +43,17 @@ class BatchCorrelationSchedulerConfiguration( fun runCorrelation() { batchCorrelationProcessor.correlate() - val remaining = messageManagementService.listAllMessages() - if (remaining.isNotEmpty()) { - logger.debug { "There are ${remaining.size} messages in the message inbox." } - } - remaining.forEach { - logger.debug { "Message with payload type ${it.payloadTypeNamespace}.${it.payloadTypeName} received at ${it.inserted}, attempts: ${it.retries}, next due at: ${it.nextRetry}." } + val count = messageManagementService.countMessagesByStatus() + correlationMetrics.reportMessageCounts(count) + + if (logger.isDebugEnabled) { + val remaining = messageManagementService.listAllMessages() + if (remaining.isNotEmpty()) { + logger.debug { "There are ${remaining.size} messages in the message inbox." } + } + remaining.forEach { + logger.debug { "Message with payload type ${it.payloadTypeNamespace}.${it.payloadTypeName} received at ${it.inserted}, attempts: ${it.retries}, next due at: ${it.nextRetry}." } + } } } diff --git a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/SpringCloudStreamChannelConfiguration.kt b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/SpringCloudStreamChannelConfiguration.kt index db65251..a4643df 100644 --- a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/SpringCloudStreamChannelConfiguration.kt +++ b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/SpringCloudStreamChannelConfiguration.kt @@ -36,7 +36,8 @@ class SpringCloudStreamChannelConfiguration { ) = StreamByteMessageConsumer( messageAcceptor = channelMessageAcceptor, metrics = metrics, - channelMessageHeaderConverter = channelMessageHeaderConverter + channelMessageHeaderConverter = channelMessageHeaderConverter, + channel = TYPE // currently based on type, later based on name ) @ConditionalOnMissingBean diff --git a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/StreamByteMessageConsumer.kt b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/StreamByteMessageConsumer.kt index e9d3ba9..eb9feb5 100644 --- a/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/StreamByteMessageConsumer.kt +++ b/extension/spring-cloud-stream/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/cloudstream/StreamByteMessageConsumer.kt @@ -13,22 +13,23 @@ import java.util.function.Consumer class StreamByteMessageConsumer( private val messageAcceptor: ChannelMessageAcceptor, private val metrics: IngressMetrics, - private val channelMessageHeaderConverter: ChannelMessageHeaderConverter + private val channelMessageHeaderConverter: ChannelMessageHeaderConverter, + private val channel: String ) : Consumer> { companion object : KLogging() override fun accept(message: Message) { - metrics.incrementReceived() + metrics.incrementReceived(channel) val headers = channelMessageHeaderConverter.extractMessageHeaders(message) logger.debug { "Received message $headers" } if (messageAcceptor.supports(headers)) { messageAcceptor.accept(ByteMessage(headers = headers, payload = message.payload)) logger.debug { "Accepted message $headers" } - metrics.incrementAccepted() + metrics.incrementAccepted(channel) } else { logger.debug { "Ignored message $headers, it is not supported by client." } - metrics.incrementIgnored() + metrics.incrementIgnored(channel) } } diff --git a/pom.xml b/pom.xml index 3f5ba5e..71aa2a9 100644 --- a/pom.xml +++ b/pom.xml @@ -13,8 +13,8 @@ UTF-8 11 - 1.6.21 - 2.6.6 + 1.7.10 + 2.7.4 From a6165fb4c9c4726b10deda6a618e8035bbdab1d0 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Wed, 28 Sep 2022 12:39:44 +0200 Subject: [PATCH 37/53] implement metrics --- docs/user-guide/index.md | 1 + docs/user-guide/metrics.md | 19 +++++++ example/axon/reservation-axon/pom.xml | 5 ++ extension/core/pom.xml | 16 ++++-- .../correlation/CorrelationMetrics.kt | 51 ++++++----------- .../bpm/correlate/ingress/IngressMetrics.kt | 55 ++++++------------- .../persist/impl/MyBatisMessageMapper.kt | 26 ++++----- .../persist/impl/MyBatisMessageMapperITest.kt | 28 ++++++++++ .../CamundaBpmCorrelateConfiguration.kt | 6 +- 9 files changed, 117 insertions(+), 90 deletions(-) create mode 100644 docs/user-guide/metrics.md create mode 100644 extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapperITest.kt diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index a7c63c4..b2d3b74 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -7,6 +7,7 @@ The user guide consists of several sections. * [Message Acceptor](message-acceptor.md) * [Message Persistence](message-persistence.md) * [Scheduled Processing](scheduled-processing.md) +* [Metrics](metrics.md) ## Examples diff --git a/docs/user-guide/metrics.md b/docs/user-guide/metrics.md new file mode 100644 index 0000000..7eb6681 --- /dev/null +++ b/docs/user-guide/metrics.md @@ -0,0 +1,19 @@ +In order to be able to monitor the library in operations, we expose different metrics using +standard Spring Boot approach and use Micrometer as the library. By doing so, we provide maximum +flexibility for the integration of the metrics in your monitoring system (like Prometheus or others). + +The following metrics are provided: + +| Component | Name | Type | Tags | Description | +|-------------|------------------------------------------------|---------|---------|---------------------------------------------------------------------------------------------------------------------------------| +| Ingress | camunda_bpm_correlate_ingress_received_total | counter | channel | Total number of messages received via given channel. | +| Ingress | camunda_bpm_correlate_ingress_accepted_total | counter | channel | Total number of messages accepted via channel. | +| Ingress | camunda_bpm_correlate_ingress_ignored_total | counter | channel | Total number of messages received but ignored via channel. | +| Acceptor | camunda_bpm_correlate_acceptor_persisted_total | counter | | Total number of messages persisted in the inbox. | +| Acceptor | camunda_bpm_correlate_acceptor_dropped_total | counter | | Total number of messages dropped instead of persisting in the inbox. | +| Inbox | camunda_bpm_correlate_inbox_message | gauge | status | Number of messages in the inbox by status. The statuses are: total, retrying, in_progress, error, maxRetriesReached and paused. | +| Correlation | camunda_bpm_correlate_correlation_success | counter | | Total number of messages successfully correlated. | +| Correlation | camunda_bpm_correlate_correlation_error | counter | | Total number of messages correlated with error. | + + + diff --git a/example/axon/reservation-axon/pom.xml b/example/axon/reservation-axon/pom.xml index 1135477..21d4a66 100644 --- a/example/axon/reservation-axon/pom.xml +++ b/example/axon/reservation-axon/pom.xml @@ -37,6 +37,7 @@ camunda-bpm-correlate-example-common + io.holunda @@ -71,6 +72,10 @@ com.fasterxml.jackson.core jackson-databind + + io.micrometer + micrometer-registry-prometheus + diff --git a/extension/core/pom.xml b/extension/core/pom.xml index 01da25c..0edd92b 100644 --- a/extension/core/pom.xml +++ b/extension/core/pom.xml @@ -20,18 +20,26 @@ io.micrometer - micrometer-registry-prometheus + micrometer-core org.camunda.bpm camunda-engine provided + + - org.springframework.data - spring-data-jpa + org.mybatis.spring.boot + mybatis-spring-boot-starter-test + 2.2.2 + test + + + org.springframework.boot + spring-boot-starter-jdbc + test - diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt index abff62b..909bc75 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt @@ -2,36 +2,22 @@ package io.holunda.camunda.bpm.correlate.correlation import io.holunda.camunda.bpm.correlate.persist.CountByStatus import io.holunda.camunda.bpm.correlate.util.ComponentLike -import io.prometheus.client.CollectorRegistry -import io.prometheus.client.Counter -import io.prometheus.client.Gauge +import io.micrometer.core.instrument.MeterRegistry +import io.micrometer.core.instrument.Tag import mu.KLogging @ComponentLike class CorrelationMetrics( - registry: CollectorRegistry + private val registry: MeterRegistry ) { - companion object : KLogging() - - private val correlatedMessagesCounter: Counter = Counter.build() - .name("camunda_bpm_correlate_correlation_success_total") - .labelNames() - .help("Messages successfully correlated") - .register(registry) - - private val errorsMessagesCounter: Counter = Counter.build() - .name("camunda_bpm_correlate_correlation_error_total") - .labelNames() - .help("Messages producing an error during correlation") - .register(registry) - - private val totalMessages: Gauge = Gauge.build() - .name("camunda_bpm_correlate_messages") - .labelNames("status") - .help("Handling messages currently waiting to be processed. Label: status - total, retrying, error, paused, inProgress or maxRetriesReached") - .register(registry) + companion object : KLogging() { + const val PREFIX = "camunda.bpm.correlate" + const val COUNTER_CORRELATED = "$PREFIX.correlation.success" + const val COUNTER_ERROR = "$PREFIX.correlation.error" + const val GAUGE_MESSAGES = "$PREFIX.inbox.messages" + } fun reportMessageCounts(countByStatus: CountByStatus) { if (countByStatus.total == 0L) { @@ -39,25 +25,24 @@ class CorrelationMetrics( } else { logger.debug { "Message counts: Total ${countByStatus.total}, eligible for processing ${countByStatus.retrying}, error ${countByStatus.error}, retries exhausted ${countByStatus.maxRetriesReached}" } } - totalMessages.labels("total").set(countByStatus.total.toDouble()) - totalMessages.labels("retrying").set(countByStatus.retrying.toDouble()) - totalMessages.labels("error").set(countByStatus.error.toDouble()) - totalMessages.labels("maxRetriesReached").set(countByStatus.maxRetriesReached.toDouble()) - totalMessages.labels("paused").set(countByStatus.paused.toDouble()) - totalMessages.labels("inProgress").set(countByStatus.inProgress.toDouble()) + + registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "total")), countByStatus.total.toDouble()) + registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "retrying")), countByStatus.retrying.toDouble()) + registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "error")), countByStatus.error.toDouble()) + registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "maxRetriesReached")), countByStatus.maxRetriesReached.toDouble()) + registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "paused")), countByStatus.paused.toDouble()) + registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "inProgress")), countByStatus.inProgress.toDouble()) } fun incrementSuccess(size: Int) { - correlatedMessagesCounter.inc(size.toDouble()) + registry.counter(COUNTER_CORRELATED).increment(size.toDouble()) } fun incrementError(size: Int) { - errorsMessagesCounter.inc(size.toDouble()) + registry.counter(COUNTER_ERROR).increment(size.toDouble()) } fun incrementError() { incrementError(1) } - - } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt index 61276ce..b00ad6a 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/ingress/IngressMetrics.kt @@ -1,82 +1,63 @@ package io.holunda.camunda.bpm.correlate.ingress import io.holunda.camunda.bpm.correlate.util.ComponentLike -import io.prometheus.client.CollectorRegistry -import io.prometheus.client.Counter +import io.micrometer.core.instrument.MeterRegistry +import io.micrometer.core.instrument.Tag /** * Metrics for ingress. */ @ComponentLike class IngressMetrics( - registry: CollectorRegistry + private val registry: MeterRegistry ) { - private val acceptedCounter = Counter - .build() - .name("camunda_bpm_correlate_ingress_accepted_total") - .labelNames("channel") - .help("Messages accepted by the ingress adapter") - .register(registry) + companion object { + const val PREFIX_INGRESS = "camunda.bpm.correlate.ingress" + const val PREFIX_ACCEPTOR = "camunda.bpm.correlate.acceptor" - private val receivedCounter = Counter - .build() - .name("camunda_bpm_correlate_ingress_received_total") - .labelNames("channel") - .help("Messages received by the ingress adapter") - .register(registry) + const val COUNTER_RECEIVED = "$PREFIX_INGRESS.received" + const val COUNTER_ACCEPTED = "$PREFIX_INGRESS.accepted" + const val COUNTER_IGNORED = "$PREFIX_INGRESS.ignored" - private val ignoredCounter = Counter - .build() - .name("camunda_bpm_correlate_ingress_ignored_total") - .labelNames("channel") - .help("Messages ignored by the ingress adapter") - .register(registry) + const val COUNTER_PERSISTED = "$PREFIX_ACCEPTOR.persisted" + const val COUNTER_DROPPED = "$PREFIX_ACCEPTOR.dropped" - private val persistedCounter = Counter - .build() - .name("camunda_bpm_correlate_acceptor_persisted_total") - .help("Messages persisted by the acceptor") - .register(registry) - - private val droppedCounter = Counter - .build() - .name("camunda_bpm_correlate_acceptor_dropped_total") - .help("Messages dropped by the acceptor") - .register(registry) + const val TAG_CHANNEL = "channel" + } /** * Received by the ingress adapter. */ fun incrementReceived(channel: String) { - receivedCounter.labels(channel).inc() + registry.counter(COUNTER_RECEIVED, listOf(Tag.of(TAG_CHANNEL, channel))).increment() } /** * Accepted by acceptor. */ fun incrementAccepted(channel: String) { - acceptedCounter.labels(channel).inc() + registry.counter(COUNTER_ACCEPTED, listOf(Tag.of(TAG_CHANNEL, channel))).increment() } /** * Ignored by acceptor. */ fun incrementIgnored(channel: String) { - ignoredCounter.labels(channel).inc() + registry.counter(COUNTER_IGNORED, listOf(Tag.of(TAG_CHANNEL, channel))).increment() } /** * Passed through message filter and persisted in inbox. */ fun incrementPersisted() { - persistedCounter.inc() + registry.counter(COUNTER_PERSISTED).increment() } /** * Ignored by message filter (instead of persisted). */ fun incrementDropped() { - droppedCounter.inc() + registry.counter(COUNTER_DROPPED).increment() } } diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt index a9c33a7..764e1a2 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt @@ -9,7 +9,7 @@ import java.time.Instant interface MyBatisMessageMapper { - @Select("SELECT * FROM COR_MESSAGE message") + @Select("SELECT * FROM COR_MESSAGE") @Results( value = [ Result(property = "id", column = "ID", jdbcType = JdbcType.VARCHAR), @@ -27,7 +27,7 @@ interface MyBatisMessageMapper { ) fun findAllLightPaged(rowBounds: RowBounds): List - @Select("SELECT * FROM COR_MESSAGE message M WHERE M.ERROR IS NOT NULL") + @Select("SELECT * FROM COR_MESSAGE M WHERE M.ERROR IS NOT NULL") @Results( value = [ Result(property = "id", column = "ID", jdbcType = JdbcType.VARCHAR), @@ -45,7 +45,7 @@ interface MyBatisMessageMapper { ) fun findAllFaultsLightPaged(rowBounds: RowBounds): List - @Select("SELECT * FROM COR_MESSAGE message") + @Select("SELECT * FROM COR_MESSAGE") @Results( value = [ Result(property = "id", column = "ID", jdbcType = JdbcType.VARCHAR), @@ -64,7 +64,7 @@ interface MyBatisMessageMapper { ) fun findAll(rowBounds: RowBounds): List - @Select("SELECT * from COR_MESSAGE WHERE ID=#{id}") + @Select("SELECT * from COR_MESSAGE M WHERE M.ID=#{id}") @Results( value = [ Result(property = "id", column = "ID"), @@ -81,16 +81,16 @@ interface MyBatisMessageMapper { Result(property = "error", column = "ERROR", jdbcType = JdbcType.VARCHAR), ] ) - fun findById(id: String): MessageEntity? + fun findById(@Param("id") id: String): MessageEntity? @Select(""" -SELECT COUNT(ID) TOTAL, - COUNT(CASE WHEN ERROR IS NOT NULL THEN 1 END) ERROR, - COUNT(CASE WHEN ERROR IS NULL AND NEXT_RETRY IS NULL THEN 1 END) IN_PROGRESS, - COUNT(CASE WHEN RETRIES = #{maxRetries} THEN 1 END) MAX_RETRIES_REACHED, - COUNT(CASE WHEN RETRIES > 0 AND RETRIES < #{maxRetries} AND NEXT_RETRY < #{now} THEN 1 END) RETRYING, - COUNT(CASE WHEN NEXT_RETRY = #{farFuture}) THEN 1 END) PAUSED -FROM COR_MESSAGE +SELECT COUNT(ID) TOTAL, + COUNT(CASE WHEN M.ERROR IS NOT NULL THEN 1 END) ERROR, + COUNT(CASE WHEN M.ERROR IS NULL AND NEXT_RETRY IS NULL THEN 1 END) IN_PROGRESS, + COUNT(CASE WHEN M.RETRIES = #{maxRetries} THEN 1 END) MAX_RETRIES_REACHED, + COUNT(CASE WHEN M.RETRIES > 0 AND M.RETRIES < #{maxRetries} AND M.NEXT_RETRY < #{now} THEN 1 END) RETRYING, + COUNT(CASE WHEN M.NEXT_RETRY = #{farFuture} THEN 1 END) PAUSED +FROM COR_MESSAGE M """) @Results( value = [ @@ -108,7 +108,7 @@ FROM COR_MESSAGE ): CountByStatus @Delete("DELETE FROM COR_MESSAGE WHERE ID=#{id}") - fun deleteById(id: String) + fun deleteById(@Param("id") id: String) @Insert("INSERT INTO COR_MESSAGE(ID, PAYLOAD_ENCODING, PAYLOAD_TYPE_NAMESPACE, PAYLOAD_TYPE_NAME, PAYLOAD_TYPE_REVISION, PAYLOAD, INSERTED, TTL_DURATION, EXPIRATION, RETRIES, NEXT_RETRY, ERROR) VALUES (#{id, jdbcType=VARCHAR}, #{payloadEncoding, jdbcType=VARCHAR}, #{payloadTypeNamespace, jdbcType=VARCHAR}, #{payloadTypeName, jdbcType=VARCHAR}, #{payloadTypeRevision, jdbcType=VARCHAR}, #{payload, jdbcType=BINARY}, #{inserted, jdbcType=TIMESTAMP_WITH_TIMEZONE}, #{timeToLiveDuration, jdbcType=VARCHAR}, #{expiration, jdbcType=TIMESTAMP_WITH_TIMEZONE}, #{retries, jdbcType=INTEGER}, #{nextRetry, jdbcType=TIMESTAMP_WITH_TIMEZONE}, #{error, jdbcType=VARCHAR})") fun insert(message: MessageEntity) diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapperITest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapperITest.kt new file mode 100644 index 0000000..f43cf4e --- /dev/null +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapperITest.kt @@ -0,0 +1,28 @@ +package io.holunda.camunda.bpm.correlate.persist.impl + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Disabled +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.mybatis.spring.boot.test.autoconfigure.MybatisTest +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.test.context.junit.jupiter.SpringExtension + + +@ExtendWith(SpringExtension::class) +@MybatisTest +@SpringBootApplication +@Disabled +class MyBatisMessageMapperITest { + + @Autowired + private lateinit var mapper: MyBatisMessageMapper + + @Test + fun `selects elements`() { + + val message = mapper.findById("1") + assertThat(message).isNotNull + } +} \ No newline at end of file diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt index f8f03e0..bf25fc2 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/CamundaBpmCorrelateConfiguration.kt @@ -15,7 +15,7 @@ import io.holunda.camunda.bpm.correlate.persist.MessageRepository import io.holunda.camunda.bpm.correlate.persist.error.RetryingErrorHandlingProperties import io.holunda.camunda.bpm.correlate.persist.impl.MessageManagementService import io.holunda.camunda.bpm.correlate.persist.impl.MessagePersistenceProperties -import io.prometheus.client.CollectorRegistry +import io.micrometer.core.instrument.MeterRegistry import mu.KLogging import org.camunda.bpm.spring.boot.starter.CamundaBpmAutoConfiguration import org.springframework.boot.autoconfigure.AutoConfigureAfter @@ -53,11 +53,11 @@ class CamundaBpmCorrelateConfiguration : ApplicationContextAware { @ConditionalOnMissingBean @Bean - fun ingressMetrics(registry: CollectorRegistry) = IngressMetrics(registry = registry) + fun ingressMetrics(registry: MeterRegistry) = IngressMetrics(registry = registry) @ConditionalOnMissingBean @Bean - fun correlationMetrics(registry: CollectorRegistry): CorrelationMetrics = CorrelationMetrics(registry = registry) + fun correlationMetrics(registry: MeterRegistry): CorrelationMetrics = CorrelationMetrics(registry = registry) @ConditionalOnMissingBean @Bean From fb8b46b6ded9ed7f12aeaf7cb9529334b8b13926 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Wed, 28 Sep 2022 16:19:46 +0200 Subject: [PATCH 38/53] add mybatis tests, improve metrics --- .../src/main/resources/application.yml | 6 +- .../src/main/resources/application.yml | 4 ++ .../src/main/resources/logback.xml | 2 +- extension/core/pom.xml | 16 ++++- .../correlation/CorrelationMetrics.kt | 34 +++++++--- .../bpm/correlate/persist/MessageEntity.kt | 2 +- .../persist/impl/MyBatisMessageMapper.kt | 12 ++-- .../persist/impl/MyBatisMessageMapperITest.kt | 28 -------- .../impl/MyBatisMessageRepositoryIT.kt | 66 +++++++++++++++++++ .../src/test/resources/application-itest.yml | 10 +++ extension/core/src/test/resources/schema.sql | 14 ++++ .../core/src/test/resources/some-messages.sql | 13 ++++ .../BatchCorrelationSchedulerConfiguration.kt | 9 ++- pom.xml | 6 -- 14 files changed, 164 insertions(+), 58 deletions(-) delete mode 100644 extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapperITest.kt create mode 100644 extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepositoryIT.kt create mode 100644 extension/core/src/test/resources/application-itest.yml create mode 100644 extension/core/src/test/resources/schema.sql create mode 100644 extension/core/src/test/resources/some-messages.sql diff --git a/example/axon/reservation-axon/src/main/resources/application.yml b/example/axon/reservation-axon/src/main/resources/application.yml index 7a01bfd..d275d2d 100644 --- a/example/axon/reservation-axon/src/main/resources/application.yml +++ b/example/axon/reservation-axon/src/main/resources/application.yml @@ -30,8 +30,6 @@ correlate: retryMaxBackoffMinutes: 5 # default 180 -> maximum 5 minutes between retries retryBackoffBase: 2.0 # value in minutes default 2.0 -> base in the power of retry to calculate the next retry - - camunda: bpm: login: @@ -53,3 +51,7 @@ axon: events: xstream general: xstream messages: xstream + +logging: + level: + io.holunda.camunda.bpm.correlate.correlation: DEBUG diff --git a/example/spring-cloud/reservation-kafka/src/main/resources/application.yml b/example/spring-cloud/reservation-kafka/src/main/resources/application.yml index 972986e..8572e9d 100644 --- a/example/spring-cloud/reservation-kafka/src/main/resources/application.yml +++ b/example/spring-cloud/reservation-kafka/src/main/resources/application.yml @@ -4,6 +4,10 @@ spring: jpa: open-in-view: true show-sql: false + h2: + console: + enabled: true + path: /h2 kafka: bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVER_HOST:localhost}:${KAFKA_BOOTSTRAP_SERVER_PORT:9092} producer: diff --git a/example/spring-cloud/reservation-kafka/src/main/resources/logback.xml b/example/spring-cloud/reservation-kafka/src/main/resources/logback.xml index 831598d..3c27436 100644 --- a/example/spring-cloud/reservation-kafka/src/main/resources/logback.xml +++ b/example/spring-cloud/reservation-kafka/src/main/resources/logback.xml @@ -14,7 +14,7 @@ - + diff --git a/extension/core/pom.xml b/extension/core/pom.xml index 0edd92b..2bf27e3 100644 --- a/extension/core/pom.xml +++ b/extension/core/pom.xml @@ -29,6 +29,12 @@ + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + test + org.mybatis.spring.boot mybatis-spring-boot-starter-test @@ -40,7 +46,15 @@ spring-boot-starter-jdbc test - + + com.h2database + h2 + test + + + org.mybatis + mybatis + diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt index 909bc75..f061ed6 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/CorrelationMetrics.kt @@ -2,9 +2,11 @@ package io.holunda.camunda.bpm.correlate.correlation import io.holunda.camunda.bpm.correlate.persist.CountByStatus import io.holunda.camunda.bpm.correlate.util.ComponentLike +import io.micrometer.core.instrument.Gauge import io.micrometer.core.instrument.MeterRegistry import io.micrometer.core.instrument.Tag import mu.KLogging +import java.util.concurrent.atomic.AtomicLong @ComponentLike class CorrelationMetrics( @@ -19,19 +21,35 @@ class CorrelationMetrics( const val GAUGE_MESSAGES = "$PREFIX.inbox.messages" } + private val total = AtomicLong(0L) + private val retrying = AtomicLong(0L) + private val error = AtomicLong(0L) + private val maxRetriesReached = AtomicLong(0L) + private val inProgress = AtomicLong(0L) + private val paused = AtomicLong(0L) + + init { + Gauge.builder(GAUGE_MESSAGES, total::get).tag("status", "total").description("").register(registry) + Gauge.builder(GAUGE_MESSAGES, retrying::get).tag("status", "retrying").register(registry) + Gauge.builder(GAUGE_MESSAGES, error::get).tag("status", "error").register(registry) + Gauge.builder(GAUGE_MESSAGES, maxRetriesReached::get).tag("status", "maxRetriesReached").register(registry) + Gauge.builder(GAUGE_MESSAGES, inProgress::get).tag("status", "inProgress").register(registry) + Gauge.builder(GAUGE_MESSAGES, paused::get).tag("status", "paused").register(registry) + } + fun reportMessageCounts(countByStatus: CountByStatus) { if (countByStatus.total == 0L) { - logger.debug { "No messages found - table is clean." } + logger.debug { "No messages found, the inbox message table is clean." } } else { - logger.debug { "Message counts: Total ${countByStatus.total}, eligible for processing ${countByStatus.retrying}, error ${countByStatus.error}, retries exhausted ${countByStatus.maxRetriesReached}" } + logger.debug { "Message counts: total: ${countByStatus.total}, retrying: ${countByStatus.retrying}, error: ${countByStatus.error}, retries exhausted: ${countByStatus.maxRetriesReached}, in progress: ${countByStatus.inProgress}, paused: ${countByStatus.paused}" } } - registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "total")), countByStatus.total.toDouble()) - registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "retrying")), countByStatus.retrying.toDouble()) - registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "error")), countByStatus.error.toDouble()) - registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "maxRetriesReached")), countByStatus.maxRetriesReached.toDouble()) - registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "paused")), countByStatus.paused.toDouble()) - registry.gauge(GAUGE_MESSAGES, listOf(Tag.of("status", "inProgress")), countByStatus.inProgress.toDouble()) + total.set(countByStatus.total) + retrying.set(countByStatus.retrying) + error.set(countByStatus.error) + maxRetriesReached.set(countByStatus.maxRetriesReached) + inProgress.set(countByStatus.inProgress) + paused.set(countByStatus.paused) } fun incrementSuccess(size: Int) { diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt index ea22201..980aea8 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/MessageEntity.kt @@ -19,7 +19,7 @@ class MessageEntity( var error: String? = null ) { companion object { - val FAR_FUTURE: Instant = Instant.parse("4999-12-03T10:15:30Z") // taking a value that will pass into every DB. + val FAR_FUTURE: Instant = Instant.parse("4999-12-03T10:15:30Z") // taking a value that will match into every DB. } /** diff --git a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt index 764e1a2..5218849 100644 --- a/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt +++ b/extension/core/src/main/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapper.kt @@ -84,12 +84,12 @@ interface MyBatisMessageMapper { fun findById(@Param("id") id: String): MessageEntity? @Select(""" -SELECT COUNT(ID) TOTAL, - COUNT(CASE WHEN M.ERROR IS NOT NULL THEN 1 END) ERROR, - COUNT(CASE WHEN M.ERROR IS NULL AND NEXT_RETRY IS NULL THEN 1 END) IN_PROGRESS, - COUNT(CASE WHEN M.RETRIES = #{maxRetries} THEN 1 END) MAX_RETRIES_REACHED, - COUNT(CASE WHEN M.RETRIES > 0 AND M.RETRIES < #{maxRetries} AND M.NEXT_RETRY < #{now} THEN 1 END) RETRYING, - COUNT(CASE WHEN M.NEXT_RETRY = #{farFuture} THEN 1 END) PAUSED +SELECT COUNT(ID) TOTAL, + COUNT(CASE WHEN M.ERROR IS NOT NULL THEN 1 END) ERROR, + COUNT(CASE WHEN M.ERROR IS NULL AND M.NEXT_RETRY IS NULL THEN 1 END) IN_PROGRESS, + COUNT(CASE WHEN M.RETRIES = #{maxRetries} THEN 1 END) MAX_RETRIES_REACHED, + COUNT(CASE WHEN M.RETRIES > 0 AND M.RETRIES < #{maxRetries} AND M.NEXT_RETRY < #{farFuture} THEN 1 END) RETRYING, + COUNT(CASE WHEN M.NEXT_RETRY = #{farFuture} THEN 1 END) PAUSED FROM COR_MESSAGE M """) @Results( diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapperITest.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapperITest.kt deleted file mode 100644 index f43cf4e..0000000 --- a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageMapperITest.kt +++ /dev/null @@ -1,28 +0,0 @@ -package io.holunda.camunda.bpm.correlate.persist.impl - -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Disabled -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import org.mybatis.spring.boot.test.autoconfigure.MybatisTest -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.autoconfigure.SpringBootApplication -import org.springframework.test.context.junit.jupiter.SpringExtension - - -@ExtendWith(SpringExtension::class) -@MybatisTest -@SpringBootApplication -@Disabled -class MyBatisMessageMapperITest { - - @Autowired - private lateinit var mapper: MyBatisMessageMapper - - @Test - fun `selects elements`() { - - val message = mapper.findById("1") - assertThat(message).isNotNull - } -} \ No newline at end of file diff --git a/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepositoryIT.kt b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepositoryIT.kt new file mode 100644 index 0000000..ff91921 --- /dev/null +++ b/extension/core/src/test/kotlin/io/holunda/camunda/bpm/correlate/persist/impl/MyBatisMessageRepositoryIT.kt @@ -0,0 +1,66 @@ +package io.holunda.camunda.bpm.correlate.persist.impl + +import io.holunda.camunda.bpm.correlate.persist.MessageEntity +import io.holunda.camunda.bpm.correlate.persist.MessageEntity.Companion.FAR_FUTURE +import org.apache.ibatis.session.SqlSessionFactory +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.mybatis.spring.boot.test.autoconfigure.MybatisTest +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase +import org.springframework.context.annotation.Bean +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.context.jdbc.Sql +import org.springframework.test.context.junit.jupiter.SpringExtension +import java.time.Instant + + +@ExtendWith(SpringExtension::class) +@ActiveProfiles("itest") +@MybatisTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +class MyBatisMessageRepositoryIT { + + @Autowired + private lateinit var repository: MyBatisMessageRepository + + @Test + @Sql(scripts = ["/some-messages.sql"]) + fun `selects one by id`() { + + val message = repository.findByIdOrNull("4711") + assertThat(message).isNotNull.apply { + extracting( MessageEntity::id.name ).isEqualTo("4711") + extracting( MessageEntity::payloadTypeName.name ).isEqualTo("MyType") + } + + val nothing = repository.findByIdOrNull("does-not-exist") + assertThat(nothing).isNull() + + } + + @Test + @Sql(scripts = ["/some-messages.sql"]) + fun `count by status`() { + val now = Instant.parse("2022-09-01T10:00:00Z") + + val count = repository.countByStatus(3, now, FAR_FUTURE) + assertThat(count.total).isEqualTo(6) + assertThat(count.error).isEqualTo(3) + assertThat(count.retrying).isEqualTo(1) + assertThat(count.inProgress).isEqualTo(2) + assertThat(count.maxRetriesReached).isEqualTo(1) + assertThat(count.paused).isEqualTo(2) + } + + + @org.springframework.context.annotation.Configuration + class MyConfiguration { + + @Bean + fun myBatisMessageRepository(sqlSessionFactory: SqlSessionFactory): MyBatisMessageRepository = MyBatisMessageRepository(sqlSessionFactory.apply { + this.configuration.mapperRegistry.addMapper(MyBatisMessageMapper::class.java) + }) + } +} \ No newline at end of file diff --git a/extension/core/src/test/resources/application-itest.yml b/extension/core/src/test/resources/application-itest.yml new file mode 100644 index 0000000..b0d79ac --- /dev/null +++ b/extension/core/src/test/resources/application-itest.yml @@ -0,0 +1,10 @@ +spring: + main: + banner-mode: off + application: + name: I-Test + datasource: + url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + driverClassName: org.h2.Driver diff --git a/extension/core/src/test/resources/schema.sql b/extension/core/src/test/resources/schema.sql new file mode 100644 index 0000000..94ab2b8 --- /dev/null +++ b/extension/core/src/test/resources/schema.sql @@ -0,0 +1,14 @@ +CREATE TABLE COR_MESSAGE ( + ID VARCHAR2(64) UNIQUE NOT NULL, + PAYLOAD_ENCODING VARCHAR2(64) NOT NULL, + PAYLOAD_TYPE_NAMESPACE VARCHAR2(128) NOT NULL, + PAYLOAD_TYPE_NAME VARCHAR2(128) NOT NULL, + PAYLOAD_TYPE_REVISION VARCHAR2(64), + PAYLOAD BINARY(1024), + INSERTED TIMESTAMP NOT NULL, + TTL_DURATION VARCHAR2(32), + EXPIRATION TIMESTAMP, + RETRIES INTEGER NOT NULL, + NEXT_RETRY TIMESTAMP, + ERROR CLOB(10000) +); diff --git a/extension/core/src/test/resources/some-messages.sql b/extension/core/src/test/resources/some-messages.sql new file mode 100644 index 0000000..7500217 --- /dev/null +++ b/extension/core/src/test/resources/some-messages.sql @@ -0,0 +1,13 @@ +INSERT INTO COR_MESSAGE(ID, PAYLOAD_ENCODING, PAYLOAD_TYPE_NAMESPACE, PAYLOAD_TYPE_NAME, PAYLOAD_TYPE_REVISION, PAYLOAD, INSERTED, TTL_DURATION, EXPIRATION, RETRIES, NEXT_RETRY, ERROR) + VALUES ('4711', 'JACKSON', 'io.holixon.namespace', 'MyType', NULL, 'B00', '2022-10-01T10:00:00Z', NULL, NULL, 0, NULL, NULL); +INSERT INTO COR_MESSAGE(ID, PAYLOAD_ENCODING, PAYLOAD_TYPE_NAMESPACE, PAYLOAD_TYPE_NAME, PAYLOAD_TYPE_REVISION, PAYLOAD, INSERTED, TTL_DURATION, EXPIRATION, RETRIES, NEXT_RETRY, ERROR) + VALUES ('4712', 'JACKSON', 'io.holixon.namespace', 'MyType', NULL, 'B00', '2022-10-01T10:00:10Z', NULL, NULL, 0, NULL, NULL); +INSERT INTO COR_MESSAGE(ID, PAYLOAD_ENCODING, PAYLOAD_TYPE_NAMESPACE, PAYLOAD_TYPE_NAME, PAYLOAD_TYPE_REVISION, PAYLOAD, INSERTED, TTL_DURATION, EXPIRATION, RETRIES, NEXT_RETRY, ERROR) + VALUES ('4713', 'JACKSON', 'io.holixon.namespace', 'MyType', NULL, 'B00', '2022-10-01T10:10:00Z', NULL, NULL, 1, '2022-10-01T10:11:00Z', 'someError'); +INSERT INTO COR_MESSAGE(ID, PAYLOAD_ENCODING, PAYLOAD_TYPE_NAMESPACE, PAYLOAD_TYPE_NAME, PAYLOAD_TYPE_REVISION, PAYLOAD, INSERTED, TTL_DURATION, EXPIRATION, RETRIES, NEXT_RETRY, ERROR) + VALUES ('4714', 'JACKSON', 'io.holixon.namespace', 'MyType', NULL, 'B00', '2022-10-01T10:12:00Z', NULL, NULL, 3, '2022-10-01T10:13:00Z', 'another'); + +INSERT INTO COR_MESSAGE(ID, PAYLOAD_ENCODING, PAYLOAD_TYPE_NAMESPACE, PAYLOAD_TYPE_NAME, PAYLOAD_TYPE_REVISION, PAYLOAD, INSERTED, TTL_DURATION, EXPIRATION, RETRIES, NEXT_RETRY, ERROR) + VALUES ('4715', 'JACKSON', 'io.holixon.namespace', 'MyType', NULL, 'B00', '2022-10-01T10:12:00Z', NULL, NULL, 1, '4999-12-03T10:15:30Z', 'another'); +INSERT INTO COR_MESSAGE(ID, PAYLOAD_ENCODING, PAYLOAD_TYPE_NAMESPACE, PAYLOAD_TYPE_NAME, PAYLOAD_TYPE_REVISION, PAYLOAD, INSERTED, TTL_DURATION, EXPIRATION, RETRIES, NEXT_RETRY, ERROR) + VALUES ('4716', 'JACKSON', 'io.holixon.namespace', 'MyType', NULL, 'B00', '2022-10-01T10:00:00Z', NULL, NULL, 0, '4999-12-03T10:15:30Z', NULL); diff --git a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt index 06f3c20..0633985 100644 --- a/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt +++ b/extension/spring-boot-starter/src/main/kotlin/io/holunda/camunda/bpm/correlate/correlation/BatchCorrelationSchedulerConfiguration.kt @@ -43,16 +43,15 @@ class BatchCorrelationSchedulerConfiguration( fun runCorrelation() { batchCorrelationProcessor.correlate() - val count = messageManagementService.countMessagesByStatus() - correlationMetrics.reportMessageCounts(count) + correlationMetrics.reportMessageCounts(messageManagementService.countMessagesByStatus()) - if (logger.isDebugEnabled) { + if (logger.isTraceEnabled) { val remaining = messageManagementService.listAllMessages() if (remaining.isNotEmpty()) { - logger.debug { "There are ${remaining.size} messages in the message inbox." } + logger.trace { "There are ${remaining.size} messages in the message inbox." } } remaining.forEach { - logger.debug { "Message with payload type ${it.payloadTypeNamespace}.${it.payloadTypeName} received at ${it.inserted}, attempts: ${it.retries}, next due at: ${it.nextRetry}." } + logger.trace { "Message with payload type ${it.payloadTypeNamespace}.${it.payloadTypeName} received at ${it.inserted}, attempts: ${it.retries}, next due at: ${it.nextRetry}." } } } } diff --git a/pom.xml b/pom.xml index 71aa2a9..df83ab6 100644 --- a/pom.xml +++ b/pom.xml @@ -284,9 +284,6 @@ kill random --illegal-access=permit ${surefireArgLine} -Djava.awt.headless=true -XX:+StartAttachListener - - **/*ITest.* - ${project.build.directory}/jgiven-reports @@ -307,9 +304,6 @@ --illegal-access=permit ${failsafeArgLine} - - **/*ITest.* - ${project.build.directory}/jgiven-reports From 3cde3c65e713470467ddbe6fc1dd69468aa32072 Mon Sep 17 00:00:00 2001 From: Simon Zambrovski Date: Wed, 28 Sep 2022 16:21:52 +0200 Subject: [PATCH 39/53] fix docs pieline --- .github/workflows/docs.yml | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index cdf0a2f..cf4aa5e 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,19 +1,6 @@ name: Build the docs -on:### Steps to reproduce - -* Library version: -* JDK version: -* Operating system: -* Complete executable reproducer: (e.g. GitHub Repo) -* Steps: (what exactly are you doing with the above reproducer?) - -### Expected behaviour - -### Actual behaviour - -(In case of exceptions provide full stack trace) - +on: push: branches: - develop From 7b3e9d830e7b80136bb00443a6a9f41a1d498991 Mon Sep 17 00:00:00 2001 From: Marvin Luchs Date: Wed, 2 Nov 2022 00:04:30 +0100 Subject: [PATCH 40/53] add modal for stacktrace --- extension/cockpit-plugin/package-lock.json | 713 +++++++++++++++++- extension/cockpit-plugin/package.json | 3 + .../components/correlate-message-actions.tsx | 15 +- .../frontend/components/correlate-table.tsx | 20 +- .../src/main/frontend/components/modal.tsx | 44 ++ .../frontend/components/stacktrace-modal.tsx | 29 + .../main/frontend/correlate-messages-view.tsx | 7 + .../src/main/frontend/lib/query-params.ts | 18 + 8 files changed, 826 insertions(+), 23 deletions(-) create mode 100644 extension/cockpit-plugin/src/main/frontend/components/modal.tsx create mode 100644 extension/cockpit-plugin/src/main/frontend/components/stacktrace-modal.tsx create mode 100644 extension/cockpit-plugin/src/main/frontend/lib/query-params.ts diff --git a/extension/cockpit-plugin/package-lock.json b/extension/cockpit-plugin/package-lock.json index c2405eb..58deae4 100644 --- a/extension/cockpit-plugin/package-lock.json +++ b/extension/cockpit-plugin/package-lock.json @@ -9,7 +9,9 @@ "version": "1.0.0", "license": "APACHE 2.0", "dependencies": { + "@radix-ui/react-dialog": "1.0.2", "classnames": "2.3.1", + "lodash-es": "4.17.21", "react": "^18.2.0", "react-cookie": "^4.1.1", "react-dom": "^18.2.0" @@ -24,6 +26,7 @@ "@rollup/plugin-node-resolve": "~13.3.0", "@rollup/plugin-replace": "~4.0.0", "@rollup/plugin-typescript": "8.4.0", + "@types/lodash-es": "4.17.6", "@types/react": "18.0.17", "@types/react-dom": "18.0.6", "@typescript-eslint/eslint-plugin": "5.34.0", @@ -1696,7 +1699,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1900,6 +1902,215 @@ "node": ">= 8" } }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz", + "integrity": "sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", + "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz", + "integrity": "sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -2049,6 +2260,21 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.187", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.187.tgz", + "integrity": "sha512-MrO/xLXCaUgZy3y96C/iOsaIqZSeupyTImKClHunL5GrmaiII2VwvWmLBu2hwa0Kp0sV19CsyjtrTc/Fx8rg/A==", + "dev": true + }, + "node_modules/@types/lodash-es": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", + "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/node": { "version": "18.7.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.9.tgz", @@ -2371,6 +2597,31 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/aria-hidden": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.1.tgz", + "integrity": "sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.9.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/aria-hidden/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, "node_modules/array-includes": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", @@ -2724,6 +2975,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3377,6 +3633,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -3601,6 +3865,14 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -3925,6 +4197,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -4345,6 +4622,88 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/react-remove-scroll/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -4366,8 +4725,7 @@ "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -4916,6 +5274,57 @@ "punycode": "^2.1.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-callback-ref/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -6131,7 +6540,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -6291,6 +6699,164 @@ "fastq": "^1.6.0" } }, + "@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-dialog": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz", + "integrity": "sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + } + }, + "@radix-ui/react-focus-guards": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", + "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-use-escape-keydown": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz", + "integrity": "sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -6395,6 +6961,21 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "@types/lodash": { + "version": "4.14.187", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.187.tgz", + "integrity": "sha512-MrO/xLXCaUgZy3y96C/iOsaIqZSeupyTImKClHunL5GrmaiII2VwvWmLBu2hwa0Kp0sV19CsyjtrTc/Fx8rg/A==", + "dev": true + }, + "@types/lodash-es": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", + "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "dev": true, + "requires": { + "@types/lodash": "*" + } + }, "@types/node": { "version": "18.7.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.9.tgz", @@ -6602,6 +7183,21 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "aria-hidden": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.1.tgz", + "integrity": "sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, "array-includes": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", @@ -6859,6 +7455,11 @@ "object-keys": "^1.1.1" } }, + "detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -7356,6 +7957,11 @@ "has-symbols": "^1.0.3" } }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -7517,6 +8123,14 @@ "side-channel": "^1.0.4" } }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -7739,6 +8353,11 @@ "p-locate": "^5.0.0" } }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -8046,6 +8665,58 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "requires": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "requires": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -8064,8 +8735,7 @@ "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.15.0", @@ -8457,6 +9127,37 @@ "punycode": "^2.1.0" } }, + "use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, + "use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "requires": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + } + } + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", diff --git a/extension/cockpit-plugin/package.json b/extension/cockpit-plugin/package.json index eeba3dd..e3aa938 100644 --- a/extension/cockpit-plugin/package.json +++ b/extension/cockpit-plugin/package.json @@ -9,7 +9,9 @@ "author": "Holunda.io", "license": "APACHE 2.0", "dependencies": { + "@radix-ui/react-dialog": "1.0.2", "classnames": "2.3.1", + "lodash-es": "4.17.21", "react": "^18.2.0", "react-cookie": "^4.1.1", "react-dom": "^18.2.0" @@ -24,6 +26,7 @@ "@rollup/plugin-node-resolve": "~13.3.0", "@rollup/plugin-replace": "~4.0.0", "@rollup/plugin-typescript": "8.4.0", + "@types/lodash-es": "4.17.6", "@types/react": "18.0.17", "@types/react-dom": "18.0.6", "@typescript-eslint/eslint-plugin": "5.34.0", diff --git a/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx b/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx index faf8b75..0eea4f2 100644 --- a/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx +++ b/extension/cockpit-plugin/src/main/frontend/components/correlate-message-actions.tsx @@ -4,16 +4,13 @@ import { Button } from "./button"; type CorrelateMessageActionsProps = { message: Message; - onDeleteMessage: (messageId: Message['id']) => Promise; - onPauseCorrelation: (messageId: Message['id']) => Promise; - onResumeCorrelation: (messageId: Message['id']) => Promise; + onDeleteMessage: (messageId: Message['id']) => unknown; + onPauseCorrelation: (messageId: Message['id']) => unknown; + onResumeCorrelation: (messageId: Message['id']) => unknown; + onShowStacktrace: (messageId: Message['id']) => unknown; }; -function CorrelateMessageActions({ message, onDeleteMessage, onPauseCorrelation, onResumeCorrelation }: CorrelateMessageActionsProps) { - const showStacktrace = () => { - console.log('stacktrace', message.error); - } - +function CorrelateMessageActions({ message, onDeleteMessage, onPauseCorrelation, onResumeCorrelation, onShowStacktrace }: CorrelateMessageActionsProps) { const modifyNextRetry = () => { console.log('nextRetry', message.id); } @@ -24,7 +21,7 @@ function CorrelateMessageActions({ message, onDeleteMessage, onPauseCorrelation, return (<> {message.error ? ( -