diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a508772 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,40 @@ +name: Build + +on: + pull_request: + push: + branches: + - master + - develop + paths-ignore: + - '.github/**' + - README.md + - gradle.properties + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + distribution: 'adopt' + java-version: '11' + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Setup git credentials + uses: oleksiyrudenko/gha-git-credentials@v2 + with: + name: 'reportportal.io' + email: 'support@reportportal.io' + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Build with Gradle + id: build + run: | + ./gradlew build diff --git a/.github/workflows/promote.yml b/.github/workflows/promote.yml new file mode 100644 index 0000000..0e00468 --- /dev/null +++ b/.github/workflows/promote.yml @@ -0,0 +1,101 @@ +# Copyright 2022 EPAM Systems +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Promote + +on: + workflow_dispatch: + inputs: + version: + description: 'Release version' + required: true + +env: + REPOSITORY_URL: 'https://maven.pkg.github.com' + UPSTREAM_REPOSITORY_URL: 'https://oss.sonatype.org' + PACKAGE_SUFFIXES: '-javadoc.jar,-javadoc.jar.asc,-sources.jar,-sources.jar.asc,.jar,.jar.asc,.pom,.pom.asc' + PACKAGE: 'com.epam.reportportal' + + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Get variables + run: | + echo "ARTIFACT=`echo ${{ github.repository }} | cut -d/ -f2- | awk '{print tolower($0)}'`" >> $GITHUB_ENV + echo "PACKAGE_PATH=`echo ${{ env.PACKAGE }} | sed 's/\./\//g'`" >> $GITHUB_ENV + - name: Upload package + run: | + IFS=',' read -a files <<< '${{ env.PACKAGE_SUFFIXES }}' + for f in ${files[@]}; do + export URL="${{ env.REPOSITORY_URL }}/${{ github.repository }}/${PACKAGE_PATH}/${ARTIFACT}/${{ github.event.inputs.version }}/${ARTIFACT}-${{ github.event.inputs.version }}${f}" + echo "Downloading artifact: ${URL}" + curl -f -u ${{ github.actor }}:${{ secrets.GITHUB_TOKEN }} -s -O -L "${URL}" + done + files=($(ls)) + echo 'Files downloaded:' + echo "${files[@]}" + echo 'Bundle generation' + export BUNDLE_FILE="bundle.jar" + jar -cvf ${BUNDLE_FILE} "${files[@]}" + echo 'Bundle upload' + curl -f -u ${{ secrets.SONATYPE_USER }}:${{ secrets.SONATYPE_PASSWORD }} -L \ + --request POST '${{ env.UPSTREAM_REPOSITORY_URL }}/service/local/staging/bundle_upload' \ + --form "file=@${BUNDLE_FILE}" >response.json + response_type=`jq type response.json || echo ''` + if [ -z "$response_type" ]; then + echo 'ERROR: Response is not JSON!' 1>&2 + cat response.json 1>&2 + exit 1 + fi + repo=`jq -r '.repositoryUris[0]' response.json` + if [ -z "$repo" ]; then + echo 'Unable to upload bundle' 1>&2 + cat response.json 1>&2 + exit 1 + fi + echo "NEXUS_REPOSITORY=${repo}" >> $GITHUB_ENV + - name: Get repository variables + run: | + echo "NEXUS_REPOSITORY_NAME=`echo ${NEXUS_REPOSITORY} | sed -E 's/(.+)\/([^\/]+)$/\2/'`" >> $GITHUB_ENV + - name: Promote package + env: + ATTEMPTS: 60 + SLEEP_TIME: 10 + run: | + verified=false + for i in `seq 0 ${ATTEMPTS}`; do + sleep $SLEEP_TIME + curl -f -s -u ${{ secrets.SONATYPE_USER }}:${{ secrets.SONATYPE_PASSWORD }} -L \ + --header 'Accept: application/json' \ + ${{ env.UPSTREAM_REPOSITORY_URL }}/service/local/staging/repository/${NEXUS_REPOSITORY_NAME} >result.json + is_closed=`jq -r '.type' result.json` + is_transitioning=`jq -r '.transitioning' result.json` + echo "Current repository status: $is_closed; transitioning: $is_transitioning" + if [[ "$is_closed" == "closed" && "$is_transitioning" == "false" ]]; then + verified=true + break + fi + done + if $verified; then + echo "A bundle was verified, releasing" + curl -f -u ${{ secrets.SONATYPE_USER }}:${{ secrets.SONATYPE_PASSWORD }} -L \ + --header 'Content-Type: application/json' \ + --data-raw "{\"data\":{\"stagedRepositoryIds\":[\"${NEXUS_REPOSITORY_NAME}\"], \"description\":\"Releasing ${{ github.event.inputs.version }}\"}}" \ + --request POST ${{ env.UPSTREAM_REPOSITORY_URL }}/service/local/staging/bulk/promote + else + echo 'Verification failed, please check the bundle' 1>&2 + exit 1 + fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..519f7fd --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,45 @@ +name: Release + +on: + push: + branches: + - master + paths-ignore: + - '.github/**' + - README.md + - gradle.properties + +env: + GH_USER_NAME: github.actor + SCRIPTS_VERSION: 5.12.0 + BOM_VERSION: 5.12.1 + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + distribution: 'adopt' + java-version: '11' + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Setup git credentials + uses: oleksiyrudenko/gha-git-credentials@v2 + with: + name: 'reportportal.io' + email: 'support@reportportal.io' + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Release with Gradle + id: release + run: | + ./gradlew release -PreleaseMode -Pscripts.version=${{env.SCRIPTS_VERSION}} -Pbom.version=${{env.BOM_VERSION}} \ + -PgithubUserName=${{env.GH_USER_NAME}} -PgithubToken=${{secrets.GITHUB_TOKEN}} \ + -PgpgPassphrase=${{secrets.GPG_PASSPHRASE}} -PgpgPrivateKey="${{secrets.GPG_PRIVATE_KEY}}" diff --git a/plugin/ui/src/common/css/colors.scss b/CHANGELOG.md similarity index 100% rename from plugin/ui/src/common/css/colors.scss rename to CHANGELOG.md diff --git a/README.md b/README.md index a9e783c..4e57ca2 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,4 @@ -# Template plugin for Epam Report Portal - -## UI - -Install the dependencies: `npm install` - -Build the UI source code: `npm run build` +# Plugin to integrate Monday with Report Portal ## Build the plugin @@ -12,6 +6,4 @@ Preconditions: - Install JDK version 11. - Specify version number in gradle.properties file. -**Note:** Versions in the _develop_ branch are not release versions and must be postfixed with `NEXT_RELEASE_VERSION-SNAPSHOT-NUMBER_OF_BUILD (Example: 5.3.6-SNAPSHOT-1)` - Build the plugin: `gradlew build` diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..59e06ca --- /dev/null +++ b/build.gradle @@ -0,0 +1,203 @@ +plugins { + id "io.spring.dependency-management" version "1.0.9.RELEASE" + id 'java' + id 'jacoco' + id "com.github.spotbugs" version "4.0.0" + id "com.github.node-gradle.node" version "2.2.1" + id "com.apollographql.apollo3" version "3.8.2" +} + +apply from: 'project-properties.gradle' + +def scriptsUrl = 'https://raw.githubusercontent.com/reportportal/gradle-scripts/' + + (releaseMode ? getProperty('scripts.version') : 'develop') + +apply from: 'ui.gradle' +apply from: scriptsUrl + '/release-fat.gradle' +apply from: scriptsUrl + '/signing.gradle' + +repositories { + maven { url "https://packages.atlassian.com/maven/repository/public" } + mavenCentral() + mavenLocal() + if (releaseMode) { + dependencyRepos.forEach { path -> + maven { + setUrl("https://maven.pkg.github.com/reportportal/${path}") + credentials { + username = findProperty("githubUserName") + password = findProperty("githubToken") + } + } + } + } else { + maven { url 'https://jitpack.io' } + } +} + +configurations { + implementation.extendsFrom hello +} + +dependencyManagement { + imports { + mavenBom(releaseMode ? 'com.epam.reportportal:commons-bom:5.12.1' : 'com.epam.reportportal:commons-bom:5.12.1') + } +} + +dependencies { + + if (releaseMode) { + implementation("com.epam.reportportal:plugin-api") + implementation('com.epam.reportportal:commons-dao') + annotationProcessor 'com.epam.reportportal:plugin-api' + } else { + implementation("com.github.reportportal:plugin-api:188792e") + annotationProcessor 'com.github.reportportal:plugin-api:188792e' + implementation 'com.github.reportportal:commons-dao:acf1ec7' + } + + hello("com.apollographql.apollo3:apollo-runtime:3.8.2") + hello("com.squareup.okhttp3:okhttp:4.9.3") + + hello group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1' + + testImplementation('org.junit.jupiter:junit-jupiter:5.6.0') + +} + +test { + + useJUnitPlatform() + jacocoTestReport { + reports { + xml.enabled true + } + } +} + +apollo { + service("service") { + generateKotlinModels.set(false) + packageName.set("com.epam.reportportal.extension.monday.model.graphql") + mapScalar("File", "com.apollographql.apollo3.api.Upload", "com.apollographql.apollo3.api.Adapters.UploadAdapter") + } +} + +sourcesJar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +build.dependsOn jacocoTestReport + +artifacts { + archives shadowJar +} + +sourceSets { + + main { + resources + { + exclude '**' + } + } +} + + +generatePomFileForShadowPublication { pom.packaging = "jar" } + +jar { + + from("src/main/resources") { + into("/resources") + } + from("ui/build") { + into("/resources") + } + manifest { + attributes( + "Class-Path": configurations.hello.collect { it.getName() }.join(' '), + "Plugin-Id": "${pluginId}", + "Plugin-Version": "${project.version}", + "Plugin-Provider": "Report Portal", + "Plugin-Class": "com.epam.reportportal.extension.monday.MondayPlugin", + "Plugin-Service": "api" + ) + } +} + +shadowJar { + archiveClassifier.set(null) + from("src/main/resources") { + into("/resources") + } + from("ui/build") { + into("/resources") + } + configurations = [project.configurations.hello] + zip64 true + dependencies { + exclude(dependency('com.github.reportportal:')) + } +} + +tasks.register('uberJar', Jar) { + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + archiveClassifier = 'uber' + + from sourceSets.main.output + + dependsOn configurations.hello + + + from { + configurations.hello.collect { + zipTree(it) + } + } + + manifest { + attributes( + "Class-Path": configurations.hello.collect { it.getName() }.join(' '), + "Plugin-Id": "${pluginId}", + "Plugin-Version": "${project.version}", + "Plugin-Provider": "Report Portal", + "Plugin-Class": "com.epam.reportportal.extension.monday.MondayPlugin", + "Plugin-Service": "api" + ) + } + + from("src/main/resources") { + into("/resources") + } + from("ui/build") { + into("/resources") + } +} + + +task plugin(type: Jar) { + getArchiveBaseName().set("plugin-${pluginId}") + into('classes') { + with jar + } + into('lib') { + from configurations.compileClasspath + } + extension('zip') +} + +task assemblePlugin(type: Copy) { + from plugin + into pluginsDir +} + +task assemblePlugins(type: Copy) { + dependsOn subprojects.assemblePlugin +} + +compileJava.dependsOn npm_run_build + diff --git a/gradle.properties b/gradle.properties index 03ffbc4..39ca7e0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,4 @@ -version=23.1 -description=EPAM Report Portal. Template plugin. -pluginId = template +version=1.0.0 +description=EPAM Report Portal. Monday plugin +pluginId=Monday +org.gradle.caching=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index cc4fdc2..7454180 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 51ef917..69a9715 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 5cde118..744e882 100644 --- a/gradlew +++ b/gradlew @@ -1,13 +1,13 @@ #!/usr/bin/env sh # -# Copyright 2022 EPAM Systems +# Copyright 2015 the original author or authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# https://www.apache.org/licenses/LICENSE-2.0 +# https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index edd8a06..107acd3 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,5 +1,5 @@ @rem -@rem Copyright 2022 EPAM Systems +@rem Copyright 2015 the original author or authors. @rem @rem Licensed under the Apache License, Version 2.0 (the "License"); @rem you may not use this file except in compliance with the License. @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -61,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/plugin/build.gradle b/plugin/build.gradle deleted file mode 100644 index d44f2d0..0000000 --- a/plugin/build.gradle +++ /dev/null @@ -1,141 +0,0 @@ -import com.github.spotbugs.SpotBugsTask - -plugins { - id "io.spring.dependency-management" version "1.0.9.RELEASE" - id 'java' - id 'jacoco' - id 'com.github.johnrengelman.shadow' version '5.2.0' - id "com.github.spotbugs" version "3.0.0" - id "com.moowork.node" version "1.3.1" -} - - -node { - version = '20.11.0' - npmVersion = '10.2.4' - download = true - workDir = file("${project.buildDir}/plugin/ui") - nodeModulesDir = file("${project.rootDir}/plugin/ui") -} - -npm_run_build { - inputs.files fileTree("ui/src") - inputs.file 'ui/package.json' - inputs.file 'ui/package-lock.json' - outputs.dir 'ui/build' -} - -apply from: 'project-properties.gradle' - -repositories { - mavenLocal() - mavenCentral { url "https://repo1.maven.org/maven2" } - if (!releaseMode) { - maven { url 'https://jitpack.io' } - } -} - -dependencies { - if (releaseMode) { - implementation 'com.epam.reportportal:commons-dao' - implementation 'com.epam.reportportal:plugin-api' - annotationProcessor 'com.epam.reportportal:plugin-api' - } else { - implementation 'com.github.reportportal:commons-dao:fa04c1f' - implementation 'com.github.reportportal:plugin-api:20ab960' - annotationProcessor 'com.github.reportportal:plugin-api:20ab960' - } -} - -spotbugs { - sourceSets = [sourceSets.main] - reportLevel = "high" -} -tasks.withType(SpotBugsTask) { - reports { - xml.enabled false - html.enabled true - } -} - -test { - useJUnitPlatform() - maxParallelForks = 1 - testLogging { - events = ['failed'] - exceptionFormat = 'short' - } - reports { - junitXml.enabled = true - } -} - -build.dependsOn jacocoTestReport - -artifacts { - archives shadowJar -} - -sourceSets { - main { - resources - { - exclude '**' - } - } -} - -jar { - from("src/main/resources") { - into("/resources") - } - from("ui/build") { - into("/resources") - } - manifest { - attributes( - "Class-Path": configurations.compile.collect { it.getName() }.join(' '), - "Plugin-Id": "${pluginId}", - "Plugin-Version": "${project.version}", - "Plugin-Provider": "Report Portal", - "Plugin-Class": "com.epam.reportportal.extension.template.TemplatePlugin", - "Plugin-Service": "api" - ) - } -} - -shadowJar { - from("src/main/resources") { - into("/resources") - } - from("ui/build") { - into("/resources") - } - configurations = [project.configurations.compile] - zip64 true - dependencies { - } -} - -task plugin(type: Jar) { - getArchiveBaseName().set("plugin-${pluginId}") - into('classes') { - with jar - } - into('lib') { - from configurations.compile - } - extension('zip') -} - -task assemblePlugin(type: Copy) { - from plugin - into pluginsDir -} - -task assemblePlugins(type: Copy) { - dependsOn subprojects.assemblePlugin -} - -compileJava.dependsOn npm_run_build - diff --git a/plugin/project-properties.gradle b/plugin/project-properties.gradle deleted file mode 100644 index 7e4d8b9..0000000 --- a/plugin/project-properties.gradle +++ /dev/null @@ -1,23 +0,0 @@ -sourceCompatibility = JavaVersion.VERSION_11 -targetCompatibility = JavaVersion.VERSION_11 - -def commonScriptsUrl = 'https://raw.githubusercontent.com/reportportal/gradle-scripts/' - -project.ext { - releaseMode = project.hasProperty("releaseMode") - pluginsDir = "$buildDir/plugins" - scriptsUrl = commonScriptsUrl + (releaseMode ? getProperty('scripts.version') : 'develop') - excludeTests = [ - '**/entity/**', - '**/model/**', - ] - limits = [ - 'instruction': 30, - 'branch' : 17, - 'line' : 30, - 'complexity' : 26, - 'method' : 29, - 'class' : 30 - ] -} - diff --git a/plugin/src/main/java/com/epam/reportportal/extension/template/TemplatePlugin.java b/plugin/src/main/java/com/epam/reportportal/extension/template/TemplatePlugin.java deleted file mode 100644 index 32c01c2..0000000 --- a/plugin/src/main/java/com/epam/reportportal/extension/template/TemplatePlugin.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.epam.reportportal.extension.template; - -import org.pf4j.Plugin; -import org.pf4j.PluginWrapper; - -/** - * @author Andrei Piankouski - */ -public class TemplatePlugin extends Plugin { - /** - * Constructor to be used by plugin manager for plugin instantiation. - * Your plugins have to provide constructor with this exact signature to - * be successfully loaded by manager. - * - * @param wrapper - A wrapper over plugin instance. - */ - public TemplatePlugin(PluginWrapper wrapper) { - super(wrapper); - } -} diff --git a/plugin/src/main/java/com/epam/reportportal/extension/template/TemplatePluginExtension.java b/plugin/src/main/java/com/epam/reportportal/extension/template/TemplatePluginExtension.java deleted file mode 100644 index 09b62c9..0000000 --- a/plugin/src/main/java/com/epam/reportportal/extension/template/TemplatePluginExtension.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.epam.reportportal.extension.template; - -import com.epam.reportportal.extension.CommonPluginCommand; -import com.epam.reportportal.extension.PluginCommand; -import com.epam.reportportal.extension.ReportPortalExtensionPoint; -import com.epam.reportportal.extension.common.IntegrationTypeProperties; -import com.epam.reportportal.extension.event.PluginEvent; -import com.epam.reportportal.extension.template.command.TemplateCommand; -import com.epam.reportportal.extension.template.event.plugin.PluginEventHandlerFactory; -import com.epam.reportportal.extension.template.event.plugin.PluginEventListener; -import com.epam.reportportal.extension.template.utils.MemoizingSupplier; -import com.epam.ta.reportportal.dao.IntegrationRepository; -import com.epam.ta.reportportal.dao.IntegrationTypeRepository; -import com.epam.ta.reportportal.dao.LogRepository; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ApplicationEventMulticaster; -import org.springframework.context.support.AbstractApplicationContext; -import org.pf4j.Extension; - -import javax.annotation.PostConstruct; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author Andrei Piankouski - */ -@Extension -public class TemplatePluginExtension implements ReportPortalExtensionPoint, DisposableBean { - - private static final String PLUGIN_ID = "template"; - public static final String BINARY_DATA_PROPERTIES_FILE_ID = "binary-data.properties"; - - private final Supplier> pluginCommandMapping = new MemoizingSupplier<>(this::getCommands); - - private final Supplier>> commonPluginCommandMapping = new MemoizingSupplier<>(this::getCommonCommands); - - private final String resourcesDir; - - private final Supplier> pluginLoadedListener; - - @Autowired - private IntegrationTypeRepository integrationTypeRepository; - - @Autowired - private IntegrationRepository integrationRepository; - - @Autowired - private LogRepository logRepository; - - @Autowired - private ApplicationContext applicationContext; - - public TemplatePluginExtension(Map initParams) { - resourcesDir = IntegrationTypeProperties.RESOURCES_DIRECTORY.getValue(initParams).map(String::valueOf).orElse(""); - - pluginLoadedListener = new MemoizingSupplier<>(() -> new PluginEventListener(PLUGIN_ID, - new PluginEventHandlerFactory(resourcesDir, integrationTypeRepository, integrationRepository) - )); - } - - @PostConstruct - public void createIntegration() { - initListeners(); - } - - private void initListeners() { - ApplicationEventMulticaster applicationEventMulticaster = applicationContext.getBean(AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME, - ApplicationEventMulticaster.class - ); - applicationEventMulticaster.addApplicationListener(pluginLoadedListener.get()); - } - - @Override - public void destroy() { - removeListeners(); - } - - private void removeListeners() { - ApplicationEventMulticaster applicationEventMulticaster = applicationContext.getBean(AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME, - ApplicationEventMulticaster.class - ); - applicationEventMulticaster.removeApplicationListener(pluginLoadedListener.get()); - } - - @Override - public Map getPluginParams() { - Map params = new HashMap<>(); - params.put(ALLOWED_COMMANDS, new ArrayList<>(pluginCommandMapping.get().keySet())); - params.put(COMMON_COMMANDS, new ArrayList<>(commonPluginCommandMapping.get().keySet())); - return params; - } - - @Override - public CommonPluginCommand getCommonCommand(String commandName) { - return commonPluginCommandMapping.get().get(commandName); - } - - @Override - public PluginCommand getIntegrationCommand(String commandName) { - return pluginCommandMapping.get().get(commandName); - } - - private Map getCommands() { - HashMap pluginCommands = new HashMap<>(); - TemplateCommand templatePlugin = new TemplateCommand(); - pluginCommands.put(templatePlugin.getName(), templatePlugin); - return pluginCommands; - } - - private Map> getCommonCommands() { - HashMap> pluginCommands = new HashMap<>(); - return pluginCommands; - } -} diff --git a/plugin/src/main/java/com/epam/reportportal/extension/template/command/TemplateCommand.java b/plugin/src/main/java/com/epam/reportportal/extension/template/command/TemplateCommand.java deleted file mode 100644 index b755d42..0000000 --- a/plugin/src/main/java/com/epam/reportportal/extension/template/command/TemplateCommand.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.epam.reportportal.extension.template.command; - -import com.epam.reportportal.extension.PluginCommand; -import com.epam.ta.reportportal.entity.integration.Integration; - -import java.util.Map; - -/** - * @author Andrei Piankouski - */ -public class TemplateCommand implements PluginCommand { - - @Override - public String getName() { - return "TemplateCommand"; - } - - @Override - public String executeCommand(Integration integration, Map params) { - return "TemplateCommand"; - } -} diff --git a/plugin/src/main/java/com/epam/reportportal/extension/template/event/EventHandlerFactory.java b/plugin/src/main/java/com/epam/reportportal/extension/template/event/EventHandlerFactory.java deleted file mode 100644 index 8b26ccf..0000000 --- a/plugin/src/main/java/com/epam/reportportal/extension/template/event/EventHandlerFactory.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.epam.reportportal.extension.template.event; - -import com.epam.reportportal.extension.template.event.handler.EventHandler; - -/** - * @author Andrei Piankouski - */ -public interface EventHandlerFactory { - - EventHandler getEventHandler(String key); -} diff --git a/plugin/src/main/java/com/epam/reportportal/extension/template/event/handler/EventHandler.java b/plugin/src/main/java/com/epam/reportportal/extension/template/event/handler/EventHandler.java deleted file mode 100644 index 4d38b0e..0000000 --- a/plugin/src/main/java/com/epam/reportportal/extension/template/event/handler/EventHandler.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.epam.reportportal.extension.template.event.handler; - -/** - * @author Andrei Piankouski - */ -public interface EventHandler { - - void handle(T event); -} diff --git a/plugin/src/main/java/com/epam/reportportal/extension/template/event/handler/plugin/PluginLoadedEventHandler.java b/plugin/src/main/java/com/epam/reportportal/extension/template/event/handler/plugin/PluginLoadedEventHandler.java deleted file mode 100644 index 487b142..0000000 --- a/plugin/src/main/java/com/epam/reportportal/extension/template/event/handler/plugin/PluginLoadedEventHandler.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.epam.reportportal.extension.template.event.handler.plugin; - -import com.epam.reportportal.extension.event.PluginEvent; -import com.epam.reportportal.extension.template.TemplatePluginExtension; -import com.epam.reportportal.extension.template.event.handler.EventHandler; -import com.epam.reportportal.rules.exception.ErrorType; -import com.epam.reportportal.rules.exception.ReportPortalException; -import com.epam.ta.reportportal.dao.IntegrationRepository; -import com.epam.ta.reportportal.dao.IntegrationTypeRepository; -import com.epam.ta.reportportal.entity.integration.Integration; -import com.epam.ta.reportportal.entity.integration.IntegrationParams; -import com.epam.ta.reportportal.entity.integration.IntegrationType; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import static java.util.Optional.ofNullable; - -/** - * @author Andrei Piankouski - */ -public class PluginLoadedEventHandler implements EventHandler { - - private static final String BINARY_DATA = "binaryData"; - - private final String resourcesDir; - private final IntegrationTypeRepository integrationTypeRepository; - private final IntegrationRepository integrationRepository; - - public PluginLoadedEventHandler(String resourcesDir, IntegrationTypeRepository integrationTypeRepository, - IntegrationRepository integrationRepository) { - this.resourcesDir = resourcesDir; - this.integrationTypeRepository = integrationTypeRepository; - this.integrationRepository = integrationRepository; - } - - @Override - public void handle(PluginEvent event) { - integrationTypeRepository.findByName(event.getPluginId()).ifPresent(integrationType -> { - createIntegration(event.getPluginId(), integrationType); - loadBinaryDataInfo(integrationType); - }); - } - - private void createIntegration(String name, IntegrationType integrationType) { - List integrations = integrationRepository.findAllGlobalByType(integrationType); - if (integrations.isEmpty()) { - Integration integration = new Integration(); - integration.setName(name); - integration.setType(integrationType); - integration.setCreationDate(LocalDateTime.now()); - integration.setEnabled(true); - integration.setCreator("SYSTEM"); - integration.setParams(new IntegrationParams(new HashMap<>())); - integrationRepository.save(integration); - } - } - - private void loadBinaryDataInfo(IntegrationType integrationType) { - Map details = integrationType.getDetails().getDetails(); - if (ofNullable(details.get(BINARY_DATA)).isEmpty()) { - try (InputStream propertiesStream = Files.newInputStream(Paths.get(resourcesDir, - TemplatePluginExtension.BINARY_DATA_PROPERTIES_FILE_ID - ))) { - Properties binaryDataProperties = new Properties(); - binaryDataProperties.load(propertiesStream); - Map binaryDataInfo = binaryDataProperties.entrySet() - .stream() - .collect(HashMap::new, - (map, entry) -> map.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue())), - HashMap::putAll - ); - details.put(BINARY_DATA, binaryDataInfo); - integrationTypeRepository.save(integrationType); - } catch (IOException ex) { - throw new ReportPortalException(ErrorType.UNABLE_TO_LOAD_BINARY_DATA, ex.getMessage()); - } - } - } -} diff --git a/plugin/src/main/java/com/epam/reportportal/extension/template/event/plugin/PluginEventHandlerFactory.java b/plugin/src/main/java/com/epam/reportportal/extension/template/event/plugin/PluginEventHandlerFactory.java deleted file mode 100644 index 1be4310..0000000 --- a/plugin/src/main/java/com/epam/reportportal/extension/template/event/plugin/PluginEventHandlerFactory.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.epam.reportportal.extension.template.event.plugin; - -import com.epam.reportportal.extension.event.PluginEvent; -import com.epam.reportportal.extension.template.event.EventHandlerFactory; -import com.epam.reportportal.extension.template.event.handler.EventHandler; -import com.epam.reportportal.extension.template.event.handler.plugin.PluginLoadedEventHandler; -import com.epam.ta.reportportal.dao.IntegrationRepository; -import com.epam.ta.reportportal.dao.IntegrationTypeRepository; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author Andrei Piankouski - */ -public class PluginEventHandlerFactory implements EventHandlerFactory { - - public static final String LOAD_KEY = "load"; - - private final Map> eventHandlerMapping; - - public PluginEventHandlerFactory(String resourcesDir, IntegrationTypeRepository integrationTypeRepository, - IntegrationRepository integrationRepository) { - this.eventHandlerMapping = new HashMap<>(); - this.eventHandlerMapping.put(LOAD_KEY, - new PluginLoadedEventHandler(resourcesDir, integrationTypeRepository, integrationRepository) - ); - } - - @Override - public EventHandler getEventHandler(String key) { - return eventHandlerMapping.get(key); - } -} diff --git a/plugin/src/main/java/com/epam/reportportal/extension/template/event/plugin/PluginEventListener.java b/plugin/src/main/java/com/epam/reportportal/extension/template/event/plugin/PluginEventListener.java deleted file mode 100644 index 75cf86c..0000000 --- a/plugin/src/main/java/com/epam/reportportal/extension/template/event/plugin/PluginEventListener.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.epam.reportportal.extension.template.event.plugin; - -import com.epam.reportportal.extension.event.PluginEvent; -import com.epam.reportportal.extension.template.event.EventHandlerFactory; -import org.springframework.context.ApplicationListener; - -import static java.util.Optional.ofNullable; - -/** - * @author Andrei Piankouski - */ -public class PluginEventListener implements ApplicationListener { - - private final String pluginId; - private final EventHandlerFactory pluginEventEventHandlerFactory; - - public PluginEventListener(String pluginId, EventHandlerFactory pluginEventEventHandlerFactory) { - this.pluginId = pluginId; - this.pluginEventEventHandlerFactory = pluginEventEventHandlerFactory; - } - - @Override - public void onApplicationEvent(PluginEvent event) { - if (supports(event)) { - ofNullable(pluginEventEventHandlerFactory.getEventHandler(event.getType())).ifPresent(pluginEventEventHandler -> pluginEventEventHandler - .handle(event)); - } - } - - private boolean supports(PluginEvent event) { - return pluginId.equals(event.getPluginId()); - } -} \ No newline at end of file diff --git a/plugin/src/main/java/com/epam/reportportal/extension/template/utils/MemoizingSupplier.java b/plugin/src/main/java/com/epam/reportportal/extension/template/utils/MemoizingSupplier.java deleted file mode 100644 index a4a5adb..0000000 --- a/plugin/src/main/java/com/epam/reportportal/extension/template/utils/MemoizingSupplier.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.epam.reportportal.extension.template.utils; - -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Supplier; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * @author Andrei Piankouski - */ -public class MemoizingSupplier implements Supplier { - - private final Supplier delegate; - - private AtomicBoolean initialized = new AtomicBoolean(false); - - private T value; - - public MemoizingSupplier(Supplier delegate) { - this.delegate = checkNotNull(delegate); - } - - @Override - public T get() { - if (!initialized.get()) { - synchronized (this) { - if (!initialized.get()) { - T t = delegate.get(); - value = t; - initialized.set(true); - return t; - } - } - } - return value; - } - -} diff --git a/plugin/src/main/resources/binary-data.properties b/plugin/src/main/resources/binary-data.properties deleted file mode 100644 index cd2ad91..0000000 --- a/plugin/src/main/resources/binary-data.properties +++ /dev/null @@ -1 +0,0 @@ -main=main.js diff --git a/plugin/ui/.eslintrc b/plugin/ui/.eslintrc deleted file mode 100644 index b69362c..0000000 --- a/plugin/ui/.eslintrc +++ /dev/null @@ -1,52 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "extraFileExtensions": [".scss", ".css"], - "ecmaVersion": 2018, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "plugins": [ - "react", - "react-hooks", - "jsx-a11y", - "@typescript-eslint", - "simple-import-sort", - "prettier" - ], - "extends": ["airbnb", "airbnb-typescript/base", "plugin:react/recommended", "prettier"], - "root": true, - "rules": { - "import/prefer-default-export": "off", - "import/no-named-as-default": "off", - "import/newline-after-import": "off", - "import/no-extraneous-dependencies": "off", - "react/react-in-jsx-scope": "off", - "react/jsx-filename-extension": [2, { "extensions": [".ts", ".tsx"] }], - "prettier/prettier": "error", - "react/function-component-definition": [ - 2, - { "namedComponents": "arrow-function", "unnamedComponents": "arrow-function" } - ], - "simple-import-sort/imports": "error", - "simple-import-sort/exports": "error", - "react/prop-types": "off" - }, - "settings": { - "import/resolver": { - "webpack": { - "config": "webpack.config.js" - } - }, - "react": { - "version": "detect" - } - } -} diff --git a/plugin/ui/.prettierrc b/plugin/ui/.prettierrc deleted file mode 100644 index 0fc3f12..0000000 --- a/plugin/ui/.prettierrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "singleQuote": true, - "arrowParens": "always", - "semicolons": "true", - "bracketSpacing": true, - "printWidth": 100, - "tabWidth": 2, - "useTabs": false -} diff --git a/plugin/ui/README.md b/plugin/ui/README.md deleted file mode 100644 index e08fe6e..0000000 --- a/plugin/ui/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Plugin template for Epam Report Portal - -## UI - -Preconditions: -- Install Node.js (version 20 is recommended). - -Install the dependencies: `npm install` - -Run in dev mode: -```bash -npm run dev # Run webpack in dev watch mode -npm run start # Serve built files -``` - -_Available only from RP v24.1_: use -```javascript -window.RP.overrideExtension(pluginName, url); -``` -function call in browser to override the plugin UI assets in favor of your local development changes, f.e. -```javascript -window.RP.overrideExtension('plugin name', 'http://localhost:9090'); -``` - -Build the UI source code: `npm run build` - -**How UI plugin works** (need to be updated): [UI plugin docs](https://github.com/reportportal/service-ui/blob/master/docs/14-plugins.md). - -## Build the plugin - -Preconditions: -- Install JDK version 11. -- Specify version number in gradle.properties file. - -**Note:** Versions in the _develop_ branch are not release versions and must be postfixed with `NEXT_RELEASE_VERSION-SNAPSHOT-NUMBER_OF_BUILD (Example: 5.3.6-SNAPSHOT-1)` - -Build the plugin: `gradlew build` diff --git a/plugin/ui/devServer.js b/plugin/ui/devServer.js deleted file mode 100644 index dac1cc2..0000000 --- a/plugin/ui/devServer.js +++ /dev/null @@ -1,20 +0,0 @@ -const http = require('http'); -const staticServer = require('node-static'); - -const contentPath = './build/public'; -const headers = { - 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Methods': '*', - 'Access-Control-Allow-Headers': '*', - 'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0', -}; -const file = new staticServer.Server(contentPath, { headers }); - -http - .createServer((req, res) => { - console.log(`Request URL: ${req.url}`); - file.serve(req, res); - }) - .listen(9090, () => { - console.log(`Serving files from ${contentPath}`); - }); diff --git a/plugin/ui/package.json b/plugin/ui/package.json deleted file mode 100644 index df1c64c..0000000 --- a/plugin/ui/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "plugin-template", - "version": "1.0.0", - "description": "", - "scripts": { - "build": "webpack --mode=production", - "dev": "webpack --mode=development --watch", - "start": "node devServer.js", - "eslint": "eslint \"./**/*.tsx\" \"./**/*.ts\"", - "lint": "npm run eslint", - "format": "npm run eslint -- --fix", - "precommit": "lint-staged", - "postcommit": "git update-index --again" - }, - "author": "", - "license": "Apache-2.0", - "dependencies": { - "classnames": "2.3.1", - "html-react-parser": "5.1.1", - "moment": "2.29.4", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-redux": "8.1.3", - "react-tracking": "9.2.1", - "redux-form": "8.3.10" - }, - "devDependencies": { - "@types/node": "^18.11.18", - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "@typescript-eslint/eslint-plugin": "^5.33.1", - "@typescript-eslint/parser": "^5.33.1", - "copy-webpack-plugin": "^9.1.0", - "css-loader": "^6.7.1", - "eslint": "^8.22.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-prettier": "^8.3.0", - "eslint-import-resolver-webpack": "^0.13.2", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-simple-import-sort": "^9.0.0", - "eslint-webpack-plugin": "^3.2.0", - "fork-ts-checker-webpack-plugin": "^7.3.0", - "husky": "^7.0.4", - "lint-staged": "^12.1.7", - "node-static": "^0.7.11", - "postcss-loader": "^6.2.1", - "prettier": "^2.5.1", - "sass": "^1.49.11", - "sass-loader": "^12.5.0", - "sass-resources-loader": "^2.2.4", - "style-loader": "^3.3.1", - "svg-inline-loader": "^0.8.2", - "ts-loader": "^9.4.2", - "ts-node": "^10.9.1", - "typescript": "^4.9.4", - "webpack": "5.75.0", - "webpack-cli": "4.10.0" - }, - "engines": { - "node": ">=20.11.0", - "npm": ">=10.2.4" - }, - "lint-staged": { - "*.{ts,tsx}": [ - "eslint --fix", - "git add" - ] - }, - "browserslist": [ - "ie 11" - ], - "keywords": [ - "epam", - "reportportal", - "rp" - ] -} diff --git a/plugin/ui/src/common/css/screen-size.scss b/plugin/ui/src/common/css/screen-size.scss deleted file mode 100644 index e69de29..0000000 diff --git a/plugin/ui/src/common/css/z-index.scss b/plugin/ui/src/common/css/z-index.scss deleted file mode 100644 index e69de29..0000000 diff --git a/plugin/ui/src/components/moduleName/index.ts b/plugin/ui/src/components/moduleName/index.ts deleted file mode 100644 index d44f121..0000000 --- a/plugin/ui/src/components/moduleName/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ModuleName } from './moduleName'; - -export { ModuleName }; - -export default ModuleName; diff --git a/plugin/ui/src/components/moduleName/moduleName.tsx b/plugin/ui/src/components/moduleName/moduleName.tsx deleted file mode 100644 index 8a1e877..0000000 --- a/plugin/ui/src/components/moduleName/moduleName.tsx +++ /dev/null @@ -1 +0,0 @@ -export const ModuleName = () =>
Plugin template
; diff --git a/plugin/ui/src/declarations.d.ts b/plugin/ui/src/declarations.d.ts deleted file mode 100644 index a32e96a..0000000 --- a/plugin/ui/src/declarations.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare module '*.scss' { - const content: { [className: string]: string }; - export = content; -} - -declare module '*.svg' { - const content: string; - export default content; -} diff --git a/plugin/ui/src/metadata.json b/plugin/ui/src/metadata.json deleted file mode 100644 index 813aa5f..0000000 --- a/plugin/ui/src/metadata.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "scope": "plugin_name", - "extensions": [ - { - "name": "plugin", - "type": "uiExtension:settingsTab", - "title": "Plugin", - "moduleName": "./moduleName" - } - ] -} diff --git a/plugin/ui/src/plugin-icon.svg b/plugin/ui/src/plugin-icon.svg deleted file mode 100644 index 33e2365..0000000 --- a/plugin/ui/src/plugin-icon.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - Combined Shape - - - - - - - - - - - - diff --git a/plugin/ui/tsconfig.eslint.json b/plugin/ui/tsconfig.eslint.json deleted file mode 100644 index 7302dc7..0000000 --- a/plugin/ui/tsconfig.eslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": ["src/**/*.ts", "src/**/*.tsx", "test/**/*.ts"] -} diff --git a/plugin/ui/tsconfig.json b/plugin/ui/tsconfig.json deleted file mode 100644 index 0db3346..0000000 --- a/plugin/ui/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "sourceMap": true, - "esModuleInterop": true, - "moduleResolution": "node", - "downlevelIteration": true, - "declaration": true, - "allowJs": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "module": "ES2015", - "target": "ES2015", - "baseUrl": "./", - "strict": true, - "jsx": "react-jsx", - "paths": { - "*": ["node_modules/*"] - }, - "typeRoots": ["node_modules/@types"], - "outDir": "build/types", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": false, - "skipLibCheck": true, - "allowSyntheticDefaultImports": true - }, - "include": ["src/**/*", "src/**/*.d.ts"], - "exclude": ["node_modules", "build"] -} diff --git a/plugin/ui/webpack.config.js b/plugin/ui/webpack.config.js deleted file mode 100644 index cda292c..0000000 --- a/plugin/ui/webpack.config.js +++ /dev/null @@ -1,124 +0,0 @@ -const path = require('path'); -const CopyPlugin = require('copy-webpack-plugin'); -const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); -const pjson = require('./package.json'); -const ESLintWebpackPlugin = require('eslint-webpack-plugin'); -const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); -const pluginName = pjson.name; - -const config = { - entry: path.resolve(__dirname, './src'), - output: { - path: path.resolve(__dirname, 'build/public'), - filename: '[name].app.[contenthash:8].js', - publicPath: 'auto', - clean: true, - }, - module: { - rules: [ - { - test: /\.tsx?$/, - use: 'ts-loader', - exclude: /node_modules/, - }, - { - test: /\.(sa|sc)ss$/, - exclude: /node_modules/, - use: [ - 'style-loader', - { - loader: 'css-loader', - options: { - modules: { - localIdentName: `${pluginName}_[name]__[local]--[hash:base64:5]`, - }, - }, - }, - 'sass-loader', - { - loader: 'sass-resources-loader', - options: { - resources: path.resolve(__dirname, './src/common/css/**/*.scss'), - }, - }, - ], - }, - { - test: /\.svg$/, - loader: 'svg-inline-loader', - }, - ], - }, - resolve: { - extensions: ['.ts', '.tsx', '.js', '.sass', '.scss', '.css'], - alias: { - components: path.resolve(__dirname, 'src/components'), - constants: path.resolve(__dirname, 'src/constants'), - icons: path.resolve(__dirname, 'src/icons'), - hooks: path.resolve(__dirname, 'src/hooks'), - utils: path.resolve(__dirname, 'src/utils'), - analyticsEvents: path.resolve(__dirname, 'src/analyticsEvents'), - }, - }, - externals: ['redux'], - plugins: [ - new ForkTsCheckerWebpackPlugin(), - new ESLintWebpackPlugin({ - context: './src', - extensions: ['.scss', '.css', '.ts', '.tsx'], - threads: true, - }), - new ModuleFederationPlugin({ - name: 'plugin_name', - filename: `remoteEntity.js`, - shared: { - react: { - import: 'react', - shareKey: 'react', - shareScope: 'default', - singleton: true, - requiredVersion: pjson.dependencies['react'], - }, - 'react-dom': { - singleton: true, - requiredVersion: pjson.dependencies['react-dom'], - }, - 'react-redux': { - singleton: true, - requiredVersion: pjson.dependencies['react-redux'], - }, - 'redux-form': { - singleton: true, - requiredVersion: pjson.dependencies['redux-form'], - }, - moment: { - singleton: true, - requiredVersion: pjson.dependencies['moment'], - }, - 'react-tracking': { - singleton: true, - requiredVersion: pjson.dependencies['react-tracking'], - }, - 'html-react-parser': { - singleton: true, - requiredVersion: pjson.dependencies['html-react-parser'], - }, - classnames: { - singleton: true, - requiredVersion: pjson.dependencies['classnames'], - }, - }, - exposes: { - './moduleName': './src/components/moduleName', - }, - }), - new CopyPlugin({ - patterns: [ - { from: path.resolve(__dirname, './src/metadata.json') }, - { from: path.resolve(__dirname, './src/plugin-icon.svg') }, - ], - }), - ], -}; - -module.exports = config; diff --git a/project-properties.gradle b/project-properties.gradle index 3adf8d0..d43cde3 100644 --- a/project-properties.gradle +++ b/project-properties.gradle @@ -2,11 +2,8 @@ sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 project.ext { + publishRepo = "https://maven.pkg.github.com/reportportal/plugin-bts-monday" + dependencyRepos = ["plugin-api", "commons-bom"] releaseMode = project.hasProperty("releaseMode") - pluginsDir = "$buildDir/jars" - -} - -wrapper { - gradleVersion = '6.0' + pluginsDir = "$buildDir/plugins" } diff --git a/settings.gradle b/settings.gradle index 7c5db5d..7e02d83 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,2 @@ -rootProject.name = 'plugin-template-epam' -include 'plugin' +rootProject.name = 'plugin-bts-monday' diff --git a/src/main/graphql/GetRepo.graphql b/src/main/graphql/GetRepo.graphql new file mode 100644 index 0000000..d3ec220 --- /dev/null +++ b/src/main/graphql/GetRepo.graphql @@ -0,0 +1,46 @@ +query GetItems($ids: [ID!]){ + items(ids: $ids) { + id + name + column_values { + ... on StatusValue { + id + index + text + type + } + } + } +} + +mutation CreateIssue($boardId: ID!, $name: String!, $columnValues: JSON){ + create_item (board_id: $boardId, item_name: $name, column_values: $columnValues) { + id + } +} + +mutation CreateIssueUpdateSection($itemId: ID!, $parentId: ID, $body: String!) { + create_update(item_id: $itemId, parent_id: $parentId, body: $body) { + id + } +} + +mutation AddFile($file: File!, $updateId: ID!) { + add_file_to_update(file: $file, update_id: $updateId) { + id + } +} + +query GetBoardConfig($boardIds: [ID!]){ + boards(ids: $boardIds) { + id + name + columns { + id + title + settings_str + type + } + } +} + diff --git a/src/main/graphql/schema.graphqls b/src/main/graphql/schema.graphqls new file mode 100644 index 0000000..6421221 --- /dev/null +++ b/src/main/graphql/schema.graphqls @@ -0,0 +1,5805 @@ +""" +Your monday.com account +""" +type Account { + """ + The account's country two-letter code in ISO3166 format + """ + country_code: String + + """ + The first day of the week for the account (sunday / monday) + """ + first_day_of_the_week: FirstDayOfTheWeek! + + """ + The account's unique identifier. + """ + id: ID! + + """ + The account's logo. + """ + logo: String + + """ + The account's name. + """ + name: String! + + """ + The account's payment plan. + """ + plan: Plan + + """ + The account's active products + """ + products: [AccountProduct] + + """ + Show weekends in timeline + """ + show_timeline_weekends: Boolean! + + """ + The product the account signed up to first. + """ + sign_up_product_kind: String + + """ + The account's slug. + """ + slug: String! + + """ + The account's tier. + """ + tier: String +} + +""" +The product a workspace is used in. +""" +type AccountProduct { + """ + The account product id + """ + id: ID + + """ + The account product kind (core / marketing / crm / software / + projectManagement / project_management / service / forms / whiteboard). + """ + kind: String +} + +""" +An activity log event +""" +type ActivityLogType { + """ + """ + account_id: String! + + """ + """ + created_at: String! + + """ + The item's column values in string form. + """ + data: String! + + """ + """ + entity: String! + + """ + """ + event: String! + + """ + """ + id: String! + + """ + """ + user_id: String! +} + +""" +An app install details. +""" +type AppInstall { + """ + The app's unique identifier. + """ + app_id: Int! + + """ + An app installer's account details. + """ + app_install_account: AppInstallAccount! + + """ + An app installer's user details + """ + app_install_user: AppInstallUser! + + """ + The app's version details + """ + app_version: AppVersion + + """ + The required and approved scopes for an app install. + """ + permissions: AppInstallPermissions + + """ + Installation date + """ + timestamp: String +} + +""" +An app installer's account details +""" +type AppInstallAccount { + """ + The app's installer account id. + """ + id: Int! +} + +""" +The required and approved scopes for an app install. +""" +type AppInstallPermissions { + """ + The scopes approved by the account admin + """ + approved_scopes: [String!]! + + """ + The scopes required by the latest live version + """ + required_scopes: [String!]! +} + +""" +An app installer's user details +""" +type AppInstallUser { + """ + The app's installer user id. + """ + id: Int +} + +""" +The app monetization status for the current account +""" +type AppMonetizationStatus { + """ + Is apps monetization is supported for the account + """ + is_supported: Boolean! +} + +""" +The account subscription details for the app. +""" +type AppSubscription { + """ + The type of the billing period [monthly/yearly]. + """ + billing_period: String + + """ + The number of days left until the subscription ends. + """ + days_left: Int + + """ + Is the subscription a trial + """ + is_trial: Boolean + + """ + The subscription plan id (on the app's side). + """ + plan_id: String! + + """ + The pricing version of subscription plan. + """ + pricing_version: Int + + """ + The subscription renewal date. + """ + renewal_date: Date! +} + +""" +The Operations counter response for the app action. +""" +type AppSubscriptionOperationsCounter { + """ + The account subscription details for the app. + """ + app_subscription: AppSubscription + + """ + The new counter value. + """ + counter_value: Int + + """ + Operations name. + """ + kind: String! + + """ + Window key. + """ + period_key: String +} + +""" +An app's version details. +""" +type AppVersion { + """ + The app's major version. + """ + major: Int! + + """ + The app's minor version. + """ + minor: Int! + + """ + The app's patch version. + """ + patch: Int! + + """ + The app's version text + """ + text: String! + + """ + The app's version type. + """ + type: String +} + +""" +A file uploaded to monday.com +""" +type Asset { + """ + The file's creation date. + """ + created_at: Date + + """ + The file's extension. + """ + file_extension: String! + + """ + The file's size in bytes. + """ + file_size: Int! + + """ + The file's unique identifier. + """ + id: ID! + + """ + The file's name. + """ + name: String! + + """ + original geometry of the asset. + """ + original_geometry: String + + """ + public url to the asset, valid for 1 hour. + """ + public_url: String! + + """ + The user who uploaded the file. + """ + uploaded_by: User! + + """ + url to view the asset. + """ + url: String! + + """ + url to view the asset in thumbnail mode. Only available for images. + """ + url_thumbnail: String +} + +""" +The source of the asset +""" +enum AssetsSource { + """ + Assets from file columns and item's files gallery + """ + all + + """ + Assets only from file columns + """ + columns + + """ + Assets only from item's files gallery + """ + gallery +} + +""" +A monday.com board. +""" +type Board { + """ + The board log events. + """ + activity_logs( + """ + Column ids to filter + """ + column_ids: [String] + + """ + From timestamp (ISO8601) + """ + from: ISO8601DateTime + + """ + Group ids to filter + """ + group_ids: [String] + + """ + Item id to filter + """ + item_ids: [ID!] + + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + + """ + To timestamp (ISO8601) + """ + to: ISO8601DateTime + + """ + User ids to filter. + """ + user_ids: [ID!] + ): [ActivityLogType] + + """ + The board's folder unique identifier. + """ + board_folder_id: ID + + """ + The board's kind (public / private / share). + """ + board_kind: BoardKind! + + """ + The board's visible columns. + """ + columns( + """ + A list of column unique identifiers. + """ + ids: [String] + + """ + A list of column types. + """ + types: [ColumnType!] + ): [Column] + + """ + Get the board communication value - typically meeting ID + """ + communication: JSON + + """ + The creator of the board. + """ + creator: User! + + """ + The board's description. + """ + description: String + + """ + The board's visible groups. + """ + groups( + """ + A list of group unique identifiers. + """ + ids: [String] + ): [Group] + + """ + The unique identifier of the board. + """ + id: ID! + + """ + The Board's item nickname, one of a predefined set of values, or a custom user value + """ + item_terminology: String + + """ + The number of items on the board + """ + items_count: Int + + """ + The board's items (rows). + """ + items_page( + """ + An opaque token representing the position in the result set from which to + resume fetching items. Use this to paginate through large result sets. + """ + cursor: String + + """ + The maximum number of items to fetch in a single request. Use this to + control the size of the result set and manage pagination. Maximum: 500. + """ + limit: Int! = 25 + + """ + A set of parameters to filter, sort, and control the scope of the items + query. Use this to customize the results based on specific criteria. + """ + query_params: ItemsQuery + ): ItemsResponse! + + """ + The board's name. + """ + name: String! + + """ + The owner of the board. + """ + owner: User! @deprecated(reason: "This field returned creator of the board. Please use 'creator' or 'owners' fields instead.") + + """ + List of user board owners + """ + owners: [User]! + + """ + The board's permissions. + """ + permissions: String! + + """ + The board's state (all / active / archived / deleted). + """ + state: State! + + """ + The board's subscribers. + """ + subscribers: [User]! + + """ + The board's specific tags. + """ + tags: [Tag] + + """ + List of team board owners + """ + team_owners( + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [Team!] + + """ + The board's team subscribers. + """ + team_subscribers( + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [Team!] + + """ + The top group at this board. + """ + top_group: Group! + + """ + The board object type. + """ + type: BoardObjectType + + """ + The last time the board was updated at. + """ + updated_at: ISO8601DateTime + + """ + The board's updates. + """ + updates( + """ + A list of items unique identifiers. + """ + ids: [ID!] + + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [Update] + + """ + The Board's url + """ + url: String! + + """ + The board's views. + """ + views( + """ + A list of view unique identifiers. + """ + ids: [ID!] + + """ + The view's type + """ + type: String + ): [BoardView] + + """ + The workspace that contains this board (null for main workspace). + """ + workspace: Workspace + + """ + The board's workspace unique identifier (null for main workspace). + """ + workspace_id: ID +} + +""" +The board attributes available. +""" +enum BoardAttributes { + """ + Object that contains available Video conferences on the board. + """ + communication + + """ + Board description. + """ + description + + """ + Board name. + """ + name +} + +""" +A board duplication +""" +type BoardDuplication { + """ + The new board created by the duplication + """ + board: Board! + + """ + Was the board duplication performed asynchronously + """ + is_async: Boolean! +} + +""" +The board kinds available. +""" +enum BoardKind { + """ + Private boards. + """ + private + + """ + Public boards. + """ + public + + """ + Shareable boards. + """ + share +} + +""" +The board object types. +""" +enum BoardObjectType { + """ + Parent Board. + """ + board + + """ + Custom Object. + """ + custom_object + + """ + Document. + """ + document + + """ + Sub Items Board. + """ + sub_items_board +} + +type BoardRelationValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + A string representing all the names of the linked items, separated by commas + """ + display_value: String! + + """ + The column's unique identifier. + """ + id: ID! + + """ + The linked items IDs + """ + linked_item_ids: [ID!]! + + """ + The linked items. + """ + linked_items: [Item!]! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +The board subscriber kind. +""" +enum BoardSubscriberKind { + """ + Board owner. + """ + owner + + """ + Board subscriber. + """ + subscriber +} + +""" +A board's view. +""" +type BoardView { + """ + The view's unique identifier. + """ + id: ID! + + """ + The view's name. + """ + name: String! + + """ + The view's settings in a string form. + """ + settings_str: String! + + """ + The view's template id if it was duplictated from other + """ + source_view_id: ID + + """ + The view's type. + """ + type: String! + + """ + Specific board view data (supported only for forms) + """ + view_specific_data_str: String! +} + +""" +Options to order by. +""" +enum BoardsOrderBy { + """ + The rank order of the board creation time (desc). + """ + created_at + + """ + The last time the user making the request used the board (desc). + """ + used_at +} + +type ButtonValue implements ColumnValue { + """ + The button's color in hex value. + """ + color: String + + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + The button's label. + """ + label: String! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +The result of adding users to / removing users from a team. +""" +type ChangeTeamMembershipsResult { + """ + The users that team membership update failed for + """ + failed_users: [User!] + + """ + The users that team membership update succeeded for + """ + successful_users: [User!] +} + +type CheckboxValue implements ColumnValue { + """ + The column's boolean value. + """ + checked: Boolean + + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + value: JSON +} + +type ColorPickerValue implements ColumnValue { + """ + The color in hex value. + """ + color: String + + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type Column { + """ + Is the column archived or not. + """ + archived: Boolean! + + """ + The column's description. + """ + description: String + + """ + The column's unique identifier. + """ + id: ID! + + """ + The column's settings in a string form. + """ + settings_str: String! + + """ + The column's title. + """ + title: String! + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's width. + """ + width: Int +} + +""" +An object defining a mapping of column between source board and destination board +""" +input ColumnMappingInput { + """ + The source column's unique identifier. + """ + source: ID! + + """ + The target column's unique identifier. + """ + target: ID +} + +""" +The property name of the column to be changed. +""" +enum ColumnProperty { + """ + the column description. + """ + description + + """ + the column title. + """ + title +} + +""" +The columns to create. +""" +enum ColumnType { + """ + Number items according to their order in the group/board + """ + auto_number + + """ + Connect data from other boards + """ + board_relation + + """ + Perform actions on items by clicking a button + """ + button + + """ + Check off items and see what's done at a glance + """ + checkbox + + """ + Manage a design system using a color palette + """ + color_picker + + """ + Choose a country + """ + country + + """ + Add the item's creator and creation date automatically + """ + creation_log + + """ + Add dates like deadlines to ensure you never drop the ball + """ + date + + """ + Set up dependencies between items in the board + """ + dependency + + """ + Instantly add collaborative rich text editor + """ + doc + + """ + Create a dropdown list of options + """ + dropdown + + """ + Email team members and clients directly from your board + """ + email + + """ + Add files & docs to your item + """ + file + + """ + Use functions to manipulate data across multiple columns + """ + formula + group + + """ + Add times to manage and schedule tasks, shifts and more + """ + hour + + """ + Integration is really cool... + """ + integration + + """ + Show all item's assignees + """ + item_assignees + + """ + Show a unique ID for each item + """ + item_id + + """ + Add the person that last updated the item and the date + """ + last_updated + + """ + Simply hyperlink to any website + """ + link + + """ + Place multiple locations on a geographic map + """ + location + + """ + Add large amounts of text without changing column width + """ + long_text + + """ + Show and edit columns' data from connected boards + """ + mirror + + """ + Name is really cool... + """ + name + + """ + Add revenue, costs, time estimations and more + """ + numbers + + """ + Assign people to improve team work + """ + people + + """ + Assign a person to increase ownership and accountability (deprecated) + """ + person + + """ + Call your contacts directly from monday.com + """ + phone + + """ + Show progress by combining status columns in a battery + """ + progress + + """ + Rate or rank anything visually + """ + rating + + """ + Get an instant overview of where things stand + """ + status + + """ + Use the subtasks column to create another level of tasks + """ + subtasks + + """ + Add tags to categorize items across multiple boards + """ + tags + + """ + Assign a full team to an item + """ + team + + """ + Add textual information e.g. addresses, names or keywords + """ + text + + """ + Easily track time spent on each item, group, and board + """ + time_tracking + + """ + Visualize your item’s duration, with a start and end date + """ + timeline + + """ + Unsupported column type + """ + unsupported + + """ + Vote on an item e.g. pick a new feature or a favorite lunch place + """ + vote + + """ + Select the week on which each item should be completed + """ + week + + """ + Keep track of the time anywhere in the world + """ + world_clock +} + +interface ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +scalar CompareValue + +""" +Complexity data. +""" +type Complexity { + """ + The remainder of complexity after the query's execution. + """ + after: Int! + + """ + The remainder of complexity before the query's execution. + """ + before: Int! + + """ + The specific query's complexity. + """ + query: Int! + + """ + How long in seconds before the complexity budget is reset + """ + reset_in_x_seconds: Int! +} + +type Country { + """ + The country's two-letter code. + """ + code: String! + + """ + The country's name. + """ + name: String! +} + +type CountryValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The country value. + """ + country: Country + + """ + The column's unique identifier. + """ + id: ID! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type CreationLogValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The date when the item was created. + """ + created_at: Date! + + """ + User who created the item + """ + creator: User! + + """ + ID of the user who created the item + """ + creator_id: ID! + + """ + The column's unique identifier. + """ + id: ID! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +A date. +""" +scalar Date + +type DateValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's date value. + """ + date: String + + """ + The string representation of selected icon. + """ + icon: String + + """ + The column's unique identifier. + """ + id: ID! + + """ + The formatted date and time in user time zone. + """ + text: String + + """ + The column's time value. + """ + time: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type DependencyValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + A string representing all the names of the linked items, separated by commas + """ + display_value: String! + + """ + The column's unique identifier. + """ + id: ID! + + """ + The linked items ids + """ + linked_item_ids: ID! + + """ + The linked items. + """ + linked_items: [Item!]! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type DocValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The document file attached to the column. + """ + file: FileDocValue + + """ + The column's unique identifier. + """ + id: ID! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type DropdownValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON + + """ + The selected dropdown values. + """ + values: [DropdownValueOption!]! +} + +type DropdownValueOption { + """ + The dropdown item's unique identifier. + """ + id: ID! + + """ + The dropdown item's label. + """ + label: String! +} + +""" +The board duplicate types available. +""" +enum DuplicateBoardType { + """ + Duplicate board with structure and items. + """ + duplicate_board_with_pulses + + """ + Duplicate board with structure, items and updates. + """ + duplicate_board_with_pulses_and_updates + + """ + Duplicate board with structure. + """ + duplicate_board_with_structure +} + +type EmailValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's email value. + """ + email: String + + """ + The column's unique identifier. + """ + id: ID! + + """ + The column's text value. It can be the same as email when user didn't enter any text. + """ + label: String + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +A multipart file +""" +scalar File + +type FileAssetValue { + """ + The asset associated with the file. + """ + asset: Asset! + + """ + The asset's id. + """ + asset_id: ID! + + """ + The file's creation date. + """ + created_at: Date! + + """ + The user who created the file. + """ + creator: User + + """ + The ID of user who created the file. + """ + creator_id: ID + + """ + Whether the file is an image. + """ + is_image: Boolean! + + """ + The file's name. + """ + name: String! +} + +type FileDocValue { + """ + The file's creation date. + """ + created_at: Date! + + """ + The user who created the file. + """ + creator: User + + """ + The ID of user who created the file. + """ + creator_id: ID + + """ + The file's unique identifier. + """ + file_id: ID! + + """ + The associated board or object's unique identifier. + """ + object_id: ID! + + """ + The file's url. + """ + url: String +} + +type FileLinkValue { + """ + The file's creation date. + """ + created_at: Date! + + """ + The user who created the file. + """ + creator: User + + """ + The ID of user who created the file. + """ + creator_id: ID + + """ + The file's id. + """ + file_id: ID! + + """ + The file's kind. + """ + kind: FileLinkValueKind! + + """ + The file's name. + """ + name: String! + + """ + The file's url. + """ + url: String +} + +""" +The type of a link value stored inside a file column +""" +enum FileLinkValueKind { + """ + Box file + """ + box + + """ + Dropbox file + """ + dropbox + + """ + Google Drive file + """ + google_drive + + """ + Generic link file + """ + link + + """ + OneDrive file + """ + onedrive +} + +type FileValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The files attached to the column. + """ + files: [FileValueItem!]! + + """ + The column's unique identifier. + """ + id: ID! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +A single file in a column. +""" +union FileValueItem = FileAssetValue | FileDocValue | FileLinkValue + +""" +The first day of work week +""" +enum FirstDayOfTheWeek { + """ + Monday + """ + monday + + """ + Sunday + """ + sunday +} + +""" +A workspace folder containing boards, docs, sub folders, etc. +""" +type Folder { + """ + The various items in the folder, not including sub-folders and dashboards. + """ + children: [Board]! + + """ + The folder's color. + """ + color: FolderColor + + """ + The folder's creation date. + """ + created_at: Date! + + """ + The folder's unique identifier. + """ + id: ID! + + """ + The folder's name. + """ + name: String! + + """ + The folder's user owner unique identifier. + """ + owner_id: ID + + """ + The folder's parent folder. + """ + parent: Folder + + """ + Sub-folders inside this folder. + """ + sub_folders: [Folder]! + + """ + The workspace that contains this folder (null id for main workspace). + """ + workspace: Workspace! +} + +""" +One value out of a list of valid folder colors +""" +enum FolderColor { + """ + aquamarine + """ + AQUAMARINE + + """ + bright-blue + """ + BRIGHT_BLUE + + """ + bright-green + """ + BRIGHT_GREEN + + """ + chili-blue + """ + CHILI_BLUE + + """ + dark-orange + """ + DARK_ORANGE + + """ + dark_purple + """ + DARK_PURPLE + + """ + dark-red + """ + DARK_RED + + """ + done-green + """ + DONE_GREEN + + """ + indigo + """ + INDIGO + + """ + lipstick + """ + LIPSTICK + + """ + No color + """ + NULL + + """ + purple + """ + PURPLE + + """ + sofia_pink + """ + SOFIA_PINK + + """ + stuck-red + """ + STUCK_RED + + """ + sunset + """ + SUNSET + + """ + working_orange + """ + WORKING_ORANGE +} + +type FormulaValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +A group of items in a board. +""" +type Group { + """ + Is the group archived or not. + """ + archived: Boolean + + """ + The group's color. + """ + color: String! + + """ + Is the group deleted or not. + """ + deleted: Boolean + + """ + The group's unique identifier. + """ + id: ID! + + """ + The items in the group. + """ + items_page( + """ + An opaque token representing the position in the result set from which to + resume fetching items. Use this to paginate through large result sets. + """ + cursor: String + + """ + The maximum number of items to fetch in a single request. Use this to + control the size of the result set and manage pagination. Maximum: 500. + """ + limit: Int! = 25 + + """ + A set of parameters to filter, sort, and control the scope of the items + query. Use this to customize the results based on specific criteria. + """ + query_params: ItemsQuery + ): ItemsResponse! + + """ + The group's position in the board. + """ + position: String! + + """ + The group's title. + """ + title: String! +} + +""" +The group attributes available. +""" +enum GroupAttributes { + """ + Group color (one of the supported colors, check the API documentation). + """ + color + + """ + The group's position in the board. Deprecated! - replaced with relative position + """ + position + + """ + The group's relative position after another group in the board. + """ + relative_position_after + + """ + The group's relative position before another group in the board. + """ + relative_position_before + + """ + Group title. + """ + title +} + +type GroupValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The group value. + """ + group: Group + + """ + The group identifier. + """ + group_id: ID + + """ + The column's unique identifier. + """ + id: ID! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type HourValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + Hour + """ + hour: Int + + """ + The column's unique identifier. + """ + id: ID! + + """ + Minute + """ + minute: Int + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +An ISO 8601-encoded datetime +""" +scalar ISO8601DateTime + +type IntegrationValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + ID of the entity + """ + entity_id: ID + + """ + The column's unique identifier. + """ + id: ID! + + """ + URL of the issue + """ + issue_api_url: ID + + """ + ID of the issue + """ + issue_id: String + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +An item (table row). +""" +type Item { + """ + The item's assets/files. + """ + assets( + """ + The assets source (all / columns / gallery) + """ + assets_source: AssetsSource + + """ + Ids of the columns you want to get assets from. + """ + column_ids: [String] + ): [Asset] + + """ + The board that contains this item. + """ + board: Board + + """ + The item's column values. + """ + column_values( + """ + A list of column ids to return + """ + ids: [String!] + + """ + A list of column types to return + """ + types: [ColumnType!] + ): [ColumnValue!]! + + """ + The item's create date. + """ + created_at: Date + + """ + The item's creator. + """ + creator: User + + """ + The unique identifier of the item creator. + """ + creator_id: String! + + """ + The item's email. + """ + email: String! + + """ + The group that contains this item. + """ + group: Group + + """ + The item's unique identifier. + """ + id: ID! + + """ + The item's linked items + """ + linked_items( + """ + The id of the link to item column + """ + link_to_item_column_id: String! + + """ + The id of the linked board + """ + linked_board_id: ID! + ): [Item!]! + + """ + The item's name. + """ + name: String! + + """ + The parent item of a subitem. + """ + parent_item: Item + + """ + The item's relative path + """ + relative_link: String + + """ + The item's state (all / active / archived / deleted). + """ + state: State + + """ + The item's subitems. + """ + subitems: [Item] + + """ + The pulses's subscribers. + """ + subscribers: [User]! + + """ + The item's last update date. + """ + updated_at: Date + + """ + The item's updates. + """ + updates( + """ + A list of items unique identifiers. + """ + ids: [ID!] + + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [Update] + + """ + The item's link + """ + url: String! +} + +type ItemIdValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + ID of the item + """ + item_id: ID! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +The direction to order the items by +""" +enum ItemsOrderByDirection { + """ + Ascending order + """ + asc + + """ + Descending order + """ + desc +} + +input ItemsPageByColumnValuesQuery { + """ + The column's unique identifier. + """ + column_id: String! + + """ + The column values to search items by. + """ + column_values: [String]! +} + +input ItemsQuery { + """ + A list of rule groups + """ + groups: [ItemsQueryGroup!] + + """ + A list of item IDs to fetch. Use this to fetch a specific set of items by their IDs. Max: 100 IDs + """ + ids: [ID!] + + """ + The operator to use for the query rules or rule groups + """ + operator: ItemsQueryOperator = and + order_by: [ItemsQueryOrderBy!] + + """ + A list of rules + """ + rules: [ItemsQueryRule!] +} + +input ItemsQueryGroup { + """ + A list of rule groups + """ + groups: [ItemsQueryGroup!] + + """ + The operator to use for the query rules or rule groups + """ + operator: ItemsQueryOperator = and + + """ + A list of rules + """ + rules: [ItemsQueryRule!] +} + +""" +The condition between the query rules +""" +enum ItemsQueryOperator { + """ + Logical AND + """ + and + + """ + Logical OR + """ + or +} + +input ItemsQueryOrderBy { + column_id: String! + direction: ItemsOrderByDirection = asc +} + +input ItemsQueryRule { + column_id: ID! + compare_attribute: String + compare_value: CompareValue! + operator: ItemsQueryRuleOperator = any_of +} + +""" +The operator to use for the value comparison +""" +enum ItemsQueryRuleOperator { + """ + Any of the values + """ + any_of + + """ + Between the two values + """ + between + + """ + Contains all the terms + """ + contains_terms + + """ + Contains the text + """ + contains_text + + """ + Ends with the value + """ + ends_with + + """ + Greater than the value + """ + greater_than + + """ + Greater than or equal to the value + """ + greater_than_or_equals + + """ + Empty value + """ + is_empty + + """ + Not empty value + """ + is_not_empty + + """ + Lower than the value + """ + lower_than + + """ + Lower than or equal to the value + """ + lower_than_or_equal + + """ + None of the values + """ + not_any_of + + """ + Does not contain the text + """ + not_contains_text + + """ + Starts with the value + """ + starts_with + + """ + Within the last + """ + within_the_last + + """ + Within the next + """ + within_the_next +} + +type ItemsResponse { + """ + An opaque cursor that represents the position in the list after the last + returned item. Use this cursor for pagination to fetch the next set of items. + If the cursor is null, there are no more items to fetch. + """ + cursor: String + + """ + The items associated with the cursor. + """ + items: [Item!]! +} + +""" +A JSON formatted string. +""" +scalar JSON + +""" +Kind of assignee +""" +enum Kind { + """ + Represents a person + """ + person + + """ + Represents a team + """ + team +} + +type LastUpdatedValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + Timestamp of the last time the item was updated + """ + updated_at: Date + + """ + User who updated the item + """ + updater: User + + """ + ID of the user who updated the item + """ + updater_id: ID + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type LinkValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + Url + """ + url: String + + """ + Url text + """ + url_text: String + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type LocationValue implements ColumnValue { + """ + Address + """ + address: String + + """ + City + """ + city: String + + """ + City + """ + city_short: String + + """ + The column that this value belongs to. + """ + column: Column! + + """ + Country + """ + country: String + + """ + Country short name (e.g. PE for Peru) + """ + country_short: String + + """ + The column's unique identifier. + """ + id: ID! + + """ + Latitude + """ + lat: Float + + """ + Longitude + """ + lng: Float + + """ + Place ID of the location + """ + place_id: String + + """ + Street + """ + street: String + + """ + Number of building in the street + """ + street_number: String + + """ + Short number of building in the street + """ + street_number_short: String + + """ + Street + """ + street_short: String + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type LongTextValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type MirrorValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + A string representing all the names of the linked items, separated by commas + """ + display_value: String! + + """ + The column's unique identifier. + """ + id: ID! + + """ + The mirrored items. + """ + mirrored_items: [MirroredItem!]! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type MirroredItem { + """ + The linked board. + """ + linked_board: Board! + + """ + The linked board's unique identifier. + """ + linked_board_id: ID! + + """ + The linked item. + """ + linked_item: Item! + + """ + The mirrored values. + """ + mirrored_value: MirroredValue +} + +""" +Represents a mirrored value (column value, group, or board). +""" +union MirroredValue = Board | BoardRelationValue | ButtonValue | CheckboxValue | ColorPickerValue | CountryValue | CreationLogValue | DateValue | DependencyValue | DocValue | DropdownValue | EmailValue | FileValue | FormulaValue | Group | GroupValue | HourValue | IntegrationValue | ItemIdValue | LastUpdatedValue | LinkValue | LocationValue | LongTextValue | MirrorValue | NumbersValue | PeopleValue | PersonValue | PhoneValue | ProgressValue | RatingValue | StatusValue | SubtasksValue | TagsValue | TeamValue | TextValue | TimeTrackingValue | TimelineValue | UnsupportedValue | VoteValue | WeekValue | WorldClockValue + +""" +Update your monday.com data. +""" +type Mutation { + """ + Add a file to a column value. + """ + add_file_to_column( + """ + The column to add the file to. + """ + column_id: String! + + """ + The file to upload. + """ + file: File! + + """ + The item to add the file to. + """ + item_id: ID! + ): Asset + + """ + Add a file to an update. + """ + add_file_to_update( + """ + The file to upload. + """ + file: File! + + """ + The update to add the file to. + """ + update_id: ID! + ): Asset + + """ + Add subscribers to a board. + """ + add_subscribers_to_board( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + Subscribers kind (subscriber / owner) + """ + kind: BoardSubscriberKind = subscriber + + """ + User ids to subscribe to a board + """ + user_ids: [ID!]! + ): [User] @deprecated(reason: "use add_users_to_board instead") + + """ + Add teams subscribers to a board. + """ + add_teams_to_board( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + Subscribers kind (subscriber / owner) + """ + kind: BoardSubscriberKind = subscriber + + """ + Team ids to subscribe to a board + """ + team_ids: [ID!]! + ): [Team] + + """ + Add teams to a workspace. + """ + add_teams_to_workspace( + """ + Subscribers kind (subscriber / owner) + """ + kind: WorkspaceSubscriberKind = subscriber + + """ + Team ids to subscribe to a workspace + """ + team_ids: [ID!]! + + """ + The workspace's unique identifier. + """ + workspace_id: ID! + ): [Team] + + """ + Add subscribers to a board. + """ + add_users_to_board( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + Subscribers kind (subscriber / owner) + """ + kind: BoardSubscriberKind = subscriber + + """ + User ids to subscribe to a board + """ + user_ids: [ID!]! + ): [User] + + """ + Add users to team. + """ + add_users_to_team( + """ + The team's unique identifier. + """ + team_id: ID! + + """ + User ids to add to/remove from the team + """ + user_ids: [ID!]! + ): ChangeTeamMembershipsResult + + """ + Add users to a workspace. + """ + add_users_to_workspace( + """ + Subscribers kind (subscriber / owner) + """ + kind: WorkspaceSubscriberKind = subscriber + + """ + User ids to subscribe to a workspace + """ + user_ids: [ID!]! + + """ + The workspace's unique identifier. + """ + workspace_id: ID! + ): [User] + + """ + Archive a board. + """ + archive_board( + """ + The board's unique identifier + """ + board_id: ID! + ): Board + + """ + Archives a group in a specific board. + """ + archive_group( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The group's unique identifier. + """ + group_id: String! + ): Group + + """ + Archive an item. + """ + archive_item( + """ + The item's unique identifier. + """ + item_id: ID + ): Item + + """ + Change a column's properties + """ + change_column_metadata( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The column's unique identifier. + """ + column_id: String! + + """ + The property name of the column to be changed (title / description). + """ + column_property: ColumnProperty + + """ + The new description of the column. + """ + value: String + ): Column + + """ + Change a column's title + """ + change_column_title( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The column's unique identifier. + """ + column_id: String! + + """ + The new title of the column. + """ + title: String! + ): Column + + """ + Change an item's column value. + """ + change_column_value( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The column's unique identifier. + """ + column_id: String! + + """ + Create Status/Dropdown labels if they're missing. (Requires permission to change board structure) + """ + create_labels_if_missing: Boolean + + """ + The item's unique identifier. + """ + item_id: ID + + """ + The new value of the column. + """ + value: JSON! + ): Item + + """ + Changes the column values of a specific item. + """ + change_multiple_column_values( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The column values updates. + """ + column_values: JSON! + + """ + Create Status/Dropdown labels if they're missing. (Requires permission to change board structure) + """ + create_labels_if_missing: Boolean + + """ + The item's unique identifier. + """ + item_id: ID + ): Item + + """ + Change an item's column with simple value. + """ + change_simple_column_value( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The column's unique identifier. + """ + column_id: String! + + """ + Create Status/Dropdown labels if they're missing. (Requires permission to change board structure) + """ + create_labels_if_missing: Boolean + + """ + The item's unique identifier. + """ + item_id: ID + + """ + The new simple value of the column (pass null to empty the column). + """ + value: String + ): Item + + """ + Clear an item's updates. + """ + clear_item_updates( + """ + The item's unique identifier. + """ + item_id: ID! + ): Item + + """ + Get the complexity data of your mutations. + """ + complexity: Complexity + + """ + Create a new board. + """ + create_board( + """ + The board's kind (public / private / share) + """ + board_kind: BoardKind! + + """ + The board's name + """ + board_name: String! + + """ + Optional board owner user ids + """ + board_owner_ids: [ID!] + + """ + Optional board owner team ids + """ + board_owner_team_ids: [ID!] + + """ + Optional board subscriber ids + """ + board_subscriber_ids: [ID!] + + """ + Optional list of subscriber team ids + """ + board_subscriber_teams_ids: [ID!] + + """ + Optional board's description + """ + description: String + + """ + Optional flag to create an empty board (without any default items) + """ + empty: Boolean = false + + """ + Optional board folder id + """ + folder_id: ID + + """ + Optional board template id + """ + template_id: ID + + """ + Optional workspace id + """ + workspace_id: ID + ): Board + + """ + Create a new column in board. + """ + create_column( + """ + The column's unique identifier after which the new column will be inserted. + """ + after_column_id: ID + + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The type of column to create. + """ + column_type: ColumnType! + + """ + The new column's defaults. + """ + defaults: JSON + + """ + The new column's description. + """ + description: String + + """ + The column's user-specified unique identifier. + """ + id: String + + """ + The new column's title. + """ + title: String! + ): Column + + """ + Creates a folder in a specific workspace. + """ + create_folder( + """ + The folder's color. + """ + color: FolderColor + + """ + The folder's name + """ + name: String! + + """ + The folder's parent folder unique identifier. + """ + parent_folder_id: ID + + """ + The unique identifier of the workspace to create this folder in + """ + workspace_id: ID + ): Folder + + """ + Creates a new group in a specific board. + """ + create_group( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + A hex representing the group's color + """ + group_color: String + + """ + The name of the new group. + """ + group_name: String! + + """ + The group's position in the board. DEPRECATED! Replaced with relative position (position_relative_method, relative_to) + """ + position: String + + """ + The position relative method to another group (before_at / after_at) + """ + position_relative_method: PositionRelative + + """ + The group to set the position next to. + """ + relative_to: String + ): Group + + """ + Create a new item. + """ + create_item( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The column values of the new item. + """ + column_values: JSON + + """ + Create Status/Dropdown labels if they're missing. (Requires permission to change board structure) + """ + create_labels_if_missing: Boolean + + """ + The group's unique identifier. + """ + group_id: String + + """ + The new item's name. + """ + item_name: String! + + """ + The position relative method to another item (before_at / after_at) + """ + position_relative_method: PositionRelative + + """ + The item to set the position next to. + """ + relative_to: Int + ): Item + + """ + Create a new notification. + """ + create_notification( + """ + The target's unique identifier. + """ + target_id: ID! + + """ + The target's type (Project / Post) + """ + target_type: NotificationTargetType! + + """ + The notification text. + """ + text: String! + + """ + The user's unique identifier. + """ + user_id: ID! + ): Notification + + """ + Create a new tag or get it if it already exists. + """ + create_or_get_tag( + """ + The private board id to create the tag at (not needed for public boards) + """ + board_id: ID + + """ + The new tag's name. + """ + tag_name: String + ): Tag + + """ + Create subitem. + """ + create_subitem( + """ + The column values of the new item. + """ + column_values: JSON + + """ + Create Status/Dropdown labels if they're missing. (Requires permission to change board structure) + """ + create_labels_if_missing: Boolean + + """ + The new item's name. + """ + item_name: String! + + """ + The parent item's unique identifier. + """ + parent_item_id: ID! + ): Item + + """ + Create a new update. + """ + create_update( + """ + The update text. + """ + body: String! + + """ + The item's unique identifier. + """ + item_id: ID + + """ + The parent post identifier. + """ + parent_id: ID + ): Update + + """ + Create a new webhook. + """ + create_webhook( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The webhook config + """ + config: JSON + + """ + The event to listen to + """ + event: WebhookEventType! + + """ + The webhook URL. + """ + url: String! + ): Webhook + + """ + Create a new workspace. + """ + create_workspace( + """ + The Workspace's description + """ + description: String + + """ + The workspace's kind (open / closed) + """ + kind: WorkspaceKind! + + """ + The Workspace's name + """ + name: String! + ): Workspace + + """ + Delete a board. + """ + delete_board( + """ + The board's unique identifier + """ + board_id: ID! + ): Board + + """ + Delete a column. + """ + delete_column( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The column's unique identifier. + """ + column_id: String! + ): Column + + """ + Deletes a folder in a specific workspace. + """ + delete_folder( + """ + The folder's unique identifier. + """ + folder_id: ID! + ): Folder + + """ + Deletes a group in a specific board. + """ + delete_group( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The group's unique identifier. + """ + group_id: String! + ): Group + + """ + Delete an item. + """ + delete_item( + """ + The item's unique identifier. + """ + item_id: ID + ): Item + + """ + Remove subscribers from the board. + """ + delete_subscribers_from_board( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + User ids to unsubscribe from a board + """ + user_ids: [ID!]! + ): [User] + + """ + Remove team subscribers from the board. + """ + delete_teams_from_board( + """ + The board's unique identifier + """ + board_id: ID! + + """ + Team ids to unsubscribe from a workspace + """ + team_ids: [ID!]! + ): [Team] + + """ + Delete teams from a workspace. + """ + delete_teams_from_workspace( + """ + Team ids to unsubscribe from a workspace + """ + team_ids: [ID!]! + + """ + The workspace's unique identifier. + """ + workspace_id: ID! + ): [Team] + + """ + Delete an update. + """ + delete_update( + """ + The update's unique identifier. + """ + id: ID! + ): Update + + """ + Delete users from a workspace. + """ + delete_users_from_workspace( + """ + User ids to unsubscribe from a workspace + """ + user_ids: [ID!]! + + """ + The workspace's unique identifier. + """ + workspace_id: ID! + ): [User] + + """ + Delete a new webhook. + """ + delete_webhook( + """ + The webhook's unique identifier. + """ + id: ID! + ): Webhook + + """ + Delete workspace. + """ + delete_workspace( + """ + The workspace's unique identifier + """ + workspace_id: ID! + ): Workspace + + """ + Duplicate a board. + """ + duplicate_board( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + Optional the new board's name. If omitted then automatically generated + """ + board_name: String + + """ + The duplication type. + """ + duplicate_type: DuplicateBoardType! + + """ + Optional destination folder in destination workspace. Defaults to the original board folder. + """ + folder_id: ID + + """ + Duplicate the subscribers to the new board. Defaults to false. + """ + keep_subscribers: Boolean + + """ + Optional destination workspace. Defaults to the original board workspace. + """ + workspace_id: ID + ): BoardDuplication + + """ + Duplicate a group. + """ + duplicate_group( + """ + Should the new group be added to the top. + """ + add_to_top: Boolean + + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The group's unique identifier. + """ + group_id: String! + + """ + The group's title. + """ + group_title: String + ): Group + + """ + Duplicate an item. + """ + duplicate_item( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The item's unique identifier. *Required + """ + item_id: ID + + """ + Duplicate with the item's updates. + """ + with_updates: Boolean + ): Item + + """ + Increase operations counter + """ + increase_app_subscription_operations( + """ + Must be positive number. + """ + increment_by: Int = 1 + + """ + Operation name. A string of up to 14 characters containing alphanumeric characters and the symbols -_ + """ + kind: String = "global" + ): AppSubscriptionOperationsCounter + + """ + Like an update. + """ + like_update( + """ + The update identifier. + """ + update_id: ID + ): Update + + """ + Move an item to a different board. + """ + move_item_to_board( + """ + The unique identifier of a target board. + """ + board_id: ID! + + """ + Mapping of columns between the original board and target board + """ + columns_mapping: [ColumnMappingInput!] + + """ + The unique identifier of a target group. + """ + group_id: ID! + + """ + The unique identifier of an item to move. + """ + item_id: ID! + + """ + Mapping of subitem columns between the original board and target board + """ + subitems_columns_mapping: [ColumnMappingInput!] + ): Item + + """ + Move an item to a different group. + """ + move_item_to_group( + """ + The group's unique identifier. + """ + group_id: String! + + """ + The item's unique identifier. + """ + item_id: ID + ): Item + + """ + Remove users from team. + """ + remove_users_from_team( + """ + The team's unique identifier. + """ + team_id: ID! + + """ + User ids to add to/remove from the team + """ + user_ids: [ID!]! + ): ChangeTeamMembershipsResult + + """ + Update Board attribute. + """ + update_board( + """ + The board's attribute to update (name / description / communication) + """ + board_attribute: BoardAttributes! + + """ + The board's unique identifier + """ + board_id: ID! + + """ + The new attribute value. + """ + new_value: String! + ): JSON + + """ + Updates a folder. + """ + update_folder( + """ + The folder's color. + """ + color: FolderColor + + """ + The folder's unique identifier + """ + folder_id: ID! + + """ + The folder's name + """ + name: String + + """ + The folder's parent folder. + """ + parent_folder_id: ID + ): Folder + + """ + Update an existing group. + """ + update_group( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + The groups's attribute to update (title / color / position / relative_position_after / relative_position_before) + """ + group_attribute: GroupAttributes! + + """ + The Group's unique identifier. + """ + group_id: String! + + """ + The new attribute value. + """ + new_value: String! + ): Group + + """ + Update an existing workspace. + """ + update_workspace( + """ + The attributes of the workspace to update + """ + attributes: UpdateWorkspaceAttributesInput! + + """ + The workspace ID. + """ + id: ID + ): Workspace +} + +""" +A notification. +""" +type Notification { + """ + The notification's unique identifier. + """ + id: ID! + + """ + The notification text. + """ + text: String +} + +""" +The notification's target type. +""" +enum NotificationTargetType { + """ + Update + """ + Post + + """ + Item or Board. + """ + Project +} + +""" +Indicates where the unit symbol should be placed in a number value +""" +enum NumberValueUnitDirection { + """ + The symbol is placed on the left of the number + """ + left + + """ + The symbol is placed on the right of the number + """ + right +} + +type NumbersValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + Indicates where the symbol should be placed - on the right or left of the number + """ + direction: NumberValueUnitDirection + + """ + The column's unique identifier. + """ + id: ID! + + """ + Number + """ + number: Float + + """ + The symbol of the unit + """ + symbol: String + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +The working status of a user. +""" +type OutOfOffice { + """ + Is the status active? + """ + active: Boolean + + """ + Are notification disabled? + """ + disable_notifications: Boolean + + """ + The status end date. + """ + end_date: Date + + """ + The status start date. + """ + start_date: Date + + """ + Out of office type. + """ + type: String +} + +type PeopleEntity { + """ + Id of the entity: a person or a team + """ + id: ID! + + """ + Type of entity + """ + kind: Kind +} + +type PeopleValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + The people and teams assigned to the item. + """ + persons_and_teams: [PeopleEntity!] + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type PersonValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + The person assigned to the item. + """ + person_id: ID + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type PhoneValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + ISO-2 country code + """ + country_short_name: String + + """ + The column's unique identifier. + """ + id: ID! + + """ + Phone number + """ + phone: String + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +A payment plan. +""" +type Plan { + """ + The maximum users allowed in the plan. + """ + max_users: Int! + + """ + The plan's time period. + """ + period: String + + """ + The plan's tier. + """ + tier: String + + """ + The plan's version. + """ + version: Int! +} + +""" +The position relative method. +""" +enum PositionRelative { + """ + position after at the given entity. + """ + after_at + + """ + position before at the given entity. + """ + before_at +} + +type ProgressValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +Get your data from monday.com +""" +type Query { + """ + Get the connected account's information. + """ + account: Account + + """ + Get a collection of installs of an app. + """ + app_installs( + """ + The id of an account to filter app installs by. + """ + account_id: ID + + """ + The id of an application. + """ + app_id: ID! + + """ + Number of items to get, the default is 25. Max: 100 + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [AppInstall] + + """ + Get apps monetization status for an account + """ + apps_monetization_status: AppMonetizationStatus + + """ + Get a collection of assets by ids. + """ + assets( + """ + Ids of the assets/files you want to get + """ + ids: [ID!]! + ): [Asset] + + """ + Get a collection of boards. + """ + boards( + """ + The board's kind (public / private / share) + """ + board_kind: BoardKind + + """ + A list of boards unique identifiers. + """ + ids: [ID!] + + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Property to order by (created_at / used_at). + """ + order_by: BoardsOrderBy + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + + """ + The state of the board (all / active / archived / deleted), the default is active. + """ + state: State = active + + """ + A list of workspace ids the boards are contained in. + """ + workspace_ids: [ID] + ): [Board] + + """ + Get the complexity data of your queries. + """ + complexity: Complexity + + """ + Get a collection of folders. Note: This query won't return folders from closed workspaces to which you are not subscribed + """ + folders( + """ + A list of folders unique identifiers. + """ + ids: [ID!] + + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + + """ + A list of workspace unique identifiers to filter folders by workspaces. (pass null to include Main Workspace) + """ + workspace_ids: [ID] + ): [Folder] + + """ + Get operations counter current value + """ + increase_app_subscription_operations( + """ + Operation name. A string of up to 14 characters containing alphanumeric characters and the symbols -_ + """ + kind: String = "global" + ): AppSubscriptionOperationsCounter + + """ + Get a collection of items. + """ + items( + """ + Excludes items that are inactive, deleted or belong to deleted items + """ + exclude_nonactive: Boolean + + """ + A list of items unique identifiers. + """ + ids: [ID!] + + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Get the recently created items at the top of the list + """ + newest_first: Boolean + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [Item] + + """ + Search items by multiple columns and values. + """ + items_page_by_column_values( + """ + The board's unique identifier. + """ + board_id: ID! + + """ + One or more columns, and their values to search items by. + """ + columns: [ItemsPageByColumnValuesQuery!] + + """ + An opaque token representing the position in the result set from which to + resume fetching items. Use this to paginate through large result sets. + """ + cursor: String + + """ + The maximum number of items to fetch in a single request. Use this to + control the size of the result set and manage pagination. Maximum: 500. + """ + limit: Int! = 25 + ): ItemsResponse! + + """ + Get the connected user's information. + """ + me: User + + """ + Get next pages of board's items (rows) by cursor. + """ + next_items_page( + """ + An opaque token representing the position in the result set from which to + resume fetching items. Use this to paginate through large result sets. + """ + cursor: String! + + """ + The maximum number of items to fetch in a single request. Use this to + control the size of the result set and manage pagination. Maximum: 500. + """ + limit: Int! = 25 + ): ItemsResponse! + + """ + Get a collection of tags. + """ + tags( + """ + A list of tags unique identifiers. + """ + ids: [ID!] + ): [Tag] + + """ + Get a collection of teams. + """ + teams( + """ + A list of teams unique identifiers. + """ + ids: [ID!] + ): [Team] + + """ + Get a collection of updates. + """ + updates( + """ + A list of items unique identifiers. + """ + ids: [ID!] + + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [Update] + + """ + Get a collection of users. + """ + users( + """ + A list of users' emails. + """ + emails: [String] + + """ + A list of users' unique identifiers. + """ + ids: [ID!] + + """ + The kind to search users by (all / non_guests / guests / non_pending). + """ + kind: UserKind + + """ + Number of users to get. + """ + limit: Int + + """ + Allows to fuzzy search by name + """ + name: String + + """ + Get the recently created users at the top of the list + """ + newest_first: Boolean + + """ + Return non active users in the account. + """ + non_active: Boolean + + """ + Page number to get, starting at 1. + """ + page: Int + ): [User] + + """ + Get the API version in use + """ + version: Version! + + """ + Get a list containing the versions of the API + """ + versions: [Version!]! + + """ + Get a collection of webhooks for the board + """ + webhooks( + """ + Filters webhooks that were created by the app initiating the request + """ + app_webhooks_only: Boolean + + """ + Board unique identifier. + """ + board_id: ID! + ): [Webhook] + + """ + Get a collection of workspaces. + """ + workspaces( + """ + A list of workspace unique identifiers. + """ + ids: [ID!] + + """ + The workspace's kind (open / closed) + """ + kind: WorkspaceKind + + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Property to order by (created_at). + """ + order_by: WorkspacesOrderBy + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + + """ + The state of the workspace (all / active / archived / deleted), the default is active. + """ + state: State = active + ): [Workspace] +} + +type RatingValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + Rating value + """ + rating: Int + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +A reply for an update. +""" +type Reply { + """ + The reply's html formatted body. + """ + body: String! + + """ + The reply's creation date. + """ + created_at: Date + + """ + The reply's creator. + """ + creator: User + + """ + The unique identifier of the reply creator. + """ + creator_id: String + + """ + The reply's unique identifier. + """ + id: ID! + + """ + The reply's text body. + """ + text_body: String + + """ + The reply's last edit date. + """ + updated_at: Date +} + +""" +The possible states for a board or item. +""" +enum State { + """ + Active only (Default). + """ + active + + """ + Active, Archived and Deleted. + """ + all + + """ + Archived only. + """ + archived + + """ + Deleted only. + """ + deleted +} + +""" +A status label style. +""" +type StatusLabelStyle { + """ + The label's border color in hex format. + """ + border: String! + + """ + The label's color in hex format. + """ + color: String! +} + +type StatusValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + The index of the status in the board + """ + index: Int + + """ + Whether the status is done + """ + is_done: Boolean + + """ + The label of the status + """ + label: String + + """ + The style of the status label + """ + label_style: StatusLabelStyle + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The ID of an update attached to the status + """ + update_id: ID + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type SubtasksValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + A string representing all the names of the subtasks, separated by commas + """ + display_value: String! + + """ + The column's unique identifier. + """ + id: ID! + + """ + The subitems + """ + subitems: [Item!]! + + """ + The subitems IDs + """ + subitems_ids: [ID!]! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +A tag +""" +type Tag { + """ + The tag's color. + """ + color: String! + + """ + The tag's unique identifier. + """ + id: ID! + + """ + The tag's name. + """ + name: String! +} + +type TagsValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + Tag ID's + """ + tag_ids: [Int!]! + + """ + A list of tags + """ + tags: [Tag!]! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +A team of users. +""" +type Team { + """ + The team's unique identifier. + """ + id: ID! + + """ + The team's name. + """ + name: String! + + """ + The users who are the owners of the team. + """ + owners( + """ + A list of users' unique identifiers. + """ + ids: [ID!] + ): [User!]! + + """ + The team's picture url. + """ + picture_url: String + + """ + The users in the team. + """ + users( + """ + A list of users' emails. + """ + emails: [String] + + """ + A list of users' unique identifiers. + """ + ids: [ID!] + + """ + The kind to search users by (all / non_guests / guests / non_pending). + """ + kind: UserKind + + """ + Number of users to get. + """ + limit: Int + + """ + Allows to fuzzy search by name + """ + name: String + + """ + Get the recently created users at the top of the list + """ + newest_first: Boolean + + """ + Return non active users in the account. + """ + non_active: Boolean + + """ + Page number to get, starting at 1. + """ + page: Int + ): [User] +} + +type TeamValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + ID of the assigned team + """ + team_id: Int + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type TextValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + The column's textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +type TimeTrackingHistoryItem { + """ + When the session was added to the cell + """ + created_at: Date! + + """ + Only applicable if the session has ended + """ + ended_at: Date + + """ + The identifier of an user which ended the tracking + """ + ended_user_id: ID + + """ + A unique session identifier + """ + id: ID! + + """ + Is true if the session end date was manually entered + """ + manually_entered_end_date: Boolean! + + """ + Is true if the session end time was manually entered + """ + manually_entered_end_time: Boolean! + + """ + Is true if the session start date was manually entered + """ + manually_entered_start_date: Boolean! + + """ + Is true if the session start time was manually entered + """ + manually_entered_start_time: Boolean! + + """ + Only applicable if the session was added by pressing the play button or via automation + """ + started_at: Date + + """ + The identifier of an user which started the tracking + """ + started_user_id: ID + + """ + The status of the session + """ + status: String! + + """ + When the session was updated + """ + updated_at: Date +} + +type TimeTrackingValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + Total duration of the time tracker + """ + duration: Int + history: [TimeTrackingHistoryItem!]! + + """ + The column's unique identifier. + """ + id: ID! + + """ + Whether the time tracker is running + """ + running: Boolean + + """ + The date when the time tracker was started + """ + started_at: Date + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + value: JSON +} + +type TimelineValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The start date of the timeline + """ + from: Date + + """ + The column's unique identifier. + """ + id: ID! + + """ + The range of dates representing the timeline (YYYY-MM-DD) + """ + text: String + + """ + The end date of the timeline + """ + to: Date + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON + + """ + The visualization type for the timeline + """ + visualization_type: String +} + +type UnsupportedValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + + """ + Text representation of the column value. Note: Not all columns support textual value + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +An update. +""" +type Update { + """ + The update's assets/files. + """ + assets: [Asset] + + """ + The update's html formatted body. + """ + body: String! + + """ + The update's creation date. + """ + created_at: Date + + """ + The update's creator. + """ + creator: User + + """ + The unique identifier of the update creator. + """ + creator_id: String + + """ + The update's unique identifier. + """ + id: ID! + + """ + The update's item ID. + """ + item_id: String + + """ + The update's replies. + """ + replies: [Reply] + + """ + The update's text body. + """ + text_body: String + + """ + The update's last edit date. + """ + updated_at: Date +} + +""" +Attributes of a workspace to update +""" +input UpdateWorkspaceAttributesInput { + """ + The description of the workspace to update + """ + description: String + + """ + The kind of the workspace to update (open / closed) + """ + kind: WorkspaceKind + + """ + The name of the workspace to update + """ + name: String +} + +""" +A monday.com user. +""" +type User { + """ + The user's account. + """ + account: Account! + + """ + The user's birthday. + """ + birthday: Date + + """ + The user's country code. + """ + country_code: String + + """ + The user's creation date. + """ + created_at: Date + + """ + The current user's language + """ + current_language: String + + """ + The user's email. + """ + email: String! + + """ + Is the user enabled or not. + """ + enabled: Boolean! + + """ + The user's unique identifier. + """ + id: ID! + + """ + Is the user an account admin. + """ + is_admin: Boolean + + """ + Is the user a guest or not. + """ + is_guest: Boolean + + """ + Is the user a pending user + """ + is_pending: Boolean + + """ + Is user verified his email. + """ + is_verified: Boolean + + """ + Is the user a view only user or not. + """ + is_view_only: Boolean + + """ + The date the user joined the account. + """ + join_date: Date + + """ + Last date & time when user was active + """ + last_activity: Date + + """ + The user's location. + """ + location: String + + """ + The user's mobile phone number. + """ + mobile_phone: String + + """ + The user's name. + """ + name: String! + + """ + The user's out of office status. + """ + out_of_office: OutOfOffice + + """ + The user's phone number. + """ + phone: String + + """ + The user's photo in the original size. + """ + photo_original: String + + """ + The user's photo in small size (150x150). + """ + photo_small: String + + """ + The user's photo in thumbnail size (100x100). + """ + photo_thumb: String + + """ + The user's photo in small thumbnail size (50x50). + """ + photo_thumb_small: String + + """ + The user's photo in tiny size (30x30). + """ + photo_tiny: String + + """ + The product to which the user signed up to first. + """ + sign_up_product_kind: String + + """ + The teams the user is a member in. + """ + teams( + """ + A list of teams unique identifiers. + """ + ids: [ID!] + ): [Team] + + """ + The user's timezone identifier. + """ + time_zone_identifier: String + + """ + The user's title. + """ + title: String + + """ + The user's profile url. + """ + url: String! + + """ + The user’s utc hours difference. + """ + utc_hours_diff: Int +} + +""" +The possibilities for a user kind. +""" +enum UserKind { + """ + All users in account. + """ + all + + """ + Only guests. + """ + guests + + """ + Only company members. + """ + non_guests + + """ + All non pending members. + """ + non_pending +} + +""" +An object containing the API version details +""" +type Version { + """ + The display name of the API version + """ + display_name: String! + + """ + The type of the API version + """ + kind: VersionKind! + + """ + Version string that can be used in API-Version header + """ + value: String! +} + +""" +All possible API version types +""" +enum VersionKind { + """ + Current version + """ + current + + """ + No longer supported version. Migrate to current version as soon as possible + """ + deprecated + + """ + Bleeding-edge rolling version that constantly changes + """ + dev + + """ + Previous version. Migrate to current version as soon as possible + """ + maintenance + + """ + Next version + """ + release_candidate +} + +type VoteValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON + + """ + The total number of votes + """ + vote_count: Int! + + """ + A list of IDs of users who voted + """ + voter_ids: [ID!]! + + """ + A list of users who voted + """ + voters: [User!]! +} + +""" +Monday webhooks +""" +type Webhook { + """ + The webhooks's board id. + """ + board_id: ID! + + """ + The webhooks's config. + """ + config: String + + """ + The event webhook will listen to + """ + event: WebhookEventType! + + """ + The webhooks's unique identifier. + """ + id: ID! +} + +""" +The webhook's target type. +""" +enum WebhookEventType { + """ + Column value changed on board + """ + change_column_value + + """ + An item name changed on board + """ + change_name + + """ + Specific Column value changed on board + """ + change_specific_column_value + + """ + Status column value changed on board + """ + change_status_column_value + + """ + Column value changed on board subitem + """ + change_subitem_column_value + + """ + An subitem name changed on board + """ + change_subitem_name + + """ + Column created on a board + """ + create_column + + """ + An item was created on board + """ + create_item + + """ + A subitem was created on a board + """ + create_subitem + + """ + An update was posted on board subitem + """ + create_subitem_update + + """ + An update was posted on board item + """ + create_update + + """ + An update was deleted from board item + """ + delete_update + + """ + An update was edited on board item + """ + edit_update + + """ + An item was archived on a board + """ + item_archived + + """ + An item was deleted from a board + """ + item_deleted + + """ + An item is moved to any group + """ + item_moved_to_any_group + + """ + An item is moved to a specific group + """ + item_moved_to_specific_group + + """ + An item restored back to board + """ + item_restored + + """ + A subitem is moved from one parent to another + """ + move_subitem + + """ + A subitem was archived on a board + """ + subitem_archived + + """ + A subitem was deleted from a board + """ + subitem_deleted +} + +type WeekValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The end date of the week + """ + end_date: Date + + """ + The column's unique identifier. + """ + id: ID! + + """ + The start date of the week + """ + start_date: Date + + """ + The range of dates representing the week (YYYY-MM-DD) + """ + text: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The column's raw value in JSON format. + """ + value: JSON +} + +""" +A monday.com workspace. +""" +type Workspace { + """ + The account product that contains workspace. + """ + account_product: AccountProduct + + """ + The workspace's creation date. + """ + created_at: Date + + """ + The workspace's description. + """ + description: String + + """ + The workspace's unique identifier. + """ + id: ID + + """ + The workspace's kind (open / closed). + """ + kind: WorkspaceKind + + """ + The workspace's name. + """ + name: String! + + """ + The workspace's user owners. + """ + owners_subscribers( + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [User] + + """ + The workspace's settings. + """ + settings: WorkspaceSettings + + """ + The workspace's state (all / active / archived / deleted). + """ + state: State + + """ + The workspace's team owners. + """ + team_owners_subscribers( + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [Team!] + + """ + The teams subscribed to the workspace. + """ + teams_subscribers( + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [Team] + + """ + The users subscribed to the workspace + """ + users_subscribers( + """ + Number of items to get, the default is 25. + """ + limit: Int = 25 + + """ + Page number to get, starting at 1. + """ + page: Int = 1 + ): [User] +} + +""" +The workspace's icon. +""" +type WorkspaceIcon { + """ + The icon color in hex value. Used as a background for the image. + """ + color: String + + """ + The public image URL, which is temporary in the case of a file that was + uploaded by the user, so you'll need to pull a new version at least once an hour. + In case it is null, you can use the first letter of the workspace name. + """ + image: String +} + +""" +The workspace kinds available. +""" +enum WorkspaceKind { + """ + Closed workspace, available to enterprise only. + """ + closed + + """ + Open workspace. + """ + open +} + +""" +The workspace's settings. +""" +type WorkspaceSettings { + """ + The workspace icon. + """ + icon: WorkspaceIcon +} + +""" +The workspace subscriber kind. +""" +enum WorkspaceSubscriberKind { + """ + Workspace owner. + """ + owner + + """ + Workspace subscriber. + """ + subscriber +} + +""" +Options to order by. +""" +enum WorkspacesOrderBy { + """ + The rank order of the workspace creation time (desc). + """ + created_at +} + +type WorldClockValue implements ColumnValue { + """ + The column that this value belongs to. + """ + column: Column! + + """ + The column's unique identifier. + """ + id: ID! + text: String + + """ + Timezone + """ + timezone: String + + """ + The column's type. + """ + type: ColumnType! + + """ + The date when column value was last updated. + """ + updated_at: Date + + """ + The column's raw value in JSON format. + """ + value: JSON +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/MondayExtension.java b/src/main/java/com/epam/reportportal/extension/monday/MondayExtension.java new file mode 100644 index 0000000..09bcdee --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/MondayExtension.java @@ -0,0 +1,265 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday; + +import com.apollographql.apollo3.ApolloClient; +import com.apollographql.apollo3.network.http.DefaultHttpEngine; +import com.epam.reportportal.extension.CommonPluginCommand; +import com.epam.reportportal.extension.IntegrationGroupEnum; +import com.epam.reportportal.extension.NamedPluginCommand; +import com.epam.reportportal.extension.PluginCommand; +import com.epam.reportportal.extension.ReportPortalExtensionPoint; +import com.epam.reportportal.extension.common.IntegrationTypeProperties; +import com.epam.reportportal.extension.event.PluginEvent; +import com.epam.reportportal.extension.monday.client.GraphQLExecutor; +import com.epam.reportportal.extension.monday.client.MondayClientProvider; +import com.epam.reportportal.extension.monday.command.GetIssueCommand; +import com.epam.reportportal.extension.monday.command.GetIssueFieldsCommand; +import com.epam.reportportal.extension.monday.command.GetIssueTypesCommand; +import com.epam.reportportal.extension.monday.command.PostTicketCommand; +import com.epam.reportportal.extension.monday.command.RetrieveCreationParamsCommand; +import com.epam.reportportal.extension.monday.command.RetrieveUpdateParamsCommand; +import com.epam.reportportal.extension.monday.command.connection.TestConnectionCommand; +import com.epam.reportportal.extension.monday.event.plugin.PluginEventHandlerFactory; +import com.epam.reportportal.extension.monday.event.plugin.PluginEventListener; +import com.epam.reportportal.extension.monday.info.impl.PluginInfoProviderImpl; +import com.epam.reportportal.extension.monday.model.enums.MondayColumnType; +import com.epam.reportportal.extension.monday.service.column.converter.DefaultColumnConverter; +import com.epam.reportportal.extension.monday.service.column.converter.DelegatingColumnConverter; +import com.epam.reportportal.extension.monday.service.column.converter.IssueColumnConverter; +import com.epam.reportportal.extension.monday.service.column.converter.LinkColumnConverter; +import com.epam.reportportal.extension.monday.service.column.converter.StatusColumnConverter; +import com.epam.reportportal.extension.monday.service.issue.IssueDescriptionProvider; +import com.epam.reportportal.extension.monday.service.issue.converter.IssueParamsConverter; +import com.epam.reportportal.extension.monday.service.issue.log.sender.LogSenderProvider; +import com.epam.reportportal.extension.monday.utils.MemoizingSupplier; +import com.epam.reportportal.extension.util.RequestEntityConverter; +import com.epam.ta.reportportal.binary.DataStoreService; +import com.epam.ta.reportportal.dao.IntegrationRepository; +import com.epam.ta.reportportal.dao.IntegrationTypeRepository; +import com.epam.ta.reportportal.dao.LogRepository; +import com.epam.ta.reportportal.dao.ProjectRepository; +import com.epam.ta.reportportal.dao.TestItemRepository; +import com.epam.ta.reportportal.dao.TicketRepository; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import javax.annotation.PostConstruct; +import okhttp3.ConnectionPool; +import okhttp3.OkHttpClient; +import org.jasypt.util.text.BasicTextEncryptor; +import org.pf4j.Extension; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ApplicationEventMulticaster; +import org.springframework.context.support.AbstractApplicationContext; + +@Extension +public class MondayExtension implements ReportPortalExtensionPoint, DisposableBean { + + public static final String BINARY_DATA_PROPERTIES_FILE_ID = "binary-data.properties"; + private static final String MONDAY_GRAPHQL_URL = "https://api.monday.com/v2"; + private static final String MONDAY_UPLOAD_FILE_URL = "https://api.monday.com/v2/file"; + private static final String DOCUMENTATION_LINK_FIELD = "documentationLink"; + private static final String DOCUMENTATION_LINK = "https://reportportal.io/docs/plugins/Monday"; + private static final String PLUGIN_ID = "Monday"; + + private final String resourcesDir; + private final ObjectMapper objectMapper; + private final RequestEntityConverter requestEntityConverter; + private final IssueParamsConverter issueParamsConverter; + private final IssueDescriptionProvider issueDescriptionProvider; + private final Supplier okHttpClientSupplier; + private final Supplier graphQLExecutor; + private final Supplier mondayClientProvider; + private final Supplier logSenderProviderSupplier; + private final Supplier> pluginLoadedListenerSupplier; + @Autowired + private ApplicationContext applicationContext; + @Autowired + private IntegrationTypeRepository integrationTypeRepository; + @Autowired + private IntegrationRepository integrationRepository; + @Autowired + private TicketRepository ticketRepository; + @Autowired + private ProjectRepository projectRepository; + @Autowired + private LogRepository logRepository; + @Autowired + private TestItemRepository testItemRepository; + private final Supplier>> pluginCommandMapping = + new MemoizingSupplier<>(this::getCommands); + @Autowired + private BasicTextEncryptor textEncryptor; + private final Supplier>> commonPluginCommandMapping = + new MemoizingSupplier<>(this::getCommonCommands); + @Autowired + @Qualifier("attachmentDataStoreService") + private DataStoreService dataStoreService; + + public MondayExtension(Map initParams) { + resourcesDir = + IntegrationTypeProperties.RESOURCES_DIRECTORY.getValue(initParams).map(String::valueOf) + .orElse(""); + objectMapper = configureObjectMapper(); + + pluginLoadedListenerSupplier = new MemoizingSupplier<>(() -> new PluginEventListener(PLUGIN_ID, + new PluginEventHandlerFactory(integrationTypeRepository, integrationRepository, + new PluginInfoProviderImpl(resourcesDir, BINARY_DATA_PROPERTIES_FILE_ID) + ) + )); + + requestEntityConverter = new RequestEntityConverter(objectMapper); + + issueParamsConverter = getIssueParamsConverter(); + issueDescriptionProvider = new IssueDescriptionProvider(); + + okHttpClientSupplier = new MemoizingSupplier<>(this::configureOkHttpClient); + graphQLExecutor = new MemoizingSupplier<>( + () -> new GraphQLExecutor(configureApolloClient(okHttpClientSupplier.get()))); + mondayClientProvider = new MemoizingSupplier<>( + () -> new MondayClientProvider(MONDAY_UPLOAD_FILE_URL, okHttpClientSupplier.get(), + textEncryptor, graphQLExecutor.get() + )); + logSenderProviderSupplier = + new MemoizingSupplier<>(() -> new LogSenderProvider(dataStoreService)); + } + + protected ObjectMapper configureObjectMapper() { + ObjectMapper om = new ObjectMapper(); + om.setAnnotationIntrospector(new JacksonAnnotationIntrospector()); + om.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true); + om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + om.registerModule(new JavaTimeModule()); + return om; + } + + private OkHttpClient configureOkHttpClient() { + return new OkHttpClient.Builder().readTimeout(10, TimeUnit.SECONDS) + .retryOnConnectionFailure(false).connectTimeout(5, TimeUnit.SECONDS) + .connectionPool(new ConnectionPool(2, 5, TimeUnit.SECONDS)).build(); + } + + private ApolloClient configureApolloClient(OkHttpClient okHttpClient) { + return new ApolloClient.Builder().httpEngine(new DefaultHttpEngine(okHttpClient)) + .serverUrl(MONDAY_GRAPHQL_URL).build(); + } + + private IssueParamsConverter getIssueParamsConverter() { + return new IssueParamsConverter(getIssueColumnConverter()); + } + + private IssueColumnConverter getIssueColumnConverter() { + return new DelegatingColumnConverter( + getIssueColumnConverterMapping(), new DefaultColumnConverter()); + } + + private Map getIssueColumnConverterMapping() { + return Map.of( + MondayColumnType.STATUS, new StatusColumnConverter(), MondayColumnType.LINK, + new LinkColumnConverter() + ); + } + + @Override + public Map getPluginParams() { + Map params = new HashMap<>(); + params.put(ALLOWED_COMMANDS, new ArrayList<>(pluginCommandMapping.get().keySet())); + params.put(DOCUMENTATION_LINK_FIELD, DOCUMENTATION_LINK); + params.put(COMMON_COMMANDS, new ArrayList<>(commonPluginCommandMapping.get().keySet())); + return params; + } + + @Override + public PluginCommand getIntegrationCommand(String commandName) { + return pluginCommandMapping.get().get(commandName); + } + + @Override + public CommonPluginCommand getCommonCommand(String commandName) { + return commonPluginCommandMapping.get().get(commandName); + } + + @Override + public IntegrationGroupEnum getIntegrationGroup() { + return IntegrationGroupEnum.BTS; + } + + @PostConstruct + public void createIntegration() { + initListeners(); + } + + private void initListeners() { + ApplicationEventMulticaster applicationEventMulticaster = applicationContext.getBean( + AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME, + ApplicationEventMulticaster.class + ); + applicationEventMulticaster.addApplicationListener(pluginLoadedListenerSupplier.get()); + } + + @Override + public void destroy() { + removeListeners(); + graphQLExecutor.get().close(); + } + + private void removeListeners() { + ApplicationEventMulticaster applicationEventMulticaster = applicationContext.getBean( + AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME, + ApplicationEventMulticaster.class + ); + applicationEventMulticaster.removeApplicationListener(pluginLoadedListenerSupplier.get()); + } + + private Map> getCommonCommands() { + List> commands = new ArrayList<>(); + commands.add(new RetrieveCreationParamsCommand(textEncryptor)); + commands.add(new RetrieveUpdateParamsCommand(textEncryptor)); + commands.add( + new GetIssueCommand(mondayClientProvider.get(), ticketRepository, integrationRepository)); + return commands.stream().collect(Collectors.toMap(NamedPluginCommand::getName, it -> it)); + } + + private Map> getCommands() { + List> commands = new ArrayList<>(); + commands.add(new TestConnectionCommand(mondayClientProvider.get())); + commands.add(new GetIssueTypesCommand(projectRepository)); + commands.add( + new GetIssueFieldsCommand(projectRepository, mondayClientProvider.get(), objectMapper)); + commands.add( + new PostTicketCommand(projectRepository, requestEntityConverter, mondayClientProvider.get(), + issueParamsConverter, issueDescriptionProvider, logSenderProviderSupplier.get(), + objectMapper, testItemRepository, logRepository + )); + return commands.stream().collect(Collectors.toMap(NamedPluginCommand::getName, it -> it)); + + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/MondayPlugin.java b/src/main/java/com/epam/reportportal/extension/monday/MondayPlugin.java new file mode 100644 index 0000000..f7cdac5 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/MondayPlugin.java @@ -0,0 +1,33 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday; + +import org.pf4j.Plugin; +import org.pf4j.PluginWrapper; + +public class MondayPlugin extends Plugin { + /** + * Constructor to be used by plugin manager for plugin instantiation. + * Your plugins have to provide constructor with this exact signature to + * be successfully loaded by manager. + * + * @param wrapper + */ + public MondayPlugin(PluginWrapper wrapper) { + super(wrapper); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/client/GraphQLExecutor.java b/src/main/java/com/epam/reportportal/extension/monday/client/GraphQLExecutor.java new file mode 100644 index 0000000..1308759 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/client/GraphQLExecutor.java @@ -0,0 +1,71 @@ +package com.epam.reportportal.extension.monday.client; + +import static java.util.Optional.ofNullable; + +import com.apollographql.apollo3.ApolloClient; +import com.apollographql.apollo3.api.ApolloResponse; +import com.apollographql.apollo3.api.Mutation; +import com.apollographql.apollo3.api.Query; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; +import java.io.Closeable; +import kotlin.coroutines.EmptyCoroutineContext; +import kotlinx.coroutines.BuildersKt; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class GraphQLExecutor implements Closeable { + + private static final Logger LOGGER = LoggerFactory.getLogger(GraphQLExecutor.class); + + private static final String AUTHORIZATION_HEADER = "Authorization"; + private static final String API_VERSION_HEADER = "API-Version"; + + private static final String API_VERSION_VALUE = "2024-04"; + + private final ApolloClient apolloClient; + + public GraphQLExecutor(ApolloClient apolloClient) { + this.apolloClient = apolloClient; + } + + public T query(Query query, String token) { + try { + ApolloResponse response = BuildersKt.runBlocking(EmptyCoroutineContext.INSTANCE, + (s, c) -> apolloClient.query(query).addHttpHeader(AUTHORIZATION_HEADER, token) + .addHttpHeader(API_VERSION_HEADER, API_VERSION_VALUE).execute(c) + ); + return ofNullable(response.data).orElseThrow(() -> { + LOGGER.error("Response errors {}", response.errors); + return new ReportPortalException( + ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, "No result for query: " + query.name()); + }); + } catch (InterruptedException e) { + LOGGER.error(e.getMessage(), e); + throw new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, e.getMessage()); + } + } + + public T mutation(Mutation mutation, String token) { + try { + ApolloResponse response = BuildersKt.runBlocking(EmptyCoroutineContext.INSTANCE, + (s, c) -> apolloClient.mutation(mutation).addHttpHeader(AUTHORIZATION_HEADER, token) + .addHttpHeader(API_VERSION_HEADER, API_VERSION_VALUE).execute(c) + ); + return ofNullable(response.data).orElseThrow(() -> { + LOGGER.error("Response errors {}", response.errors); + return new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "No result for mutation: " + mutation.name() + ); + }); + } catch (InterruptedException e) { + LOGGER.error(e.getMessage(), e); + throw new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, e.getMessage()); + } + } + + @Override + public void close() { + apolloClient.close(); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/client/MondayClient.java b/src/main/java/com/epam/reportportal/extension/monday/client/MondayClient.java new file mode 100644 index 0000000..248132d --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/client/MondayClient.java @@ -0,0 +1,98 @@ +package com.epam.reportportal.extension.monday.client; + +import static java.util.Optional.ofNullable; + +import com.apollographql.apollo3.api.Optional; +import com.epam.reportportal.extension.monday.model.graphql.CreateIssueMutation; +import com.epam.reportportal.extension.monday.model.graphql.CreateIssueUpdateSectionMutation; +import com.epam.reportportal.extension.monday.model.graphql.GetBoardConfigQuery; +import com.epam.reportportal.extension.monday.model.graphql.GetItemsQuery; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpMethod; + +public class MondayClient { + + private static final String AUTHORIZATION_HEADER = "Authorization"; + + private final OkHttpClient okHttpClient; + private final GraphQLExecutor graphQLExecutor; + + private final String fileUploadUrl; + private final String token; + + public MondayClient(OkHttpClient okHttpClient, GraphQLExecutor graphQLExecutor, + String fileUploadUrl, String token) { + this.okHttpClient = okHttpClient; + this.graphQLExecutor = graphQLExecutor; + this.fileUploadUrl = fileUploadUrl; + this.token = token; + } + + public java.util.Optional getBoard(String boardId) { + GetBoardConfigQuery getBoardConfigQuery = + new GetBoardConfigQuery(Optional.present(List.of(boardId))); + GetBoardConfigQuery.Data data = graphQLExecutor.query(getBoardConfigQuery, token); + return ofNullable(data.boards).flatMap(boards -> boards.stream().findFirst()); + } + + public java.util.Optional createItem(String boardId, String name, + String columns) { + CreateIssueMutation createIssueMutation = new CreateIssueMutation(boardId, name, + com.apollographql.apollo3.api.Optional.present(columns) + ); + CreateIssueMutation.Data data = graphQLExecutor.mutation(createIssueMutation, token); + return ofNullable(data.create_item); + } + + public java.util.Optional createItemUpdateSection( + String itemId, String body) { + CreateIssueUpdateSectionMutation createMutation = + new CreateIssueUpdateSectionMutation(itemId, Optional.absent(), body); + CreateIssueUpdateSectionMutation.Data data = graphQLExecutor.mutation(createMutation, token); + return ofNullable(data.create_update); + } + + public java.util.Optional createReply( + String itemId, String parentId, String body) { + CreateIssueUpdateSectionMutation createMutation = + new CreateIssueUpdateSectionMutation(itemId, Optional.present(parentId), body); + CreateIssueUpdateSectionMutation.Data data = graphQLExecutor.mutation(createMutation, token); + return ofNullable(data.create_update); + } + + /** + * File upload made without Apollo client because of a bunch of unresolved errors that occur when UploadAdapter from GraphQL is used + */ + public boolean uploadFile(String parentId, InputStream inputStream, String fileName, + String contentType) throws IOException { + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("query", + "mutation ($file: File!) {add_file_to_update (file: $file, update_id: " + parentId + + ") {id}}" + ).addFormDataPart("variables[file]", fileName, + RequestBody.create(IOUtils.toByteArray(inputStream), MediaType.parse(contentType)) + ).build(); + Request request = new Request.Builder().url(fileUploadUrl).method(HttpMethod.POST.name(), body) + .addHeader(AUTHORIZATION_HEADER, token).build(); + try (Response response = okHttpClient.newCall(request).execute()) { + return response.isSuccessful(); + } + } + + public java.util.Optional getItem(String itemId) { + GetItemsQuery getItemsQuery = new GetItemsQuery(Optional.present(List.of(itemId))); + GetItemsQuery.Data data = graphQLExecutor.query(getItemsQuery, token); + + return ofNullable(data.items).flatMap(items -> items.stream().findFirst()); + } + +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/client/MondayClientProvider.java b/src/main/java/com/epam/reportportal/extension/monday/client/MondayClientProvider.java new file mode 100644 index 0000000..49968fc --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/client/MondayClientProvider.java @@ -0,0 +1,29 @@ +package com.epam.reportportal.extension.monday.client; + +import com.epam.reportportal.extension.monday.model.enums.MondayProperties; +import com.epam.ta.reportportal.entity.integration.IntegrationParams; +import okhttp3.OkHttpClient; +import org.jasypt.util.text.BasicTextEncryptor; + +public class MondayClientProvider { + + private final String fileUploadUrl; + private final OkHttpClient okHttpClient; + + private final BasicTextEncryptor textEncryptor; + private final GraphQLExecutor graphQLExecutor; + + public MondayClientProvider(String fileUploadUrl, OkHttpClient okHttpClient, + BasicTextEncryptor textEncryptor, GraphQLExecutor graphQLExecutor) { + this.fileUploadUrl = fileUploadUrl; + this.okHttpClient = okHttpClient; + this.textEncryptor = textEncryptor; + this.graphQLExecutor = graphQLExecutor; + } + + public MondayClient provide(IntegrationParams params) { + String token = textEncryptor.decrypt(MondayProperties.API_TOKEN.getParam(params)); + return new MondayClient(okHttpClient, graphQLExecutor, fileUploadUrl, token); + } + +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/command/GetIssueCommand.java b/src/main/java/com/epam/reportportal/extension/monday/command/GetIssueCommand.java new file mode 100644 index 0000000..3fc5a28 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/command/GetIssueCommand.java @@ -0,0 +1,122 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.command; + +import static java.util.Optional.ofNullable; + +import com.epam.reportportal.extension.CommonPluginCommand; +import com.epam.reportportal.extension.monday.client.MondayClient; +import com.epam.reportportal.extension.monday.client.MondayClientProvider; +import com.epam.reportportal.extension.monday.model.enums.MondayProperties; +import com.epam.reportportal.extension.monday.model.graphql.GetItemsQuery; +import com.epam.reportportal.model.externalsystem.Ticket; +import com.epam.reportportal.rules.commons.validation.Suppliers; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.dao.IntegrationRepository; +import com.epam.ta.reportportal.dao.TicketRepository; +import com.epam.ta.reportportal.entity.integration.Integration; +import com.epam.ta.reportportal.entity.integration.IntegrationParams; +import java.util.Map; +import java.util.Objects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Pavel Bortnik + */ +public class GetIssueCommand implements CommonPluginCommand { + + private static final Logger LOGGER = LoggerFactory.getLogger(GetIssueCommand.class); + + private final String TICKET_ID = "ticketId"; + private final String PROJECT_ID = "projectId"; + + private final MondayClientProvider mondayClientProvider; + + private final TicketRepository ticketRepository; + private final IntegrationRepository integrationRepository; + + public GetIssueCommand(MondayClientProvider mondayClientProvider, + TicketRepository ticketRepository, IntegrationRepository integrationRepository) { + this.mondayClientProvider = mondayClientProvider; + this.ticketRepository = ticketRepository; + this.integrationRepository = integrationRepository; + } + + @Override + public Ticket executeCommand(Map params) { + final com.epam.ta.reportportal.entity.bts.Ticket ticket = ticketRepository.findByTicketId( + (String) ofNullable(params.get(TICKET_ID)).orElseThrow( + () -> new ReportPortalException(ErrorType.BAD_REQUEST_ERROR, + TICKET_ID + " must be provided" + ))).orElseThrow(() -> new ReportPortalException(ErrorType.BAD_REQUEST_ERROR, + "Ticket not found with id " + TICKET_ID + )); + final Long projectId = (Long) ofNullable(params.get(PROJECT_ID)).orElseThrow( + () -> new ReportPortalException(ErrorType.BAD_REQUEST_ERROR, + PROJECT_ID + " must be provided" + )); + + final String btsUrl = MondayProperties.URL.getParam(params); + final String boardId = MondayProperties.PROJECT.getParam(params); + + final Integration integration = + integrationRepository.findProjectBtsByUrlAndLinkedProject(btsUrl, boardId, projectId) + .orElseGet( + () -> integrationRepository.findGlobalBtsByUrlAndLinkedProject(btsUrl, boardId) + .orElseThrow(() -> new ReportPortalException( + ErrorType.BAD_REQUEST_ERROR, + "Integration with provided url and project isn't found" + ))); + return getTicket(ticket.getTicketId(), integration.getParams()); + } + + private Ticket getTicket(String id, IntegrationParams details) { + + String url = MondayProperties.URL.getParam(details.getParams()); + String boardId = MondayProperties.PROJECT.getParam(details); + + MondayClient mondayClient = mondayClientProvider.provide(details); + + return mondayClient.getItem(id).map(issue -> convertToTicket(url, boardId, issue)).orElseThrow( + () -> new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "Ticket not found by id: " + id + )); + + } + + private Ticket convertToTicket(String url, String boardId, GetItemsQuery.Item issue) { + Ticket ticket = new Ticket(); + ticket.setId(issue.id); + ticket.setSummary(issue.name); + ticket.setStatus(""); + ofNullable(issue.column_values).flatMap( + values -> values.stream().filter(v -> Objects.nonNull(v.onStatusValue)) + .map(v -> v.onStatusValue).filter(s -> Objects.nonNull(s.id)) + .filter(s -> s.id.contains("status")).findFirst()) + .ifPresentOrElse(s -> ticket.setStatus(s.text), () -> ticket.setStatus("")); + ticket.setTicketUrl( + Suppliers.formattedSupplier("{}/boards/{}/pulses/{}", url, boardId, issue.id).get()); + return ticket; + } + + @Override + public String getName() { + return "getIssue"; + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/command/GetIssueFieldsCommand.java b/src/main/java/com/epam/reportportal/extension/monday/command/GetIssueFieldsCommand.java new file mode 100644 index 0000000..a39ced5 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/command/GetIssueFieldsCommand.java @@ -0,0 +1,101 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.command; + +import static java.util.Optional.ofNullable; + +import com.epam.reportportal.extension.ProjectManagerCommand; +import com.epam.reportportal.extension.monday.client.MondayClient; +import com.epam.reportportal.extension.monday.client.MondayClientProvider; +import com.epam.reportportal.extension.monday.model.enums.MondayProperties; +import com.epam.reportportal.extension.monday.model.graphql.GetBoardConfigQuery; +import com.epam.reportportal.extension.monday.model.graphql.type.ColumnType; +import com.epam.reportportal.extension.monday.model.payload.BoardSettings; +import com.epam.reportportal.model.externalsystem.AllowedValue; +import com.epam.reportportal.model.externalsystem.PostFormField; +import com.epam.ta.reportportal.dao.ProjectRepository; +import com.epam.ta.reportportal.entity.integration.Integration; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Pavel Bortnik + */ +public class GetIssueFieldsCommand extends ProjectManagerCommand> { + + private static final Logger LOGGER = LoggerFactory.getLogger(GetIssueFieldsCommand.class); + + // TODO probably more + private final Set excludedColumnTypes = + Set.of(ColumnType.item_id, ColumnType.file, ColumnType.last_updated, ColumnType.timeline, + ColumnType.subtasks); + + private final MondayClientProvider mondayClientProvider; + private final ObjectMapper objectMapper; + + public GetIssueFieldsCommand(ProjectRepository projectRepository, + MondayClientProvider mondayClientProvider, ObjectMapper objectMapper) { + super(projectRepository); + this.mondayClientProvider = mondayClientProvider; + this.objectMapper = objectMapper; + } + + @Override + public String getName() { + return "getIssueFields"; + } + + @Override + protected List invokeCommand(Integration integration, Map params) { + String boardId = MondayProperties.PROJECT.getParam(integration.getParams()); + + MondayClient mondayClient = mondayClientProvider.provide(integration.getParams()); + + return mondayClient.getBoard(boardId).map(b -> { + List columns = b.columns; + return columns.stream().filter(c -> !excludedColumnTypes.contains(c.type)).map(c -> { + List allowedValues = new ArrayList<>(); + if (ColumnType.status == c.type) { + addStatusColumn(c, allowedValues); + } + + return new PostFormField( + c.id, c.title, c.type.rawValue, "name".equals(c.id), new ArrayList<>(), allowedValues); + }).collect(Collectors.toList()); + }).orElseGet(Collections::emptyList); + + } + + private void addStatusColumn(GetBoardConfigQuery.Column c, List allowedValues) { + try { + BoardSettings boardSettings = objectMapper.readValue(c.settings_str, BoardSettings.class); + ofNullable(boardSettings.getLabels()).ifPresent( + labels -> labels.forEach((k, v) -> allowedValues.add(new AllowedValue(k, k + ": " + v)))); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/command/GetIssueTypesCommand.java b/src/main/java/com/epam/reportportal/extension/monday/command/GetIssueTypesCommand.java new file mode 100644 index 0000000..6f15e71 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/command/GetIssueTypesCommand.java @@ -0,0 +1,43 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.command; + +import com.epam.reportportal.extension.ProjectManagerCommand; +import com.epam.ta.reportportal.dao.ProjectRepository; +import com.epam.ta.reportportal.entity.integration.Integration; +import java.util.List; +import java.util.Map; + +/** + * @author Pavel Bortnik + */ +public class GetIssueTypesCommand extends ProjectManagerCommand> { + + public GetIssueTypesCommand(ProjectRepository projectRepository) { + super(projectRepository); + } + + @Override + public String getName() { + return "getIssueTypes"; + } + + @Override + protected List invokeCommand(Integration integration, Map params) { + return List.of(); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/command/PostTicketCommand.java b/src/main/java/com/epam/reportportal/extension/monday/command/PostTicketCommand.java new file mode 100644 index 0000000..90788d8 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/command/PostTicketCommand.java @@ -0,0 +1,185 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.command; + +import static com.epam.reportportal.extension.util.CommandParamUtils.ENTITY_PARAM; +import static com.epam.reportportal.rules.commons.validation.BusinessRule.expect; +import static com.epam.ta.reportportal.commons.Predicates.isNull; +import static com.epam.ta.reportportal.commons.Predicates.not; +import static java.util.Optional.ofNullable; + +import com.epam.reportportal.extension.ProjectMemberCommand; +import com.epam.reportportal.extension.monday.client.MondayClient; +import com.epam.reportportal.extension.monday.client.MondayClientProvider; +import com.epam.reportportal.extension.monday.model.enums.MondayColumnId; +import com.epam.reportportal.extension.monday.model.enums.MondayProperties; +import com.epam.reportportal.extension.monday.service.issue.IssueDescriptionProvider; +import com.epam.reportportal.extension.monday.service.issue.converter.IssueParamsConverter; +import com.epam.reportportal.extension.monday.service.issue.log.sender.LogSender; +import com.epam.reportportal.extension.monday.service.issue.log.sender.LogSenderProvider; +import com.epam.reportportal.extension.util.RequestEntityConverter; +import com.epam.reportportal.extension.util.RequestEntityValidator; +import com.epam.reportportal.model.externalsystem.PostFormField; +import com.epam.reportportal.model.externalsystem.PostTicketRQ; +import com.epam.reportportal.model.externalsystem.Ticket; +import com.epam.reportportal.rules.commons.validation.Suppliers; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.dao.LogRepository; +import com.epam.ta.reportportal.dao.ProjectRepository; +import com.epam.ta.reportportal.dao.TestItemRepository; +import com.epam.ta.reportportal.entity.integration.Integration; +import com.epam.ta.reportportal.entity.log.Log; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.List; +import java.util.Map; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Pavel Bortnik + */ +public class PostTicketCommand extends ProjectMemberCommand { + + private static final Logger LOGGER = LoggerFactory.getLogger(PostTicketCommand.class); + + private final RequestEntityConverter requestEntityConverter; + + private final MondayClientProvider mondayClientProvider; + + private final IssueParamsConverter issueParamsConverter; + private final IssueDescriptionProvider issueDescriptionProvider; + + private final LogSenderProvider logSenderProvider; + + private final ObjectMapper objectMapper; + + private final TestItemRepository testItemRepository; + private final LogRepository logRepository; + + public PostTicketCommand(ProjectRepository projectRepository, + RequestEntityConverter requestEntityConverter, MondayClientProvider mondayClientProvider, + IssueParamsConverter issueParamsConverter, IssueDescriptionProvider issueDescriptionProvider, + LogSenderProvider logSenderProvider, ObjectMapper objectMapper, + TestItemRepository testItemRepository, LogRepository logRepository) { + super(projectRepository); + this.requestEntityConverter = requestEntityConverter; + this.mondayClientProvider = mondayClientProvider; + this.issueParamsConverter = issueParamsConverter; + this.issueDescriptionProvider = issueDescriptionProvider; + this.logSenderProvider = logSenderProvider; + this.objectMapper = objectMapper; + this.testItemRepository = testItemRepository; + this.logRepository = logRepository; + } + + @Override + public String getName() { + return "postTicket"; + } + + @Override + protected Ticket invokeCommand(Integration integration, Map params) { + PostTicketRQ ticketRQ = + requestEntityConverter.getEntity(ENTITY_PARAM, params, PostTicketRQ.class); + RequestEntityValidator.validate(ticketRQ); + expect(ticketRQ.getFields(), not(isNull())).verify(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "External System fields set is empty!" + ); + List fields = ticketRQ.getFields(); + + String name = getIssueName(fields); + + String boardId = MondayProperties.PROJECT.getParam(integration.getParams()); + String url = MondayProperties.URL.getParam(integration.getParams()); + String columns = convertToIssueColumns(fields); + + MondayClient mondayClient = mondayClientProvider.provide(integration.getParams()); + + String issueId = mondayClient.createItem(boardId, name, columns).map(i -> i.id).orElseThrow( + () -> new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "Error during issue creation" + )); + + ofNullable(ticketRQ.getBackLinks()).filter(m -> !m.isEmpty()) + .ifPresent(backLinks -> postBackLinks(ticketRQ, mondayClient, issueId, backLinks)); + + Ticket ticket = new Ticket(); + ticket.setId(issueId); + ticket.setSummary(name); + ticket.setTicketUrl( + Suppliers.formattedSupplier("{}/boards/{}/pulses/{}", url, boardId, issueId).get()); + return ticket; + } + + private String getIssueName(List fields) { + return fields.stream().filter(f -> MondayColumnId.NAME.matches(f.getId())) + .filter(f -> CollectionUtils.isNotEmpty(f.getValue())) + .filter(f -> f.getValue().stream().findFirst().isPresent()).findFirst() + .flatMap(f -> f.getValue().stream().findFirst()).orElseThrow( + () -> new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "Issue name not provided" + )); + } + + private String convertToIssueColumns(List fields) { + Map issueParams = issueParamsConverter.convert(fields); + return writeAsString(issueParams); + } + + private String writeAsString(Object object) { + try { + return objectMapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + LOGGER.error(e.getMessage(), e); + throw new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "Unable to convert columns: " + e.getMessage() + ); + } + } + + private void postBackLinks(PostTicketRQ ticketRQ, MondayClient mondayClient, String issueId, + Map backLinks) { + backLinks.forEach((id, link) -> testItemRepository.findById(id).ifPresent(item -> { + String mainUpdateBody = issueDescriptionProvider.provide(ticketRQ, item, link); + String sectionId = + mondayClient.createItemUpdateSection(issueId, mainUpdateBody).map(s -> s.id) + .orElseThrow(() -> new ReportPortalException( + ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "Error during description creation for item: " + item.getItemId() + )); + if (!ticketRQ.getIsIncludeLogs() && !ticketRQ.getIsIncludeScreenshots()) { + return; + } + ofNullable(item.getLaunchId()).ifPresent(launchId -> { + List logs = + logRepository.findAllUnderTestItemByLaunchIdAndTestItemIdsWithLimit(launchId, + List.of(item.getItemId()), ticketRQ.getNumberOfLogs() + ); + if (logs.isEmpty()) { + return; + } + LogSender logSender = logSenderProvider.provide(mondayClient); + logSender.send(logs, ticketRQ, issueId, sectionId); + }); + })); + } + + +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/command/RetrieveCreationParamsCommand.java b/src/main/java/com/epam/reportportal/extension/monday/command/RetrieveCreationParamsCommand.java new file mode 100644 index 0000000..76f1e64 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/command/RetrieveCreationParamsCommand.java @@ -0,0 +1,66 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.command; + +import static com.epam.reportportal.extension.monday.utils.ParamUtils.normalizeUrl; +import static com.epam.reportportal.rules.commons.validation.BusinessRule.expect; + +import com.epam.reportportal.extension.CommonPluginCommand; +import com.epam.reportportal.extension.monday.model.enums.MondayProperties; +import com.epam.reportportal.rules.exception.ErrorType; +import com.google.common.collect.Maps; +import java.util.Map; +import org.apache.commons.collections.MapUtils; +import org.jasypt.util.text.BasicTextEncryptor; + +/** + * @author Pavel Bortnik + */ +public class RetrieveCreationParamsCommand implements CommonPluginCommand> { + + private final BasicTextEncryptor textEncryptor; + + public RetrieveCreationParamsCommand(BasicTextEncryptor textEncryptor) { + this.textEncryptor = textEncryptor; + } + + @Override + public String getName() { + return "retrieveCreate"; + } + + @Override + public Map executeCommand(Map integrationParams) { + + expect(integrationParams, MapUtils::isNotEmpty).verify( + ErrorType.BAD_REQUEST_ERROR, "No integration params provided"); + + Map resultParams = + Maps.newHashMapWithExpectedSize(MondayProperties.values().length); + + resultParams.put(MondayProperties.URL.getName(), + normalizeUrl(MondayProperties.URL.getParam(integrationParams))); + resultParams.put( + MondayProperties.PROJECT.getName(), MondayProperties.PROJECT.getParam(integrationParams)); + resultParams.put(MondayProperties.API_TOKEN.getName(), + textEncryptor.encrypt(MondayProperties.API_TOKEN.getParam(integrationParams)) + ); + + return resultParams; + } + +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/command/RetrieveUpdateParamsCommand.java b/src/main/java/com/epam/reportportal/extension/monday/command/RetrieveUpdateParamsCommand.java new file mode 100644 index 0000000..0f20aa2 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/command/RetrieveUpdateParamsCommand.java @@ -0,0 +1,59 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.command; + +import static com.epam.reportportal.extension.monday.utils.ParamUtils.normalizeUrl; + +import com.epam.reportportal.extension.CommonPluginCommand; +import com.epam.reportportal.extension.monday.model.enums.MondayProperties; +import com.google.common.collect.Maps; +import java.util.Map; +import java.util.Optional; +import org.jasypt.util.text.BasicTextEncryptor; + +/** + * @author Pavel Bortnik + */ +public class RetrieveUpdateParamsCommand implements CommonPluginCommand> { + + private final BasicTextEncryptor textEncryptor; + + public RetrieveUpdateParamsCommand(BasicTextEncryptor textEncryptor) { + this.textEncryptor = textEncryptor; + } + + @Override + public String getName() { + return "retrieveUpdated"; + } + + @Override + public Map executeCommand(Map integrationParams) { + Map resultParams = Maps.newHashMapWithExpectedSize(integrationParams.size()); + MondayProperties.URL.findParam(integrationParams) + .ifPresent(url -> resultParams.put(MondayProperties.URL.getName(), normalizeUrl(url))); + MondayProperties.PROJECT.findParam(integrationParams) + .ifPresent(boardId -> resultParams.put(MondayProperties.PROJECT.getName(), boardId)); + MondayProperties.API_TOKEN.findParam(integrationParams).ifPresent( + token -> resultParams.put(MondayProperties.API_TOKEN.getName(), + textEncryptor.encrypt(token) + )); + Optional.ofNullable(integrationParams.get("defectFormFields")) + .ifPresent(defectFormFields -> resultParams.put("defectFormFields", defectFormFields)); + return resultParams; + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/command/connection/TestConnectionCommand.java b/src/main/java/com/epam/reportportal/extension/monday/command/connection/TestConnectionCommand.java new file mode 100644 index 0000000..d93708a --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/command/connection/TestConnectionCommand.java @@ -0,0 +1,80 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.command.connection; + +import static com.epam.reportportal.rules.exception.ErrorType.BAD_REQUEST_ERROR; +import static com.epam.reportportal.rules.exception.ErrorType.UNABLE_INTERACT_WITH_INTEGRATION; +import static java.util.Optional.ofNullable; + +import com.epam.reportportal.extension.PluginCommand; +import com.epam.reportportal.extension.monday.client.MondayClient; +import com.epam.reportportal.extension.monday.client.MondayClientProvider; +import com.epam.reportportal.extension.monday.model.enums.MondayProperties; +import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.entity.integration.Integration; +import com.epam.ta.reportportal.entity.integration.IntegrationParams; +import java.util.Map; + +/** + * @author Pavel Bortnik + */ +public class TestConnectionCommand implements PluginCommand { + + private final MondayClientProvider mondayClientProvider; + + public TestConnectionCommand(MondayClientProvider mondayClientProvider) { + this.mondayClientProvider = mondayClientProvider; + } + + @Override + public String getName() { + return "testConnection"; + } + + @Override + public Boolean executeCommand(Integration integration, Map params) { + IntegrationParams integrationParams = ofNullable(integration.getParams()).orElseThrow( + () -> new ReportPortalException(UNABLE_INTERACT_WITH_INTEGRATION, + "Integration params are not specified." + )); + + String url = MondayProperties.URL.getParam(integrationParams); + + if (!url.startsWith("https://") || !url.contains(".monday.com")) { + throw new ReportPortalException(UNABLE_INTERACT_WITH_INTEGRATION, + "Invalid URL."); + } + + String boardId = MondayProperties.PROJECT.getParam(integrationParams); + + verifyBoardId(boardId); + + MondayClient mondayClient = mondayClientProvider.provide(integrationParams); + + return mondayClient.getBoard(boardId).map(b -> Boolean.TRUE).orElseThrow( + () -> new ReportPortalException(UNABLE_INTERACT_WITH_INTEGRATION, + "Board with provided id {} not found", boardId)); + } + + private void verifyBoardId(String boardId) { + try { + Long.parseLong(boardId); + } catch (NumberFormatException e) { + throw new ReportPortalException(BAD_REQUEST_ERROR, "Invalid Board ID"); + } + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/event/EventHandlerFactory.java b/src/main/java/com/epam/reportportal/extension/monday/event/EventHandlerFactory.java new file mode 100644 index 0000000..af66bad --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/event/EventHandlerFactory.java @@ -0,0 +1,24 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.event; + +import com.epam.reportportal.extension.monday.event.handler.EventHandler; + +public interface EventHandlerFactory { + + EventHandler getEventHandler(String key); +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/event/handler/EventHandler.java b/src/main/java/com/epam/reportportal/extension/monday/event/handler/EventHandler.java new file mode 100644 index 0000000..a573810 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/event/handler/EventHandler.java @@ -0,0 +1,22 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.event.handler; + +public interface EventHandler { + + void handle(T event); +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/event/handler/plugin/PluginLoadedEventHandler.java b/src/main/java/com/epam/reportportal/extension/monday/event/handler/plugin/PluginLoadedEventHandler.java new file mode 100644 index 0000000..8d4827f --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/event/handler/plugin/PluginLoadedEventHandler.java @@ -0,0 +1,67 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.event.handler.plugin; + +import com.epam.reportportal.extension.event.PluginEvent; +import com.epam.reportportal.extension.monday.event.handler.EventHandler; +import com.epam.reportportal.extension.monday.info.PluginInfoProvider; +import com.epam.ta.reportportal.dao.IntegrationRepository; +import com.epam.ta.reportportal.dao.IntegrationTypeRepository; +import com.epam.ta.reportportal.entity.integration.Integration; +import com.epam.ta.reportportal.entity.integration.IntegrationParams; +import com.epam.ta.reportportal.entity.integration.IntegrationType; +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; + +public class PluginLoadedEventHandler implements EventHandler { + + private final IntegrationTypeRepository integrationTypeRepository; + private final IntegrationRepository integrationRepository; + private final PluginInfoProvider pluginInfoProvider; + + public PluginLoadedEventHandler(IntegrationTypeRepository integrationTypeRepository, + IntegrationRepository integrationRepository, PluginInfoProvider pluginInfoProvider) { + this.integrationTypeRepository = integrationTypeRepository; + this.integrationRepository = integrationRepository; + this.pluginInfoProvider = pluginInfoProvider; + } + + @Override + public void handle(PluginEvent event) { + integrationTypeRepository.findByName(event.getPluginId()).ifPresent(integrationType -> { + createIntegration(event.getPluginId(), integrationType); + integrationTypeRepository.save(pluginInfoProvider.provide(integrationType)); + }); + } + + private void createIntegration(String name, IntegrationType integrationType) { + List integrations = integrationRepository.findAllGlobalByType(integrationType); + if (integrations.isEmpty()) { + Integration integration = new Integration(); + integration.setName(name); + integration.setType(integrationType); + integration.setCreationDate(Instant.now()); + integration.setEnabled(true); + integration.setCreator("SYSTEM"); + integration.setParams(new IntegrationParams(new HashMap<>())); + integrationRepository.save(integration); + } + } + +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/event/plugin/PluginEventHandlerFactory.java b/src/main/java/com/epam/reportportal/extension/monday/event/plugin/PluginEventHandlerFactory.java new file mode 100644 index 0000000..fa0b284 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/event/plugin/PluginEventHandlerFactory.java @@ -0,0 +1,49 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.event.plugin; + +import com.epam.reportportal.extension.event.PluginEvent; +import com.epam.reportportal.extension.monday.event.EventHandlerFactory; +import com.epam.reportportal.extension.monday.event.handler.EventHandler; +import com.epam.reportportal.extension.monday.event.handler.plugin.PluginLoadedEventHandler; +import com.epam.reportportal.extension.monday.info.PluginInfoProvider; +import com.epam.ta.reportportal.dao.IntegrationRepository; +import com.epam.ta.reportportal.dao.IntegrationTypeRepository; +import java.util.HashMap; +import java.util.Map; + +public class PluginEventHandlerFactory implements EventHandlerFactory { + + public static final String LOAD_KEY = "load"; + + private final Map> eventHandlerMapping; + + public PluginEventHandlerFactory(IntegrationTypeRepository integrationTypeRepository, + IntegrationRepository integrationRepository, PluginInfoProvider pluginInfoProvider) { + this.eventHandlerMapping = new HashMap<>(); + this.eventHandlerMapping.put(LOAD_KEY, + new PluginLoadedEventHandler(integrationTypeRepository, integrationRepository, + pluginInfoProvider + ) + ); + } + + @Override + public EventHandler getEventHandler(String key) { + return eventHandlerMapping.get(key); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/event/plugin/PluginEventListener.java b/src/main/java/com/epam/reportportal/extension/monday/event/plugin/PluginEventListener.java new file mode 100644 index 0000000..d10472c --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/event/plugin/PluginEventListener.java @@ -0,0 +1,47 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.event.plugin; + +import static java.util.Optional.ofNullable; + +import com.epam.reportportal.extension.event.PluginEvent; +import com.epam.reportportal.extension.monday.event.EventHandlerFactory; +import org.springframework.context.ApplicationListener; + +public class PluginEventListener implements ApplicationListener { + + private final String pluginId; + private final EventHandlerFactory pluginEventEventHandlerFactory; + + public PluginEventListener(String pluginId, + EventHandlerFactory pluginEventEventHandlerFactory) { + this.pluginId = pluginId; + this.pluginEventEventHandlerFactory = pluginEventEventHandlerFactory; + } + + @Override + public void onApplicationEvent(PluginEvent event) { + if (supports(event)) { + ofNullable(pluginEventEventHandlerFactory.getEventHandler(event.getType())).ifPresent( + pluginEventEventHandler -> pluginEventEventHandler.handle(event)); + } + } + + private boolean supports(PluginEvent event) { + return pluginId.equals(event.getPluginId()); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/info/PluginInfoProvider.java b/src/main/java/com/epam/reportportal/extension/monday/info/PluginInfoProvider.java new file mode 100644 index 0000000..e7c9032 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/info/PluginInfoProvider.java @@ -0,0 +1,8 @@ +package com.epam.reportportal.extension.monday.info; + +import com.epam.ta.reportportal.entity.integration.IntegrationType; + +public interface PluginInfoProvider { + + IntegrationType provide(IntegrationType integrationType); +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/info/impl/PluginInfoProviderImpl.java b/src/main/java/com/epam/reportportal/extension/monday/info/impl/PluginInfoProviderImpl.java new file mode 100644 index 0000000..82126a2 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/info/impl/PluginInfoProviderImpl.java @@ -0,0 +1,90 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.info.impl; + +import static java.util.Optional.ofNullable; + +import com.epam.reportportal.extension.monday.info.PluginInfoProvider; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.entity.integration.IntegrationType; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public class PluginInfoProviderImpl implements PluginInfoProvider { + + public static final Map PLUGIN_METADATA = new HashMap<>(); + private static final String BINARY_DATA_KEY = "binaryData"; + private static final String DESCRIPTION_KEY = "description"; + private static final String METADATA_KEY = "metadata"; + private static final String PLUGIN_DESCRIPTION = + "The integration provides an exchange of information between ReportPortal and the Monday, such as posting issues and linking issues, getting updates on their statuses."; + + static { + PLUGIN_METADATA.put("embedded", true); + PLUGIN_METADATA.put("multiple", true); + } + + private final String resourcesDir; + private final String propertyFile; + + public PluginInfoProviderImpl(String resourcesDir, String propertyFile) { + this.resourcesDir = resourcesDir; + this.propertyFile = propertyFile; + } + + @Override + public IntegrationType provide(IntegrationType integrationType) { + loadBinaryDataInfo(integrationType); + updateDescription(integrationType); + updateMetadata(integrationType); + return integrationType; + } + + private void loadBinaryDataInfo(IntegrationType integrationType) { + Map details = integrationType.getDetails().getDetails(); + if (ofNullable(details.get(BINARY_DATA_KEY)).isEmpty()) { + try (InputStream propertiesStream = Files.newInputStream( + Paths.get(resourcesDir, propertyFile))) { + Properties binaryDataProperties = new Properties(); + binaryDataProperties.load(propertiesStream); + Map binaryDataInfo = binaryDataProperties.entrySet().stream().collect( + HashMap::new, (map, entry) -> map.put(String.valueOf(entry.getKey()), + String.valueOf(entry.getValue()) + ), HashMap::putAll); + details.put(BINARY_DATA_KEY, binaryDataInfo); + } catch (IOException ex) { + throw new ReportPortalException(ErrorType.UNABLE_TO_LOAD_BINARY_DATA, ex.getMessage()); + } + } + } + + private void updateDescription(IntegrationType integrationType) { + Map details = integrationType.getDetails().getDetails(); + details.put(DESCRIPTION_KEY, PLUGIN_DESCRIPTION); + } + + private void updateMetadata(IntegrationType integrationType) { + Map details = integrationType.getDetails().getDetails(); + details.put(METADATA_KEY, PLUGIN_METADATA); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/model/enums/MondayColumnId.java b/src/main/java/com/epam/reportportal/extension/monday/model/enums/MondayColumnId.java new file mode 100644 index 0000000..0008791 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/model/enums/MondayColumnId.java @@ -0,0 +1,20 @@ +package com.epam.reportportal.extension.monday.model.enums; + +public enum MondayColumnId { + + NAME("name"); + + private final String value; + + MondayColumnId(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public boolean matches(String value) { + return this.value.equals(value); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/model/enums/MondayColumnType.java b/src/main/java/com/epam/reportportal/extension/monday/model/enums/MondayColumnType.java new file mode 100644 index 0000000..8346d24 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/model/enums/MondayColumnType.java @@ -0,0 +1,28 @@ +package com.epam.reportportal.extension.monday.model.enums; + +import java.util.Arrays; +import java.util.Optional; + +public enum MondayColumnType { + + LINK("link"), STATUS("status"); + + private final String value; + + MondayColumnType(String value) { + this.value = value; + } + + public static Optional of(String value) { + return Arrays.stream(values()).filter(t -> t.value.equals(value)).findFirst(); + } + + public String getValue() { + return value; + } + + public boolean matches(String value) { + return this.value.equals(value); + } + +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/model/enums/MondayProperties.java b/src/main/java/com/epam/reportportal/extension/monday/model/enums/MondayProperties.java new file mode 100644 index 0000000..64e464e --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/model/enums/MondayProperties.java @@ -0,0 +1,71 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.model.enums; + +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.entity.integration.IntegrationParams; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * @author Pavel Bortnik + */ +public enum MondayProperties { + + URL("url"), PROJECT("project"), API_TOKEN("apiToken"); + + private final String name; + + MondayProperties(String name) { + this.name = name; + } + + public Optional findParam(Map params) { + return Optional.ofNullable(params.get(this.name)).map(String::valueOf); + } + + public String getParam(Map params) { + return findParam(params).orElseThrow( + () -> new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "BTS parameter not provided: " + this.name + )); + } + + public Optional findParam(IntegrationParams params) { + return Optional.ofNullable(params.getParams().get(this.name)).map(o -> (String) o); + } + + public String getParam(IntegrationParams params) { + return findParam(params).orElseThrow( + () -> new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "BTS parameter not provided: " + this.name + )); + } + + public void setParam(IntegrationParams params, String value) { + if (null == params.getParams()) { + params.setParams(new HashMap<>()); + } + params.getParams().put(this.name, value); + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/model/payload/BoardSettings.java b/src/main/java/com/epam/reportportal/extension/monday/model/payload/BoardSettings.java new file mode 100644 index 0000000..a343ae9 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/model/payload/BoardSettings.java @@ -0,0 +1,17 @@ +package com.epam.reportportal.extension.monday.model.payload; + +import java.io.Serializable; +import java.util.Map; + +public class BoardSettings implements Serializable { + + private Map labels; + + public Map getLabels() { + return labels; + } + + public void setLabels(Map labels) { + this.labels = labels; + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/DefaultColumnConverter.java b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/DefaultColumnConverter.java new file mode 100644 index 0000000..05706ba --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/DefaultColumnConverter.java @@ -0,0 +1,12 @@ +package com.epam.reportportal.extension.monday.service.column.converter; + +import com.epam.reportportal.model.externalsystem.PostFormField; +import java.util.Optional; +import org.apache.commons.lang3.StringUtils; + +public class DefaultColumnConverter implements IssueColumnConverter { + @Override + public Optional convert(PostFormField field) { + return field.getValue().stream().filter(StringUtils::isNotBlank).findFirst(); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/DelegatingColumnConverter.java b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/DelegatingColumnConverter.java new file mode 100644 index 0000000..22340f4 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/DelegatingColumnConverter.java @@ -0,0 +1,28 @@ +package com.epam.reportportal.extension.monday.service.column.converter; + +import static java.util.Optional.ofNullable; + +import com.epam.reportportal.extension.monday.model.enums.MondayColumnType; +import com.epam.reportportal.model.externalsystem.PostFormField; +import java.util.Map; +import java.util.Optional; + +public class DelegatingColumnConverter implements IssueColumnConverter { + + private final Map delegateMapping; + + private final IssueColumnConverter fallbackConverter; + + public DelegatingColumnConverter(Map delegateMapping, + IssueColumnConverter fallbackConverter) { + this.delegateMapping = delegateMapping; + this.fallbackConverter = fallbackConverter; + } + + @Override + public Optional convert(PostFormField field) { + return MondayColumnType.of(field.getFieldType()) + .flatMap(t -> ofNullable(delegateMapping.get(t))).map(c -> c.convert(field)) + .orElseGet(() -> fallbackConverter.convert(field)); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/IssueColumnConverter.java b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/IssueColumnConverter.java new file mode 100644 index 0000000..09ab982 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/IssueColumnConverter.java @@ -0,0 +1,9 @@ +package com.epam.reportportal.extension.monday.service.column.converter; + +import com.epam.reportportal.model.externalsystem.PostFormField; +import java.util.Optional; + +public interface IssueColumnConverter { + + Optional convert(PostFormField field); +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/LinkColumnConverter.java b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/LinkColumnConverter.java new file mode 100644 index 0000000..913bfb1 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/LinkColumnConverter.java @@ -0,0 +1,13 @@ +package com.epam.reportportal.extension.monday.service.column.converter; + +import com.epam.reportportal.model.externalsystem.PostFormField; +import java.util.Optional; +import org.apache.commons.lang3.StringUtils; + +public class LinkColumnConverter implements IssueColumnConverter { + @Override + public Optional convert(PostFormField field) { + return field.getValue().stream().filter(StringUtils::isNotBlank).findFirst() + .map(v -> v + " " + v); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/StatusColumnConverter.java b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/StatusColumnConverter.java new file mode 100644 index 0000000..bdc5d83 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/service/column/converter/StatusColumnConverter.java @@ -0,0 +1,11 @@ +package com.epam.reportportal.extension.monday.service.column.converter; + +import com.epam.reportportal.model.externalsystem.PostFormField; +import java.util.Optional; + +public class StatusColumnConverter implements IssueColumnConverter { + @Override + public Optional convert(PostFormField field) { + return field.getValue().stream().findFirst().map(v -> v.split(": ")[1]); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/service/issue/IssueDescriptionProvider.java b/src/main/java/com/epam/reportportal/extension/monday/service/issue/IssueDescriptionProvider.java new file mode 100644 index 0000000..fdebe1d --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/service/issue/IssueDescriptionProvider.java @@ -0,0 +1,38 @@ +package com.epam.reportportal.extension.monday.service.issue; + +import static com.epam.reportportal.rules.commons.validation.Suppliers.formattedSupplier; +import static java.util.Optional.ofNullable; + +import com.epam.reportportal.model.externalsystem.PostTicketRQ; +import com.epam.ta.reportportal.entity.item.TestItem; +import org.apache.commons.lang3.StringUtils; + +public class IssueDescriptionProvider { + + public static final String BACK_LINK_TITLE = "Back link to Report Portal"; + public static final String COMMENTS_TITLE = "Test Item comments:"; + + public String provide(PostTicketRQ ticketRQ, TestItem item, String link) { + StringBuilder descriptionBuilder = new StringBuilder(); + if (StringUtils.isNotBlank(link)) { + descriptionBuilder.append(formattedSupplier( + "

{}

", link, + BACK_LINK_TITLE + ).get()); + } + if (ticketRQ.getIsIncludeComments()) { + if (StringUtils.isNotBlank(link)) { + ofNullable(item.getItemResults()).flatMap(result -> ofNullable(result.getIssue())) + .ifPresent(issue -> { + if (StringUtils.isNotBlank(issue.getIssueDescription())) { + descriptionBuilder.append( + formattedSupplier("

{}

", COMMENTS_TITLE).get()) + .append(formattedSupplier("

{}

", issue.getIssueDescription()).get()); + } + }); + } + } + return descriptionBuilder.toString(); + + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/service/issue/converter/IssueParamsConverter.java b/src/main/java/com/epam/reportportal/extension/monday/service/issue/converter/IssueParamsConverter.java new file mode 100644 index 0000000..25de79b --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/service/issue/converter/IssueParamsConverter.java @@ -0,0 +1,28 @@ +package com.epam.reportportal.extension.monday.service.issue.converter; + +import com.epam.reportportal.extension.monday.model.enums.MondayColumnId; +import com.epam.reportportal.extension.monday.service.column.converter.IssueColumnConverter; +import com.epam.reportportal.model.externalsystem.PostFormField; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.commons.collections4.CollectionUtils; + +public class IssueParamsConverter { + + private final IssueColumnConverter issueColumnConverter; + + public IssueParamsConverter(IssueColumnConverter issueColumnConverter) { + this.issueColumnConverter = issueColumnConverter; + } + + public Map convert(List fields) { + Map issueParams = new HashMap<>(); + + fields.stream().filter(f -> !MondayColumnId.NAME.matches(f.getId())) + .filter(f -> CollectionUtils.isNotEmpty(f.getValue())).forEach( + f -> issueColumnConverter.convert(f).ifPresent(v -> issueParams.put(f.getId(), v))); + + return issueParams; + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/service/issue/log/sender/LogSender.java b/src/main/java/com/epam/reportportal/extension/monday/service/issue/log/sender/LogSender.java new file mode 100644 index 0000000..3e41787 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/service/issue/log/sender/LogSender.java @@ -0,0 +1,99 @@ +package com.epam.reportportal.extension.monday.service.issue.log.sender; + +import static com.epam.reportportal.rules.commons.validation.Suppliers.formattedSupplier; +import static com.epam.ta.reportportal.commons.EntityUtils.INSTANT_TO_LDT; +import static com.epam.ta.reportportal.commons.EntityUtils.TO_DATE; +import static java.util.Optional.ofNullable; + +import com.epam.reportportal.extension.monday.client.MondayClient; +import com.epam.reportportal.extension.monday.command.PostTicketCommand; +import com.epam.reportportal.model.externalsystem.PostTicketRQ; +import com.epam.reportportal.rules.exception.ErrorType; +import com.epam.reportportal.rules.exception.ReportPortalException; +import com.epam.ta.reportportal.binary.DataStoreService; +import com.epam.ta.reportportal.entity.attachment.Attachment; +import com.epam.ta.reportportal.entity.log.Log; +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LogSender { + + private static final Logger LOGGER = LoggerFactory.getLogger(PostTicketCommand.class); + + private static final String TEST_EXECUTION_LOG_TITLE = "Test execution log:"; + + private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("MM-dd-yyyy HH:mm:ss"); + + private final MondayClient mondayClient; + private final DataStoreService dataStoreService; + + public LogSender(MondayClient mondayClient, DataStoreService dataStoreService) { + this.mondayClient = mondayClient; + this.dataStoreService = dataStoreService; + } + + public void send(List logs, PostTicketRQ ticketRQ, String issueId, String sectionId) { + StringBuilder descriptionBuilder = new StringBuilder(); + descriptionBuilder.append( + formattedSupplier("

{}

", TEST_EXECUTION_LOG_TITLE).get()); + logs.forEach(log -> { + if (ticketRQ.getIsIncludeLogs()) { + descriptionBuilder.append("

").append(getFormattedMessage(log)).append("

"); + } + if (ticketRQ.getIsIncludeScreenshots()) { + ofNullable(log.getAttachment()).ifPresent(attachment -> { + sendWithAttachment(issueId, sectionId, descriptionBuilder.toString(), attachment); + descriptionBuilder.setLength(0); + }); + } + + }); + + if (descriptionBuilder.length() > 0) { + send(issueId, sectionId, descriptionBuilder.toString()); + } + } + + private String getFormattedMessage(Log log) { + StringBuilder messageBuilder = new StringBuilder(); + ofNullable(log.getLogTime()).ifPresent(logTime -> messageBuilder.append(" Time: ") + .append(DATE_FORMAT.format(INSTANT_TO_LDT.apply(logTime))).append(", ")); + ofNullable(log.getLogLevel()).ifPresent( + logLevel -> messageBuilder.append("Level: ").append(logLevel).append(", ")); + messageBuilder.append("Log: ").append(log.getLogMessage()); + return messageBuilder.toString(); + } + + private void send(String issueId, String sectionId, String body) { + mondayClient.createReply(issueId, sectionId, body).orElseThrow( + () -> new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, + "Unable to create Log in Reply" + )); + } + + private void sendWithAttachment(String issueId, String sectionId, String body, + Attachment attachment) { + mondayClient.createReply(issueId, sectionId, body).map(r -> r.id) + .ifPresent(replyId -> uploadAttachment(replyId, mondayClient, attachment)); + } + + private void uploadAttachment(String sectionId, MondayClient mondayClient, + Attachment attachment) { + Optional inputStreamOpt = dataStoreService.load(attachment.getFileId()); + if (inputStreamOpt.isPresent()) { + try (InputStream inputStream = inputStreamOpt.get()) { + mondayClient.uploadFile( + sectionId, inputStream, attachment.getFileName(), attachment.getContentType()); + } catch (IOException e) { + LOGGER.error(e.getMessage(), e); + throw new ReportPortalException(ErrorType.UNABLE_INTERACT_WITH_INTEGRATION, e.getMessage()); + } + } + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/service/issue/log/sender/LogSenderProvider.java b/src/main/java/com/epam/reportportal/extension/monday/service/issue/log/sender/LogSenderProvider.java new file mode 100644 index 0000000..f8fe80d --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/service/issue/log/sender/LogSenderProvider.java @@ -0,0 +1,17 @@ +package com.epam.reportportal.extension.monday.service.issue.log.sender; + +import com.epam.reportportal.extension.monday.client.MondayClient; +import com.epam.ta.reportportal.binary.DataStoreService; + +public class LogSenderProvider { + + private final DataStoreService dataStoreService; + + public LogSenderProvider(DataStoreService dataStoreService) { + this.dataStoreService = dataStoreService; + } + + public LogSender provide(MondayClient mondayClient) { + return new LogSender(mondayClient, dataStoreService); + } +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/utils/MemoizingSupplier.java b/src/main/java/com/epam/reportportal/extension/monday/utils/MemoizingSupplier.java new file mode 100644 index 0000000..a857a42 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/utils/MemoizingSupplier.java @@ -0,0 +1,51 @@ +/* + * Copyright 2021 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.epam.reportportal.extension.monday.utils; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Supplier; + +public class MemoizingSupplier implements Supplier { + + private final Supplier delegate; + + private AtomicBoolean initialized = new AtomicBoolean(false); + + private T value; + + public MemoizingSupplier(Supplier delegate) { + this.delegate = checkNotNull(delegate); + } + + @Override + public T get() { + if (!initialized.get()) { + synchronized (this) { + if (!initialized.get()) { + T t = delegate.get(); + value = t; + initialized.set(true); + return t; + } + } + } + return value; + } + +} diff --git a/src/main/java/com/epam/reportportal/extension/monday/utils/ParamUtils.java b/src/main/java/com/epam/reportportal/extension/monday/utils/ParamUtils.java new file mode 100644 index 0000000..49ce2b3 --- /dev/null +++ b/src/main/java/com/epam/reportportal/extension/monday/utils/ParamUtils.java @@ -0,0 +1,13 @@ +package com.epam.reportportal.extension.monday.utils; + +public class ParamUtils { + + + public static String normalizeUrl(String url) { + if (url.endsWith("/")) { + return url.substring(0, url.length() - 1); + } + return url; + } + +} diff --git a/src/main/resources/binary-data.properties b/src/main/resources/binary-data.properties new file mode 100644 index 0000000..21434ce --- /dev/null +++ b/src/main/resources/binary-data.properties @@ -0,0 +1,3 @@ +main=remoteEntity.js +metadata=metadata.json +icon=plugin-icon.svg \ No newline at end of file diff --git a/plugin/ui/src/common/css/fonts.scss b/src/main/resources/schema/001_schema_init.sql similarity index 100% rename from plugin/ui/src/common/css/fonts.scss rename to src/main/resources/schema/001_schema_init.sql diff --git a/ui.gradle b/ui.gradle new file mode 100644 index 0000000..f71a379 --- /dev/null +++ b/ui.gradle @@ -0,0 +1,14 @@ +node { + version = '20.11.0' + npmVersion = '10.2.4' + download = true + workDir = file("${project.buildDir}/ui") + nodeModulesDir = file("${project.projectDir}/ui") +} + +npm_run_build { + inputs.files fileTree("ui/src") + inputs.file 'ui/package.json' + inputs.file 'ui/package-lock.json' + outputs.dir 'ui/build' +} diff --git a/ui/.babelrc b/ui/.babelrc new file mode 100644 index 0000000..5cf038f --- /dev/null +++ b/ui/.babelrc @@ -0,0 +1,17 @@ +{ + "presets": [ + "@babel/preset-react", + [ + "@babel/preset-env", + { + "loose": true, + "shippedProposals": true + } + ] + ], + "plugins": [ + "@babel/plugin-transform-runtime", + ["@babel/plugin-proposal-decorators", { "legacy": true }], + ["@babel/plugin-proposal-class-properties", { "loose": true }] + ] +} diff --git a/plugin/ui/.editorconfig b/ui/.editorconfig similarity index 81% rename from plugin/ui/.editorconfig rename to ui/.editorconfig index 2f5cf9e..a89f144 100644 --- a/plugin/ui/.editorconfig +++ b/ui/.editorconfig @@ -5,11 +5,11 @@ root = true end_of_line = lf insert_final_newline = true -[*.ts] +[*.js] indent_style = space indent_size = 2 -[*.tsx] +[*.jsx] indent_style = space indent_size = 2 @@ -17,10 +17,6 @@ indent_size = 2 indent_style = space indent_size = 2 -[*.scss] -indent_style = space -indent_size = 2 - [*.json] indent_style = space indent_size = 2 diff --git a/plugin/ui/.eslintignore b/ui/.eslintignore similarity index 61% rename from plugin/ui/.eslintignore rename to ui/.eslintignore index b1a337a..6956c22 100644 --- a/plugin/ui/.eslintignore +++ b/ui/.eslintignore @@ -2,6 +2,3 @@ node_modules/* build package.json package-lock.json -*.js -src/**/*.scss -src/**/*.css diff --git a/ui/.eslintrc b/ui/.eslintrc new file mode 100644 index 0000000..e0f1e7b --- /dev/null +++ b/ui/.eslintrc @@ -0,0 +1,71 @@ +{ + "parser": "@babel/eslint-parser", + "extends": [ + "airbnb", + "plugin:prettier/recommended", + "plugin:react-hooks/recommended", + "prettier/react" + ], + "plugins": ["react", "jsx-a11y", "prettier", "babel"], + "settings": { + "import/resolver": { + "webpack": { + "config": "webpack.config.js" + } + } + }, + "env": { + "browser": true, + "jest": true + }, + "globals": { + "React": true, + "Utils": true + }, + "rules": { + "prettier/prettier": 2, + "jsx-a11y/no-static-element-interactions": 0, + "no-unused-expressions": ["error", { "allowTernary": true, "allowShortCircuit": true }], + "jsx-a11y/label-has-for": ["error", { "required": { "some": ["nesting", "id"] } }], + "jsx-a11y/tabindex-no-positive": 0, + "jsx-a11y/no-noninteractive-tabindex": 0, + "jsx-a11y/anchor-is-valid": 0, + "jsx-a11y/control-has-associated-label": 0, + "import/prefer-default-export": 0, + "import/no-extraneous-dependencies": 0, + "react/no-unused-prop-types": 0, + "react/react-in-jsx-scope": 0, + "react/forbid-prop-types": 0, + "react/jsx-no-target-blank": 0, + "react/destructuring-assignment": 0, + "react/static-property-placement": 0, + "react/jsx-props-no-spreading": 0, + "react/prop-types": 0, + "no-restricted-globals": 0, + "prefer-destructuring": 0, + "react/jsx-curly-brace-presence": 0, + "react/no-access-state-in-setstate": 0, + "react/state-in-constructor": 0, + "react/jsx-fragments": 0, + "import/no-cycle": 0, + "import/named": 0, + "no-else-return": 0, + "react/button-has-type": 0, + "lines-between-class-members": 0, + "react/default-props-match-prop-types": 0, + "react/require-default-props": 0, + "jsx-a11y/click-events-have-key-events": 0, + "jsx-a11y/mouse-events-have-key-events": 0, + "react/no-unused-state": 0, + "react/sort-comp": 0, + "import/no-useless-path-segments": 0, + "no-invalid-this": 0, + "prefer-object-spread": 0, + "react/function-component-definition": 0 + }, + "parserOptions": { + "ecmaFeatures": { + "legacyDecorators": true + } + } +} diff --git a/plugin/ui/.gitignore b/ui/.gitignore similarity index 100% rename from plugin/ui/.gitignore rename to ui/.gitignore diff --git a/ui/.prettierrc b/ui/.prettierrc new file mode 100644 index 0000000..3c41168 --- /dev/null +++ b/ui/.prettierrc @@ -0,0 +1,6 @@ +{ + "arrowParens": "always", + "singleQuote": true, + "trailingComma": "all", + "printWidth": 100 +} diff --git a/plugin/ui/package-lock.json b/ui/package-lock.json similarity index 62% rename from plugin/ui/package-lock.json rename to ui/package-lock.json index 9a61b8a..51a58c2 100644 --- a/plugin/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,63 +1,47 @@ { - "name": "plugin-template", + "name": "plugin-bts-monday", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "plugin-template", + "name": "plugin-bts-monday", "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "classnames": "2.3.1", - "html-react-parser": "5.1.1", - "moment": "2.29.4", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-redux": "8.1.3", - "react-tracking": "9.2.1", - "redux-form": "8.3.10" + "react": "17.0.2", + "react-dom": "17.0.2", + "react-redux": "7.2.8" }, "devDependencies": { - "@types/node": "^18.11.18", - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "@typescript-eslint/eslint-plugin": "^5.33.1", - "@typescript-eslint/parser": "^5.33.1", - "copy-webpack-plugin": "^9.1.0", - "css-loader": "^6.7.1", - "eslint": "^8.22.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-prettier": "^8.3.0", - "eslint-import-resolver-webpack": "^0.13.2", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-jsx-a11y": "^6.5.1", + "@babel/core": "^7.23.3", + "@babel/eslint-parser": "7.23.10", + "@babel/plugin-proposal-class-properties": "7.18.6", + "@babel/plugin-proposal-decorators": "7.23.3", + "@babel/plugin-transform-runtime": "7.23.3", + "@babel/preset-env": "7.23.3", + "@babel/preset-react": "7.23.3", + "@babel/runtime": "^7.23.2", + "babel-loader": "^8.3.0", + "copy-webpack-plugin": "^11.0.0", + "eslint": "8.56.0", + "eslint-config-airbnb": "19.0.4", + "eslint-config-prettier": "^6.15.0", + "eslint-import-resolver-webpack": "0.13.8", + "eslint-plugin-babel": "5.3.1", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-jsx-a11y": "6.8.0", "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-simple-import-sort": "^9.0.0", - "eslint-webpack-plugin": "^3.2.0", - "fork-ts-checker-webpack-plugin": "^7.3.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-webpack-plugin": "^4.0.1", "husky": "^7.0.4", "lint-staged": "^12.1.7", "node-static": "^0.7.11", - "postcss-loader": "^6.2.1", "prettier": "^2.5.1", - "sass": "^1.49.11", - "sass-loader": "^12.5.0", - "sass-resources-loader": "^2.2.4", - "style-loader": "^3.3.1", "svg-inline-loader": "^0.8.2", - "ts-loader": "^9.4.2", - "ts-node": "^10.9.1", - "typescript": "^4.9.4", - "webpack": "5.75.0", - "webpack-cli": "4.10.0" - }, - "engines": { - "node": ">=20.11.0", - "npm": ">=10.2.4" + "webpack": "^5.89.0", + "webpack-cli": "^4.10.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -69,6 +53,19 @@ "node": ">=0.10.0" } }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", @@ -82,192 +79,1833 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/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==", + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz", + "integrity": "sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==", + "dev": true, + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", + "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "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.23.3", + "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.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.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==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "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-decorators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.3.tgz", + "integrity": "sha512-u8SwzOcP0DYSsa++nHd/9exlHb0NAlHCb890qtZZbSwPX2bFv8LBEztxwN7Xg/dS8oAFFidhrI9PBcLBJSkGRQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "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-decorators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", + "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "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.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-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-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.3.tgz", + "integrity": "sha512-XcQ3X58CKBdBnnZpPaQjgVMePsXtSZzHoku70q9tUAQp02ggPQNM04BF3RvlW1GSM/McbSOQAzEK4MXbS7/JFg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/code-frame/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==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/code-frame/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==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/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/@babel/code-frame/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, + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/code-frame/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==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/code-frame/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==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/highlight/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/@babel/highlight/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/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/highlight/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, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@babel/template": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "node_modules/@babel/traverse": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "dev": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, "node_modules/@discoveryjs/json-ext": { @@ -294,6 +1932,18 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", @@ -326,10 +1976,37 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -346,65 +2023,154 @@ "minimatch": "^3.0.5" }, "engines": { - "node": ">=10.10.0" + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@jest/types/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/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@jest/types/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, - "engines": { - "node": ">=12.22" + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": ">=8" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "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" @@ -427,13 +2193,22 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "eslint-scope": "5.1.1" } }, "node_modules/@nodelib/fs.scandir": { @@ -471,34 +2246,16 @@ "node": ">= 8" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@types/eslint": { - "version": "8.56.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", - "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -530,6 +2287,30 @@ "hoist-non-react-statics": "^3.3.0" } }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -543,42 +2324,38 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.19.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz", - "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==", + "version": "20.11.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", + "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true - }, "node_modules/@types/prop-types": { "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "18.2.63", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.63.tgz", - "integrity": "sha512-ppaqODhs15PYL2nGUOaOu2RSCCB4Difu4UFrP4I3NHLloXC/ESQzQMi9nvjfT1+rudd0d2L3fQPJxRSey+rGlQ==", + "version": "18.2.55", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", + "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, - "node_modules/@types/react-dom": { - "version": "18.2.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", - "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", - "devOptional": true, + "node_modules/@types/react-redux": { + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", "dependencies": { - "@types/react": "*" + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" } }, "node_modules/@types/scheduler": { @@ -586,204 +2363,20 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.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/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.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.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.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.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.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.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "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.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.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/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "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" + "@types/yargs-parser": "*" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.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/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", @@ -792,148 +2385,148 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -1015,15 +2608,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -1116,18 +2700,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1138,39 +2710,17 @@ } }, "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/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "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": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1221,15 +2771,6 @@ "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.filter": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", @@ -1250,34 +2791,15 @@ } }, "node_modules/array.prototype.find": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.2.tgz", - "integrity": "sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", - "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.2.tgz", + "integrity": "sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1338,18 +2860,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", @@ -1400,12 +2910,6 @@ "node": ">=8" } }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -1416,13 +2920,10 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -1448,6 +2949,80 @@ "dequal": "^2.0.3" } }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.5.0", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1463,15 +3038,6 @@ "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1495,9 +3061,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "dev": true, "funding": [ { @@ -1514,8 +3080,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -1533,16 +3099,15 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", + "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "get-intrinsic": "^1.2.3", + "set-function-length": "^1.2.0" }, "engines": { "node": ">= 0.4" @@ -1561,9 +3126,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001594", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", - "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", + "version": "1.0.30001584", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001584.tgz", + "integrity": "sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==", "dev": true, "funding": [ { @@ -1581,55 +3146,17 @@ ] }, "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/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/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==", + "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": { - "is-glob": "^4.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, "node_modules/chrome-trace-event": { @@ -1641,10 +3168,20 @@ "node": ">=6.0" } }, - "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/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/clean-stack": { "version": "2.2.0", @@ -1698,21 +3235,18 @@ } }, "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==", + "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.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "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==", + "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/colorette": { @@ -1739,6 +3273,12 @@ "node": "^12.20.0 || >=14" } }, + "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", @@ -1751,21 +3291,27 @@ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/copy-webpack-plugin": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", - "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "dependencies": { - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^11.0.3", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1", + "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -1775,56 +3321,50 @@ "webpack": "^5.1.0" } }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=10" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "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==", + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/css-loader": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", - "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -1832,30 +3372,33 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js-compat": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", + "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.2" }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "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, - "bin": { - "cssesc": "bin/cssesc" + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">= 8" } }, "node_modules/csstype": { @@ -1892,29 +3435,19 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", + "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -1943,15 +3476,6 @@ "node": ">=6" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1976,57 +3500,6 @@ "node": ">=6.0.0" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2034,9 +3507,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.692", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.692.tgz", - "integrity": "sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA==", + "version": "1.4.657", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.657.tgz", + "integrity": "sha512-On2ymeleg6QbRuDk7wNgDdXtNqlJLM2w4Agx1D/RiTmItiL+a9oq5p7HUa2ZtkAtGBe/kil2dq/7rPfkbe0r5w==", "dev": true }, "node_modules/emoji-regex": { @@ -2062,21 +3535,10 @@ "dependencies": { "graceful-fs": "^4.1.2", "memory-fs": "^0.2.0", - "tapable": "^0.1.8" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" + "tapable": "^0.1.8" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "engines": { + "node": ">=0.6" } }, "node_modules/envinfo": { @@ -2091,62 +3553,51 @@ "node": ">=4" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.3", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", - "safe-regex-test": "^1.0.3", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -2161,18 +3612,6 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", @@ -2183,46 +3622,42 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", - "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "define-properties": "^1.2.1", - "es-abstract": "^1.22.4", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", + "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", + "internal-slot": "^1.0.5", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" + "safe-array-concat": "^1.0.1" } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -2254,11 +3689,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" - }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -2269,28 +3699,25 @@ } }, "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==", + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -2375,40 +3802,19 @@ "eslint-plugin-import": "^2.25.2" } }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-config-airbnb-typescript": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", - "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", + "node_modules/eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", "dev": true, "dependencies": { - "eslint-config-airbnb-base": "^15.0.0" + "get-stdin": "^6.0.0" }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", - "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, "bin": { - "eslint-config-prettier": "bin/cli.js" + "eslint-config-prettier-check": "bin/cli.js" }, "peerDependencies": { - "eslint": ">=7.0.0" + "eslint": ">=3.14.1" } }, "node_modules/eslint-import-resolver-node": { @@ -2431,23 +3837,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.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-import-resolver-webpack": { "version": "0.13.8", "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.8.tgz", @@ -2483,6 +3872,23 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-webpack/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.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-import-resolver-webpack/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -2493,9 +3899,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -2518,6 +3924,21 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz", + "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": ">=4.0.0" + } + }, "node_modules/eslint-plugin-import": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", @@ -2570,15 +3991,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", @@ -2631,29 +4043,27 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", - "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", + "resolve": "^2.0.0-next.4", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" @@ -2686,22 +4096,30 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, "bin": { - "semver": "bin/semver.js" + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-simple-import-sort": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-9.0.0.tgz", - "integrity": "sha512-PtrLjyXP8kjRneWT1n0b99y/2Fyup37we7FVoWsI61/O7x4ztLohzhep/pxI/cYlECr/cQ2j6utckdvWpVwXNA==", + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0" + "engines": { + "node": ">=4.0.0" } }, "node_modules/eslint-scope": { @@ -2727,38 +4145,35 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "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": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=10" } }, "node_modules/eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.0.1.tgz", + "integrity": "sha512-fUFcXpui/FftGx3NzvWgLZXlLbu+m74sUxGEgxgoxYcUtkIQbS6SdNNZkS99m5ycb23TfoNYrDpp1k/CK5j6Hw==", "dev": true, "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", + "@types/eslint": "^8.37.0", + "jest-worker": "^29.5.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", + "eslint": "^8.0.0", "webpack": "^5.0.0" } }, @@ -2808,27 +4223,148 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "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": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" + } + }, + "node_modules/eslint/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://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/espree": { @@ -2848,6 +4384,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -3016,6 +4564,23 @@ "node": ">=8" } }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -3062,9 +4627,9 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/for-each": { @@ -3076,89 +4641,12 @@ "is-callable": "^1.1.3" } }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", - "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">=12.13.0", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "typescript": ">3.6.0", - "vue-template-compiler": "*", - "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "dev": true - }, "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.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -3195,6 +4683,15 @@ "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", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -3214,6 +4711,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -3227,14 +4733,13 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.1.tgz", + "integrity": "sha512-KmuibvwbWaM4BHcBRYwJfZ1JxyJeBwB8ct9YYu67SvYdbEIlcQ2e56dHxfbobqW38GXo8/zDFqJeGtHiVbWyQw==", "dev": true, "dependencies": { "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3282,18 +4787,12 @@ "dev": true }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "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, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/globalthis": { @@ -3312,20 +4811,19 @@ } }, "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", - "slash": "^3.0.0" + "slash": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3365,30 +4863,30 @@ } }, "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==", + "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": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, "engines": { "node": ">= 0.4" @@ -3425,9 +4923,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -3444,47 +4942,6 @@ "react-is": "^16.7.0" } }, - "node_modules/html-dom-parser": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-5.0.7.tgz", - "integrity": "sha512-2YD2/yB0QgrlkBIn0CsGaRXC89E1gtuPVpiOGC52NTzPCC83n0WMdGD+5q7lpcKqbCpnWValQbovuy/NI/0kag==", - "dependencies": { - "domhandler": "5.0.3", - "htmlparser2": "9.1.0" - } - }, - "node_modules/html-react-parser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-5.1.1.tgz", - "integrity": "sha512-L5VK0rKN3VM7uzRH+4wxAL9elvHuCNDjyWKKjcCDR+YWW5Qr7WWSK7+e627DcePVAFi5IMqc+rAU8j/1DpC/Tw==", - "dependencies": { - "domhandler": "5.0.3", - "html-dom-parser": "5.0.7", - "react-property": "2.0.2", - "style-to-js": "1.1.10" - }, - "peerDependencies": { - "react": "0.14 || 15 || 16 || 17 || 18" - } - }, - "node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -3509,18 +4966,6 @@ "url": "https://github.com/sponsors/typicode" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -3530,12 +4975,6 @@ "node": ">= 4" } }, - "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "devOptional": true - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -3605,11 +5044,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/inline-style-parser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", - "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==" - }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -3633,14 +5067,6 @@ "node": ">= 0.10" } }, - "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-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -3657,12 +5083,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -3690,18 +5110,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -3827,9 +5235,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "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" @@ -3883,11 +5291,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -3914,15 +5317,12 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "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.7" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4053,18 +5453,115 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/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/jest-util/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/jest-util/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/jest-util/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/jest-util/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/jest-util/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/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/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/jest-worker/node_modules/supports-color": { @@ -4099,6 +5596,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "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/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -4135,18 +5644,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -4180,15 +5677,6 @@ "node": ">=0.10.0" } }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -4229,12 +5717,6 @@ "node": ">=10" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, "node_modules/lint-staged": { "version": "12.5.0", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.5.0.tgz", @@ -4305,6 +5787,21 @@ } } }, + "node_modules/listr2/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/listr2/node_modules/cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -4321,6 +5818,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/listr2/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/listr2/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/listr2/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4405,7 +5920,14 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "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", @@ -4431,6 +5953,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update/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/log-update/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/log-update/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/log-update/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4503,33 +6058,27 @@ } }, "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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.4" + "semver": "^6.0.0" }, "engines": { - "node": ">= 4.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/memory-fs": { @@ -4626,62 +6175,24 @@ "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", "dev": true }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "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/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "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/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true - }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -4961,24 +6472,6 @@ "node": ">=6" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5021,237 +6514,100 @@ "node": ">=8" } }, - "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/pidtree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", - "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } + "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/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, "engines": { - "node": ">= 12.13.0" + "node": ">=8.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "node_modules/pidtree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", + "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" + "bin": { + "pidtree": "bin/pidtree.js" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=0.10" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "find-up": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=8" } }, - "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=8" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "icss-utils": "^5.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=6" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5337,26 +6693,28 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", "dependencies": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" }, "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==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "17.0.2" } }, "node_modules/react-is": { @@ -5364,78 +6722,34 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/react-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.2.tgz", - "integrity": "sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==" - }, "node_modules/react-redux": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", - "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", + "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/use-sync-external-store": "^0.0.3", + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", - "use-sync-external-store": "^1.0.0" + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" }, "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4 || ^5.0.0-beta.0" + "react": "^16.8.3 || ^17 || ^18" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, "react-dom": { "optional": true }, "react-native": { "optional": true - }, - "redux": { - "optional": true } } }, "node_modules/react-redux/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/react-tracking": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/react-tracking/-/react-tracking-9.2.1.tgz", - "integrity": "sha512-9ymMV2uXXfJTjwDoKjHajfoYhFGNie592H6tChe5Xew2ODohyrNAEc7AwNtZ2JODXNqvDApRpHwaVFYndKkdvQ==", - "dependencies": { - "deepmerge": "^4.2.2", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "prop-types": "^15.x", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/rechoir": { "version": "0.7.1", @@ -5449,65 +6763,14 @@ "node": ">= 0.10" } }, - "node_modules/rechoir/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.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/redux": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "peer": true, "dependencies": { "@babel/runtime": "^7.9.2" } }, - "node_modules/redux-form": { - "version": "8.3.10", - "resolved": "https://registry.npmjs.org/redux-form/-/redux-form-8.3.10.tgz", - "integrity": "sha512-Eeog8dJYUxCSZI/oBoy7VkprvMjj1lpUnHa3LwjVNZvYDNeiRZMoZoaAT+6nlK2YQ4aiBopKUMiLe4ihUOHCGg==", - "dependencies": { - "@babel/runtime": "^7.9.2", - "es6-error": "^4.1.1", - "hoist-non-react-statics": "^3.3.2", - "invariant": "^2.2.4", - "is-promise": "^2.1.0", - "lodash": "^4.17.15", - "prop-types": "^15.6.1", - "react-is": "^16.4.2" - }, - "engines": { - "node": ">=8.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/redux-form" - }, - "peerDependencies": { - "immutable": "^3.8.2 || ^4.0.0", - "react": "^16.4.2 || ^17.0.0 || ^18.0.0", - "react-redux": "^6.0.1 || ^7.0.0 || ^8.0.0", - "redux": "^3.7.2 || ^4.0.0" - }, - "peerDependenciesMeta": { - "immutable": { - "optional": true - } - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", @@ -5529,21 +6792,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -5552,6 +6841,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "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/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -5562,9 +6889,9 @@ } }, "node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -5723,13 +7050,13 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "is-regex": "^1.1.4" }, "engines": { @@ -5739,93 +7066,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sass": { - "version": "1.71.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", - "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/sass-resources-loader": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.5.tgz", - "integrity": "sha512-po8rfETH9cOQACWxubT/1CCu77KjxwRtCDm6QAXZH99aUHBydwSoxdIjC40SGp/dcS/FkSNJl0j1VEojGZqlvQ==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.1.0", - "glob": "^7.1.6", - "loader-utils": "^2.0.0" - } - }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "dependencies": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", @@ -5833,18 +7094,12 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/serialize-javascript": { @@ -5857,15 +7112,14 @@ } }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dev": true, "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", + "define-data-property": "^1.1.1", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" }, @@ -5874,15 +7128,14 @@ } }, "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "dev": true, "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", + "define-data-property": "^1.0.1", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5922,18 +7175,14 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "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.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5952,12 +7201,15 @@ "dev": true }, "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/slice-ansi": { @@ -5989,18 +7241,9 @@ } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6016,15 +7259,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -6185,48 +7419,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/style-to-js": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.10.tgz", - "integrity": "sha512-VC7MBJa+y0RZhpnLKDPmVRLRswsASLmixkiZ5R8xZpNT9VyjeRzwnXd2pBzAWdgSGv/pCNNH01gPCCUsB9exYg==", - "dependencies": { - "style-to-object": "1.0.5" - } - }, - "node_modules/style-to-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", - "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", - "dependencies": { - "inline-style-parser": "0.2.2" - } - }, "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==", + "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": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -6297,9 +7499,9 @@ } }, "node_modules/terser": { - "version": "5.28.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz", - "integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -6348,14 +7550,13 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/terser-webpack-plugin/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, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "engines": { + "node": ">=8" } }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { @@ -6372,6 +7573,24 @@ "node": ">= 10.13.0" } }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -6405,6 +7624,15 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "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", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "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", @@ -6417,91 +7645,6 @@ "node": ">=8.0" } }, - "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-loader/node_modules/enhanced-resolve": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", - "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ts-loader/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -6541,27 +7684,6 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "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/tsutils/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/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6575,9 +7697,9 @@ } }, "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==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { "node": ">=10" @@ -6587,30 +7709,29 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -6620,17 +7741,16 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -6640,38 +7760,19 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "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", @@ -6693,13 +7794,44 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "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.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { - "node": ">= 10.0.0" + "node": ">=4" } }, "node_modules/update-browserslist-db": { @@ -6741,26 +7873,6 @@ "punycode": "^2.1.0" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -6775,22 +7887,22 @@ } }, "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.90.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", + "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -6799,9 +7911,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -6909,16 +8021,10 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", - "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -6928,6 +8034,24 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/webpack/node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -7060,6 +8184,39 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7096,9 +8253,9 @@ "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==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/yaml": { @@ -7110,15 +8267,6 @@ "node": ">= 6" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..84dc5d7 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,62 @@ +{ + "name": "plugin-bts-monday", + "version": "1.0.0", + "description": "", + "main": "src/index.js", + "scripts": { + "build": "webpack --mode=production", + "dev": "webpack --mode=development --watch", + "start": "node devServer.js", + "lint": "eslint \"src/**/*.{js,jsx}\"", + "format": "npm run lint -- --fix", + "precommit": "lint-staged", + "postcommit": "git update-index --again" + }, + "keywords": [], + "author": "ReportPortal.io", + "license": "Apache-2.0", + "dependencies": { + "react": "17.0.2", + "react-dom": "17.0.2", + "react-redux": "7.2.8" + }, + "devDependencies": { + "@babel/core": "^7.23.3", + "@babel/eslint-parser": "7.23.10", + "@babel/plugin-proposal-class-properties": "7.18.6", + "@babel/plugin-proposal-decorators": "7.23.3", + "@babel/plugin-transform-runtime": "7.23.3", + "@babel/preset-env": "7.23.3", + "@babel/preset-react": "7.23.3", + "@babel/runtime": "^7.23.2", + "babel-loader": "^8.3.0", + "copy-webpack-plugin": "^11.0.0", + "husky": "^7.0.4", + "lint-staged": "^12.1.7", + "eslint": "8.56.0", + "eslint-config-airbnb": "19.0.4", + "eslint-config-prettier": "^6.15.0", + "eslint-import-resolver-webpack": "0.13.8", + "eslint-webpack-plugin": "^4.0.1", + "eslint-plugin-babel": "5.3.1", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-jsx-a11y": "6.8.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0", + "node-static": "^0.7.11", + "prettier": "^2.5.1", + "svg-inline-loader": "^0.8.2", + "webpack": "^5.89.0", + "webpack-cli": "^4.10.0" + }, + "lint-staged": { + "*.{js,jsx}": [ + "npm run format", + "git add" + ] + }, + "browserslist": [ + "defaults" + ] +} diff --git a/ui/src/components/constans.js b/ui/src/components/constans.js new file mode 100644 index 0000000..dad266c --- /dev/null +++ b/ui/src/components/constans.js @@ -0,0 +1,6 @@ +export const LABELS = { + INTEGRATION_NAME: 'Integration Name', + URL: 'Link to BTS', + BOARD_ID: 'Board ID in BTS', + TOKEN: 'API Token', +}; diff --git a/ui/src/components/integrationFormFields/index.js b/ui/src/components/integrationFormFields/index.js new file mode 100644 index 0000000..6adab71 --- /dev/null +++ b/ui/src/components/integrationFormFields/index.js @@ -0,0 +1,5 @@ +import { IntegrationFormFields } from './integrationFormFields'; + +export { IntegrationFormFields }; + +export default IntegrationFormFields; diff --git a/ui/src/components/integrationFormFields/integrationFormFields.jsx b/ui/src/components/integrationFormFields/integrationFormFields.jsx new file mode 100644 index 0000000..9ccf80d --- /dev/null +++ b/ui/src/components/integrationFormFields/integrationFormFields.jsx @@ -0,0 +1,71 @@ +import React, { useEffect } from 'react'; +import { LABELS } from '../constans'; + +export const IntegrationFormFields = (props) => { + const { initialize, disabled, initialData, updateMetaData, ...extensionProps } = props; + const { + components: { FieldErrorHint, FieldElement, FieldText, FieldTextFlex }, + validators: { requiredField, btsUrl, btsBoardId, btsIntegrationName }, + constants: { SECRET_FIELDS_KEY }, + } = extensionProps; + + useEffect(() => { + initialize(initialData); + updateMetaData({ + [SECRET_FIELDS_KEY]: ['apiToken'], + }); + }, []); + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/ui/src/components/integrationSettings/index.js b/ui/src/components/integrationSettings/index.js new file mode 100644 index 0000000..28585af --- /dev/null +++ b/ui/src/components/integrationSettings/index.js @@ -0,0 +1,5 @@ +import { IntegrationSettings } from './integrationSettings'; + +export { IntegrationSettings }; + +export default IntegrationSettings; diff --git a/ui/src/components/integrationSettings/integrationSettings.jsx b/ui/src/components/integrationSettings/integrationSettings.jsx new file mode 100644 index 0000000..aac74af --- /dev/null +++ b/ui/src/components/integrationSettings/integrationSettings.jsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { useDispatch } from 'react-redux'; +import { LABELS } from '../constans'; + +export const IntegrationSettings = (props) => { + const { data, goToPreviousPage, onUpdate, isGlobal, ...extensionProps } = props; + const { + actions: { showModalAction, hideModalAction }, + components: { + IntegrationSettings: IntegrationSettingsContainer, + BtsAuthFieldsInfo, + BtsPropertiesForIssueForm, + }, + utils: { getDefectFormFields }, + constants: { BTS_FIELDS_FORM }, + } = extensionProps; + + const dispatch = useDispatch(); + + const fieldsConfig = [ + { + value: data.integrationParameters.url, + message: LABELS.URL, + }, + { + value: data.integrationParameters.project, + message: LABELS.BOARD_ID, + }, + ]; + + const getConfirmationFunc = (testConnection) => (integrationData, integrationMetaData) => { + onUpdate( + integrationData, + () => { + dispatch(hideModalAction()); + testConnection(); + }, + integrationMetaData, + ); + }; + + const editAuthorizationClickHandler = (testConnection) => { + const { + data: { name, integrationParameters, integrationType }, + } = props; + + dispatch( + showModalAction({ + id: 'addIntegrationModal', + data: { + isGlobal, + onConfirm: getConfirmationFunc(testConnection), + instanceType: integrationType.name, + customProps: { + initialData: { + ...integrationParameters, + integrationName: name, + }, + editAuthMode: true, + }, + }, + }), + ); + }; + + const getEditAuthConfig = () => ({ + content: , + onClick: editAuthorizationClickHandler, + }); + + const onSubmit = (integrationData, callback, metaData) => { + const { fields, checkedFieldsIds = {}, ...meta } = metaData; + const defectFormFields = getDefectFormFields(fields, checkedFieldsIds, integrationData); + + onUpdate({ defectFormFields }, callback, meta); + }; + + return ( + + ); +}; diff --git a/plugin/ui/src/index.ts b/ui/src/index.js similarity index 100% rename from plugin/ui/src/index.ts rename to ui/src/index.js diff --git a/ui/src/metadata.json b/ui/src/metadata.json new file mode 100644 index 0000000..9c8f202 --- /dev/null +++ b/ui/src/metadata.json @@ -0,0 +1,17 @@ +{ + "scope": "Monday", + "extensions": [ + { + "name": "integrationFormFields", + "title": "Monday plugin fields", + "type": "uiExtension:integrationFormFields", + "moduleName": "./integrationFormFields" + }, + { + "name": "integrationSettings", + "title": "Monday plugin settings", + "type": "uiExtension:integrationSettings", + "moduleName": "./integrationSettings" + } + ] +} diff --git a/ui/src/plugin-icon.svg b/ui/src/plugin-icon.svg new file mode 100644 index 0000000..709e82a --- /dev/null +++ b/ui/src/plugin-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ui/webpack.config.js b/ui/webpack.config.js new file mode 100644 index 0000000..723a5a8 --- /dev/null +++ b/ui/webpack.config.js @@ -0,0 +1,74 @@ +const path = require('path'); +const CopyPlugin = require('copy-webpack-plugin'); +const ESLintWebpackPlugin = require('eslint-webpack-plugin'); +const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); +const pjson = require('./package.json'); + +const config = { + entry: ['./src/index.js'], + output: { + path: path.resolve(__dirname, 'build/public'), // compile to 'build/public' to allow public access to plugin resources + filename: '[name].app.[contenthash:8].js', + publicPath: 'auto', + clean: true, + }, + module: { + rules: [ + { + test: /\.(js|jsx)$/, + use: 'babel-loader', + exclude: /node_modules/, + }, + { + test: /\.svg$/, + loader: 'svg-inline-loader', + }, + ], + }, + resolve: { + extensions: ['.js', '.jsx'], + alias: { + components: path.resolve(__dirname, 'src/components'), + }, + }, + plugins: [ + new ESLintWebpackPlugin({ + context: './src', + extensions: ['.js', '.jsx'], + threads: true, + }), + new ModuleFederationPlugin({ + name: 'Monday', + filename: `remoteEntity.js`, + shared: { + react: { + import: 'react', + shareKey: 'react', + shareScope: 'default', + singleton: true, + requiredVersion: pjson.dependencies.react, + }, + 'react-dom': { + singleton: true, + requiredVersion: pjson.dependencies['react-dom'], + }, + 'react-redux': { + singleton: true, + requiredVersion: pjson.dependencies['react-redux'], + }, + }, + exposes: { + './integrationSettings': './src/components/integrationSettings', + './integrationFormFields': './src/components/integrationFormFields', + }, + }), + new CopyPlugin({ + patterns: [ + { from: path.resolve(__dirname, './src/metadata.json') }, + { from: path.resolve(__dirname, './src/plugin-icon.svg') }, + ], + }), + ], +}; + +module.exports = config;