diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 21080d06c45..a7dddbfd65c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,20 +1,50 @@ version: 2 updates: -- package-ecosystem: maven - directory: "/cnf" - schedule: - interval: weekly - open-pull-requests-limit: 10 - target-branch: develop -- package-ecosystem: npm - directory: "/ui" - schedule: - interval: weekly - open-pull-requests-limit: 10 - target-branch: develop -- package-ecosystem: "github-actions" - directory: "/.github/workflows" - schedule: - interval: "weekly" - open-pull-requests-limit: 10 - target-branch: develop + - package-ecosystem: maven + directory: "/cnf" + schedule: + interval: weekly + open-pull-requests-limit: 10 + target-branch: develop + groups: + influxdb: + patterns: + - "com.influxdb:*" + + - package-ecosystem: npm + directory: "/ui" + schedule: + interval: weekly + open-pull-requests-limit: 10 + target-branch: develop + groups: + angular: + patterns: + - "@angular/*" + capacitor: + patterns: + - "@capacitor/*" + ionic-native: + patterns: + - "@ionic-native/*" + ngx-formly: + patterns: + - "@ngx-formly/*" + karma: + patterns: + - "karma-*" + - "karma" + eslint: + patterns: + - "@angular-eslint/*" + - "@stylistic/eslint-plugin" + - "@typescript-eslint/*" + - "eslint-*" + - "eslint" + + - package-ecosystem: "github-actions" + directory: "/.github/workflows" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 + target-branch: develop diff --git a/.gradle-wrapper/gradle-wrapper.jar b/.gradle-wrapper/gradle-wrapper.jar index e6441136f3d..2c3521197d7 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 09523c0e549..9355b415575 100644 --- a/.gradle-wrapper/gradle-wrapper.properties +++ b/.gradle-wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/.woodpecker/ui-build.yml b/.woodpecker/ui-build.yml new file mode 100644 index 00000000000..224fc19ad14 --- /dev/null +++ b/.woodpecker/ui-build.yml @@ -0,0 +1,80 @@ +variables: + - &sftp-settings + server: ${CACHE_SERVER} + username: user + password: pass + ignore_branch: true + port: 2222 + path: /cache + mount: + - cache + + - &rsync-settings + user: fenecon-docs + hosts: + - ${ARTIFACT_SERVER} + port: 22 + key: + from_secret: ssh_key_intranet + args: '-v' + + - &main-build + - branch: [main, develop] + - evaluate: 'CI_COMMIT_MESSAGE contains "[APP]"' + - path: + include: ['.woodpecker/ui-build.yml'] + on_empty: false + +when: + event: + - push + +matrix: + THEME: + - fenecon + - heckert + +clone: + git: + when: *main-build + image: woodpeckerci/plugin-git + +steps: + restore-cache: + when: *main-build + image: appleboy/drone-sftp-cache + settings: + restore: true + <<: *sftp-settings + + prepare-environment: + when: *main-build + image: openems-bash + commands: + - export CACHE=$CI_WORKSPACE/cache + - mkdir -p $CI_WORKSPACE/cache build/target + - source tools/common.sh + - common_initialize_environment + - common_build_snapshot_version + - common_save_environment $CI_WORKSPACE/.openems-env + depends_on: [restore-cache] + + build-android-app: + when: *main-build + image: openems-android:20.32 + environment: + - THEME=${THEME} + commands: + - source $CI_WORKSPACE/.openems-env + - source tools/common.sh + - common_build_android_app + depends_on: [prepare-environment] + + refresh-dev-android: + when: *main-build + image: woodpeckerci/rsync:latest + settings: + <<: *rsync-settings + source: $CI_WORKSPACE/ui/android/target/ + target: /var/opt/develop/fems-artifacts/html/${CI_COMMIT_BRANCH} + depends_on: [build-android-app] diff --git a/build.gradle b/build.gradle index 72457c55315..82249fb14f2 100644 --- a/build.gradle +++ b/build.gradle @@ -344,12 +344,19 @@ task copyBundleReadmes() { */ task buildAntoraDocs(dependsOn: copyBundleReadmes) { group 'Documentation' - dependsOn ":doc:buildAntoraDocs" + + def source = file("doc/build/www") + def output = file("${buildDir}/www") + doLast { + output.deleteDir() copy { - from "doc/build/www" - into "${buildDir}/www" + from source + into output } + source.deleteDir() + + println("Built ${output}!") } } diff --git a/cnf/build.bnd b/cnf/build.bnd index b64f56b11b6..3a846baa49b 100644 --- a/cnf/build.bnd +++ b/cnf/build.bnd @@ -40,7 +40,7 @@ buildpath: \ org.osgi.service.metatype;version='1.4.1',\ org.osgi.service.metatype.annotations;version='1.4.1',\ org.osgi.util.promise;version='1.2.0',\ - com.google.guava;version='33.2.1.jre',\ + com.google.guava;version='33.3.0.jre',\ com.google.gson;version='2.11.0',\ testpath: \ diff --git a/cnf/pom.xml b/cnf/pom.xml index 5483a448725..fe40c659af6 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -38,7 +38,7 @@ com.google.guava guava - 33.2.1-jre + 33.3.0-jre com.google.guava @@ -142,7 +142,7 @@ io.reactivex.rxjava3 rxjava - 3.1.8 + 3.1.9 @@ -276,22 +276,22 @@ com.influxdb influxdb-client-java - 7.1.0 + 7.2.0 com.influxdb influxdb-client-core - 7.1.0 + 7.2.0 com.influxdb influxdb-client-utils - 7.1.0 + 7.2.0 com.influxdb flux-dsl - 7.1.0 + 7.2.0 org.java-websocket @@ -301,7 +301,7 @@ org.jetbrains.kotlin kotlin-osgi-bundle - 2.0.0 + 2.0.20 org.jetbrains.kotlinx @@ -393,13 +393,13 @@ org.owasp.encoder encoder - 1.2.3 + 1.3.1 org.postgresql postgresql - 42.7.3 + 42.7.4 diff --git a/doc/antora.yml b/doc/antora.yml index 44a009a71f4..e2a06e35be5 100644 --- a/doc/antora.yml +++ b/doc/antora.yml @@ -3,4 +3,4 @@ title: Open Energy Management System version: latest start_page: ROOT:introduction.adoc nav: -- modules/ROOT/nav.adoc + - modules/ROOT/nav.adoc diff --git a/doc/build.gradle b/doc/build.gradle index 4aaf5ee6b5a..100f1e0ffd9 100644 --- a/doc/build.gradle +++ b/doc/build.gradle @@ -12,11 +12,16 @@ node { task buildAntoraDocs(type: NodeTask) { dependsOn npmInstall script = file("build/node_modules/@antora/cli/bin/antora") - args = ["site.yml"] + args = ["--log-format=pretty", "site.yml"] + + def nojekyll = file("build/.nojekyll") + def source = file("build/CNAME") + def output = file("build/www") + doLast { copy { - from "build/.nojekyll", "build/CNAME" - into "build/www" + from nojekyll, source + into output } } } diff --git a/doc/build/site.yml b/doc/build/site.yml index 876e6391607..79e4816da4f 100644 --- a/doc/build/site.yml +++ b/doc/build/site.yml @@ -7,13 +7,13 @@ site: content: sources: - url: ./../../ - edit_url: https://github.com/OpenEMS/openems/tree/{refname}/{path} + edit_url: https://github.com/OpenEMS/openems/tree/develop/{path} branches: HEAD start_path: doc ui: bundle: - url: uibundle_openems.zip + url: https://github.com/OpenEMS/openems.io-theme/releases/latest/download/ui-bundle.zip output: dir: www diff --git a/doc/build/uibundle_openems.zip b/doc/build/uibundle_openems.zip deleted file mode 100644 index 2ed7adc83ec..00000000000 Binary files a/doc/build/uibundle_openems.zip and /dev/null differ diff --git a/doc/modules/ROOT/pages/backend/backend-to-backend.adoc b/doc/modules/ROOT/pages/backend/backend-to-backend.adoc index 16491e358e0..691211b8415 100644 --- a/doc/modules/ROOT/pages/backend/backend-to-backend.adoc +++ b/doc/modules/ROOT/pages/backend/backend-to-backend.adoc @@ -2,7 +2,6 @@ :imagesdir: ../assets/images :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/backend/build.adoc b/doc/modules/ROOT/pages/backend/build.adoc index 7cf4edef961..316eb0d3f3d 100644 --- a/doc/modules/ROOT/pages/backend/build.adoc +++ b/doc/modules/ROOT/pages/backend/build.adoc @@ -1,7 +1,6 @@ = Build OpenEMS Backend :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/backend/deploy.adoc b/doc/modules/ROOT/pages/backend/deploy.adoc index ec58f2f8b8d..b7c19ea5c83 100644 --- a/doc/modules/ROOT/pages/backend/deploy.adoc +++ b/doc/modules/ROOT/pages/backend/deploy.adoc @@ -1,7 +1,6 @@ = Deploy OpenEMS Backend :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/backend/metadata.adoc b/doc/modules/ROOT/pages/backend/metadata.adoc index 56c9ab86be9..87e353aed67 100644 --- a/doc/modules/ROOT/pages/backend/metadata.adoc +++ b/doc/modules/ROOT/pages/backend/metadata.adoc @@ -1,7 +1,6 @@ = Metadata :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/backend/service.adoc b/doc/modules/ROOT/pages/backend/service.adoc index 84649d21803..71d4f4f0548 100644 --- a/doc/modules/ROOT/pages/backend/service.adoc +++ b/doc/modules/ROOT/pages/backend/service.adoc @@ -1,7 +1,6 @@ = Backend Services :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/backend/timedata.adoc b/doc/modules/ROOT/pages/backend/timedata.adoc index a14d93d499c..63e91a38f0d 100644 --- a/doc/modules/ROOT/pages/backend/timedata.adoc +++ b/doc/modules/ROOT/pages/backend/timedata.adoc @@ -1,7 +1,6 @@ = Timedata :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/component-communication/index.adoc b/doc/modules/ROOT/pages/component-communication/index.adoc index dc7f6d96f78..19aeac40642 100644 --- a/doc/modules/ROOT/pages/component-communication/index.adoc +++ b/doc/modules/ROOT/pages/component-communication/index.adoc @@ -1,7 +1,6 @@ = Internal Component Communication :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :source-highlighter: highlight.js diff --git a/doc/modules/ROOT/pages/contribute/coding-guidelines.adoc b/doc/modules/ROOT/pages/contribute/coding-guidelines.adoc index b48fa6f3b90..065e9838276 100644 --- a/doc/modules/ROOT/pages/contribute/coding-guidelines.adoc +++ b/doc/modules/ROOT/pages/contribute/coding-guidelines.adoc @@ -2,7 +2,6 @@ :imagesdir: ../assets/images :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/contribute/documentation.adoc b/doc/modules/ROOT/pages/contribute/documentation.adoc index 28dd5955d85..6aca0cb0d57 100644 --- a/doc/modules/ROOT/pages/contribute/documentation.adoc +++ b/doc/modules/ROOT/pages/contribute/documentation.adoc @@ -2,7 +2,6 @@ :imagesdir: ../assets/images :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/coreconcepts.adoc b/doc/modules/ROOT/pages/coreconcepts.adoc index 43020e97f0a..bcf93d5031d 100644 --- a/doc/modules/ROOT/pages/coreconcepts.adoc +++ b/doc/modules/ROOT/pages/coreconcepts.adoc @@ -2,7 +2,6 @@ :imagesdir: ../assets/images :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/architecture.adoc b/doc/modules/ROOT/pages/edge/architecture.adoc index eb4296f3177..85c0555caa1 100644 --- a/doc/modules/ROOT/pages/edge/architecture.adoc +++ b/doc/modules/ROOT/pages/edge/architecture.adoc @@ -1,7 +1,6 @@ = Edge Architecture :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/bridge.adoc b/doc/modules/ROOT/pages/edge/bridge.adoc index 2a5834b147e..0189faeedfd 100644 --- a/doc/modules/ROOT/pages/edge/bridge.adoc +++ b/doc/modules/ROOT/pages/edge/bridge.adoc @@ -1,7 +1,6 @@ = Bridge :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/build.adoc b/doc/modules/ROOT/pages/edge/build.adoc index b1ed1ca6d62..134674cf001 100644 --- a/doc/modules/ROOT/pages/edge/build.adoc +++ b/doc/modules/ROOT/pages/edge/build.adoc @@ -1,7 +1,6 @@ = Build OpenEMS Edge :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/configuration.adoc b/doc/modules/ROOT/pages/edge/configuration.adoc index b5c5bd54dca..2a2609a9872 100644 --- a/doc/modules/ROOT/pages/edge/configuration.adoc +++ b/doc/modules/ROOT/pages/edge/configuration.adoc @@ -1,7 +1,6 @@ = Configuration :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/controller.adoc b/doc/modules/ROOT/pages/edge/controller.adoc index 3f6c203742a..f40d81e8436 100644 --- a/doc/modules/ROOT/pages/edge/controller.adoc +++ b/doc/modules/ROOT/pages/edge/controller.adoc @@ -1,7 +1,6 @@ = Controller :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/deploy.adoc b/doc/modules/ROOT/pages/edge/deploy.adoc index 2088195edbd..58059b150a3 100644 --- a/doc/modules/ROOT/pages/edge/deploy.adoc +++ b/doc/modules/ROOT/pages/edge/deploy.adoc @@ -1,7 +1,6 @@ = Deploy OpenEMS Edge :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/device_service.adoc b/doc/modules/ROOT/pages/edge/device_service.adoc index f732e9f1f2b..cb889ba7e38 100644 --- a/doc/modules/ROOT/pages/edge/device_service.adoc +++ b/doc/modules/ROOT/pages/edge/device_service.adoc @@ -1,7 +1,6 @@ = Controller :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/implement.adoc b/doc/modules/ROOT/pages/edge/implement.adoc index 7f899a872e0..79904339734 100644 --- a/doc/modules/ROOT/pages/edge/implement.adoc +++ b/doc/modules/ROOT/pages/edge/implement.adoc @@ -1,7 +1,6 @@ = Implementing a device :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc @@ -585,5 +584,5 @@ Same applies to the OpenEMS Backend for dynamically loading devices. Before continuing with the development and implementation, it's important to ensure that your module's tests are passing. This helps in maintaining the quality and functionality of the module. To check the tests of your module, execute the following Gradle command in the root directory of OpenEMS: ---- -Run ./gradlew :io.openems.edge.io.shelly:clean in the root Directory to check the tests of your module. +Run ./gradlew :io.openems.edge.io.shelly:test in the root Directory to check the tests of your module. ---- diff --git a/doc/modules/ROOT/pages/edge/nature.adoc b/doc/modules/ROOT/pages/edge/nature.adoc index eb096721f89..11450097b34 100644 --- a/doc/modules/ROOT/pages/edge/nature.adoc +++ b/doc/modules/ROOT/pages/edge/nature.adoc @@ -1,7 +1,6 @@ = Nature :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/scheduler.adoc b/doc/modules/ROOT/pages/edge/scheduler.adoc index eb5b7455113..dcd2bca0815 100644 --- a/doc/modules/ROOT/pages/edge/scheduler.adoc +++ b/doc/modules/ROOT/pages/edge/scheduler.adoc @@ -1,7 +1,6 @@ = Scheduler :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/edge/timedata.adoc b/doc/modules/ROOT/pages/edge/timedata.adoc index 907ed5a7629..a5296501417 100644 --- a/doc/modules/ROOT/pages/edge/timedata.adoc +++ b/doc/modules/ROOT/pages/edge/timedata.adoc @@ -1,7 +1,6 @@ = Timedata :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/gettingstarted.adoc b/doc/modules/ROOT/pages/gettingstarted.adoc index 266aff42053..345571185fe 100644 --- a/doc/modules/ROOT/pages/gettingstarted.adoc +++ b/doc/modules/ROOT/pages/gettingstarted.adoc @@ -2,7 +2,6 @@ :imagesdir: ../assets/images :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/intellij.adoc b/doc/modules/ROOT/pages/intellij.adoc index 40568594cdc..de14e909977 100644 --- a/doc/modules/ROOT/pages/intellij.adoc +++ b/doc/modules/ROOT/pages/intellij.adoc @@ -2,7 +2,6 @@ :imagesdir: ../assets/images :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/simulation/gitpod.adoc b/doc/modules/ROOT/pages/simulation/gitpod.adoc index d37f061be1f..544c17c9a2a 100644 --- a/doc/modules/ROOT/pages/simulation/gitpod.adoc +++ b/doc/modules/ROOT/pages/simulation/gitpod.adoc @@ -1,7 +1,6 @@ = Live-Demo on Gitpod :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/simulation/realtime.adoc b/doc/modules/ROOT/pages/simulation/realtime.adoc index 671e4c0d906..bd60b45d829 100644 --- a/doc/modules/ROOT/pages/simulation/realtime.adoc +++ b/doc/modules/ROOT/pages/simulation/realtime.adoc @@ -1,7 +1,6 @@ = Real-Time Simulation :imagesdir: ../../assets/images :sectnumlevels: 0 -:toc: :toclevels: 0 OpenEMS provides several virtual devices for testing and development. To set up the simulation-environment follow the setup guide in xref:gettingstarted.adoc[Getting Started]. The Apache Felix Web Console Configuration lists all OpenEMS component, but those which rely on external hardware can't be used for simulation. These are replaced by more generic components tagged with the "Simulator" prefix. Still, not all non-simulator devices rely on real hardware. Other components used in production, like Loggers, Controllers and Schedulers can be combined with the virtual devices to build a "living" system. diff --git a/doc/modules/ROOT/pages/simulation/ui-history.adoc b/doc/modules/ROOT/pages/simulation/ui-history.adoc index 60104e6ec96..06a7a8ba94f 100644 --- a/doc/modules/ROOT/pages/simulation/ui-history.adoc +++ b/doc/modules/ROOT/pages/simulation/ui-history.adoc @@ -1,7 +1,6 @@ = UI History Simulation :imagesdir: ../../assets/images :sectnumlevels: 0 -:toc: :toclevels: 0 Sometimes it can be useful to mock historic data in OpenEMS UI in order to take consistent screenshots or to visualize how a certain Controller would have behaved during a day. diff --git a/doc/modules/ROOT/pages/ui/architecture.adoc b/doc/modules/ROOT/pages/ui/architecture.adoc index f95264ac7d0..12fd248810a 100644 --- a/doc/modules/ROOT/pages/ui/architecture.adoc +++ b/doc/modules/ROOT/pages/ui/architecture.adoc @@ -1,7 +1,6 @@ = UI Architecture :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/ui/build.adoc b/doc/modules/ROOT/pages/ui/build.adoc index 4d935529531..77de45f42c2 100644 --- a/doc/modules/ROOT/pages/ui/build.adoc +++ b/doc/modules/ROOT/pages/ui/build.adoc @@ -1,7 +1,6 @@ = Build OpenEMS UI :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/ui/implementing-a-widget/introduction.adoc b/doc/modules/ROOT/pages/ui/implementing-a-widget/introduction.adoc index 443093fc988..951184a778f 100644 --- a/doc/modules/ROOT/pages/ui/implementing-a-widget/introduction.adoc +++ b/doc/modules/ROOT/pages/ui/implementing-a-widget/introduction.adoc @@ -1,7 +1,6 @@ = Implementing a UI-Widget :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/doc/modules/ROOT/pages/ui/setup-ide.adoc b/doc/modules/ROOT/pages/ui/setup-ide.adoc index 644868adcac..0954e583a72 100644 --- a/doc/modules/ROOT/pages/ui/setup-ide.adoc +++ b/doc/modules/ROOT/pages/ui/setup-ide.adoc @@ -2,7 +2,6 @@ :imagesdir: ../../assets/images :sectnums: :sectnumlevels: 4 -:toc: :toclevels: 4 :experimental: :keywords: AsciiDoc diff --git a/gradlew b/gradlew index 09d360f6284..951a127823d 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 922eb59f04f..237848b5ef1 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 1d0b0dde4e4..923ac4c24c1 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -62,7 +62,7 @@ Java-WebSocket;version='[1.5.4,1.5.5)',\ com.fasterxml.aalto-xml;version='[1.3.3,1.3.4)',\ com.google.gson;version='[2.11.0,2.11.1)',\ - com.google.guava;version='[33.2.1,33.2.2)',\ + com.google.guava;version='[33.3.0,33.3.1)',\ com.google.guava.failureaccess;version='[1.0.2,1.0.3)',\ com.squareup.okio;version='[3.9.0,3.9.1)',\ com.zaxxer.HikariCP;version='[5.1.0,5.1.1)',\ @@ -100,9 +100,11 @@ io.openems.wrapper.retrofit-converter-gson;version=snapshot,\ io.openems.wrapper.retrofit-converter-scalars;version=snapshot,\ io.openems.wrapper.retrofit2;version=snapshot,\ - io.reactivex.rxjava3.rxjava;version='[3.1.8,3.1.9)',\ + io.reactivex.rxjava3.rxjava;version='[3.1.9,3.1.10)',\ + org.apache.commons.commons-codec;version='[1.17.0,1.17.1)',\ org.apache.commons.commons-compress;version='[1.26.2,1.26.3)',\ - org.apache.commons.commons-csv;version='[1.10.0,1.10.1)',\ + org.apache.commons.commons-csv;version='[1.11.0,1.11.1)',\ + org.apache.commons.commons-io;version='[2.16.1,2.16.2)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.eventadmin;version='[1.6.4,1.6.5)',\ org.apache.felix.fileinstall;version='[3.7.4,3.7.5)',\ @@ -113,7 +115,7 @@ org.apache.felix.scr;version='[2.2.12,2.2.13)',\ org.apache.felix.webconsole;version='[5.0.6,5.0.7)',\ org.apache.felix.webconsole.plugins.ds;version='[2.3.0,2.3.1)',\ - org.jetbrains.kotlin.osgi-bundle;version='[2.0.0,2.0.1)',\ + org.jetbrains.kotlin.osgi-bundle;version='[2.0.20,2.0.21)',\ org.jsr-305;version='[3.0.2,3.0.3)',\ org.ops4j.pax.logging.pax-logging-api;version='[2.2.1,2.2.2)',\ org.ops4j.pax.logging.pax-logging-log4j2;version='[2.2.1,2.2.2)',\ @@ -121,7 +123,7 @@ org.osgi.service.jdbc;version='[1.1.0,1.1.1)',\ org.osgi.util.function;version='[1.2.0,1.2.1)',\ org.osgi.util.promise;version='[1.3.0,1.3.1)',\ - org.owasp.encoder;version='[1.2.3,1.2.4)',\ - org.postgresql.jdbc;version='[42.7.3,42.7.4)',\ + org.owasp.encoder;version='[1.3.1,1.3.2)',\ + org.postgresql.jdbc;version='[42.7.4,42.7.5)',\ reactive-streams;version='[1.0.4,1.0.5)',\ stax2-api;version='[4.2.2,4.2.3)' \ No newline at end of file diff --git a/io.openems.common/src/io/openems/common/OpenemsConstants.java b/io.openems.common/src/io/openems/common/OpenemsConstants.java index 14f7bd4db52..69b49e779ee 100644 --- a/io.openems.common/src/io/openems/common/OpenemsConstants.java +++ b/io.openems.common/src/io/openems/common/OpenemsConstants.java @@ -22,7 +22,7 @@ public class OpenemsConstants { *

* This is the month of the release. */ - public static final short VERSION_MINOR = 8; + public static final short VERSION_MINOR = 9; /** * The patch version of OpenEMS. diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 46f4680d966..c621ec4d944 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -200,7 +200,7 @@ com.fazecast.jSerialComm;version='[2.10.4,2.10.5)',\ com.ghgande.j2mod;version='[3.2.1,3.2.2)',\ com.google.gson;version='[2.11.0,2.11.1)',\ - com.google.guava;version='[33.2.1,33.2.2)',\ + com.google.guava;version='[33.3.0,33.3.1)',\ com.google.guava.failureaccess;version='[1.0.2,1.0.3)',\ com.squareup.okio;version='[3.9.0,3.9.1)',\ com.sun.jna;version='[5.14.0,5.14.1)',\ @@ -393,11 +393,13 @@ io.openems.wrapper.retrofit-converter-scalars;version=snapshot,\ io.openems.wrapper.retrofit2;version=snapshot,\ io.openems.wrapper.sdnotify;version=snapshot,\ - io.reactivex.rxjava3.rxjava;version='[3.1.8,3.1.9)',\ + io.reactivex.rxjava3.rxjava;version='[3.1.9,3.1.10)',\ javax.jmdns;version='[3.4.1,3.4.2)',\ javax.xml.soap-api;version='[1.4.0,1.4.1)',\ + org.apache.commons.commons-codec;version='[1.17.0,1.17.1)',\ org.apache.commons.commons-compress;version='[1.26.2,1.26.3)',\ - org.apache.commons.commons-csv;version='[1.10.0,1.10.1)',\ + org.apache.commons.commons-csv;version='[1.11.0,1.11.1)',\ + org.apache.commons.commons-io;version='[2.16.1,2.16.2)',\ org.apache.commons.math3;version='[3.6.1,3.6.2)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ org.apache.felix.eventadmin;version='[1.6.4,1.6.5)',\ @@ -414,7 +416,7 @@ org.eclipse.jetty.io;version='[9.4.28,9.4.29)',\ org.eclipse.jetty.util;version='[9.4.28,9.4.29)',\ org.eclipse.paho.mqttv5.client;version='[1.2.5,1.2.6)',\ - org.jetbrains.kotlin.osgi-bundle;version='[2.0.0,2.0.1)',\ + org.jetbrains.kotlin.osgi-bundle;version='[2.0.20,2.0.21)',\ org.jsoup;version='[1.18.1,1.18.2)',\ org.jsr-305;version='[3.0.2,3.0.3)',\ org.openmuc.jmbus;version='[3.3.0,3.3.1)',\ @@ -424,7 +426,7 @@ org.osgi.service.component;version='[1.5.1,1.5.2)',\ org.osgi.util.function;version='[1.2.0,1.2.1)',\ org.osgi.util.promise;version='[1.3.0,1.3.1)',\ - org.owasp.encoder;version='[1.2.3,1.2.4)',\ + org.owasp.encoder;version='[1.3.1,1.3.2)',\ reactive-streams;version='[1.0.4,1.0.5)',\ rrd4j;version='[3.9.0,3.9.1)',\ stax2-api;version='[4.2.2,4.2.3)' \ No newline at end of file diff --git a/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/currenthandler/AbstractMaxCurrentHandler.java b/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/currenthandler/AbstractMaxCurrentHandler.java index 98bd99b774d..e5406842d18 100644 --- a/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/currenthandler/AbstractMaxCurrentHandler.java +++ b/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/currenthandler/AbstractMaxCurrentHandler.java @@ -283,7 +283,7 @@ public synchronized int calculateCurrentLimit(Battery battery) { // Get the minimum limit of all limits in Ampere var limit = TypeUtils.min(TypeUtils.toDouble(bpBms), minCellVoltageLimit, maxCellVoltageLimit, - minCellTemperatureLimit, maxCellTemperatureLimit, maxIncreaseAmpereLimit, forceCurrent); + minCellTemperatureLimit, maxCellTemperatureLimit, maxSocLimit, maxIncreaseAmpereLimit, forceCurrent); // Set '0' to block charge/discharge? if ( diff --git a/io.openems.edge.controller.ess.gridoptimizedcharge/src/io/openems/edge/controller/ess/gridoptimizedcharge/ControllerEssGridOptimizedChargeImpl.java b/io.openems.edge.controller.ess.gridoptimizedcharge/src/io/openems/edge/controller/ess/gridoptimizedcharge/ControllerEssGridOptimizedChargeImpl.java index 8f323515b5e..aa727e503b4 100644 --- a/io.openems.edge.controller.ess.gridoptimizedcharge/src/io/openems/edge/controller/ess/gridoptimizedcharge/ControllerEssGridOptimizedChargeImpl.java +++ b/io.openems.edge.controller.ess.gridoptimizedcharge/src/io/openems/edge/controller/ess/gridoptimizedcharge/ControllerEssGridOptimizedChargeImpl.java @@ -145,8 +145,7 @@ private void updateConfig(Config config) { @Override public void run() throws OpenemsNamedException { - - if (!this.ess.isManaged()) { + if (!this.ess.isManaged() && this.config.mode() != Mode.OFF) { this._setConfiguredEssIsNotManaged(true); return; } diff --git a/io.openems.edge.evcs.spelsberg/readme.adoc b/io.openems.edge.evcs.spelsberg/readme.adoc index 00dc5bbffa0..5e972a157f1 100644 --- a/io.openems.edge.evcs.spelsberg/readme.adoc +++ b/io.openems.edge.evcs.spelsberg/readme.adoc @@ -5,7 +5,7 @@ Implementation of the Spelsberg SMART PRO charging station. This EVCS component implementation is not yet fully feature tested. Please consider it BETA quality. -=== Technical Data +== Technical Data * Rated current: 16A single and three phase * Charging cable: Type 2, up to 16A @@ -13,7 +13,7 @@ This EVCS component implementation is not yet fully feature tested. Please consi * Communication protocol: Modbus TCP -=== This implementation includes: +== This implementation includes: ** Reading of current and power from the EVCS ** Setting charge power/current via OpenEMS Edge EVCS Controller @@ -21,7 +21,7 @@ This EVCS component implementation is not yet fully feature tested. Please consi ** EVCS status updates ** Validation of Modbus TCP connection -=== Planned Features: +== Planned Features: ** Support for automatic phase shifting diff --git a/io.openems.edge.timedata.rrd4j/src/io/openems/edge/timedata/rrd4j/RecordWorker.java b/io.openems.edge.timedata.rrd4j/src/io/openems/edge/timedata/rrd4j/RecordWorker.java index fc51ebd37b5..f363bc0293b 100644 --- a/io.openems.edge.timedata.rrd4j/src/io/openems/edge/timedata/rrd4j/RecordWorker.java +++ b/io.openems.edge.timedata.rrd4j/src/io/openems/edge/timedata/rrd4j/RecordWorker.java @@ -202,8 +202,10 @@ public void collectData() { protected void forever() throws InterruptedException { final var record = this.records.take(); - if (this.config.readOnly() && this.config.debugMode()) { - this.log.info("Read-Only-Mode is activated. Not writing record: " + record.toString()); + if (this.config.readOnly()) { + if (this.config.debugMode()) { + this.log.info("Read-Only-Mode is activated. Not writing record: " + record.toString()); + } return; } diff --git a/io.openems.edge.timedata.rrd4j/src/io/openems/edge/timedata/rrd4j/Rrd4jReadHandler.java b/io.openems.edge.timedata.rrd4j/src/io/openems/edge/timedata/rrd4j/Rrd4jReadHandler.java index 6747b3b96d9..7ee00663374 100644 --- a/io.openems.edge.timedata.rrd4j/src/io/openems/edge/timedata/rrd4j/Rrd4jReadHandler.java +++ b/io.openems.edge.timedata.rrd4j/src/io/openems/edge/timedata/rrd4j/Rrd4jReadHandler.java @@ -4,6 +4,7 @@ import java.time.Instant; import java.time.ZoneOffset; import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Optional; import java.util.Set; @@ -479,10 +480,10 @@ public SortedMap> queryHis }, (t, u) -> t, TreeMap::new)); } - private static record Range(ZonedDateTime from, ZonedDateTime to) { + protected static record Range(ZonedDateTime from, ZonedDateTime to) { } - private static Stream streamRanges(// + protected static Stream streamRanges(// final ZonedDateTime from, // final ZonedDateTime to, // final Resolution resolution // @@ -493,7 +494,8 @@ private static Stream streamRanges(// final var builder = Stream.builder(); var fromRange = from; - var toRange = increase(from, resolution); + + var toRange = truncate(increase(from, resolution), resolution); if (toRange.isAfter(to)) { toRange = to; } @@ -501,7 +503,7 @@ private static Stream streamRanges(// while (!fromRange.equals(toRange)) { builder.accept(new Range(fromRange, toRange)); fromRange = toRange; - toRange = increase(toRange, resolution); + toRange = truncate(increase(fromRange, resolution), resolution); if (toRange.isAfter(to)) { toRange = to; } @@ -510,6 +512,18 @@ private static Stream streamRanges(// return builder.build(); } + private static ZonedDateTime truncate(ZonedDateTime date, Resolution resolution) { + return switch (resolution.getUnit()) { + case DAYS, HALF_DAYS, HOURS, SECONDS, MINUTES, MILLIS, NANOS, MICROS -> { + yield date.truncatedTo(resolution.getUnit()); + } + case CENTURIES, DECADES, ERAS, FOREVER, MILLENNIA, YEARS, WEEKS -> { + throw new UnsupportedOperationException(); + } + case MONTHS -> date.withDayOfMonth(1).truncatedTo(ChronoUnit.DAYS); + }; + } + private static ZonedDateTime increase(ZonedDateTime date, Resolution resolution) { return switch (resolution.getUnit()) { case DAYS, HALF_DAYS, HOURS, SECONDS, MINUTES, MILLIS, NANOS, MICROS -> { diff --git a/io.openems.edge.timedata.rrd4j/test/io/openems/edge/timedata/rrd4j/Rrd4jReadHandlerTest.java b/io.openems.edge.timedata.rrd4j/test/io/openems/edge/timedata/rrd4j/Rrd4jReadHandlerTest.java index 635a3035742..f0c0eab0d27 100644 --- a/io.openems.edge.timedata.rrd4j/test/io/openems/edge/timedata/rrd4j/Rrd4jReadHandlerTest.java +++ b/io.openems.edge.timedata.rrd4j/test/io/openems/edge/timedata/rrd4j/Rrd4jReadHandlerTest.java @@ -163,6 +163,21 @@ public void testQueryHistoricDataWithResolution15minutes() throws Exception { ), this.query(new Resolution(15, ChronoUnit.MINUTES))); } + @Test + public void testStreamRanges() throws Exception { + final var utc = ZoneId.of("UTC"); + final var from = ZonedDateTime.of(2023, 12, 26, 0, 0, 0, 0, utc); + final var to = ZonedDateTime.of(2024, 3, 8, 0, 0, 0, 0, utc); + final var result = Rrd4jReadHandler.streamRanges(from, to, new Resolution(1, ChronoUnit.MONTHS)).toList(); + assertEquals(4, result.size()); + assertEquals(new Rrd4jReadHandler.Range(from, ZonedDateTime.of(2024, 1, 1, 0, 0, 0, 0, utc)), result.get(0)); + assertEquals(new Rrd4jReadHandler.Range(ZonedDateTime.of(2024, 1, 1, 0, 0, 0, 0, utc), + ZonedDateTime.of(2024, 2, 1, 0, 0, 0, 0, utc)), result.get(1)); + assertEquals(new Rrd4jReadHandler.Range(ZonedDateTime.of(2024, 2, 1, 0, 0, 0, 0, utc), + ZonedDateTime.of(2024, 3, 1, 0, 0, 0, 0, utc)), result.get(2)); + assertEquals(new Rrd4jReadHandler.Range(ZonedDateTime.of(2024, 3, 1, 0, 0, 0, 0, utc), to), result.get(3)); + } + private SortedMap> query(Resolution resolution) throws IllegalArgumentException, OpenemsNamedException { return this.readHandler.queryHistoricData(this.rrdbId, // diff --git a/io.openems.wrapper/influxdb-client-core.bnd b/io.openems.wrapper/influxdb-client-core.bnd index 7798c9f3287..051a463b074 100644 --- a/io.openems.wrapper/influxdb-client-core.bnd +++ b/io.openems.wrapper/influxdb-client-core.bnd @@ -2,10 +2,10 @@ Bundle-Name: influxdb-client-core Bundle-Description: The Java InfluxDB 2.0 Client Core Bundle-DocURL: https://github.com/influxdata/influxdb-client-java Bundle-License: https://opensource.org/licenses/MIT -Bundle-Version: 7.1.0 +Bundle-Version: 7.2.0 Include-Resource: \ - @influxdb-client-core-7.1.0.jar,\ + @influxdb-client-core-7.2.0.jar,\ Export-Package: \ com.influxdb,\ diff --git a/io.openems.wrapper/influxdb-client-java.bnd b/io.openems.wrapper/influxdb-client-java.bnd index d104a2e8891..577af489e58 100644 --- a/io.openems.wrapper/influxdb-client-java.bnd +++ b/io.openems.wrapper/influxdb-client-java.bnd @@ -2,10 +2,10 @@ Bundle-Name: influxdb-client-java Bundle-Description: The Java InfluxDB 2.0 Client Java Bundle-DocURL: https://github.com/influxdata/influxdb-client-java Bundle-License: https://opensource.org/licenses/MIT -Bundle-Version: 7.1.0 +Bundle-Version: 7.2.0 Include-Resource: \ - @influxdb-client-java-7.1.0.jar,\ + @influxdb-client-java-7.2.0.jar,\ Export-Package: \ com.influxdb.client,\ diff --git a/io.openems.wrapper/influxdb-client-utils.bnd b/io.openems.wrapper/influxdb-client-utils.bnd index 32ffc20d813..d272fc79b37 100644 --- a/io.openems.wrapper/influxdb-client-utils.bnd +++ b/io.openems.wrapper/influxdb-client-utils.bnd @@ -2,10 +2,10 @@ Bundle-Name: influxdb-client-utils Bundle-Description: The Java InfluxDB 2.0 Client Utils Bundle-DocURL: https://github.com/influxdata/influxdb-client-java Bundle-License: https://opensource.org/licenses/MIT -Bundle-Version: 7.1.0 +Bundle-Version: 7.2.0 Include-Resource: \ - @influxdb-client-utils-7.1.0.jar,\ + @influxdb-client-utils-7.2.0.jar,\ Export-Package: \ com.influxdb.utils,\ diff --git a/io.openems.wrapper/influxdb-flux-dsl.bnd b/io.openems.wrapper/influxdb-flux-dsl.bnd index d7c95c16634..98b1eac6822 100644 --- a/io.openems.wrapper/influxdb-flux-dsl.bnd +++ b/io.openems.wrapper/influxdb-flux-dsl.bnd @@ -2,10 +2,10 @@ Bundle-Name: influxdb-flux-dsl Bundle-Description: The Java InfluxDB 2.0 Flux DSL Bundle-DocURL: https://github.com/influxdata/influxdb-client-java Bundle-License: https://opensource.org/licenses/MIT -Bundle-Version: 7.1.0 +Bundle-Version: 7.2.0 Include-Resource: \ - @flux-dsl-7.1.0.jar,\ + @flux-dsl-7.2.0.jar,\ Export-Package: \ com.influxdb.query,\ diff --git a/tools/common.sh b/tools/common.sh index 47370e548d1..ed3c536b323 100644 --- a/tools/common.sh +++ b/tools/common.sh @@ -8,11 +8,11 @@ common_initialize_environment() { SRC_PACKAGE_JSON="ui/package.json" SRC_PACKAGE_LOCK_JSON="ui/package-lock.json" SRC_CHANGELOG_CONSTANTS="ui/src/app/changelog/view/component/changelog.constants.ts" - SRC_ANDROID_GRADLE="ui/android/app/build.gradle" # Set environment variables - THEME="openems" + THEME="${THEME:-openems}" PACKAGE_NAME="openems-edge" + VERSION_STRING="" VERSION="$(cd ui && node -p "require('./package.json').version" && cd ..)" local tmp_version=$(echo $VERSION | cut -d'-' -f1) @@ -61,10 +61,6 @@ common_update_version_in_code() { echo "## Update $SRC_CHANGELOG_CONSTANTS" sed --in-place "s#\(UI_VERSION = \"\).*\(\";\)#\1$VERSION\2#" $SRC_CHANGELOG_CONSTANTS - - echo "## Update $SRC_ANDROID_GRADLE" - sed --in-place "s#\(versionCode \).*\$#\1$(printf "%04d%02d%02d" $VERSION_MAJOR $VERSION_MINOR $VERSION_PATCH)#" $SRC_ANDROID_GRADLE - sed --in-place "s#\(versionName \).*\$#\1\"$VERSION\"#" $SRC_ANDROID_GRADLE } # Build OpenEMS Backend @@ -120,6 +116,36 @@ common_build_ui() { fi } +common_build_android_app() { + echo "# Build OpenEMS Android APP" + if [ "${NODE_MODULES_CACHE}" != "" -a -d "$NODE_MODULES_CACHE" ]; then + echo "## Use cached node_modules" + mv -f "${NODE_MODULES_CACHE}" "ui/node_modules" + fi + cd ui + + # Install dependencies from package.json + npm ci + if [ "${NG_CLI_CACHE_PATH}" != "" ]; then + echo "## Angular Cache: $NG_CLI_CACHE_PATH" + node_modules/.bin/ng config cli.cache.path "$NG_CLI_CACHE_PATH" + fi + + case "${THEME^^}" in + "FENECON") NODE_ENV="FENECON";; + "HECKERT") NODE_ENV="Heckert";; + esac + + # Install depencencies for capacitor + NODE_ENV=${NODE_ENV} ionic cap build android -c "${THEME},${THEME}-backend-deploy-app" + + # Build App + cd android + THEME=${THEME} ./gradlew buildThemeRelease + + cd ../.. +} + common_save_environment() { local file=${1:-build.environment} echo " @@ -132,4 +158,4 @@ common_save_environment() { export VERSION_DEV_COMMIT=\"$VERSION_DEV_COMMIT\" export VERSION_DEV_BUILD_TIME=\"$VERSION_DEV_BUILD_TIME\" " | tee $file -} \ No newline at end of file +} diff --git a/tools/drone/openems-android.sh b/tools/drone/openems-android.sh index 8e19fd37bea..91067d639ab 100755 --- a/tools/drone/openems-android.sh +++ b/tools/drone/openems-android.sh @@ -2,10 +2,10 @@ NODE_MAJOR=20 -ANDROID_SDK_VERSION=9477386 +ANDROID_SDK_VERSION=11076708 ANDROID_HOME="/opt/android-sdk" -ANDROID_BUILD_TOOLS_VERSION=32.0.0 -ANDROID_PLATFORMS_VERSION=32 +ANDROID_BUILD_TOOLS_VERSION=34.0.0 +ANDROID_PLATFORMS_VERSION=34 # Build/Update 'openems-android' Container for Drone/Woodpecker CI @@ -14,6 +14,8 @@ docker pull node:${NODE_MAJOR} docker build -t openems-android:${NODE_MAJOR}.${ANDROID_PLATFORMS_VERSION} -f - . < '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -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 - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" +$ROOT/gradlew $@ diff --git a/ui/android/gradlew.bat b/ui/android/gradlew.bat index 93e3f59f135..0aaa0ca9698 100644 --- a/ui/android/gradlew.bat +++ b/ui/android/gradlew.bat @@ -1,92 +1,4 @@ -@rem -@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. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -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" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -: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 %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@echo off&setlocal +set ROOT=%~dp0..\.. + +CALL %ROOT%\gradlew.bat diff --git a/ui/android/keystore.properties b/ui/android/keystore.properties index 9ac490bd3ea..23a54c08f52 100644 --- a/ui/android/keystore.properties +++ b/ui/android/keystore.properties @@ -1,4 +1,4 @@ storePassword=Halelilu4 keyPassword=Halelilu4 keyAlias=key1 -storeFile=./../../key.jks \ No newline at end of file +storeFile=./../../key.jks diff --git a/ui/android/settings.gradle b/ui/android/settings.gradle index 3b4431d7724..944c98f4239 100644 --- a/ui/android/settings.gradle +++ b/ui/android/settings.gradle @@ -2,4 +2,4 @@ include ':app' include ':capacitor-cordova-android-plugins' project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') -apply from: 'capacitor.settings.gradle' \ No newline at end of file +apply from: 'capacitor.settings.gradle' diff --git a/ui/android/variables.gradle b/ui/android/variables.gradle index 5946adabdd2..631e62221ee 100644 --- a/ui/android/variables.gradle +++ b/ui/android/variables.gradle @@ -1,7 +1,7 @@ ext { minSdkVersion = 22 - compileSdkVersion = 33 - targetSdkVersion = 33 + compileSdkVersion = 34 + targetSdkVersion = 34 androidxActivityVersion = '1.7.0' androidxAppCompatVersion = '1.6.1' androidxCoordinatorLayoutVersion = '1.2.0' @@ -13,4 +13,4 @@ ext { androidxJunitVersion = '1.1.5' androidxEspressoCoreVersion = '3.5.1' cordovaAndroidVersion = '10.1.1' -} \ No newline at end of file +} diff --git a/ui/angular.json b/ui/angular.json index bb545d9ee55..e1fba2f0688 100644 --- a/ui/angular.json +++ b/ui/angular.json @@ -220,4 +220,4 @@ "styleext": "scss" } } -} \ No newline at end of file +} diff --git a/ui/capacitor.config.ts b/ui/capacitor.config.ts index 7702fbd212e..eadd5c3ecba 100644 --- a/ui/capacitor.config.ts +++ b/ui/capacitor.config.ts @@ -22,10 +22,10 @@ const baseConfig: CapacitorConfig = { useDialog: true, }, CapacitorCookies: { - enabled: true - } - } -} + enabled: true, + }, + }, +}; switch (process.env.NODE_ENV as Theme) { // case 'EXAMPLE': @@ -40,8 +40,7 @@ switch (process.env.NODE_ENV as Theme) { // } // break; default: - throw new Error(`Capacitor config for theme ${process.env.NODE_ENV} not implemented.`) -} -console.warn(config); + throw new Error(`Capacitor config for theme ${process.env.NODE_ENV} not implemented.`); +} export default config; diff --git a/ui/e2e/tsconfig.json b/ui/e2e/tsconfig.json index a5524bf13b2..a82df00eef3 100644 --- a/ui/e2e/tsconfig.json +++ b/ui/e2e/tsconfig.json @@ -9,4 +9,4 @@ "node" ] } -} \ No newline at end of file +} diff --git a/ui/karma.conf.js b/ui/karma.conf.js index 0980006d7ec..be800f624ce 100644 --- a/ui/karma.conf.js +++ b/ui/karma.conf.js @@ -31,7 +31,7 @@ module.exports = function (config) { dir: require('path').join(__dirname, './coverage/ngv'), subdir: '.', reporters: [ - {type: 'lcov'}, + { type: 'lcov' }, { type: 'html' }, { type: 'text-summary' } ], diff --git a/ui/ngsw-config.json b/ui/ngsw-config.json index cfbfb992b16..04d5a40739a 100644 --- a/ui/ngsw-config.json +++ b/ui/ngsw-config.json @@ -24,4 +24,4 @@ } } ] -} \ No newline at end of file +} diff --git a/ui/package-lock.json b/ui/package-lock.json index ce222429275..edc7956ab67 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,44 +1,44 @@ { "name": "openems-ui", - "version": "2024.8.0", + "version": "2024.9.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "openems-ui", - "version": "2024.8.0", + "version": "2024.9.0", "license": "AGPL-3.0", "dependencies": { - "@angular/animations": "~16.2.12", - "@angular/common": "~16.2.12", - "@angular/core": "~16.2.12", - "@angular/forms": "~16.2.12", - "@angular/platform-browser": "~16.2.12", - "@angular/platform-browser-dynamic": "~16.2.12", - "@angular/router": "~16.2.12", - "@angular/service-worker": "~16.2.12", - "@capacitor-community/file-opener": "^1.0.5", - "@capacitor/android": "5.7.7", - "@capacitor/app": "^5.0.6", - "@capacitor/core": "5.7.7", - "@capacitor/filesystem": "^5.2.0", - "@capacitor/ios": "5.7.7", - "@capacitor/splash-screen": "^5.0.6", + "@angular/animations": "18.0.5", + "@angular/common": "18.0.5", + "@angular/core": "18.0.5", + "@angular/forms": "18.0.5", + "@angular/platform-browser": "18.0.5", + "@angular/platform-browser-dynamic": "18.0.5", + "@angular/router": "18.0.5", + "@angular/service-worker": "18.0.5", + "@capacitor-community/file-opener": "^6.0.0", + "@capacitor/android": "^6.0.0", + "@capacitor/app": "^6.0.0", + "@capacitor/core": "^6.0.0", + "@capacitor/filesystem": "^6.0.0", + "@capacitor/ios": "^6.0.0", + "@capacitor/splash-screen": "^6.0.0", "@ionic-native/core": "^5.36.0", "@ionic-native/file-opener": "^5.36.0", "@ionic/angular": "^6.7.5", - "@ionic/cli": "^7.1.6", "@ngx-formly/core": "^6.3.0", "@ngx-formly/ionic": "^6.3.6", "@ngx-formly/schematics": "^6.3.0", "@ngx-translate/core": "^15.0.0", "@nodro7/angular-mydatepicker": "^0.14.0", "capacitor-blob-writer": "^1.1.17", - "capacitor-ios-autofill-save-password": "^2.0.0", - "capacitor-secure-storage-plugin": "^0.9.0", - "chart.js": "^4.4.3", + "capacitor-ios-autofill-save-password": "^3.0.0", + "capacitor-secure-storage-plugin": "^0.10.0", + "chart.js": "^4.4.4", "chartjs-adapter-date-fns": "^3.0.0", "chartjs-plugin-annotation": "^3.0.1", + "chartjs-plugin-datalabels": "^2.2.0", "chartjs-plugin-zoom": "^2.0.1", "classlist.js": "^1.1.20150312", "compare-versions": "^6.1.1", @@ -46,41 +46,49 @@ "date-fns": "^2.30.0", "file-saver-es": "^2.0.5", "ng2-charts": "4.1.1", - "ngx-cookie-service": "^16.1.0", - "ngx-device-detector": "^6.0.2", + "ngx-cookie-service": "18.0.0", + "ngx-device-detector": "^8.0.0", "ngx-spinner": "^16.0.2", "roboto-fontface": "^0.10.0", "rxjs": "~6.6.7", - "swiper": "11.1.8", + "swiper": "11.1.11", "tslib": "^2.6.2", "uuid": "^10.0.0", - "zone.js": "~0.13.3" + "zone.js": "~0.14.7" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.14", - "@angular-eslint/builder": "^16.3.1", - "@angular-eslint/eslint-plugin": "^16.3.1", - "@angular-eslint/eslint-plugin-template": "^16.3.1", - "@angular-eslint/template-parser": "^16.3.1", - "@angular/cli": "^16.2.13", - "@angular/compiler": "^16.2.12", - "@angular/compiler-cli": "^16.2.12", - "@angular/language-service": "^16.2.12", - "@capacitor/assets": "^3.0.0", - "@capacitor/cli": "6.1.1", + "@angular-devkit/build-angular": "^18.0.5", + "@angular-devkit/core": "18.0.5", + "@angular-devkit/schematics": "18.0.5", + "@angular-eslint/builder": "^18.1.0", + "@angular-eslint/eslint-plugin": "^18.1.0", + "@angular-eslint/eslint-plugin-template": "^18.1.0", + "@angular-eslint/template-parser": "^18.1.0", + "@angular/cli": "18.1.0", + "@angular/compiler": "18.0.5", + "@angular/compiler-cli": "18.0.5", + "@angular/language-service": "18.0.5", + "@capacitor/assets": "^3.0.5", + "@capacitor/cli": "6.1.2", "@ionic/angular-toolkit": "^11.0.1", - "@stylistic/eslint-plugin": "^2.4.0", + "@ionic/cli": "^7.2.0", + "@stylistic/eslint-plugin": "^2.7.2", "@types/jasmine": "~4.3.6", "@types/jasminewd2": "~2.0.13", + "@types/json-schema": "^7.0.15", "@types/node": "^20.12.6", + "@types/qs": "^6.9.15", + "@types/range-parser": "^1.2.7", + "@types/send": "^0.17.4", "@types/uuid": "^10.0.0", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "@typescript-eslint/types": "^7.0.0", "eslint": "^8.57.0", "eslint-plugin-import": "2.29.1", - "eslint-plugin-jsdoc": "48.2.3", + "eslint-plugin-jsdoc": "48.10.0", "eslint-plugin-prefer-arrow": "1.2.3", - "eslint-plugin-unused-imports": "^3.2.0", + "eslint-plugin-unused-imports": "^4.1.3", "jasmine-core": "~4.5.0", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.2", @@ -91,20 +99,14 @@ "karma-jasmine-html-reporter": "^2.1.0", "protractor": "~7.0.0", "ts-node": "^10.9.2", - "typescript": "~4.9.5", + "typescript": "~5.4.5", "typescript-strict-plugin": "^2.4.4" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -116,21 +118,70 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1602.13", + "version": "0.1802.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.2.tgz", + "integrity": "sha512-LPRl9jhcf0NgshaL6RoUy1uL/cAyNt7oxctoZ9EHUu8eh5E9W/jZGhVowjOLpirwqYhmEzKJJIeS49Ssqs3RQg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "16.2.13", + "@angular-devkit/core": "18.2.2", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.2.tgz", + "integrity": "sha512-Zz0tGptI/QQnUBDdp+1G5wGwQWMjpfe2oO+UohkrDVgFS71yVj4VDnOy51kMTxBvzw+36evTgthPpmzqPIfxBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/architect/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/@angular-devkit/architect/node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -138,95 +189,97 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.2.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.14", - "@angular-devkit/build-webpack": "0.1602.14", - "@angular-devkit/core": "16.2.14", - "@babel/core": "7.22.9", - "@babel/generator": "7.22.9", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.22.6", - "@babel/plugin-proposal-async-generator-functions": "7.20.7", - "@babel/plugin-transform-async-to-generator": "7.22.5", - "@babel/plugin-transform-runtime": "7.22.9", - "@babel/preset-env": "7.22.9", - "@babel/runtime": "7.22.6", - "@babel/template": "7.22.5", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.14", - "@vitejs/plugin-basic-ssl": "1.0.1", + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.2.tgz", + "integrity": "sha512-7HEnTN2T1jnjuItXKcApOsoYGgfou4+POju3ZbwIQukDZ3B2COskvQkVTxqPNrQ0ZjT2mxZYoVlmGW9M+7N25g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1802.2", + "@angular-devkit/build-webpack": "0.1802.2", + "@angular-devkit/core": "18.2.2", + "@angular/build": "18.2.2", + "@babel/core": "7.25.2", + "@babel/generator": "7.25.0", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.25.0", + "@babel/plugin-transform-async-to-generator": "7.24.7", + "@babel/plugin-transform-runtime": "7.24.7", + "@babel/preset-env": "7.25.3", + "@babel/runtime": "7.25.0", + "@discoveryjs/json-ext": "0.6.1", + "@ngtools/webpack": "18.2.2", + "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.14", + "autoprefixer": "10.4.20", "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.21.5", - "chokidar": "3.5.3", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.20", - "css-loader": "6.8.1", - "esbuild-wasm": "0.18.17", - "fast-glob": "3.3.1", - "guess-parser": "0.4.22", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.2.0", + "copy-webpack-plugin": "12.0.2", + "critters": "0.0.24", + "css-loader": "7.1.2", + "esbuild-wasm": "0.23.0", + "fast-glob": "3.3.2", + "http-proxy-middleware": "3.0.0", + "https-proxy-agent": "7.0.5", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.1.3", - "less-loader": "11.1.0", + "less": "4.2.0", + "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "magic-string": "0.30.1", - "mini-css-extract-plugin": "2.7.6", - "mrmime": "1.0.1", - "open": "8.4.2", + "loader-utils": "3.3.1", + "magic-string": "0.30.11", + "mini-css-extract-plugin": "2.9.0", + "mrmime": "2.0.0", + "open": "10.1.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "2.3.1", - "piscina": "4.0.0", - "postcss": "8.4.31", - "postcss-loader": "7.3.3", + "picomatch": "4.0.2", + "piscina": "4.6.1", + "postcss": "8.4.41", + "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.64.1", - "sass-loader": "13.3.2", - "semver": "7.5.4", - "source-map-loader": "4.0.1", + "sass": "1.77.6", + "sass-loader": "16.0.0", + "semver": "7.6.3", + "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.19.2", - "text-table": "0.2.0", + "terser": "5.31.6", "tree-kill": "1.2.2", - "tslib": "2.6.1", - "vite": "4.5.3", - "webpack": "5.88.2", - "webpack-dev-middleware": "6.1.2", - "webpack-dev-server": "4.15.1", - "webpack-merge": "5.9.0", + "tslib": "2.6.3", + "vite": "5.4.0", + "watchpack": "2.4.1", + "webpack": "5.94.0", + "webpack-dev-middleware": "7.3.0", + "webpack-dev-server": "5.0.4", + "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.18.17" + "esbuild": "0.23.0" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "@angular/localize": "^16.0.0", - "@angular/platform-server": "^16.0.0", - "@angular/service-worker": "^16.0.0", + "@angular/compiler-cli": "^18.0.0", + "@angular/localize": "^18.0.0", + "@angular/platform-server": "^18.0.0", + "@angular/service-worker": "^18.0.0", + "@web/test-runner": "^0.18.0", + "browser-sync": "^3.0.2", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^16.0.0", + "ng-packagr": "^18.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.9.3 <5.2" + "typescript": ">=5.4 <5.6" }, "peerDependenciesMeta": { "@angular/localize": { @@ -238,6 +291,12 @@ "@angular/service-worker": { "optional": true }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, "jest": { "optional": true }, @@ -258,454 +317,531 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@ampproject/remapping": { - "version": "2.2.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1602.14", + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.2.tgz", + "integrity": "sha512-Zz0tGptI/QQnUBDdp+1G5wGwQWMjpfe2oO+UohkrDVgFS71yVj4VDnOy51kMTxBvzw+36evTgthPpmzqPIfxBw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "16.2.14", - "rxjs": "7.8.1" + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "16.2.14", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.2.tgz", + "integrity": "sha512-okaDdTMXnDhvnnnih6rPQnexL6htfEAPr19bB1Ci9d31gEjVuKZCjlcw2sPZ6BUyilwC9nZlCI5vbH1Ljf6mzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1802.2", + "@babel/core": "7.25.2", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.24.7", + "@inquirer/confirm": "3.1.22", + "@vitejs/plugin-basic-ssl": "1.1.0", + "browserslist": "^4.23.0", + "critters": "0.0.24", + "esbuild": "0.23.0", + "fast-glob": "3.3.2", + "https-proxy-agent": "7.0.5", + "listr2": "8.2.4", + "lmdb": "3.0.13", + "magic-string": "0.30.11", + "mrmime": "2.0.0", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.6.1", + "rollup": "4.20.0", + "sass": "1.77.6", + "semver": "7.6.3", + "vite": "5.4.0", + "watchpack": "2.4.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^3.5.2" + "@angular/compiler-cli": "^18.0.0", + "@angular/localize": "^18.0.0", + "@angular/platform-server": "^18.0.0", + "@angular/service-worker": "^18.0.0", + "less": "^4.2.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.4 <5.6" }, "peerDependenciesMeta": { - "chokidar": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { "optional": true } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.12.0", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/source-map": { - "version": "0.7.4", + "node_modules/@angular-devkit/build-angular/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.22.9", + "node_modules/@angular-devkit/build-angular/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", + "node_modules/@angular-devkit/build-angular/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/runtime": { - "version": "7.22.6", + "node_modules/@angular-devkit/build-angular/node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", "dev": true, "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.13.11" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/template": { - "version": "7.22.5", + "node_modules/@angular-devkit/build-angular/node_modules/rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "fsevents": "~2.3.2" } }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv": { - "version": "6.12.6", + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { - "version": "3.5.2", + "node_modules/@angular-devkit/build-angular/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@angular-devkit/build-angular/node_modules/commander": { - "version": "2.20.3", + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true, - "license": "MIT" + "license": "0BSD" }, - "node_modules/@angular-devkit/build-angular/node_modules/fast-glob": { - "version": "3.3.1", + "node_modules/@angular-devkit/build-angular/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { - "version": "3.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/less": { - "version": "4.1.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/postcss": { - "version": "8.4.31", - "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" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/regenerator-runtime": { - "version": "0.13.11", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { - "version": "7.8.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "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/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.5.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/terser": { - "version": "5.19.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.1", - "dev": true, - "license": "0BSD" - }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack": { - "version": "5.88.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@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.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "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", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1602.14", + "version": "0.1802.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.2.tgz", + "integrity": "sha512-Pj+YmKh0nJOKl6QAsqYh3SqfuVJrFqjyp5WrG9BgfsMD9GCMD+5teMHNYJlp+vG/C8e7VdZp4rqOon8K9Xn4Mw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/architect": "0.1802.2", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { "webpack": "^5.30.0", - "webpack-dev-server": "^4.0.0" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1602.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "16.2.14", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "16.2.14", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/jsonc-parser": { - "version": "3.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -713,19 +849,21 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.2.13", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.5.tgz", + "integrity": "sha512-sGtrS0SqkcBvyuv0QkIfyadwPgDhMroz1r51lMh1hwzJaJ0LNuVMLviEeYIybeBnvAdp9YvYC8I1WgB/FUEFBw==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", + "ajv": "8.13.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -739,12 +877,16 @@ } }, "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { - "version": "3.2.0", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true, "license": "MIT" }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -752,29 +894,45 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.2.13", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.5.tgz", + "integrity": "sha512-hZwAq3hwuJzCuh7uqO/7T9IMERhYVxz+ganJlEykpyr58o0IjUM1Q4ZSH5UOYlGRPdBCZJbfiafZ0Sg5w5xBww==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "16.2.13", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.1", + "@angular-devkit/core": "18.0.5", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.10", "ora": "5.4.1", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { - "version": "3.2.0", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true, "license": "MIT" }, + "node_modules/@angular-devkit/schematics/node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -782,117 +940,106 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "16.3.1", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.3.0.tgz", + "integrity": "sha512-httEQyqyBw3+0CRtAa7muFxHrauRfkEfk/jmrh5fn2Eiu+I53hAqFPgrwVi1V6AP/kj2zbAiWhd5xM3pMJdoRQ==", "dev": true, "license": "MIT", - "dependencies": { - "@nx/devkit": "16.5.1", - "nx": "16.5.1" - }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "16.3.1", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.3.0.tgz", + "integrity": "sha512-v/59FxUKnMzymVce99gV43huxoqXWMb85aKvzlNvLN+ScDu6ZE4YMiTQNpfapVL2lkxhs0uwB3jH17EYd5TcsA==", "dev": true, "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "16.3.1", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.3.0.tgz", + "integrity": "sha512-Vl7gfPMXxvtHTjYdlzR161aj5xrqW6T57wd8ToQ7Gqzm0qHGfY6kE4SQobUa2LCYckTNSlv+zXe48C4ah/dSjw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/utils": "16.3.1", - "@typescript-eslint/utils": "5.62.0" + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "@angular-eslint/utils": "18.3.0" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "16.3.1", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.3.0.tgz", + "integrity": "sha512-ddR/qwYbUeq9IpyVKrPbfZyRBTy6V8uc5I0JcBKttQ4CZ4joXhqsVgWFsI+JAMi8E66uNj1VC7NuKCOjDINv2Q==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "16.3.1", - "@angular-eslint/utils": "16.3.1", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "@angular-eslint/utils": "18.3.0", "aria-query": "5.3.0", - "axobject-query": "4.0.0" + "axobject-query": "4.1.0" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/template-parser": { - "version": "16.3.1", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.3.0.tgz", + "integrity": "sha512-1mUquqcnugI4qsoxcYZKZ6WMi6RPelDcJZg2YqGyuaIuhWmi3ZqJZLErSSpjP60+TbYZu7wM8Kchqa1bwJtEaQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "16.3.1", - "eslint-scope": "^7.0.0" + "@angular-eslint/bundled-angular-compiler": "18.3.0", + "eslint-scope": "^8.0.2" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, - "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", - "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/@angular-eslint/template-parser/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/@angular-eslint/utils": { - "version": "16.3.1", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.3.0.tgz", + "integrity": "sha512-sCrkHkpxBJZLuCikdboZoawCfc2UgbJv+T14tu2uQCv+Vwzeadnu04vkeY2vTkA8GeBdBij/G9/N/nvwmwVw3g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "16.3.1", - "@typescript-eslint/utils": "5.62.0" + "@angular-eslint/bundled-angular-compiler": "18.3.0" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular/animations": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.0.5.tgz", + "integrity": "sha512-RYwlS+4I33beAWdzFFmaDPqXZN+r66qPzzMOk9LQguwF76eBJbykHniODalSLvjrY6Iz7CULavByYNpzq2TT7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "16.2.12" + "@angular/core": "18.0.5" } }, "node_modules/@angular/cdk": { - "version": "15.2.9", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.1.tgz", + "integrity": "sha512-6y4MmpEPXze6igUHkLsBUPkxw32F8+rmW0xVXZchkSyGlFgqfh53ueXoryWb0qL4s5enkNY6AzXnKAqHfPNkVQ==", "license": "MIT", "peer": true, "dependencies": { @@ -902,44 +1049,33 @@ "parse5": "^7.1.2" }, "peerDependencies": { - "@angular/common": "^15.0.0 || ^16.0.0", - "@angular/core": "^15.0.0 || ^16.0.0", + "@angular/common": "^18.0.0 || ^19.0.0", + "@angular/core": "^18.0.0 || ^19.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular/cdk/node_modules/parse5": { - "version": "7.1.2", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/@angular/cli": { - "version": "16.2.13", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.1.0.tgz", + "integrity": "sha512-2E+b7S/736AOmxf5je9OWoPpgPY240TfJfFXwQiVvq/4KyC+ZR9lBrqRx72Xghn8nu3z8Q2BPZIXVGZppl0USQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1602.13", - "@angular-devkit/core": "16.2.13", - "@angular-devkit/schematics": "16.2.13", - "@schematics/angular": "16.2.13", + "@angular-devkit/architect": "0.1801.0", + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "@inquirer/prompts": "5.0.7", + "@listr2/prompt-adapter-inquirer": "2.0.13", + "@schematics/angular": "18.1.0", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.2.0", - "npm-package-arg": "10.1.0", - "npm-pick-manifest": "8.0.1", - "open": "8.4.2", - "ora": "5.4.1", - "pacote": "15.2.0", - "resolve": "1.22.2", - "semver": "7.5.4", + "ini": "4.1.3", + "jsonc-parser": "3.3.1", + "listr2": "8.2.3", + "npm-package-arg": "11.0.2", + "npm-pick-manifest": "9.0.1", + "pacote": "18.0.6", + "resolve": "1.22.8", + "semver": "7.6.2", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -947,50 +1083,117 @@ "ng": "bin/ng.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/jsonc-parser": { - "version": "3.2.0", + "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { + "version": "0.1801.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1801.0.tgz", + "integrity": "sha512-iZa3J3CrZT6MKiHPw8ijgVwMyCMewCsP4xc75SetUwF/yuqRUHygALs5jJVZQFQjSFUrkg9gqXa1cCjFDwpT8A==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "18.1.0", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } }, - "node_modules/@angular/cli/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.1.0.tgz", + "integrity": "sha512-6eXQDzHZCbpSMLv9Ohl+1QyLVDmGEXpuuHz3y64LfUTP0aEiBaxk96FjLXIxzJ4f2pbbW2XHzc+yuboGToRA0w==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "ajv": "8.16.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": ">=10" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@angular/cli/node_modules/resolve": { - "version": "1.22.2", + "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.1.0.tgz", + "integrity": "sha512-BjrYutLfYFiPOSEcLBWCj3ENkwDn8gMfBSJesaBz7OrZBZGK5j0dVgBLIsGTP96TKo4o4vszJQOvS4AtV6xMGg==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@angular-devkit/core": "18.1.0", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.10", + "ora": "5.4.1", + "rxjs": "7.8.1" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular/cli/node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/@angular/cli/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, "node_modules/@angular/cli/node_modules/semver": { - "version": "7.5.4", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -998,36 +1201,35 @@ "node": ">=10" } }, - "node_modules/@angular/cli/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/@angular/common": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.5.tgz", + "integrity": "sha512-yItVQSu+Rx8gthWJDTOHwbzItY8/lqmmmYA1RMex0u3GkJoX3/3TZSGXbbBXl8GH8vmQOfp9yj3C02JmlwldRg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "16.2.12", + "@angular/core": "18.0.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.0.5.tgz", + "integrity": "sha512-U1/qjNDjxMukXwQrJZjmr87KVxQmHbD7fxVlg0+qafHLe+YDuCtyOfQSGEZrWhwktxvAYZbl3FK+m3Hnk/D3Nw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "16.2.12" + "@angular/core": "18.0.5" }, "peerDependenciesMeta": { "@angular/core": { @@ -1036,15 +1238,17 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.0.5.tgz", + "integrity": "sha512-aFKDDTsRmc691EkNRj9OkrKNXDOaHdXB42MyUrj3WwJIJFMnSY/UDf6h+CRVF0U+CITszFyWhmeHQRA/3mJWNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "7.23.2", + "@babel/core": "7.24.7", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.1.2", + "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", "yargs": "^17.2.1" @@ -1055,64 +1259,120 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "16.2.12", - "typescript": ">=4.9.3 <5.2" + "@angular/compiler": "18.0.5", + "typescript": ">=5.4 <5.5" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", + "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/@angular/compiler-cli/node_modules/@babel/core/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, + "license": "MIT" + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@angular/core": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.5.tgz", + "integrity": "sha512-0UuL+aMMWGYksz09YBsiHq1li7GmL8obB3IC3T5MwDqnn7FGRUBfBUOZEkM6B+pwgg+RAtNdJkbCfbh1z74bFQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.13.0" + "zone.js": "~0.14.0" } }, "node_modules/@angular/forms": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.5.tgz", + "integrity": "sha512-nO7bN+nO2/czgKSvPx6ewqpfb8xXOyns06uovWpAXSH4jYoiZ6CHTHhOKrOL/3SRkhUV9u+EUXTTAOSBkS+OBA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12", + "@angular/common": "18.0.5", + "@angular/core": "18.0.5", + "@angular/platform-browser": "18.0.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.0.5.tgz", + "integrity": "sha512-ahZnsUk8q/4k+okP9hBcfWRiOiMximSAI7Vq5M/fe9cezykt8cWEzxgRoduTvDKoQPqcRl0nHlDYju2zkXcU6g==", "dev": true, "license": "MIT", "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.5.tgz", + "integrity": "sha512-hBKaGz7dhsjNhD0aWB8G2/YZQ/MaBhzFIQSAZMPs2ccAqH1Jx772/Y11k57seA3VaPpnL8WZ1apOSJgALUJ//w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "16.2.12", - "@angular/common": "16.2.12", - "@angular/core": "16.2.12" + "@angular/animations": "18.0.5", + "@angular/common": "18.0.5", + "@angular/core": "18.0.5" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1121,39 +1381,45 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.0.5.tgz", + "integrity": "sha512-i8CXojKcjsKzD2JR2clIisqavlHCW1jw+F2hJVrf/JR9iu6kVpGpZOqb3yYHoQCsPa7hUzQnn0ewYwBvlWsDmw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/compiler": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12" + "@angular/common": "18.0.5", + "@angular/compiler": "18.0.5", + "@angular/core": "18.0.5", + "@angular/platform-browser": "18.0.5" } }, "node_modules/@angular/router": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.0.5.tgz", + "integrity": "sha512-GmdzD5FZYPKCGP6mV3AZraAU6czfGcjjCym6mIsdJr3DyMwnQSwaaHAu8qlQbPDVfsP+gKVSPh1JxI1lzzarLA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12", - "@angular/platform-browser": "16.2.12", + "@angular/common": "18.0.5", + "@angular/core": "18.0.5", + "@angular/platform-browser": "18.0.5", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "16.2.12", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.0.5.tgz", + "integrity": "sha512-Uz3rKHY0pBOvAfxhaGI9X8glS8oaPv03e3GsucZhzuDCijQGHQb1Plaz56NntIGvGaghLMq3zwV7YLPnquarvw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1162,24 +1428,21 @@ "ngsw-config": "ngsw-config.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "16.2.12", - "@angular/core": "16.2.12" + "@angular/common": "18.0.5", + "@angular/core": "18.0.5" } }, - "node_modules/@assemblyscript/loader": { - "version": "0.10.1", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/@babel/code-frame": { - "version": "7.24.2", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -1187,7 +1450,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true, "license": "MIT", "engines": { @@ -1195,20 +1460,22 @@ } }, "node_modules/@babel/core": { - "version": "7.23.2", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1223,27 +1490,17 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/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, "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -1251,13 +1508,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -1265,35 +1524,42 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -1303,6 +1569,8 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -1310,18 +1578,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", "dev": true, "license": "MIT", "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.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", "semver": "^6.3.1" }, "engines": { @@ -1333,6 +1601,8 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -1340,11 +1610,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -1357,6 +1629,8 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -1364,7 +1638,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1378,69 +1654,45 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "license": "MIT", "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" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -1450,18 +1702,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, "license": "MIT", "engines": { @@ -1469,13 +1725,15 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1485,13 +1743,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1501,40 +1761,50 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, "license": "MIT", "engines": { @@ -1542,7 +1812,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "license": "MIT", "engines": { @@ -1550,7 +1822,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "license": "MIT", "engines": { @@ -1558,37 +1832,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -1598,9 +1877,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.4" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -1608,12 +1892,15 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" }, "engines": { "node": ">=6.9.0" @@ -1622,60 +1909,81 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.13.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.0", + "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.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1683,6 +1991,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1694,6 +2004,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1705,6 +2017,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1719,6 +2033,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1730,6 +2046,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1740,11 +2058,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1754,11 +2074,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1769,6 +2091,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1780,6 +2104,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1791,6 +2117,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1802,6 +2130,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1813,6 +2143,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1824,6 +2156,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1835,6 +2169,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1846,6 +2182,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1857,6 +2195,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1871,6 +2211,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1885,6 +2227,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1899,11 +2243,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1913,14 +2259,16 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1930,13 +2278,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1946,11 +2296,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1960,11 +2312,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1974,12 +2328,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1989,12 +2345,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -2005,17 +2363,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", "dev": true, "license": "MIT", "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.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", "globals": "^11.1.0" }, "engines": { @@ -2026,12 +2384,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2041,11 +2401,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2055,12 +2417,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2070,11 +2434,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2083,12 +2449,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -2099,12 +2484,14 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2114,11 +2501,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -2129,12 +2518,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2144,13 +2535,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -2160,11 +2553,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -2175,11 +2570,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2189,11 +2586,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -2204,11 +2603,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2218,12 +2619,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2233,13 +2636,15 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2249,14 +2654,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -2266,12 +2673,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2281,12 +2690,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2296,11 +2707,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2310,11 +2723,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -2325,11 +2740,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -2340,14 +2757,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2357,12 +2776,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2372,11 +2793,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -2387,12 +2810,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -2403,11 +2828,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2417,12 +2844,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2432,13 +2861,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -2449,11 +2880,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2463,11 +2896,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -2478,11 +2913,13 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2492,15 +2929,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -2512,6 +2951,8 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -2519,11 +2960,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2533,12 +2976,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2548,11 +2993,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2562,11 +3009,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2576,11 +3025,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2590,11 +3041,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2604,12 +3057,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2619,12 +3074,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2634,12 +3091,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2649,24 +3108,29 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.9", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", + "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/compat-data": "^7.25.2", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@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.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@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", @@ -2678,60 +3142,60 @@ "@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.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.7", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.6", - "@babel/plugin-transform-parameters": "^7.22.5", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", - "core-js-compat": "^3.31.0", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.0", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", "semver": "^6.3.1" }, "engines": { @@ -2743,6 +3207,8 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -2750,13 +3216,13 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.6", + "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, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, @@ -2766,11 +3232,15 @@ }, "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, "license": "MIT" }, "node_modules/@babel/runtime": { - "version": "7.24.0", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2780,31 +3250,32 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@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.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.4", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2813,11 +3284,13 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.24.4", + "version": "7.25.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", + "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.25.4", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -2827,12 +3300,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2840,33 +3315,34 @@ } }, "node_modules/@capacitor-community/file-opener": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@capacitor-community/file-opener/-/file-opener-1.0.6.tgz", - "integrity": "sha512-iHsPblcgqTF8rEmvpVyAGfxuTUtV8BthoBv/zBLKEEb1vSUVONed0UTRjvvqjHxewS8LNEWVXzuMzXfQU1r1cA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@capacitor-community/file-opener/-/file-opener-6.0.0.tgz", + "integrity": "sha512-nJ9S5rCqnVDBKfqdjDhrYOIO9JLeScFkRfKLs2G+d6Df73vrJMes8dr+dGSEvKiPhyjRhICW5imDJEbzaD8KpA==", "license": "MIT", "engines": { "node": ">=16.0.0", "npm": ">=8.0.0" }, "peerDependencies": { - "@capacitor/core": "^5.0.0" + "@capacitor/core": "^6.0.0" } }, "node_modules/@capacitor/android": { - "version": "5.7.7", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.7.7.tgz", - "integrity": "sha512-gkc8p0jjbRHu5oxKvWQV1d6zRHNeK7/GQUHOL9J6yQqnnttLDf1tSZ4BVjicMdyKlxUailuBcboWvng+KYilvQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-6.1.2.tgz", + "integrity": "sha512-Yh0gQDY1bgRrL25J6ecIlvvs2kF8iNSwIPXjyw6Yz9mnwYxBazF5KZbjpKtGPnJgicJhFkYGsqOkEtxrve0EoQ==", + "license": "MIT", "peerDependencies": { - "@capacitor/core": "^5.7.0" + "@capacitor/core": "^6.1.0" } }, "node_modules/@capacitor/app": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.8.tgz", - "integrity": "sha512-ClUPJG6Awkf5HncVCZQwLrnuugjU8TnACSJ1dKJb6QNCHv2jQzmXvB3KvTvxTZyWbh5EVvlla0qlobYyU1lb6A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-6.0.1.tgz", + "integrity": "sha512-0kXbOl7LPPMFVcAii3u/7Ps0DvXlr7dtHT97r9J1faDlgdQLQUvtGp48tjvFm48gqHI0aOPRJnTBr5JXW4ETYg==", "license": "MIT", "peerDependencies": { - "@capacitor/core": "^5.0.0" + "@capacitor/core": "^6.0.0" } }, "node_modules/@capacitor/assets": { @@ -2897,9 +3373,9 @@ } }, "node_modules/@capacitor/assets/node_modules/@capacitor/cli": { - "version": "5.7.6", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.7.6.tgz", - "integrity": "sha512-CDDcBF7wHm5v/j0dA2bls0vK954XlD1JCjMuTgLtjZMvWrIlTJAkwCQLkiqRhS2P63AXqfqQqkb/qs2RHc1zDQ==", + "version": "5.7.8", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.7.8.tgz", + "integrity": "sha512-qN8LDlREMhrYhOvVXahoJVNkP8LP55/YPRJrzTAFrMqlNJC18L3CzgWYIblFPnuwfbH/RxbfoZT/ydkwgVpMrw==", "dev": true, "license": "MIT", "dependencies": { @@ -2939,147 +3415,94 @@ "node": "^12.20.0 || >=14" } }, - "node_modules/@capacitor/assets/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@capacitor/assets/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@capacitor/assets/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "node_modules/@capacitor/assets/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, "license": "MIT", "engines": { - "node": ">= 12" + "node": ">=8" } }, - "node_modules/@capacitor/assets/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==", + "node_modules/@capacitor/assets/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@capacitor/assets/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "node_modules/@capacitor/assets/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/@capacitor/assets/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/@capacitor/assets/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "license": "MIT", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@capacitor/assets/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@capacitor/assets/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/@capacitor/assets/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@capacitor/assets/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@capacitor/assets/node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "node_modules/@capacitor/assets/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } + "license": "0BSD" }, "node_modules/@capacitor/cli": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-6.1.1.tgz", - "integrity": "sha512-rsRqEadfnBSUX90RZj59oXvi30bpSusLMfIcgbOIArOloTgfaaWr9R471F6m3gGWF7BhNoskJpZcCgSUsfywwA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-6.1.2.tgz", + "integrity": "sha512-HKCNGE0RP8U7aiEF2vg5wTivJROS8BVfu8a3yYJb1mRQvzv+czpmtHNsTWS/WukvwoxUjyjRmsNQSAACHfMTmQ==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/cli-framework-output": "^2.2.5", "@ionic/utils-fs": "^3.1.6", @@ -3108,429 +3531,738 @@ "node": ">=18.0.0" } }, - "node_modules/@capacitor/cli/node_modules/@ionic/utils-array": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", - "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", + "node_modules/@capacitor/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=10.3.0" + "node": "^12.20.0 || >=14" } }, - "node_modules/@capacitor/cli/node_modules/@ionic/utils-fs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", - "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", + "node_modules/@capacitor/cli/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "dependencies": { - "@types/fs-extra": "^8.0.0", - "debug": "^4.0.0", - "fs-extra": "^9.0.0", - "tslib": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=10.3.0" + "node": ">=8" } }, - "node_modules/@capacitor/cli/node_modules/@ionic/utils-object": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", - "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", + "node_modules/@capacitor/cli/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" + "license": "MIT", + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=10.3.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@capacitor/cli/node_modules/@ionic/utils-stream": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", - "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", + "node_modules/@capacitor/cli/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=10.3.0" + "node": ">=8" } }, - "node_modules/@capacitor/cli/node_modules/@ionic/utils-subprocess": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", - "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", + "node_modules/@capacitor/cli/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", "dependencies": { - "@ionic/utils-array": "2.1.5", - "@ionic/utils-fs": "3.1.6", - "@ionic/utils-process": "2.1.10", - "@ionic/utils-stream": "3.1.5", - "@ionic/utils-terminal": "2.3.3", - "cross-spawn": "^7.0.3", - "debug": "^4.0.0", - "tslib": "^2.0.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=10.3.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@capacitor/cli/node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-process": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", - "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", - "dev": true, + "node_modules/@capacitor/core": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-6.1.2.tgz", + "integrity": "sha512-xFy1/4qLFLp5WCIzIhtwUuVNNoz36+V7/BzHmLqgVJcvotc4MMjswW/TshnPQaLLujEOaLkA4h8ZJ0uoK3ImGg==", + "license": "MIT", "dependencies": { - "@ionic/utils-object": "2.1.5", - "@ionic/utils-terminal": "2.3.3", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "tslib": "^2.0.1" - }, + "tslib": "^2.1.0" + } + }, + "node_modules/@capacitor/filesystem": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/filesystem/-/filesystem-6.0.1.tgz", + "integrity": "sha512-eHhXm6tzBIQhErzFnfOE6eA1U+15DHc2212/COfzzGGRk/dyGympoVV3ct2YPVzvpTSxMEW3xFocORv/xD9gFg==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@capacitor/ios": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-6.1.2.tgz", + "integrity": "sha512-HaeW68KisBd/7TmavzPDlL2bpoDK5AjR2ZYrqU4TlGwM88GtQfvduBCAlSCj20X0w/4+rWMkseD9dAAkacjiyQ==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.1.0" + } + }, + "node_modules/@capacitor/splash-screen": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-6.0.2.tgz", + "integrity": "sha512-WC0KYZ+ev15up03xs4fTnoTKwBVUSxXsKKQr/8XAncvi/nAG8qrpanW8OlavSC5zF5e1IZZDLsI2GSv0SkZ7VQ==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.3.0" + "node": ">=0.1.90" } }, - "node_modules/@capacitor/cli/node_modules/@ionic/utils-terminal": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", - "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "@types/slice-ansi": "^4.0.0", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=10.3.0" + "node": ">=12" } }, - "node_modules/@capacitor/cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@cspotcode/source-map-support/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==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@capacitor/cli/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz", + "integrity": "sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || >=14" + "node": ">=14.17.0" } }, - "node_modules/@capacitor/cli/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@es-joy/jsdoccomment": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.46.0.tgz", + "integrity": "sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==", "dev": true, + "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.0.0" }, "engines": { - "node": ">=10" + "node": ">=16" } }, - "node_modules/@capacitor/cli/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, - "node_modules/@capacitor/cli/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/@esbuild/android-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@capacitor/cli/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "node_modules/@esbuild/android-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, - "node_modules/@capacitor/cli/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "node_modules/@esbuild/android-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@capacitor/cli/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, - "node_modules/@capacitor/cli/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/@esbuild/darwin-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 10.0.0" + "node": ">=18" } }, - "node_modules/@capacitor/cli/node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@capacitor/core": { - "version": "5.7.7", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.7.7.tgz", - "integrity": "sha512-LeV1ljAihl/1lFGHZERNY2DtD1fbPBF3rNOSHFPMXIluK4Cq4nK4a4z/dLPX+Cv4F0TyCIzX3+/t79PMbhDwrg==", - "dependencies": { - "tslib": "^2.1.0" + "node": ">=18" } }, - "node_modules/@capacitor/filesystem": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@capacitor/filesystem/-/filesystem-5.2.2.tgz", - "integrity": "sha512-h0Ta0NXF/zX9bXoD5qtoEoWSWCewow8Kredb2bBFO+vrd4NVthZH+GyrII2dk0++UIw40HjyLNk4apwGGSu9Sg==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "@capacitor/core": "^5.1.1" - } - }, - "node_modules/@capacitor/ios": { - "version": "5.7.7", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.7.7.tgz", - "integrity": "sha512-bgvSJGia5C5Klfd7t/qlqlRAWzGGAwlIlzkOJYsxpJiYuz6OXVgeesuXRxMNOaUZQ9fmL7OWukmhcv03t9Up+w==", - "peerDependencies": { - "@capacitor/core": "^5.7.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@capacitor/splash-screen": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@capacitor/splash-screen/-/splash-screen-5.0.8.tgz", - "integrity": "sha512-mDRJS9QFxL5UMN74gRr6cBhOtkZjWwdttPCjBJNgcMDJIGi9IAKRJuDGTsqSUbp6zWrPF4AW29Mu6qhXtHpHWg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "@capacitor/core": "^5.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.1.90" + "node": ">=18" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" + "node": ">=18" } }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.42.0", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "comment-parser": "1.4.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", + "node_modules/@esbuild/linux-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Python-2.0" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "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, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "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, "license": "(MIT OR CC0-1.0)", "engines": { @@ -3542,19 +4274,19 @@ }, "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==", "dev": true, "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3566,8 +4298,34 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "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, "license": "Apache-2.0", "engines": { @@ -3579,7 +4337,10 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, @@ -3593,118 +4354,372 @@ "node": ">=6.9.0" } }, - "node_modules/@ionic-native/core": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.36.0.tgz", - "integrity": "sha512-lOrkktadlKYbYf1LrDyAtsu1JnQ0oCCdkOU7iHQ8oXnNOkMwobFfD2m62F1CoOr0u9LIkpYnZSPjng8lZbmbNw==", + "node_modules/@inquirer/checkbox": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.4.7.tgz", + "integrity": "sha512-5YwCySyV1UEgqzz34gNsC38eKxRBtlRDpJLlKcRtTjlYA/yDKuc1rfw+hjw+2WJxbAZtaDPsRl5Zk7J14SBoBw==", + "dev": true, "license": "MIT", "dependencies": { - "@types/cordova": "latest" + "@inquirer/core": "^9.0.10", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.2", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" }, - "peerDependencies": { - "rxjs": "^5.5.0 || ^6.5.0" + "engines": { + "node": ">=18" } }, - "node_modules/@ionic-native/file-opener": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/@ionic-native/file-opener/-/file-opener-5.36.0.tgz", - "integrity": "sha512-UKp3pbqvQXsAtLMJ5JE+KcTMxpjSZMFebf6nvy/KJvwy85JGIaCV4ZVM/H9CFUrHJMWBH6wDbY+WPygnsrl4Yg==", + "node_modules/@inquirer/confirm": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", + "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", + "dev": true, "license": "MIT", "dependencies": { - "@types/cordova": "latest" + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2" }, - "peerDependencies": { - "@ionic-native/core": "^5.1.0", - "rxjs": "^5.5.0 || ^6.5.0" + "engines": { + "node": ">=18" } }, - "node_modules/@ionic/angular": { - "version": "6.7.5", + "node_modules/@inquirer/core": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.10.tgz", + "integrity": "sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==", + "dev": true, "license": "MIT", "dependencies": { - "@ionic/core": "6.7.5", - "ionicons": "^6.1.3", - "jsonc-parser": "^3.0.0", - "tslib": "^2.0.0" + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.2", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.1.0", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, - "peerDependencies": { - "@angular/core": ">=12.0.0", - "@angular/forms": ">=12.0.0", - "@angular/router": ">=12.0.0", - "rxjs": ">=6.6.0", - "zone.js": ">=0.11.0" + "engines": { + "node": ">=18" } }, - "node_modules/@ionic/angular-toolkit": { - "version": "11.0.1", + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", + "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "^17.0.0", - "@angular-devkit/schematics": "^17.0.0", - "@schematics/angular": "^17.0.0" + "undici-types": "~6.19.2" } }, - "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/core": { - "version": "17.3.3", + "node_modules/@inquirer/editor": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.1.22.tgz", + "integrity": "sha512-K1QwTu7GCK+nKOVRBp5HY9jt3DXOfPGPr6WRDrPImkcJRelG9UTx2cAtK1liXmibRrzJlTWOwqgWT3k2XnS62w==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.1", - "picomatch": "4.0.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2", + "external-editor": "^3.1.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/schematics": { - "version": "17.3.3", + "node_modules/@inquirer/expand": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.1.22.tgz", + "integrity": "sha512-wTZOBkzH+ItPuZ3ZPa9lynBsdMp6kQ9zbjVPYEtSBG7UulGjg2kQiAnUjgyG4SlntpTce5bOmXAPvE4sguXjpA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "17.3.3", - "jsonc-parser": "3.2.1", - "magic-string": "0.30.8", - "ora": "5.4.1", - "rxjs": "7.8.1" + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=18" } }, - "node_modules/@ionic/angular-toolkit/node_modules/@schematics/angular": { - "version": "17.3.3", + "node_modules/@inquirer/figures": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", "dev": true, "license": "MIT", - "dependencies": { - "@angular-devkit/core": "17.3.3", - "@angular-devkit/schematics": "17.3.3", - "jsonc-parser": "3.2.1" - }, "engines": { - "node": "^18.13.0 || >=20.9.0", + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.2.9.tgz", + "integrity": "sha512-7Z6N+uzkWM7+xsE+3rJdhdG/+mQgejOVqspoW+w0AbSZnL6nq5tGMEVASaYVWbkoSzecABWwmludO2evU3d31g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.1.22.tgz", + "integrity": "sha512-5Fxt1L9vh3rAKqjYwqsjU4DZsEvY/2Gll+QkqR4yEpy6wvzLxdSgFhUcxfDAOtO4BEoTreWoznC0phagwLU5Kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.0.7.tgz", + "integrity": "sha512-GFcigCxJTKCH3aECzMIu4FhgLJWnFvMXzpI4CCSoELWFtkOOU2P+goYA61+OKpGrB8fPE7q6n8zAXBSlZRrHjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^2.3.7", + "@inquirer/confirm": "^3.1.11", + "@inquirer/editor": "^2.1.11", + "@inquirer/expand": "^2.1.11", + "@inquirer/input": "^2.1.11", + "@inquirer/password": "^2.1.11", + "@inquirer/rawlist": "^2.1.11", + "@inquirer/select": "^2.3.7" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.2.4.tgz", + "integrity": "sha512-pb6w9pWrm7EfnYDgQObOurh2d2YH07+eDo3xQBsNAM2GRhliz6wFXGi1thKQ4bN6B0xDd6C3tBsjdr3obsCl3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.4.7.tgz", + "integrity": "sha512-JH7XqPEkBpNWp3gPCqWqY8ECbyMoFcCZANlL6pV9hf59qK6dGmkOlx1ydyhY+KZ0c5X74+W6Mtp+nm2QX0/MAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.10", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.2", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.2.tgz", + "integrity": "sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ionic-native/core": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.36.0.tgz", + "integrity": "sha512-lOrkktadlKYbYf1LrDyAtsu1JnQ0oCCdkOU7iHQ8oXnNOkMwobFfD2m62F1CoOr0u9LIkpYnZSPjng8lZbmbNw==", + "license": "MIT", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file-opener": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/@ionic-native/file-opener/-/file-opener-5.36.0.tgz", + "integrity": "sha512-UKp3pbqvQXsAtLMJ5JE+KcTMxpjSZMFebf6nvy/KJvwy85JGIaCV4ZVM/H9CFUrHJMWBH6wDbY+WPygnsrl4Yg==", + "license": "MIT", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic/angular": { + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.7.5.tgz", + "integrity": "sha512-nV8HP7RedjYkIAT8nVr5ifHNT0D3XzA74RPG3/WCCFJKunERNJ9SBiNkCTWhUpSkqsYYwEB4+SOOHz+R5NLk/w==", + "license": "MIT", + "dependencies": { + "@ionic/core": "6.7.5", + "ionicons": "^6.1.3", + "jsonc-parser": "^3.0.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": ">=12.0.0", + "@angular/forms": ">=12.0.0", + "@angular/router": ">=12.0.0", + "rxjs": ">=6.6.0", + "zone.js": ">=0.11.0" + } + }, + "node_modules/@ionic/angular-toolkit": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@ionic/angular-toolkit/-/angular-toolkit-11.0.1.tgz", + "integrity": "sha512-dxx2RDbxDYM2nWRPIirKMJySHtqJ1u02T25PGbNb99W2Wlcmu1cza3+2/PQ8ga18yMz/dQqaGyEmPDf3ZSVO0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "^17.0.0", + "@angular-devkit/schematics": "^17.0.0", + "@schematics/angular": "^17.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/core": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/schematics": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "17.3.8", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/@schematics/angular": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.8.tgz", + "integrity": "sha512-2g4OmSyE9YGq50Uj7fNI26P/TSAFJ7ZuirwTF2O7Xc4XRQ29/tYIIqhezpNlTb6rlYblcQuMcUZBrMfWJHcqJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", + "jsonc-parser": "3.2.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, + "node_modules/@ionic/angular-toolkit/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true, + "license": "MIT" + }, "node_modules/@ionic/angular-toolkit/node_modules/magic-string": { "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3716,6 +4731,8 @@ }, "node_modules/@ionic/angular-toolkit/node_modules/picomatch": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", "dev": true, "license": "MIT", "engines": { @@ -3727,6 +4744,8 @@ }, "node_modules/@ionic/angular-toolkit/node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3737,6 +4756,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-7.2.0.tgz", "integrity": "sha512-IEms9Df8mJOoWPqgvZEXmqKztttHDFAz+9ewDPZGYv8Xx66Cj7zSen13O2Vf4FuLXhl+U95HXT9sAs4lDwFmcQ==", + "dev": true, "license": "MIT", "dependencies": { "@ionic/cli-framework": "6.0.1", @@ -3777,6 +4797,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-6.0.1.tgz", "integrity": "sha512-Fyix4eQt2HKTV+GoeoiziQGZyqIA8RfoMqjGyAS5XgNXLOYW0P27Ph348hQZh9Mphjf+m0lOYa6dWQTEPzUHiQ==", + "dev": true, "license": "MIT", "dependencies": { "@ionic/cli-framework-output": "2.2.8", @@ -3803,6 +4824,7 @@ "version": "2.2.8", "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", + "dev": true, "license": "MIT", "dependencies": { "@ionic/utils-terminal": "2.3.5", @@ -3817,6 +4839,7 @@ "version": "2.1.13", "resolved": "https://registry.npmjs.org/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.13.tgz", "integrity": "sha512-Yj1fz6p7OehreQ8C70bd9+M6tYP/rvzLw5JVj8pT/N9s0kQSjqEFRbs96LKr3lfd3TADZaS8OlZrQIqenFIUpg==", + "dev": true, "license": "MIT", "dependencies": { "@ionic/utils-terminal": "2.3.5", @@ -3828,10 +4851,31 @@ "node": ">=16.0.0" } }, - "node_modules/@ionic/cli-framework-prompts/node_modules/ansi-styles": { + "node_modules/@ionic/cli-framework/node_modules/@ionic/utils-subprocess": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", + "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-terminal": "2.3.5", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/cli-framework/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, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3843,10 +4887,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@ionic/cli-framework-prompts/node_modules/chalk": { + "node_modules/@ionic/cli-framework/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, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3859,10 +4904,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@ionic/cli-framework-prompts/node_modules/color-convert": { + "node_modules/@ionic/cli-framework/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, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3871,43 +4917,45 @@ "node": ">=7.0.0" } }, - "node_modules/@ionic/cli-framework-prompts/node_modules/has-flag": { + "node_modules/@ionic/cli-framework/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, + "license": "MIT" + }, + "node_modules/@ionic/cli-framework/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, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@ionic/cli-framework-prompts/node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "license": "MIT", + "node_modules/@ionic/cli-framework/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@ionic/cli-framework-prompts/node_modules/supports-color": { + "node_modules/@ionic/cli-framework/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, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -3916,10 +4964,11 @@ "node": ">=8" } }, - "node_modules/@ionic/cli-framework/node_modules/@ionic/utils-subprocess": { + "node_modules/@ionic/cli/node_modules/@ionic/utils-subprocess": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "dev": true, "license": "MIT", "dependencies": { "@ionic/utils-array": "2.1.6", @@ -3935,10 +4984,11 @@ "node": ">=16.0.0" } }, - "node_modules/@ionic/cli-framework/node_modules/ansi-styles": { + "node_modules/@ionic/cli/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, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3950,10 +5000,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@ionic/cli-framework/node_modules/chalk": { + "node_modules/@ionic/cli/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, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3966,10 +5017,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@ionic/cli-framework/node_modules/color-convert": { + "node_modules/@ionic/cli/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, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3978,94 +5030,48 @@ "node": ">=7.0.0" } }, - "node_modules/@ionic/cli-framework/node_modules/has-flag": { + "node_modules/@ionic/cli/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, + "license": "MIT" + }, + "node_modules/@ionic/cli/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, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@ionic/cli-framework/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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ionic/cli/node_modules/@ionic/utils-subprocess": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", - "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", - "license": "MIT", - "dependencies": { - "@ionic/utils-array": "2.1.6", - "@ionic/utils-fs": "3.1.7", - "@ionic/utils-process": "2.1.12", - "@ionic/utils-stream": "3.1.7", - "@ionic/utils-terminal": "2.3.5", - "cross-spawn": "^7.0.3", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/cli/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==", + "node_modules/@ionic/cli/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" + "bin": { + "is-docker": "cli.js" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@ionic/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@ionic/cli/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==", + "node_modules/@ionic/cli/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "is-docker": "^2.0.0" }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@ionic/cli/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==", - "license": "MIT", "engines": { "node": ">=8" } @@ -4074,6 +5080,7 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, "license": "MIT", "dependencies": { "is-docker": "^2.0.0", @@ -4090,6 +5097,7 @@ "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, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -4100,6 +5108,8 @@ }, "node_modules/@ionic/core": { "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.7.5.tgz", + "integrity": "sha512-zRkRn+h/Vs3xt/EVgBdShMKDyeGOM4RU31NPF2icfu3CUTH+VrMV569MUnNjYvd1Lu2xK90pYy4TaicSWmC1Pw==", "license": "MIT", "dependencies": { "@stencil/core": "^2.18.0", @@ -4111,6 +5121,7 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^4.0.0", @@ -4124,6 +5135,7 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "dev": true, "license": "MIT", "dependencies": { "@types/fs-extra": "^8.0.0", @@ -4139,6 +5151,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", @@ -4150,31 +5163,11 @@ "node": ">=10" } }, - "node_modules/@ionic/utils-fs/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@ionic/utils-fs/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@ionic/utils-network": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/@ionic/utils-network/-/utils-network-2.1.7.tgz", "integrity": "sha512-5Q3NdZtSLiLs7ufuX9X293BvAwo8CxaD93Hkp3ODPgctLYErv3nFibhq3j+eguEqUh2um9WNXEUOuQ8x+Sd1fw==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^4.0.0", @@ -4188,6 +5181,7 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^4.0.0", @@ -4201,6 +5195,7 @@ "version": "2.1.12", "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", + "dev": true, "license": "MIT", "dependencies": { "@ionic/utils-object": "2.1.6", @@ -4214,10 +5209,18 @@ "node": ">=16.0.0" } }, + "node_modules/@ionic/utils-process/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@ionic/utils-stream": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^4.0.0", @@ -4228,82 +5231,106 @@ } }, "node_modules/@ionic/utils-subprocess": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.14.tgz", - "integrity": "sha512-nGYvyGVjU0kjPUcSRFr4ROTraT3w/7r502f5QJEsMRKTqa4eEzCshtwRk+/mpASm0kgBN5rrjYA5A/OZg8ahqg==", + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", + "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", "dev": true, "license": "MIT", "dependencies": { - "@ionic/utils-array": "2.1.6", - "@ionic/utils-fs": "3.1.7", - "@ionic/utils-process": "2.1.11", - "@ionic/utils-stream": "3.1.6", - "@ionic/utils-terminal": "2.3.4", + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.6", + "@ionic/utils-process": "2.1.10", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-terminal": "2.3.3", "cross-spawn": "^7.0.3", "debug": "^4.0.0", "tslib": "^2.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.3.0" } }, - "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-process": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.11.tgz", - "integrity": "sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==", + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-array": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", + "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", "dev": true, "license": "MIT", "dependencies": { - "@ionic/utils-object": "2.1.6", - "@ionic/utils-terminal": "2.3.4", "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", "tslib": "^2.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.3.0" } }, - "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-stream": { + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-fs": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.6.tgz", - "integrity": "sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", + "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", "dev": true, "license": "MIT", "dependencies": { + "@types/fs-extra": "^8.0.0", "debug": "^4.0.0", + "fs-extra": "^9.0.0", "tslib": "^2.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.3.0" } }, - "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-terminal": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", - "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-object": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", + "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", "dev": true, "license": "MIT", "dependencies": { - "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-process": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", + "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-object": "2.1.5", + "@ionic/utils-terminal": "2.3.3", "debug": "^4.0.0", "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.3.0" } }, - "node_modules/@ionic/utils-terminal": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", - "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-stream": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", + "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-terminal": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", + "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/slice-ansi": "^4.0.0", @@ -4317,54 +5344,223 @@ "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.3.0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", + "node_modules/@ionic/utils-subprocess/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, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", + "node_modules/@ionic/utils-subprocess/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, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", + "node_modules/@ionic/utils-subprocess/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, "license": "MIT" }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", + "node_modules/@ionic/utils-subprocess/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@ionic/utils-subprocess/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@ionic/utils-terminal/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@ionic/utils-terminal/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, + "license": "MIT" + }, + "node_modules/@ionic/utils-terminal/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@ionic/utils-terminal/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -4381,6 +5577,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4395,6 +5593,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4409,23 +5609,10 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -4434,6 +5621,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -4446,7 +5635,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -4455,6 +5646,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -4462,21 +5655,27 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "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, "license": "MIT", "dependencies": { @@ -4484,95 +5683,350 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@kurkle/color": { - "version": "0.3.2", - "license": "MIT" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@ngtools/webpack": { - "version": "16.2.14", + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "typescript": ">=4.9.3 <5.2", - "webpack": "^5.54.0" + "tslib": "2" } }, - "node_modules/@ngx-formly/core": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-6.3.6.tgz", - "integrity": "sha512-0GDllrb9fFBTKG+yT+iQf96N3/CN+qRXIYsSX3uft12+c28qKVfMTsWTPYQsmKfGcrqtOZkMVTc+jGGD2JLZLg==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.0.0" + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@angular/forms": ">=13.2.0", - "rxjs": "^6.5.3 || ^7.0.0" + "tslib": "2" } }, - "node_modules/@ngx-formly/ionic": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/@ngx-formly/ionic/-/ionic-6.3.6.tgz", - "integrity": "sha512-GaZav6bGGuQ3BqEVYK9DV+QsdM92jjfPmKbN9qz5s+kXH4ahjGfMqcq6Rm4SP49vvl5Am3mJZbZU4g9XrJI5tQ==", - "dependencies": { - "tslib": "^2.0.0" + "node_modules/@jsonjoy.com/util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", + "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@ionic/angular": "^6.0.0 || ^7.0.0", - "@ngx-formly/core": "6.3.6" + "tslib": "2" } }, - "node_modules/@ngx-formly/schematics": { - "version": "6.3.0", - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "^13.0.3", - "@angular-devkit/schematics": "^13.0.3", - "@schematics/angular": "^13.0.3" - } + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", + "license": "MIT" }, - "node_modules/@ngx-formly/schematics/node_modules/@angular-devkit/core": { - "version": "13.3.11", + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.13.tgz", + "integrity": "sha512-nAl6teTt7EWSjttNavAnv3uFR3w3vPP3OTYmHyPNHzKhAj2NoBDHmbS3MGpvvO8KXXPASnHjEGrrKrdKTMKPnQ==", + "dev": true, "license": "MIT", "dependencies": { - "ajv": "8.9.0", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" + "@inquirer/type": "^1.3.3" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=18.0.0" }, "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "@inquirer/prompts": ">= 3 < 6" } }, - "node_modules/@ngx-formly/schematics/node_modules/@angular-devkit/schematics": { - "version": "13.3.11", + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.13.tgz", + "integrity": "sha512-uiKPB0Fv6WEEOZjruu9a6wnW/8jrjzlZbxXscMB8kuCJ1k6kHpcBnuvaAWcqhbI7rqX5GKziwWEdD+wi2gNLfA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@angular-devkit/core": "13.3.11", - "jsonc-parser": "3.0.0", - "magic-string": "0.25.7", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.13.tgz", + "integrity": "sha512-bEVIIfK5mSQoG1R19qA+fJOvCB+0wVGGnXHT3smchBVahYBdlPn2OsZZKzlHWfb1E+PhLBmYfqB5zQXFP7hJig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.13.tgz", + "integrity": "sha512-Yml1KlMzOnXj/tnW7yX8U78iAzTk39aILYvCPbqeewAq1kSzl+w59k/fiVkTBfvDi/oW/5YRxL+Fq+Y1Fr1r2Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.13.tgz", + "integrity": "sha512-afbVrsMgZ9dUTNUchFpj5VkmJRxvht/u335jUJ7o23YTbNbnpmXif3VKQGCtnjSh+CZaqm6N3CPG8KO3zwyZ1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.13.tgz", + "integrity": "sha512-vOtxu0xC0SLdQ2WRXg8Qgd8T32ak4SPqk5zjItRszrJk2BdeXqfGxBJbP7o4aOvSPSmSSv46Lr1EP4HXU8v7Kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.13.tgz", + "integrity": "sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ngtools/webpack": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.2.tgz", + "integrity": "sha512-YhADmc+lVjLt3kze07A+yLry2yzcghdclu+7D3EDfa6fG2Pk33HK3MY2I0Z0BO+Ivoq7cV7yxm+naR+Od0Y5ng==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "typescript": ">=5.4 <5.6", + "webpack": "^5.54.0" + } + }, + "node_modules/@ngx-formly/core": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-6.3.6.tgz", + "integrity": "sha512-0GDllrb9fFBTKG+yT+iQf96N3/CN+qRXIYsSX3uft12+c28qKVfMTsWTPYQsmKfGcrqtOZkMVTc+jGGD2JLZLg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/forms": ">=13.2.0", + "rxjs": "^6.5.3 || ^7.0.0" + } + }, + "node_modules/@ngx-formly/ionic": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/@ngx-formly/ionic/-/ionic-6.3.6.tgz", + "integrity": "sha512-GaZav6bGGuQ3BqEVYK9DV+QsdM92jjfPmKbN9qz5s+kXH4ahjGfMqcq6Rm4SP49vvl5Am3mJZbZU4g9XrJI5tQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@ionic/angular": "^6.0.0 || ^7.0.0", + "@ngx-formly/core": "6.3.6" + } + }, + "node_modules/@ngx-formly/schematics": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-6.3.6.tgz", + "integrity": "sha512-QdrvdL4YrfhU9AxIXczSyzbZHWq7uuDtsIeEZ3lC0dFyvA0YyTxZRWfNyyMwCXCRXvn70WGlaU8UpeahTXsoAg==", + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "^13.0.3", + "@angular-devkit/schematics": "^13.0.3", + "@schematics/angular": "^13.0.3" + } + }, + "node_modules/@ngx-formly/schematics/node_modules/@angular-devkit/core": { + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.11.tgz", + "integrity": "sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w==", + "license": "MIT", + "dependencies": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@ngx-formly/schematics/node_modules/@angular-devkit/schematics": { + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.11.tgz", + "integrity": "sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg==", + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "13.3.11", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", "ora": "5.4.1", "rxjs": "6.6.7" }, @@ -4584,6 +6038,8 @@ }, "node_modules/@ngx-formly/schematics/node_modules/@schematics/angular": { "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.11.tgz", + "integrity": "sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==", "license": "MIT", "dependencies": { "@angular-devkit/core": "13.3.11", @@ -4598,6 +6054,8 @@ }, "node_modules/@ngx-formly/schematics/node_modules/ajv": { "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -4610,12 +6068,33 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@ngx-formly/schematics/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/@ngx-formly/schematics/node_modules/jsonc-parser": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", "license": "MIT" }, "node_modules/@ngx-formly/schematics/node_modules/magic-string": { "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.4" @@ -4623,6 +6102,8 @@ }, "node_modules/@ngx-formly/schematics/node_modules/source-map": { "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "license": "BSD-3-Clause", "engines": { "node": ">= 8" @@ -4630,6 +6111,8 @@ }, "node_modules/@ngx-translate/core": { "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz", + "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==", "license": "SEE LICENSE IN LICENSE", "engines": { "node": "^16.13.0 || >=18.10.0" @@ -4642,6 +6125,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -4654,6 +6139,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -4662,6 +6149,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -4674,13 +6163,41 @@ }, "node_modules/@nodro7/angular-mydatepicker": { "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@nodro7/angular-mydatepicker/-/angular-mydatepicker-0.14.0.tgz", + "integrity": "sha512-NLUqU2Hpy3OQn/2xp5FDIqBlb87o9LCYRShnA9tfbQIPQIKay4sSexK6XPswZ3ccXkvrgRMhFDZpv10JURqahA==", "license": "MIT", "dependencies": { "tslib": "^2.0.0" } }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@npmcli/fs": { - "version": "3.1.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "license": "ISC", "dependencies": { @@ -4691,47 +6208,63 @@ } }, "node_modules/@npmcli/git": { - "version": "4.1.0", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^3.0.0" + "which": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, "license": "ISC", "engines": { - "node": ">=12" + "node": ">=16" } }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "license": "ISC", "dependencies": { @@ -4739,178 +6272,194 @@ "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "installed-package-contents": "lib/index.js" + "installed-package-contents": "bin/index.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", + "node_modules/@npmcli/package-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", "dev": true, "license": "ISC", "dependencies": { - "which": "^3.0.0" + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { - "node-which": "bin/which.js" + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/run-script": { + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/package-json/node_modules/normalize-package-data": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, - "license": "ISC", + "license": "BSD-2-Clause", "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" + "which": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@nrwl/devkit": { - "version": "16.5.1", + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@nx/devkit": "16.5.1" + "license": "ISC", + "engines": { + "node": ">=16" } }, - "node_modules/@nrwl/tao": { - "version": "16.5.1", + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "nx": "16.5.1" + "isexe": "^3.1.1" }, "bin": { - "tao": "index.js" + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@nx/devkit": { - "version": "16.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@nrwl/devkit": "16.5.1", - "ejs": "^3.1.7", - "ignore": "^5.0.4", - "semver": "7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "nx": ">= 15 <= 17" - } - }, - "node_modules/@nx/devkit/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/@npmcli/redact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", + "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", "dev": true, "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@nx/devkit/node_modules/semver": { - "version": "7.5.3", + "node_modules/@npmcli/run-script": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", + "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@nx/devkit/node_modules/tmp": { - "version": "0.2.3", + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=14.14" + "node": ">=16" } }, - "node_modules/@nx/devkit/node_modules/yallist": { + "node_modules/@npmcli/run-script/node_modules/which": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, - "license": "ISC" - }, - "node_modules/@parcel/watcher": { - "version": "2.0.4", - "dev": true, - "hasInstallScript": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" + "isexe": "^3.1.1" }, - "engines": { - "node": ">= 10.0.0" + "bin": { + "node-which": "bin/which.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", "optional": true, @@ -4918,6 +6467,19 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@prettier/plugin-xml": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", @@ -4929,155 +6491,435 @@ "prettier": ">=2.4.0" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@schematics/angular": { - "version": "16.2.13", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.1.0.tgz", + "integrity": "sha512-k9Dy6JD7hqvCzDqnMjDm7J8H/P6m5mLuX2yEgQWKRAJ/YMINtBQAaKA1T9qXk97kEX6RNLpHMuDIsrIfK/H31Q==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "16.2.13", - "@angular-devkit/schematics": "16.2.13", - "jsonc-parser": "3.2.0" + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "jsonc-parser": "3.3.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@schematics/angular/node_modules/jsonc-parser": { - "version": "3.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@sigstore/bundle": { - "version": "1.1.0", + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.1.0.tgz", + "integrity": "sha512-6eXQDzHZCbpSMLv9Ohl+1QyLVDmGEXpuuHz3y64LfUTP0aEiBaxk96FjLXIxzJ4f2pbbW2XHzc+yuboGToRA0w==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" + "ajv": "8.16.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", + "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.1.0.tgz", + "integrity": "sha512-BjrYutLfYFiPOSEcLBWCj3ENkwDn8gMfBSJesaBz7OrZBZGK5j0dVgBLIsGTP96TKo4o4vszJQOvS4AtV6xMGg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "18.1.0", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.10", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@sigstore/sign": { - "version": "1.0.0", + "node_modules/@schematics/angular/node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { - "version": "2.0.0", + "node_modules/@schematics/angular/node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" } }, - "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { - "version": "5.0.0", + "node_modules/@schematics/angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "tslib": "^2.1.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { - "node": ">= 6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/lru-cache": { - "version": "7.18.3", + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { - "version": "11.1.1", + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", + "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/minipass-fetch": { - "version": "3.0.4", + "node_modules/@sigstore/sign": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", + "node_modules/@sigstore/tuf": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", + "node_modules/@sigstore/verify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true, "license": "MIT" }, "node_modules/@stencil/core": { "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz", + "integrity": "sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==", "license": "MIT", "bin": { "stencil": "bin/stencil" @@ -5088,16 +6930,18 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.4.0.tgz", - "integrity": "sha512-GJ86m60wpKPm0m8sSuApOITjCvKUbyzhVO/BTQb7BNYXVUJMS3ql+uAro0V+4yoHwyBVXTB4EDy3UGkOqtEyyw==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.7.2.tgz", + "integrity": "sha512-3DVLU5HEuk2pQoBmXJlzvrxbKNpu2mJ0SRqz5O/CJjyNCr12ZiPcYMEtuArTyPOk5i7bsAU44nywh1rGfe3gKQ==", "dev": true, + "license": "MIT", "dependencies": { - "@stylistic/eslint-plugin-js": "2.4.0", - "@stylistic/eslint-plugin-jsx": "2.4.0", - "@stylistic/eslint-plugin-plus": "2.4.0", - "@stylistic/eslint-plugin-ts": "2.4.0", - "@types/eslint": "^9.6.0" + "@types/eslint": "^9.6.1", + "@typescript-eslint/utils": "^8.3.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5106,440 +6950,17 @@ "eslint": ">=8.40.0" } }, - "node_modules/@stylistic/eslint-plugin-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.4.0.tgz", - "integrity": "sha512-ScIYDFAwNz+ELr3KfAZMuYMCUq7Q6TdEEIq4RBRR77EHucpDrwi5Kx2d0VdYxb4s4o6nOtSkJmY9MCZupDYJow==", + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true, - "dependencies": { - "@types/eslint": "^9.6.0", - "acorn": "^8.12.1", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } + "license": "MIT" }, - "node_modules/@stylistic/eslint-plugin-js/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-js/node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-jsx": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-2.4.0.tgz", - "integrity": "sha512-yaZXaRj9lOwrQd1YA1d1Ssz58IrDKDYTvLzlKcKED4NlpjDdMbj//Y4DlNhlW9M9v0ZsRsmKNQl2p5OWFfmdEw==", - "dev": true, - "dependencies": { - "@stylistic/eslint-plugin-js": "^2.4.0", - "@types/eslint": "^9.6.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@stylistic/eslint-plugin-jsx/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@stylistic/eslint-plugin-jsx/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@stylistic/eslint-plugin-plus": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-2.4.0.tgz", - "integrity": "sha512-yqVZ2ps3lSzT3Atcx/jSbzTaRJfxtWeuPk1WvINUod1fRVxNlgKLDwiM+63Hq3Q7H4aM0lS5ccAbFlEGINNg0Q==", - "dev": true, - "dependencies": { - "@types/eslint": "^9.6.0", - "@typescript-eslint/utils": "^7.17.0" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@stylistic/eslint-plugin-ts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.4.0.tgz", - "integrity": "sha512-0zi3hHrrqaXPGZESTfPNUm4YMvxq+aqPGCUiZfEnn7l5VNC19oKaPonZ6LmKzoksebzpJ7w6nieZLVeQm4o7tg==", - "dev": true, - "dependencies": { - "@stylistic/eslint-plugin-js": "2.4.0", - "@types/eslint": "^9.6.0", - "@typescript-eslint/utils": "^7.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "node_modules/@trapezedev/gradle-parse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@trapezedev/gradle-parse/-/gradle-parse-7.0.10.tgz", - "integrity": "sha512-k822Is3jGroqOTKF0gAFm80LmhFJWBAyZvNtyuXq6uQUzDDe2fj/gHwixP6VFzlpaWKLP7IuR609Xv8gwJCXyg==", + "node_modules/@trapezedev/gradle-parse": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@trapezedev/gradle-parse/-/gradle-parse-7.0.10.tgz", + "integrity": "sha512-k822Is3jGroqOTKF0gAFm80LmhFJWBAyZvNtyuXq6uQUzDDe2fj/gHwixP6VFzlpaWKLP7IuR609Xv8gwJCXyg==", "dev": true, "license": "SEE LICENSE" }, @@ -5612,80 +7033,62 @@ "node": ">=10" } }, - "node_modules/@trapezedev/project/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, "license": "MIT" }, "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, "license": "MIT" }, "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, "license": "MIT" }, "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==", "dev": true, "license": "MIT" }, "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@types/body-parser": { "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "license": "MIT", "dependencies": { @@ -5695,6 +7098,8 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5703,6 +7108,8 @@ }, "node_modules/@types/connect": { "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -5711,6 +7118,8 @@ }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "license": "MIT", "dependencies": { @@ -5720,6 +7129,8 @@ }, "node_modules/@types/cookie": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true, "license": "MIT" }, @@ -5731,6 +7142,8 @@ }, "node_modules/@types/cors": { "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "license": "MIT", "dependencies": { @@ -5738,31 +7151,27 @@ } }, "node_modules/@types/eslint": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", - "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5773,9 +7182,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", - "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "license": "MIT", "dependencies": { @@ -5789,6 +7198,7 @@ "version": "8.1.5", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -5796,11 +7206,15 @@ }, "node_modules/@types/http-errors": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true, "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.14", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5809,11 +7223,15 @@ }, "node_modules/@types/jasmine": { "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.6.tgz", + "integrity": "sha512-3N0FpQTeiWjm+Oo1WUYWguUS7E6JLceiGTriFrG8k5PU7zRLJCzLcWURU3wjMbZGS//a2/LgjsnO3QxIlwxt9g==", "dev": true, "license": "MIT" }, "node_modules/@types/jasminewd2": { "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.13.tgz", + "integrity": "sha512-aJ3wj8tXMpBrzQ5ghIaqMisD8C3FIrcO6sDKHqFbuqAsI7yOxj0fA7MrRCPLZHIVUjERIwsMmGn/vB0UQ9u0Hg==", "dev": true, "license": "MIT", "dependencies": { @@ -5822,16 +7240,22 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true, "license": "MIT" }, @@ -5842,15 +7266,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { - "version": "20.12.7", + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-forge": { "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5866,36 +7305,43 @@ }, "node_modules/@types/q": { "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", "dev": true, "license": "MIT" }, "node_modules/@types/qs": { "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/retry": { - "version": "0.12.0", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true, "license": "MIT" }, "node_modules/@types/selenium-webdriver": { "version": "3.0.26", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.26.tgz", + "integrity": "sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "license": "MIT", "dependencies": { @@ -5905,6 +7351,8 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "license": "MIT", "dependencies": { @@ -5913,6 +7361,8 @@ }, "node_modules/@types/serve-static": { "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "license": "MIT", "dependencies": { @@ -5925,10 +7375,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/sockjs": { "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5942,8 +7395,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ws": { - "version": "8.5.10", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5951,58 +7413,32 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -6011,49 +7447,50 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.21.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -6062,15 +7499,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6078,62 +7517,26 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "dev": true, - "license": "MIT", - "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/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "dev": true, - "license": "BSD-2-Clause", - "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" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -6141,55 +7544,37 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6197,21 +7582,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6223,90 +7610,41 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", + "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", "dev": true, "license": "MIT", "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" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", + "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -6314,11 +7652,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.62.0", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", + "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -6326,20 +7666,23 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", + "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -6352,82 +7695,91 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", + "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.3.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/globby": { - "version": "11.1.0", + "node_modules/@typescript-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, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://opencollective.com/eslint" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true, "license": "ISC" }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.0.1", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", "dev": true, "license": "MIT", "engines": { "node": ">=14.6.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "license": "MIT", "dependencies": { @@ -6437,21 +7789,29 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "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, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "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, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "license": "MIT", "dependencies": { @@ -6462,11 +7822,15 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "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, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "license": "MIT", "dependencies": { @@ -6478,6 +7842,8 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "license": "MIT", "dependencies": { @@ -6486,6 +7852,8 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6494,11 +7862,15 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "license": "MIT", "dependencies": { @@ -6514,6 +7886,8 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "license": "MIT", "dependencies": { @@ -6526,6 +7900,8 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "license": "MIT", "dependencies": { @@ -6537,6 +7913,8 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6550,6 +7928,8 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "license": "MIT", "dependencies": { @@ -6557,86 +7937,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@wessberg/ts-evaluator": { - "version": "0.0.27", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "jsdom": "^16.4.0", - "object-path": "^0.11.5", - "tslib": "^2.0.3" - }, - "engines": { - "node": ">=10.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" - }, - "peerDependencies": { - "typescript": ">=3.2.x || >= 4.x" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/@wessberg/ts-evaluator/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@xml-tools/parser": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", @@ -6659,59 +7959,39 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true, "license": "BSD-2-Clause" }, - "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" - }, + "license": "ISC", "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/@zkochan/js-yaml": { - "version": "0.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@zkochan/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/abab": { - "version": "2.0.6", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "license": "ISC" - }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", "dependencies": { @@ -6727,25 +8007,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -6754,16 +8015,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6772,6 +8027,8 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6779,9 +8036,14 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.1", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "dev": true, "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -6795,6 +8057,8 @@ }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, "license": "MIT", "dependencies": { @@ -6807,6 +8071,8 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { @@ -6819,37 +8085,32 @@ } }, "node_modules/adm-zip": { - "version": "0.5.12", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.15.tgz", + "integrity": "sha512-jYPWSeOA8EFoZnucrKCNihqBjoEGQSU4HKgHYQgKNEQ0pQF9a/DYuo/+fAxY76k4qe75LUlLWpAM1QWcBMTOKw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.0" + "node": ">=12.0" } }, "node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "license": "MIT", "dependencies": { - "humanize-ms": "^1.2.1" + "debug": "^4.3.4" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 14" } }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "license": "MIT", "dependencies": { @@ -6861,13 +8122,16 @@ } }, "node_modules/ajv": { - "version": "8.12.0", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -6875,7 +8139,10 @@ } }, "node_modules/ajv-formats": { - "version": "2.1.1", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -6891,6 +8158,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -6902,6 +8171,8 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", "engines": { @@ -6910,6 +8181,9 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -6923,6 +8197,8 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" @@ -6934,6 +8210,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -6941,6 +8219,8 @@ }, "node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { @@ -6952,6 +8232,8 @@ }, "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==", "devOptional": true, "license": "ISC", "dependencies": { @@ -6962,46 +8244,47 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "license": "ISC" + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/are-docs-informative": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, "license": "MIT", "engines": { "node": ">=14" } }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/arg": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { - "version": "1.0.10", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7010,6 +8293,8 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "license": "MIT", "dependencies": { @@ -7025,6 +8310,8 @@ }, "node_modules/array-flatten": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true, "license": "MIT" }, @@ -7036,14 +8323,17 @@ "license": "MIT" }, "node_modules/array-includes": { - "version": "3.1.7", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -7055,6 +8345,8 @@ }, "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, "license": "MIT", "engines": { @@ -7063,6 +8355,8 @@ }, "node_modules/array-uniq": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, "license": "MIT", "engines": { @@ -7071,6 +8365,8 @@ }, "node_modules/array.prototype.findlastindex": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7090,6 +8386,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "license": "MIT", "dependencies": { @@ -7107,6 +8405,8 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7124,6 +8424,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "license": "MIT", "dependencies": { @@ -7145,6 +8447,8 @@ }, "node_modules/arrify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, "license": "MIT", "engines": { @@ -7155,10 +8459,13 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, "license": "MIT" }, "node_modules/asn1": { "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7167,6 +8474,8 @@ }, "node_modules/assert-plus": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "license": "MIT", "engines": { @@ -7177,6 +8486,7 @@ "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.0.1" @@ -7189,31 +8499,33 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/async": { - "version": "3.2.5", - "dev": true, - "license": "MIT" - }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { - "version": "10.4.14", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -7223,15 +8535,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -7246,6 +8562,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -7260,6 +8578,8 @@ }, "node_modules/aws-sign2": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -7267,39 +8587,20 @@ } }, "node_modules/aws4": { - "version": "1.12.0", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.1.tgz", + "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==", "dev": true, "license": "MIT" }, - "node_modules/axios": { - "version": "1.6.8", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/axobject-query": { - "version": "4.0.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" + "engines": { + "node": ">= 0.4" } }, "node_modules/b4a": { @@ -7311,42 +8612,31 @@ }, "node_modules/babel-loader": { "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "license": "MIT", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -7355,6 +8645,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -7362,53 +8654,27 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "dev": true, - "license": "MIT", - "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", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, "license": "MIT", "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" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "license": "MIT", "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" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7416,6 +8682,9 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/bare-events": { @@ -7471,6 +8740,8 @@ }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -7489,6 +8760,8 @@ }, "node_modules/base64id": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, "license": "MIT", "engines": { @@ -7499,6 +8772,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -7506,11 +8780,15 @@ }, "node_modules/batch": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true, "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7529,6 +8807,8 @@ }, "node_modules/big.js": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, "license": "MIT", "engines": { @@ -7536,15 +8816,22 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "devOptional": true, "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -7554,6 +8841,8 @@ }, "node_modules/blocking-proxy": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", "dev": true, "license": "MIT", "dependencies": { @@ -7568,6 +8857,8 @@ }, "node_modules/body-parser": { "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "license": "MIT", "dependencies": { @@ -7589,16 +8880,10 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -7607,6 +8892,8 @@ }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "license": "MIT", "dependencies": { @@ -7618,11 +8905,15 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "license": "MIT", "dependencies": { @@ -7632,6 +8923,8 @@ }, "node_modules/boolbase": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, "license": "ISC" }, @@ -7659,11 +8952,13 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -7679,13 +8974,10 @@ "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/browserslist": { - "version": "4.23.0", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -7703,10 +8995,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -7717,6 +9009,8 @@ }, "node_modules/browserstack": { "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", "dev": true, "license": "MIT", "dependencies": { @@ -7725,6 +9019,8 @@ }, "node_modules/browserstack/node_modules/agent-base": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "license": "MIT", "dependencies": { @@ -7736,6 +9032,8 @@ }, "node_modules/browserstack/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7744,6 +9042,8 @@ }, "node_modules/browserstack/node_modules/https-proxy-agent": { "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -7756,6 +9056,8 @@ }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -7788,30 +9090,31 @@ }, "node_modules/buffer-from": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, - "node_modules/builtin-modules": { - "version": "3.3.0", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/bytes": { - "version": "3.0.0", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { @@ -7819,16 +9122,18 @@ } }, "node_modules/cacache": { - "version": "17.1.4", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", - "lru-cache": "^7.7.1", + "lru-cache": "^10.0.1", "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", @@ -7837,27 +9142,42 @@ "unique-filename": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", + "node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", - "engines": { - "node": ">=12" + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } + "license": "ISC" }, "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==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -7875,6 +9195,8 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -7883,6 +9205,8 @@ }, "node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -7908,7 +9232,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001606", + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "dev": true, "funding": [ { @@ -7930,36 +9256,41 @@ "version": "1.1.17", "resolved": "https://registry.npmjs.org/capacitor-blob-writer/-/capacitor-blob-writer-1.1.17.tgz", "integrity": "sha512-IixJbl0k4NQ+aPo+UbDvHJxztnaGymVMCkYoHKTjj3F3KDTsMEl5iK7fEZkQ5jhQabe8YJKW0wTGu6Qm/RmXrw==", + "license": "MIT", "peerDependencies": { "@capacitor/core": ">=3.0.0", "@capacitor/filesystem": ">=1.0.0" } }, "node_modules/capacitor-ios-autofill-save-password": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capacitor-ios-autofill-save-password/-/capacitor-ios-autofill-save-password-2.0.0.tgz", - "integrity": "sha512-7Tnu7qU5elnv1YkcXtXPIBhvyCZX9nskKrI78kJG65qaf6rSL1EE5IBOdTSQcpyPSyVio+UX1EFsS/QZjQrPuA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/capacitor-ios-autofill-save-password/-/capacitor-ios-autofill-save-password-3.0.0.tgz", + "integrity": "sha512-FGWralgZ47FtpRcIaJP+IcNDZfmoaCUmkeGBKo84V3nYMKQwQbpN9wLIzXa+TtHj8h1SenRuSR2eTsQBrRewAQ==", "license": "MIT", "peerDependencies": { - "@capacitor/core": "^5.0.0" + "@capacitor/core": "^6.0.0" } }, "node_modules/capacitor-secure-storage-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/capacitor-secure-storage-plugin/-/capacitor-secure-storage-plugin-0.9.0.tgz", - "integrity": "sha512-P5fiC94opcLHu41vceo9weXH+20g0SPYKkeAx+qm9eKNcVFqpcuI4dqwivXlGXYNMDygyjSQuAaFwZ4gW0Y91Q==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/capacitor-secure-storage-plugin/-/capacitor-secure-storage-plugin-0.10.0.tgz", + "integrity": "sha512-dV4E+HTZAJWC3gef7sBXaAkkb6wvcZHyXjJIHXNb3yz9gRQ/5VMLqCxa0khqpwgWh5oIbo4XFxg3g5tEkfaNMg==", "license": "MIT", "peerDependencies": { - "@capacitor/core": "^5.0.0" + "@capacitor/core": "^6.0.0" } }, "node_modules/caseless": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true, "license": "Apache-2.0" }, "node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7973,12 +9304,15 @@ }, "node_modules/chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, "license": "MIT" }, "node_modules/chart.js": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", - "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", + "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -7989,6 +9323,8 @@ }, "node_modules/chartjs-adapter-date-fns": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-3.0.0.tgz", + "integrity": "sha512-Rs3iEB3Q5pJ973J93OBTpnP7qoGwvq3nUnoMdtxO+9aoJof7UFcRbWcIDteXuYd1fgAvct/32T9qaLyLuZVwCg==", "license": "MIT", "peerDependencies": { "chart.js": ">=2.8.0", @@ -8004,8 +9340,19 @@ "chart.js": ">=4.0.0" } }, + "node_modules/chartjs-plugin-datalabels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz", + "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==", + "license": "MIT", + "peerDependencies": { + "chart.js": ">=3.0.0" + } + }, "node_modules/chartjs-plugin-zoom": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz", + "integrity": "sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==", "license": "MIT", "dependencies": { "hammerjs": "^2.0.8" @@ -8025,14 +9372,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -8046,19 +9389,27 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", "engines": { @@ -8067,10 +9418,14 @@ }, "node_modules/classlist.js": { "version": "1.1.20150312", + "resolved": "https://registry.npmjs.org/classlist.js/-/classlist.js-1.1.20150312.tgz", + "integrity": "sha512-eR8yB970+yGslcTnJnROX2icsMa8v/KVLv/sgv3NhSvZSHgam64XNSF2TyJnKIfsnTFJBcTdrIneYqUIrvxLpg==", "license": "Dedicated to the public domain" }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "license": "MIT", "engines": { @@ -8079,6 +9434,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" @@ -8089,6 +9446,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", "engines": { "node": ">=6" @@ -8097,28 +9456,203 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/cli-width": { - "version": "3.0.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, "license": "ISC", "engines": { - "node": ">= 10" + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/cliui": { - "version": "8.0.1", + "node_modules/cliui/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, - "license": "ISC", + "license": "MIT" + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { "node": ">=0.8" @@ -8126,6 +9660,8 @@ }, "node_modules/clone-deep": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8153,21 +9689,21 @@ }, "node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, - "node_modules/color-convert/node_modules/color-name": { + "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, "license": "MIT" }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, "node_modules/color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", @@ -8179,14 +9715,6 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/color/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -8200,13 +9728,24 @@ "node": ">=7.0.0" } }, + "node_modules/color/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, + "license": "MIT" + }, "node_modules/colorette": { "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/colors": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, "license": "MIT", "engines": { @@ -8215,6 +9754,9 @@ }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -8224,14 +9766,19 @@ } }, "node_modules/commander": { - "version": "7.2.0", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/comment-parser": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, "license": "MIT", "engines": { @@ -8240,6 +9787,8 @@ }, "node_modules/common-path-prefix": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true, "license": "ISC" }, @@ -8264,6 +9813,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8271,6 +9821,8 @@ }, "node_modules/compressible": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "license": "MIT", "dependencies": { @@ -8282,6 +9834,8 @@ }, "node_modules/compression": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8297,8 +9851,20 @@ "node": ">= 0.8.0" } }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -8307,20 +9873,29 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, "node_modules/connect": { "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8335,6 +9910,8 @@ }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, "license": "MIT", "engines": { @@ -8343,60 +9920,25 @@ }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, "node_modules/content-disposition": { "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8408,6 +9950,8 @@ }, "node_modules/content-type": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "license": "MIT", "engines": { @@ -8451,18 +9995,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-angular/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/conventional-changelog-atom": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", @@ -8476,18 +10008,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-atom/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/conventional-changelog-codemirror": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", @@ -8501,18 +10021,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-codemirror/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/conventional-changelog-conventionalcommits": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", @@ -8528,18 +10036,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-conventionalcommits/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/conventional-changelog-core": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", @@ -8566,67 +10062,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/conventional-changelog-core/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, "node_modules/conventional-changelog-ember": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", @@ -8640,18 +10075,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-ember/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/conventional-changelog-eslint": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", @@ -8665,18 +10088,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-eslint/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/conventional-changelog-express": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", @@ -8690,18 +10101,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-express/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/conventional-changelog-jquery": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", @@ -8715,18 +10114,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-jquery/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/conventional-changelog-jshint": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", @@ -8741,18 +10128,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-jshint/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/conventional-changelog-preset-loader": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", @@ -8834,11 +10209,15 @@ }, "node_modules/convert-source-map": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "license": "MIT", "engines": { @@ -8847,6 +10226,8 @@ }, "node_modules/cookie-signature": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true, "license": "MIT" }, @@ -8854,10 +10235,13 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, "license": "MIT" }, "node_modules/copy-anything": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, "license": "MIT", "dependencies": { @@ -8868,19 +10252,21 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "11.0.0", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, "license": "MIT", "dependencies": { - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^13.1.1", + "globby": "^14.0.0", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -8892,6 +10278,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -8901,12 +10289,61 @@ "node": ">=10.13.0" } }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/core-js-compat": { - "version": "3.36.1", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.23.3" }, "funding": { "type": "opencollective", @@ -8915,10 +10352,15 @@ }, "node_modules/core-util-is": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "license": "MIT", "dependencies": { @@ -8930,14 +10372,16 @@ } }, "node_modules/cosmiconfig": { - "version": "8.3.6", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -8954,29 +10398,17 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "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, "license": "MIT" }, "node_modules/critters": { - "version": "0.0.20", + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", + "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8986,11 +10418,13 @@ "domhandler": "^5.0.2", "htmlparser2": "^8.0.2", "postcss": "^8.4.23", - "pretty-bytes": "^5.3.0" + "postcss-media-query-parser": "^0.2.3" } }, "node_modules/critters/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, "license": "MIT", "dependencies": { @@ -9005,6 +10439,8 @@ }, "node_modules/critters/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, "license": "MIT", "dependencies": { @@ -9020,6 +10456,8 @@ }, "node_modules/critters/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, "license": "MIT", "dependencies": { @@ -9029,8 +10467,17 @@ "node": ">=7.0.0" } }, + "node_modules/critters/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, + "license": "MIT" + }, "node_modules/critters/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, "license": "MIT", "engines": { @@ -9039,6 +10486,8 @@ }, "node_modules/critters/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, "license": "MIT", "dependencies": { @@ -9060,6 +10509,9 @@ }, "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, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -9081,32 +10533,45 @@ } }, "node_modules/css-loader": { - "version": "6.8.1", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-select": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9122,6 +10587,8 @@ }, "node_modules/css-what": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -9133,6 +10600,8 @@ }, "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==", "dev": true, "license": "MIT", "bin": { @@ -9142,34 +10611,17 @@ "node": ">=4" } }, - "node_modules/cssom": { - "version": "0.4.4", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "dev": true, - "license": "MIT" - }, "node_modules/custom-event": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true, "license": "MIT" }, "node_modules/d3": { "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", "license": "ISC", "dependencies": { "d3-array": "3", @@ -9209,6 +10661,8 @@ }, "node_modules/d3-array": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "license": "ISC", "dependencies": { "internmap": "1 - 2" @@ -9219,6 +10673,8 @@ }, "node_modules/d3-axis": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "license": "ISC", "engines": { "node": ">=12" @@ -9226,6 +10682,8 @@ }, "node_modules/d3-brush": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -9240,6 +10698,8 @@ }, "node_modules/d3-chord": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "license": "ISC", "dependencies": { "d3-path": "1 - 3" @@ -9250,6 +10710,8 @@ }, "node_modules/d3-color": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "license": "ISC", "engines": { "node": ">=12" @@ -9257,6 +10719,8 @@ }, "node_modules/d3-contour": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "license": "ISC", "dependencies": { "d3-array": "^3.2.0" @@ -9267,6 +10731,8 @@ }, "node_modules/d3-delaunay": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "license": "ISC", "dependencies": { "delaunator": "5" @@ -9277,6 +10743,8 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "license": "ISC", "engines": { "node": ">=12" @@ -9284,6 +10752,8 @@ }, "node_modules/d3-drag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -9295,6 +10765,8 @@ }, "node_modules/d3-dsv": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "license": "ISC", "dependencies": { "commander": "7", @@ -9316,8 +10788,19 @@ "node": ">=12" } }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/d3-ease": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "license": "BSD-3-Clause", "engines": { "node": ">=12" @@ -9325,6 +10808,8 @@ }, "node_modules/d3-fetch": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" @@ -9335,6 +10820,8 @@ }, "node_modules/d3-force": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -9347,13 +10834,17 @@ }, "node_modules/d3-format": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-geo": { - "version": "3.1.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" @@ -9364,6 +10855,8 @@ }, "node_modules/d3-hierarchy": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", "license": "ISC", "engines": { "node": ">=12" @@ -9371,6 +10864,8 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "license": "ISC", "dependencies": { "d3-color": "1 - 3" @@ -9381,6 +10876,8 @@ }, "node_modules/d3-path": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "license": "ISC", "engines": { "node": ">=12" @@ -9388,6 +10885,8 @@ }, "node_modules/d3-polygon": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", "license": "ISC", "engines": { "node": ">=12" @@ -9395,6 +10894,8 @@ }, "node_modules/d3-quadtree": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "license": "ISC", "engines": { "node": ">=12" @@ -9402,6 +10903,8 @@ }, "node_modules/d3-random": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", "license": "ISC", "engines": { "node": ">=12" @@ -9409,6 +10912,8 @@ }, "node_modules/d3-scale": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", @@ -9422,7 +10927,9 @@ } }, "node_modules/d3-scale-chromatic": { - "version": "3.0.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -9434,6 +10941,8 @@ }, "node_modules/d3-selection": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", "engines": { "node": ">=12" @@ -9441,6 +10950,8 @@ }, "node_modules/d3-shape": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "license": "ISC", "dependencies": { "d3-path": "^3.1.0" @@ -9451,6 +10962,8 @@ }, "node_modules/d3-time": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "license": "ISC", "dependencies": { "d3-array": "2 - 3" @@ -9461,6 +10974,8 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "license": "ISC", "dependencies": { "d3-time": "1 - 3" @@ -9471,6 +10986,8 @@ }, "node_modules/d3-timer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "license": "ISC", "engines": { "node": ">=12" @@ -9478,6 +10995,8 @@ }, "node_modules/d3-transition": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -9495,6 +11014,8 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -9519,6 +11040,8 @@ }, "node_modules/dashdash": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "license": "MIT", "dependencies": { @@ -9532,26 +11055,16 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/data-urls": { - "version": "2.0.0", "dev": true, "license": "MIT", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 14" } }, "node_modules/data-view-buffer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "license": "MIT", "dependencies": { @@ -9568,6 +11081,8 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9584,6 +11099,8 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "license": "MIT", "dependencies": { @@ -9600,6 +11117,8 @@ }, "node_modules/date-fns": { "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0" @@ -9614,6 +11133,8 @@ }, "node_modules/date-format": { "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, "license": "MIT", "engines": { @@ -9631,7 +11152,10 @@ } }, "node_modules/debug": { - "version": "4.3.4", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -9647,6 +11171,8 @@ }, "node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "license": "MIT", "engines": { @@ -9680,11 +11206,6 @@ "node": ">=0.10.0" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "dev": true, - "license": "MIT" - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -9713,11 +11234,45 @@ }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/default-gateway": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9727,8 +11282,64 @@ "node": ">= 10" } }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/default-gateway/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -9739,6 +11350,9 @@ }, "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==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -9753,15 +11367,22 @@ } }, "node_modules/define-lazy-prop": { - "version": "2.0.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-properties": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -9780,89 +11401,45 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, "license": "MIT", "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/del": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/del/node_modules/globby": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "esprima": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/del/node_modules/pify": { - "version": "2.3.0", + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -9870,29 +11447,34 @@ }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/delaunator": { - "version": "5.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", "license": "ISC", "dependencies": { - "robust-predicates": "^3.0.0" + "robust-predicates": "^3.0.2" } }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", "engines": { @@ -9901,6 +11483,8 @@ }, "node_modules/dequal": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { @@ -9909,6 +11493,8 @@ }, "node_modules/destroy": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "license": "MIT", "engines": { @@ -9928,6 +11514,8 @@ }, "node_modules/detect-node": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true, "license": "MIT" }, @@ -9935,6 +11523,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, "license": "ISC", "dependencies": { "asap": "^2.0.0", @@ -9943,11 +11532,16 @@ }, "node_modules/di": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true, "license": "MIT" }, "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, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -9955,6 +11549,8 @@ }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { @@ -9966,6 +11562,8 @@ }, "node_modules/dns-packet": { "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "license": "MIT", "dependencies": { @@ -9977,6 +11575,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9988,6 +11588,8 @@ }, "node_modules/dom-serialize": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9999,6 +11601,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -10012,6 +11616,8 @@ }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -10021,27 +11627,10 @@ ], "license": "BSD-2-Clause" }, - "node_modules/domexception": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } - }, "node_modules/domhandler": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10056,6 +11645,8 @@ }, "node_modules/domutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10080,32 +11671,28 @@ "node": ">=8" } }, - "node_modules/dotenv": { - "version": "10.0.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" } }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, "node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -10121,12 +11708,14 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, "license": "MIT" }, "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -10134,11 +11723,15 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" }, "node_modules/ecc-jsbn": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "license": "MIT", "dependencies": { @@ -10146,27 +11739,24 @@ "safer-buffer": "^2.1.0" } }, - "node_modules/ee-first": { - "version": "1.1.1", + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true, "license": "MIT" }, - "node_modules/ejs": { - "version": "3.1.10", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.728", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true, "license": "ISC" }, @@ -10174,6 +11764,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, "license": "Apache-2.0", "dependencies": { "sax": "1.1.4" @@ -10182,18 +11773,17 @@ "node": ">= 0.4.0" } }, - "node_modules/elementtree/node_modules/sax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", - "license": "ISC" - }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, "license": "MIT", "engines": { @@ -10202,6 +11792,8 @@ }, "node_modules/encodeurl": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "license": "MIT", "engines": { @@ -10210,6 +11802,8 @@ }, "node_modules/encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", "optional": true, @@ -10219,6 +11813,9 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -10247,45 +11844,19 @@ } }, "node_modules/engine.io-parser": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "license": "MIT", "dependencies": { @@ -10296,24 +11867,23 @@ "node": ">=10.13.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", + "node_modules/ent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1" + "punycode": "^1.4.1" }, "engines": { - "node": ">=8.6" + "node": ">= 0.4" } }, - "node_modules/ent": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/entities": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "devOptional": true, "license": "BSD-2-Clause", "engines": { @@ -10325,19 +11895,38 @@ }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/err-code": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, "license": "MIT" }, "node_modules/errno": { "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "license": "MIT", "optional": true, @@ -10350,6 +11939,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -10358,6 +11949,8 @@ }, "node_modules/es-abstract": { "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "license": "MIT", "dependencies": { @@ -10417,6 +12010,9 @@ }, "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, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" @@ -10427,18 +12023,25 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.5.0", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, "license": "MIT", "dependencies": { @@ -10450,6 +12053,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -10463,6 +12068,8 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "license": "MIT", "dependencies": { @@ -10471,6 +12078,8 @@ }, "node_modules/es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "license": "MIT", "dependencies": { @@ -10487,11 +12096,15 @@ }, "node_modules/es6-promise": { "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true, "license": "MIT" }, "node_modules/es6-promisify": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10499,7 +12112,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.17", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10507,46 +12122,52 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.17", - "@esbuild/android-arm64": "0.18.17", - "@esbuild/android-x64": "0.18.17", - "@esbuild/darwin-arm64": "0.18.17", - "@esbuild/darwin-x64": "0.18.17", - "@esbuild/freebsd-arm64": "0.18.17", - "@esbuild/freebsd-x64": "0.18.17", - "@esbuild/linux-arm": "0.18.17", - "@esbuild/linux-arm64": "0.18.17", - "@esbuild/linux-ia32": "0.18.17", - "@esbuild/linux-loong64": "0.18.17", - "@esbuild/linux-mips64el": "0.18.17", - "@esbuild/linux-ppc64": "0.18.17", - "@esbuild/linux-riscv64": "0.18.17", - "@esbuild/linux-s390x": "0.18.17", - "@esbuild/linux-x64": "0.18.17", - "@esbuild/netbsd-x64": "0.18.17", - "@esbuild/openbsd-x64": "0.18.17", - "@esbuild/sunos-x64": "0.18.17", - "@esbuild/win32-arm64": "0.18.17", - "@esbuild/win32-ia32": "0.18.17", - "@esbuild/win32-x64": "0.18.17" + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" } }, "node_modules/esbuild-wasm": { - "version": "0.18.17", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.23.0.tgz", + "integrity": "sha512-6jP8UmWy6R6TUUV8bMuC3ZyZ6lZKI56x0tkxyCIqWwRRJ/DgeQKneh/Oid5EoGoPFLrGNkz47ZEtWAYuiY/u9g==", "dev": true, "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/escalade": { - "version": "3.1.1", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "license": "MIT", "engines": { @@ -10555,11 +12176,16 @@ }, "node_modules/escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, "license": "MIT" }, "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, "license": "MIT", "engines": { "node": ">=0.8.0" @@ -10567,6 +12193,9 @@ }, "node_modules/escodegen": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -10584,15 +12213,11 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/escodegen/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, "license": "BSD-3-Clause", "optional": true, "engines": { @@ -10601,6 +12226,8 @@ }, "node_modules/eslint": { "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10655,6 +12282,8 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { @@ -10665,6 +12294,8 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10672,7 +12303,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz", + "integrity": "sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==", "dev": true, "license": "MIT", "dependencies": { @@ -10689,6 +12322,8 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10697,6 +12332,8 @@ }, "node_modules/eslint-plugin-import": { "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "license": "MIT", "dependencies": { @@ -10725,8 +12362,21 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10735,6 +12385,8 @@ }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10744,8 +12396,23 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "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, "license": "ISC", "bin": { @@ -10753,19 +12420,22 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.2.3", + "version": "48.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.10.0.tgz", + "integrity": "sha512-BEli0k8E0dzhJairAllwlkGnyYDZVKNn4WDmyKy+v6J5qGNuofjzxwNUi+55BOGmyO9mKBhqaidwGy+dxndn/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.42.0", + "@es-joy/jsdoccomment": "~0.46.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.3.4", + "debug": "^4.3.5", "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.6.0", - "spdx-expression-parse": "^4.0.0" + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" }, "engines": { "node": ">=18" @@ -10776,6 +12446,8 @@ }, "node_modules/eslint-plugin-jsdoc/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, "license": "MIT", "engines": { @@ -10785,17 +12457,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, "node_modules/eslint-plugin-prefer-arrow": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10803,18 +12468,14 @@ } }, "node_modules/eslint-plugin-unused-imports": { - "version": "3.2.0", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.3.tgz", + "integrity": "sha512-lqrNZIZjFMUr7P06eoKtQLwyVRibvG7N+LtfKtObYGizAAGrcqLkc3tDx+iAik2z7q0j/XI3ihjupIqxhFabFA==", "dev": true, "license": "MIT", - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "6 - 7", - "eslint": "8" + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { @@ -10822,32 +12483,31 @@ } } }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/eslint-scope": { - "version": "5.1.1", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -10855,6 +12515,8 @@ }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -10870,6 +12532,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -10882,13 +12546,21 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "Python-2.0" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.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, "license": "MIT", "dependencies": { @@ -10904,6 +12576,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -10913,8 +12587,17 @@ "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, + "license": "MIT" + }, "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, "license": "MIT", "engines": { @@ -10926,6 +12609,8 @@ }, "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, "license": "BSD-2-Clause", "dependencies": { @@ -10939,31 +12624,41 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", + "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, - "license": "BSD-2-Clause", + "license": "Apache-2.0", "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", + "node_modules/eslint/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -10975,6 +12670,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -10989,72 +12686,38 @@ }, "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, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "p-limit": "^3.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, "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, "license": "MIT", "dependencies": { @@ -11066,6 +12729,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, "license": "(MIT OR CC0-1.0)", "engines": { @@ -11076,16 +12741,18 @@ } }, "node_modules/espree": { - "version": "9.6.1", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -11093,6 +12760,9 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -11103,7 +12773,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11113,16 +12785,10 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11132,16 +12798,10 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/estraverse": { - "version": "4.3.0", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11150,6 +12810,9 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -11157,24 +12820,25 @@ }, "node_modules/etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/eventemitter-asyncresource": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/eventemitter3": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true, "license": "MIT" }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", "engines": { @@ -11182,18 +12846,20 @@ } }, "node_modules/execa": { - "version": "5.1.1", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" }, "engines": { @@ -11203,8 +12869,17 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/exit": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -11222,11 +12897,15 @@ }, "node_modules/exponential-backoff": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "dev": true, "license": "Apache-2.0" }, "node_modules/express": { "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11266,26 +12945,74 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, "license": "MIT", "dependencies": { "chardet": "^0.7.0", @@ -11298,6 +13025,9 @@ }, "node_modules/external-editor/node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -11306,8 +13036,23 @@ "node": ">=0.10.0" } }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/extsprintf": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, "engines": [ "node >=0.6.0" @@ -11316,6 +13061,8 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-fifo": { @@ -11327,6 +13074,8 @@ }, "node_modules/fast-glob": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -11342,10 +13091,14 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, @@ -11353,10 +13106,20 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true, "license": "MIT" }, "node_modules/fastq": { - "version": "1.16.0", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "license": "ISC", "dependencies": { @@ -11365,6 +13128,8 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -11386,6 +13151,9 @@ }, "node_modules/figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" @@ -11399,6 +13167,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { @@ -11410,35 +13180,10 @@ }, "node_modules/file-saver-es": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver-es/-/file-saver-es-2.0.5.tgz", + "integrity": "sha512-Kg0lt+is9nOyi/VDms9miScNGot25jVFbjFccXuCL/shd2Q+rt70MALxHVkXllsX83JEBLiHQNjDPGd/6FIOoQ==", "license": "MIT" }, - "node_modules/filelist": { - "version": "1.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -11453,16 +13198,18 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.3.0", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~1.5.0", "unpipe": "~1.0.0" }, "engines": { @@ -11471,6 +13218,8 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -11479,11 +13228,28 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-cache-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "license": "MIT", "dependencies": { @@ -11498,19 +13264,26 @@ } }, "node_modules/find-up": { - "version": "4.1.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, "license": "BSD-3-Clause", "bin": { @@ -11519,6 +13292,8 @@ }, "node_modules/flat-cache": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { @@ -11530,13 +13305,34 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/flatted": { - "version": "3.2.9", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -11556,6 +13352,8 @@ }, "node_modules/for-each": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "license": "MIT", "dependencies": { @@ -11563,7 +13361,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "license": "ISC", "dependencies": { @@ -11577,19 +13377,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/forever-agent": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -11597,7 +13388,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "license": "MIT", "dependencies": { @@ -11626,6 +13419,8 @@ }, "node_modules/forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "license": "MIT", "engines": { @@ -11634,6 +13429,8 @@ }, "node_modules/fraction.js": { "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "license": "MIT", "engines": { @@ -11646,6 +13443,8 @@ }, "node_modules/fresh": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "license": "MIT", "engines": { @@ -11654,24 +13453,30 @@ }, "node_modules/fs-constants": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true, "license": "MIT" }, "node_modules/fs-extra": { - "version": "8.1.0", + "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, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=12" } }, "node_modules/fs-minipass": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "license": "ISC", "dependencies": { @@ -11681,25 +13486,33 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "dev": true, - "license": "Unlicense" - }, "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, "license": "ISC" }, + "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, + "license": "MIT", + "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", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11707,6 +13520,8 @@ }, "node_modules/function.prototype.name": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "license": "MIT", "dependencies": { @@ -11724,32 +13539,18 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "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, "license": "MIT", "engines": { @@ -11758,14 +13559,32 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -11781,14 +13600,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/get-pkg-repo": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", @@ -11808,6 +13619,22 @@ "node": ">=6.9.0" } }, + "node_modules/get-pkg-repo/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/get-pkg-repo/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -11820,31 +13647,32 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/get-pkg-repo/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/get-pkg-repo/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, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, - "node_modules/get-pkg-repo/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==", + "node_modules/get-pkg-repo/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, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "license": "MIT" + }, + "node_modules/get-pkg-repo/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" }, "node_modules/get-pkg-repo/node_modules/readable-stream": { "version": "2.3.8", @@ -11890,12 +13718,23 @@ "xtend": "~4.0.1" } }, - "node_modules/get-pkg-repo/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/get-pkg-repo/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, "node_modules/get-pkg-repo/node_modules/yargs": { "version": "16.2.0", @@ -11916,22 +13755,17 @@ "node": ">=10" } }, - "node_modules/get-pkg-repo/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/get-stream": { - "version": "6.0.1", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11939,6 +13773,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -11957,6 +13793,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, "license": "MIT", "dependencies": { "basic-ftp": "^5.0.2", @@ -11972,6 +13809,7 @@ "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -11982,29 +13820,10 @@ "node": ">=14.14" } }, - "node_modules/get-uri/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/get-uri/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/getpass": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "license": "MIT", "dependencies": { @@ -12045,16 +13864,6 @@ "node": ">=4" } }, - "node_modules/git-remote-origin-url/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/git-semver-tags": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", @@ -12107,21 +13916,22 @@ "license": "MIT" }, "node_modules/glob": { - "version": "10.3.12", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -12129,6 +13939,8 @@ }, "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==", "devOptional": true, "license": "ISC", "dependencies": { @@ -12140,41 +13952,39 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/minipass": { - "version": "7.0.4", - "dev": true, - "license": "ISC", "engines": { - "node": ">=16 || 14 >=14.17" + "node": "*" } }, "node_modules/globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "license": "MIT", "engines": { @@ -12182,11 +13992,14 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -12196,18 +14009,21 @@ } }, "node_modules/globby": { - "version": "13.2.2", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { + "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", "merge2": "^1.4.1", - "slash": "^4.0.0" + "slash": "^3.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12215,6 +14031,9 @@ }, "node_modules/gopd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" @@ -12225,6 +14044,9 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/gradle-to-js": { @@ -12242,22 +14064,15 @@ }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, - "node_modules/guess-parser": { - "version": "0.4.22", - "dev": true, - "license": "MIT", - "dependencies": { - "@wessberg/ts-evaluator": "0.0.27" - }, - "peerDependencies": { - "typescript": ">=3.7.5" - } - }, "node_modules/hammerjs": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -12265,6 +14080,8 @@ }, "node_modules/handle-thing": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true, "license": "MIT" }, @@ -12302,6 +14119,8 @@ }, "node_modules/har-schema": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, "license": "ISC", "engines": { @@ -12310,6 +14129,9 @@ }, "node_modules/har-validator": { "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dev": true, "license": "MIT", "dependencies": { @@ -12322,6 +14144,8 @@ }, "node_modules/har-validator/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -12337,6 +14161,8 @@ }, "node_modules/har-validator/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, @@ -12352,6 +14178,8 @@ }, "node_modules/has-ansi": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "license": "MIT", "dependencies": { @@ -12363,6 +14191,8 @@ }, "node_modules/has-ansi/node_modules/ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", "engines": { @@ -12371,6 +14201,8 @@ }, "node_modules/has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "license": "MIT", "funding": { @@ -12379,6 +14211,8 @@ }, "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, "license": "MIT", "engines": { @@ -12387,6 +14221,9 @@ }, "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==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -12397,6 +14234,9 @@ }, "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==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12407,6 +14247,9 @@ }, "node_modules/has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12417,6 +14260,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -12429,13 +14274,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "license": "ISC" - }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -12444,21 +14287,6 @@ "node": ">= 0.4" } }, - "node_modules/hdr-histogram-js": { - "version": "2.0.3", - "dev": true, - "license": "BSD", - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "node_modules/hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -12473,32 +14301,49 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/hosted-git-info": { - "version": "6.1.1", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^7.5.1" + "yallist": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } + "license": "ISC" }, "node_modules/hpack.js": { "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12508,8 +14353,17 @@ "wbuf": "^1.1.0" } }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -12524,30 +14378,25 @@ }, "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/html-entities": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true, "funding": [ { @@ -12563,11 +14412,15 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/htmlparser2": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -12586,16 +14439,22 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true, "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12609,13 +14468,27 @@ "node": ">= 0.8" } }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-parser-js": { "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true, "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12628,43 +14501,41 @@ } }, "node_modules/http-proxy-agent": { - "version": "4.0.1", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz", + "integrity": "sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==", "dev": true, "license": "MIT", "dependencies": { - "@types/http-proxy": "^1.17.8", + "@types/http-proxy": "^1.17.10", + "debug": "^4.3.4", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "micromatch": "^4.0.5" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/http-signature": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12678,35 +14549,43 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { - "version": "2.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=10.17.0" + "node": ">=8.12.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.0.0" + "engines": { + "node": ">=10.18" } }, "node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -12717,6 +14596,8 @@ }, "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, "license": "ISC", "engines": { @@ -12728,6 +14609,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -12745,7 +14628,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.0", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -12760,7 +14645,9 @@ "license": "ISC" }, "node_modules/ignore-walk": { - "version": "6.0.4", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "license": "ISC", "dependencies": { @@ -12770,30 +14657,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/image-size": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "license": "MIT", "optional": true, @@ -12806,16 +14673,22 @@ }, "node_modules/immediate": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true, "license": "MIT" }, "node_modules/immutable": { - "version": "4.3.5", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true, "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "license": "MIT", "dependencies": { @@ -12829,16 +14702,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -12846,19 +14714,20 @@ }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "license": "ISC" - }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -12867,10 +14736,14 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { - "version": "4.1.1", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, "license": "ISC", "engines": { @@ -12878,32 +14751,34 @@ } }, "node_modules/inquirer": { - "version": "8.2.4", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dev": true, "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.21", + "lodash": "^4.17.19", "mute-stream": "0.0.8", - "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.5.5", + "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "through": "^2.3.6" }, "engines": { - "node": ">=12.0.0" + "node": ">=8.0.0" } }, "node_modules/inquirer/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, "license": "MIT", "dependencies": { @@ -12918,6 +14793,8 @@ }, "node_modules/inquirer/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, "license": "MIT", "dependencies": { @@ -12931,8 +14808,20 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/inquirer/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, "node_modules/inquirer/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, "license": "MIT", "dependencies": { @@ -12942,24 +14831,34 @@ "node": ">=7.0.0" } }, + "node_modules/inquirer/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, + "license": "MIT" + }, "node_modules/inquirer/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, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/inquirer/node_modules/rxjs": { - "version": "7.8.1", + "node_modules/inquirer/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } + "license": "ISC" }, "node_modules/inquirer/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, "license": "MIT", "dependencies": { @@ -12971,6 +14870,8 @@ }, "node_modules/internal-slot": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "license": "MIT", "dependencies": { @@ -12984,6 +14885,8 @@ }, "node_modules/internmap": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "license": "ISC", "engines": { "node": ">=12" @@ -12991,6 +14894,8 @@ }, "node_modules/ionicons": { "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.1.3.tgz", + "integrity": "sha512-ptzz38dd/Yq+PgjhXegh7yhb/SLIk1bvL9vQDtLv1aoSc7alO6mX2DIMgcKYzt9vrNWkRu1f9Jr78zIFFyOXqw==", "license": "MIT", "dependencies": { "@stencil/core": "^2.18.0" @@ -12998,6 +14903,9 @@ }, "node_modules/ip-address": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, "license": "MIT", "dependencies": { "jsbn": "1.1.0", @@ -13007,16 +14915,10 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/jsbn": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "license": "BSD-3-Clause" - }, "node_modules/ipaddr.js": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, "license": "MIT", "engines": { @@ -13025,6 +14927,8 @@ }, "node_modules/is-array-buffer": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "license": "MIT", "dependencies": { @@ -13040,11 +14944,15 @@ }, "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, "license": "MIT" }, "node_modules/is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "license": "MIT", "dependencies": { @@ -13056,6 +14964,8 @@ }, "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==", "devOptional": true, "license": "MIT", "dependencies": { @@ -13067,6 +14977,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", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "license": "MIT", "dependencies": { @@ -13080,22 +14992,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -13106,11 +15006,16 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13118,6 +15023,8 @@ }, "node_modules/is-data-view": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "license": "MIT", "dependencies": { @@ -13132,6 +15039,8 @@ }, "node_modules/is-date-object": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13145,13 +15054,16 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13159,6 +15071,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "devOptional": true, "license": "MIT", "engines": { @@ -13167,6 +15081,9 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -13174,6 +15091,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -13183,8 +15102,29 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", "engines": { "node": ">=8" @@ -13192,11 +15132,15 @@ }, "node_modules/is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT", "engines": { @@ -13206,6 +15150,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -13218,6 +15175,8 @@ }, "node_modules/is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13241,15 +15200,19 @@ } }, "node_modules/is-path-cwd": { - "version": "1.0.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/is-path-in-cwd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13261,6 +15224,8 @@ }, "node_modules/is-path-in-cwd/node_modules/is-path-inside": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", "dev": true, "license": "MIT", "dependencies": { @@ -13272,6 +15237,8 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", "engines": { @@ -13280,6 +15247,8 @@ }, "node_modules/is-plain-obj": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, "license": "MIT", "engines": { @@ -13291,6 +15260,8 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "license": "MIT", "dependencies": { @@ -13300,13 +15271,10 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "license": "MIT", "dependencies": { @@ -13322,6 +15290,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -13336,6 +15306,9 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -13346,6 +15319,8 @@ }, "node_modules/is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "license": "MIT", "dependencies": { @@ -13360,6 +15335,8 @@ }, "node_modules/is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "license": "MIT", "dependencies": { @@ -13387,6 +15364,8 @@ }, "node_modules/is-typed-array": { "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "license": "MIT", "dependencies": { @@ -13401,10 +15380,15 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", "engines": { "node": ">=10" @@ -13415,6 +15399,8 @@ }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13426,25 +15412,38 @@ }, "node_modules/is-what": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true, "license": "MIT" }, "node_modules/is-wsl": { - "version": "2.2.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { - "version": "1.0.0", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, "node_modules/isbinaryfile": { "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, "license": "MIT", "engines": { @@ -13456,10 +15455,15 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "license": "MIT", "engines": { @@ -13468,11 +15472,15 @@ }, "node_modules/isstream": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true, "license": "MIT" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -13480,30 +15488,26 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" } }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -13517,28 +15521,18 @@ }, "node_modules/istanbul-lib-report/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, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/istanbul-lib-report/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, "license": "MIT", "dependencies": { @@ -13550,6 +15544,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -13563,6 +15559,8 @@ }, "node_modules/istanbul-lib-source-maps/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, "license": "BSD-3-Clause", "engines": { @@ -13570,7 +15568,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -13582,15 +15582,14 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -13598,84 +15597,10 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jake": { - "version": "10.8.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jake/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jasmine": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==", "dev": true, "license": "MIT", "dependencies": { @@ -13689,43 +15614,32 @@ }, "node_modules/jasmine-core": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", + "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", "dev": true, "license": "MIT" }, "node_modules/jasmine-spec-reporter": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", + "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", "dev": true, "license": "Apache-2.0", "dependencies": { "colors": "1.4.0" } }, - "node_modules/jasmine/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jasmine/node_modules/jasmine-core": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", "dev": true, "license": "MIT" }, "node_modules/jasminewd2": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", "dev": true, "license": "MIT", "engines": { @@ -13734,6 +15648,8 @@ }, "node_modules/jest-worker": { "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", "dependencies": { @@ -13747,6 +15663,8 @@ }, "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, "license": "MIT", "engines": { @@ -13755,6 +15673,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13768,7 +15688,9 @@ } }, "node_modules/jiti": { - "version": "1.21.0", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "license": "MIT", "bin": { @@ -13777,81 +15699,45 @@ }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsbn": { - "version": "0.1.1", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true, "license": "MIT" }, "node_modules/jsdoc-type-pratt-parser": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" } }, - "node_modules/jsdom": { - "version": "16.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, "node_modules/jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "license": "MIT", "bin": { @@ -13863,6 +15749,8 @@ }, "node_modules/json-buffer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, @@ -13874,31 +15762,46 @@ "license": "MIT" }, "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/json-schema": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true, "license": "(AFL-2.1 OR BSD-3-Clause)" }, "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==", "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -13909,19 +15812,28 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.1", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, "node_modules/jsonfile": { - "version": "4.0.0", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -13947,6 +15859,8 @@ }, "node_modules/jsprim": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "license": "MIT", "dependencies": { @@ -13961,6 +15875,8 @@ }, "node_modules/jszip": { "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { @@ -13970,8 +15886,17 @@ "setimmediate": "^1.0.5" } }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, "node_modules/jszip/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -13986,11 +15911,15 @@ }, "node_modules/jszip/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, "node_modules/jszip/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", "dependencies": { @@ -13998,7 +15927,9 @@ } }, "node_modules/karma": { - "version": "6.4.2", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "license": "MIT", "dependencies": { @@ -14021,7 +15952,7 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^4.4.1", + "socket.io": "^4.7.2", "source-map": "^0.6.1", "tmp": "^0.2.1", "ua-parser-js": "^0.7.30", @@ -14036,6 +15967,8 @@ }, "node_modules/karma-chrome-launcher": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -14044,6 +15977,8 @@ }, "node_modules/karma-chrome-launcher/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "license": "ISC", "dependencies": { @@ -14055,6 +15990,8 @@ }, "node_modules/karma-coverage": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", "dev": true, "license": "MIT", "dependencies": { @@ -14071,6 +16008,8 @@ }, "node_modules/karma-coverage-istanbul-reporter": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", "dev": true, "license": "MIT", "dependencies": { @@ -14084,27 +16023,21 @@ "url": "https://github.com/sponsors/mattlewis92" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/glob": { - "version": "7.2.3", + "node_modules/karma-coverage-istanbul-reporter/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14120,33 +16053,140 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=6" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/rimraf": { - "version": "2.7.1", + "node_modules/karma-coverage-istanbul-reporter/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/karma-coverage-istanbul-reporter/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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma-coverage/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "brace-expansion": "^1.1.7" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "*" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/source-map": { - "version": "0.6.1", + "node_modules/karma-coverage/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, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/karma-jasmine": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14161,6 +16201,8 @@ }, "node_modules/karma-jasmine-html-reporter": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -14171,14 +16213,45 @@ }, "node_modules/karma-source-map-support": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } }, + "node_modules/karma/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/karma/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/karma/node_modules/cliui": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", "dependencies": { @@ -14187,68 +16260,88 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/karma/node_modules/glob": { - "version": "7.2.3", + "node_modules/karma/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, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=7.0.0" } }, - "node_modules/karma/node_modules/mime": { - "version": "2.6.0", + "node_modules/karma/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, - "license": "MIT", - "bin": { - "mime": "cli.js" + "license": "MIT" + }, + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4.0.0" + "node": "*" } }, - "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.6", + "node_modules/karma/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "minimist": "^1.2.6" + "glob": "^7.1.3" }, "bin": { - "mkdirp": "bin/cmd.js" + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/karma/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, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/karma/node_modules/tmp": { - "version": "0.2.1", + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "rimraf": "^3.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8.17.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/karma/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", "dependencies": { @@ -14264,16 +16357,10 @@ "node": ">=10" } }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/keyv": { "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -14282,6 +16369,8 @@ }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", "engines": { @@ -14298,16 +16387,10 @@ "node": ">=6" } }, - "node_modules/klona": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/launch-editor": { - "version": "2.6.1", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz", + "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==", "dev": true, "license": "MIT", "dependencies": { @@ -14319,6 +16402,7 @@ "version": "0.0.24", "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", "integrity": "sha512-6PVFIYXxlYF0o6hrAsHtGpTmi06otkwNrMcmQ0K96SeSRHPREPa9J3nJZ1frliVH7XT0XFswoJFQoXsDukzGNQ==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^2.1.0", @@ -14330,6 +16414,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -14339,13 +16424,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, "license": "MIT" }, "node_modules/less": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -14368,36 +16455,98 @@ } }, "node_modules/less-loader": { - "version": "11.1.0", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", "dev": true, "license": "MIT", - "dependencies": { - "klona": "^2.0.4" - }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "less": "^3.5.0 || ^4.0.0", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" } }, "node_modules/less/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, "license": "BSD-3-Clause", "optional": true, - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14410,6 +16559,8 @@ }, "node_modules/license-webpack-plugin": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, "license": "ISC", "dependencies": { @@ -14424,16 +16575,163 @@ } } }, - "node_modules/lie": { - "version": "3.3.0", + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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, + "license": "MIT" + }, + "node_modules/listr2": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz", + "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.13.tgz", + "integrity": "sha512-UGe+BbaSUQtAMZobTb4nHvFMrmvuAQKSeaqAX2meTEQjfsbpl5sxdHD8T72OnwD4GU9uwNhYXIVe4QGs8N9Zyw==", "dev": true, + "hasInstallScript": true, "license": "MIT", "dependencies": { - "immediate": "~3.0.5" + "msgpackr": "^1.10.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.4.1", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.0.13", + "@lmdb/lmdb-darwin-x64": "3.0.13", + "@lmdb/lmdb-linux-arm": "3.0.13", + "@lmdb/lmdb-linux-arm64": "3.0.13", + "@lmdb/lmdb-linux-x64": "3.0.13", + "@lmdb/lmdb-win32-x64": "3.0.13" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true, "license": "MIT" }, @@ -14479,6 +16777,8 @@ }, "node_modules/loader-runner": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", "engines": { @@ -14486,7 +16786,9 @@ } }, "node_modules/loader-utils": { - "version": "3.2.1", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, "license": "MIT", "engines": { @@ -14494,28 +16796,39 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "license": "MIT" }, "node_modules/lodash._baseassign": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", + "dev": true, "license": "MIT", "dependencies": { "lodash._basecopy": "^3.0.0", @@ -14526,18 +16839,21 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true, "license": "MIT" }, "node_modules/lodash._bindcallback": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", + "dev": true, "license": "MIT" }, "node_modules/lodash._createassigner": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", + "dev": true, "license": "MIT", "dependencies": { "lodash._bindcallback": "^3.0.0", @@ -14549,2031 +16865,1939 @@ "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true, "license": "MIT" }, "node_modules/lodash._isiterateecall": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", - "license": "MIT" - }, - "node_modules/lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", - "license": "MIT", - "dependencies": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "license": "MIT" - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "license": "MIT" - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", - "license": "MIT", - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", "dev": true, "license": "MIT" }, - "node_modules/lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "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/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log4js": { - "version": "6.9.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/magic-string": { - "version": "0.30.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "dev": true, - "license": "ISC" - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" } }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", + "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, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "MIT" }, - "node_modules/make-fetch-happen/node_modules/fs-minipass": { - "version": "2.1.0", + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } + "license": "MIT" }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT" }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "license": "ISC", + "node_modules/log-symbols/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==", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "license": "ISC", + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { - "minipass": "^3.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/make-fetch-happen/node_modules/unique-filename": { + "node_modules/log-symbols/node_modules/color-convert": { "version": "2.0.1", - "dev": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "unique-slug": "^3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=7.0.0" } }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "node_modules/log-symbols/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==", + "license": "MIT" }, - "node_modules/make-fetch-happen/node_modules/yallist": { + "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "dev": true, + "node_modules/log-symbols/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==", "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/memfs": { - "version": "3.5.3", + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, - "license": "Unlicense", + "license": "MIT", "dependencies": { - "fs-monkey": "^1.0.4" + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">= 4.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "license": "MIT", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "environment": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/meow/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==", + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/log-update/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "get-east-asian-width": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/log-update/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/log-update/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "license": "MIT" + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, - "node_modules/merge2": { - "version": "1.4.1", + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, "engines": { - "node": ">= 8" + "node": ">=8.0" } }, - "node_modules/mergexml": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/mergexml/-/mergexml-1.2.4.tgz", - "integrity": "sha512-yiOlDqcVCz7AG1eSboonc18FTlfqDEKYfGoAV3Lul98u6YRV/s0kjtf4bjk47t0hLTFJR0BSYMd6BpmX3xDjNQ==", + "node_modules/lru-cache": { + "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, "license": "ISC", "dependencies": { - "@xmldom/xmldom": "^0.7.0", - "formidable": "^3.5.1", - "xpath": "0.0.27" + "yallist": "^3.0.2" } }, - "node_modules/mergexml/node_modules/xpath": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", - "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", + "node_modules/macos-release": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.6.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/methods": { - "version": "1.1.2", + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/micromatch": { - "version": "4.0.5", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "semver": "^7.5.3" }, "engines": { - "node": ">=8.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime": { - "version": "1.6.0", + "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, - "license": "MIT", - "bin": { - "mime": "cli.js" + "license": "ISC" + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" }, "engines": { - "node": ">=4" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" + "node": ">=8" }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/memfs": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz", + "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 4.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", + "node_modules/meow/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, "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">=8" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", + "node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, "license": "ISC" }, - "node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", + "node_modules/meow/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, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "p-locate": "^4.1.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/minimist": { - "version": "1.2.8", + "node_modules/meow/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, "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minimist-options": { + "node_modules/meow/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "license": "ISC", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { "node": ">=8" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">= 8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, - "node_modules/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-fetch": { - "version": "2.1.2", + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.3.6", + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, - "node_modules/minipass-fetch/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-flush": { - "version": "1.0.5", + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "bin": { + "semver": "bin/semver" } }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "engines": { + "node": ">= 8" } }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", + "node_modules/mergexml": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mergexml/-/mergexml-1.2.4.tgz", + "integrity": "sha512-yiOlDqcVCz7AG1eSboonc18FTlfqDEKYfGoAV3Lul98u6YRV/s0kjtf4bjk47t0hLTFJR0BSYMd6BpmX3xDjNQ==", "dev": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@xmldom/xmldom": "^0.7.0", + "formidable": "^3.5.1", + "xpath": "0.0.27" } }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", + "node_modules/mergexml/node_modules/xpath": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", + "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=0.6.0" + } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/minipass-sized": { - "version": "1.0.3", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "license": "MIT", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "license": "ISC" - }, - "node_modules/minizlib": { - "version": "2.1.2", "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, "engines": { - "node": ">= 8" + "node": ">= 0.6" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "1.0.4", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mrmime": { + "node_modules/min-indent": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", + "node_modules/mini-css-extract-plugin": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dev": true, "license": "MIT", "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, - "bin": { - "multicast-dns": "cli.js" + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/mute-stream": { - "version": "0.0.8", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, "license": "ISC" }, - "node_modules/nanoid": { - "version": "3.3.7", + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/native-run": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", - "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { - "@ionic/utils-fs": "^3.1.7", - "@ionic/utils-terminal": "^2.3.4", - "bplist-parser": "^0.3.2", - "debug": "^4.3.4", - "elementtree": "^0.1.7", - "ini": "^4.1.1", - "plist": "^3.1.0", - "split2": "^4.2.0", - "through2": "^4.0.2", - "tslib": "^2.6.2", - "yauzl": "^2.10.0" - }, - "bin": { - "native-run": "bin/native-run" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" }, "engines": { - "node": ">=16.0.0" + "node": ">= 6" } }, - "node_modules/native-run/node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 10.x" + "node": ">=0.10.0" } }, - "node_modules/natural-compare": { - "version": "1.4.0", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/needle": { - "version": "3.3.1", + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, - "license": "MIT", - "optional": true, + "license": "ISC", "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 4.4.x" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/negotiator": { - "version": "0.6.3", + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, "engines": { - "node": ">= 0.6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/neo-async": { - "version": "2.6.2", + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">= 0.4.0" + "node": ">= 8" } }, - "node_modules/ng2-charts": { - "version": "4.1.1", + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "license": "ISC", "dependencies": { - "lodash-es": "^4.17.15", - "tslib": "^2.3.0" + "yallist": "^4.0.0" }, - "peerDependencies": { - "@angular/cdk": ">=14.0.0", - "@angular/common": ">=14.0.0", - "@angular/core": ">=14.0.0", - "chart.js": "^3.4.0 || ^4.0.0", - "rxjs": "^6.5.3 || ^7.4.0" + "engines": { + "node": ">=8" } }, - "node_modules/ngx-cookie-service": { - "version": "16.1.0", - "license": "MIT", + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", "dependencies": { - "tslib": "^2.0.0" + "minipass": "^3.0.0" }, - "peerDependencies": { - "@angular/common": "^16.0.0", - "@angular/core": "^16.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/ngx-device-detector": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ngx-device-detector/-/ngx-device-detector-6.0.2.tgz", - "integrity": "sha512-+zaYUYGepNE4vMBA/6kyc1rhuUm5uU4cwbvFEEy0gAY4OarId15zwcb1iyvQbyrLCXhZW0DrPZTBoQxzp7dyVw==", - "license": "MIT", + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", "dependencies": { - "tslib": "^2.0.0" + "yallist": "^4.0.0" }, - "peerDependencies": { - "@angular/common": "^16.0.0", - "@angular/core": "^16.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/ngx-spinner": { - "version": "16.0.2", - "license": "MIT", + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", "dependencies": { - "tslib": "^2.3.0" + "minipass": "^3.0.0" }, - "peerDependencies": { - "@angular/animations": ">=15.0.0", - "@angular/common": ">=15.0.0", - "@angular/core": ">=15.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/node-abi": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", - "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "semver": "^7.3.5" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/node-addon-api": { - "version": "3.2.1", + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">= 8" } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, - "license": "BSD-2-Clause" + "license": "ISC" }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/node-forge": { - "version": "1.3.1", + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } + "license": "MIT" }, - "node_modules/node-gyp": { - "version": "9.4.1", + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true, "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, "engines": { - "node": "^12.13 || ^14.13 || >=16" + "node": ">=0.10.0" } }, - "node_modules/node-gyp-build": { - "version": "4.8.0", + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "engines": { + "node": ">=10" } }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", + "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, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT" }, - "node_modules/node-html-parser": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", - "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "node_modules/msgpackr": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", + "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", "dev": true, "license": "MIT", - "dependencies": { - "css-select": "^4.2.1", - "he": "1.2.0" + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" } }, - "node_modules/node-html-parser/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, - "license": "BSD-2-Clause", + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "node-gyp-build-optional-packages": "5.2.2" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, - "node_modules/node-html-parser/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/node-html-parser/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, + "license": "ISC", "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/node-html-parser/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/node-html-parser/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/node-releases": { - "version": "2.0.14", + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", "dev": true, "license": "MIT" }, - "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "node_modules/native-run": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", + "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", + "through2": "^4.0.2", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" }, "bin": { - "nodemon": "bin/nodemon.js" + "native-run": "bin/native-run" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" + "node": ">=16.0.0" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/native-run/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "license": "ISC", + "engines": { + "node": ">= 10.x" } }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "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, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } + "license": "MIT" }, - "node_modules/nopt": { - "version": "6.0.0", + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, "dependencies": { - "abbrev": "^1.0.0" + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" }, "bin": { - "nopt": "bin/nopt.js" + "needle": "bin/needle" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 4.4.x" } }, - "node_modules/normalize-package-data": { - "version": "5.0.0", + "node_modules/needle/node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "ISC", + "optional": true }, - "node_modules/normalize-path": { - "version": "3.0.0", - "devOptional": true, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/normalize-range": { - "version": "0.1.2", + "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, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4.0" } }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "dev": true, + "node_modules/ng2-charts": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-4.1.1.tgz", + "integrity": "sha512-iHwXDbmX86lfeH8VRcsaW2tJATsuAZo4kvvC/Yk2l35zOHjevja1qBvO6BAibiDazi9r9aS6ZRJOqWPsz1pP2w==", "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "lodash-es": "^4.17.15", + "tslib": "^2.3.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "peerDependencies": { + "@angular/cdk": ">=14.0.0", + "@angular/common": ">=14.0.0", + "@angular/core": ">=14.0.0", + "chart.js": "^3.4.0 || ^4.0.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/ngx-cookie-service": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-18.0.0.tgz", + "integrity": "sha512-hkkUckzZTXXWtFgvVkT2hg6mwYMLXioXDZWBsVCOy9gYkADjsj0N5VViO7eo2izQ0VcMPd/Etog1trf/T4oZMQ==", + "license": "MIT", "dependencies": { - "semver": "^7.1.1" + "tslib": "^2.6.2" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "peerDependencies": { + "@angular/common": "^18.0.0-rc.0", + "@angular/core": "^18.0.0-rc.0" } }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", + "node_modules/ngx-device-detector": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ngx-device-detector/-/ngx-device-detector-8.0.0.tgz", + "integrity": "sha512-ik6EwUKnlN+xwoWHzyJp5+V+QRWYrmpTqAvRwa16xBnAVd7/i3jElN7MZjs/InwcYz7AW3XcSNeu+XRvtHgb9w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^18.0.0", + "@angular/core": "^18.0.0" + } + }, + "node_modules/ngx-spinner": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/ngx-spinner/-/ngx-spinner-16.0.2.tgz", + "integrity": "sha512-MZpOHb3dvSqD6xiEdR+EtOfPY2r1kfA7t5Hv5IVwi7gkbTwVgnqxDWdOYJ/HW1pSZ5iEGhqlJqWg6CysLmNfHQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": ">=15.0.0", + "@angular/common": ">=15.0.0", + "@angular/core": ">=15.0.0" + } + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" } }, - "node_modules/npm-package-arg": { - "version": "10.1.0", + "node_modules/node-abi": { + "version": "3.67.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", + "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/npm-packlist": { - "version": "7.0.4", + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", "dependencies": { - "ignore-walk": "^6.0.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/npm-pick-manifest": { - "version": "8.0.1", + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 6.13.0" } }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", + "node_modules/node-gyp": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { - "version": "2.0.0", + "node_modules/node-gyp-build": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10" + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { - "version": "5.0.0", + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">= 6" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "7.18.3", + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, "license": "ISC", "engines": { - "node": ">=12" + "node": ">=16" } }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "license": "ISC", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.4", + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", "dev": true, "license": "MIT", "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "css-select": "^4.2.1", + "he": "1.2.0" } }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", + "node_modules/node-html-parser/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "path-key": "^3.0.0" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/npm-watch": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.9.0.tgz", - "integrity": "sha512-C5Rgh5+jvY33K1EH8Qjr1hfpH9Nhasc90QJ0W+JyKg2ogE0LOCZI4xirC8QmywW7XinyBpynwxlrN6aPfjc3Hw==", + "node_modules/node-html-parser/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "license": "MIT", "dependencies": { - "nodemon": "^2.0.7", - "through2": "^4.0.2" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" }, - "bin": { - "npm-watch": "cli.js" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/npmlog": { - "version": "6.0.2", + "node_modules/node-html-parser/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, - "license": "ISC", + "license": "BSD-2-Clause", "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "domelementtype": "^2.2.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/nth-check": { - "version": "2.1.1", + "node_modules/node-html-parser/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "boolbase": "^1.0.0" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" }, "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/nwsapi": { - "version": "2.2.7", + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true, "license": "MIT" }, - "node_modules/nx": { - "version": "16.5.1", + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", "dependencies": { - "@nrwl/tao": "16.5.1", - "@parcel/watcher": "2.0.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.0.0", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^7.0.2", - "dotenv": "~10.0.0", - "enquirer": "~2.3.6", - "fast-glob": "3.2.7", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^11.1.0", - "glob": "7.1.4", - "ignore": "^5.0.4", - "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "3.0.5", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "semver": "7.5.3", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "v8-compile-cache": "2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" }, "bin": { - "nx": "bin/nx.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "16.5.1", - "@nx/nx-darwin-x64": "16.5.1", - "@nx/nx-freebsd-x64": "16.5.1", - "@nx/nx-linux-arm-gnueabihf": "16.5.1", - "@nx/nx-linux-arm64-gnu": "16.5.1", - "@nx/nx-linux-arm64-musl": "16.5.1", - "@nx/nx-linux-x64-gnu": "16.5.1", - "@nx/nx-linux-x64-musl": "16.5.1", - "@nx/nx-win32-arm64-msvc": "16.5.1", - "@nx/nx-win32-x64-msvc": "16.5.1" - }, - "peerDependencies": { - "@swc-node/register": "^1.4.2", - "@swc/core": "^1.2.173" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/nx/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" + "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8" + "node": ">=8.10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/nodemon" } }, - "node_modules/nx/node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/nx/node_modules/chalk": { - "version": "4.1.2", + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/nx/node_modules/cli-spinners": { - "version": "2.6.1", + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/nx/node_modules/cliui": { - "version": "7.0.4", + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/nx/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/nx/node_modules/fast-glob": { - "version": "3.2.7", + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nx/node_modules/fs-extra": { - "version": "11.2.0", + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" }, "engines": { - "node": ">=14.14" + "node": ">=10" } }, - "node_modules/nx/node_modules/glob": { - "version": "7.1.4", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/nx/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/nx/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "argparse": "^2.0.1" + "npm-normalize-package-bin": "^3.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nx/node_modules/jsonc-parser": { - "version": "3.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/nx/node_modules/jsonfile": { - "version": "6.1.0", + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "universalify": "^2.0.0" + "semver": "^7.1.1" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nx/node_modules/lines-and-columns": { - "version": "2.0.4", + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nx/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/npm-package-arg": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", "dev": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/nx/node_modules/minimatch": { - "version": "3.0.5", + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "lru-cache": "^10.0.1" }, "engines": { - "node": "*" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/nx/node_modules/semver": { - "version": "7.5.3", + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "ignore-walk": "^6.0.4" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nx/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/npm-pick-manifest": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.1.tgz", + "integrity": "sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "has-flag": "^4.0.0" + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/nx/node_modules/tmp": { - "version": "0.2.3", + "node_modules/npm-registry-fetch": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, "engines": { - "node": ">=14.14" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/nx/node_modules/tsconfig-paths": { - "version": "4.2.0", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/nx/node_modules/universalify": { - "version": "2.0.1", + "node_modules/npm-watch": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.9.0.tgz", + "integrity": "sha512-C5Rgh5+jvY33K1EH8Qjr1hfpH9Nhasc90QJ0W+JyKg2ogE0LOCZI4xirC8QmywW7XinyBpynwxlrN6aPfjc3Hw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "nodemon": "^2.0.7", + "through2": "^4.0.2" + }, + "bin": { + "npm-watch": "cli.js" } }, - "node_modules/nx/node_modules/yallist": { - "version": "4.0.0", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "license": "ISC" + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } }, "node_modules/oauth-sign": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -16582,6 +18806,8 @@ }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { @@ -16589,30 +18815,32 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/object-path": { - "version": "0.11.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.12.0" - } - }, "node_modules/object.assign": { "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16630,6 +18858,8 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16647,6 +18877,8 @@ }, "node_modules/object.groupby": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16659,13 +18891,15 @@ } }, "node_modules/object.values": { - "version": "1.1.7", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16676,11 +18910,15 @@ }, "node_modules/obuf": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true, "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "license": "MIT", "dependencies": { @@ -16692,6 +18930,8 @@ }, "node_modules/on-headers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, "license": "MIT", "engines": { @@ -16700,6 +18940,9 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -16707,6 +18950,8 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -16719,32 +18964,37 @@ } }, "node_modules/open": { - "version": "8.4.2", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { - "version": "0.9.3", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -16752,6 +19002,8 @@ }, "node_modules/ora": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", "dependencies": { "bl": "^4.1.0", @@ -16773,6 +19025,8 @@ }, "node_modules/ora/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==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -16786,6 +19040,8 @@ }, "node_modules/ora/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -16800,6 +19056,8 @@ }, "node_modules/ora/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==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -16808,8 +19066,16 @@ "node": ">=7.0.0" } }, + "node_modules/ora/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==", + "license": "MIT" + }, "node_modules/ora/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==", "license": "MIT", "engines": { "node": ">=8" @@ -16817,6 +19083,8 @@ }, "node_modules/ora/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==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -16825,10 +19093,18 @@ "node": ">=8" } }, + "node_modules/ordered-binary": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", + "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", + "dev": true, + "license": "MIT" + }, "node_modules/os-name": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, "license": "MIT", "dependencies": { "macos-release": "^2.5.0", @@ -16843,38 +19119,50 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/p-limit": { - "version": "2.3.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16888,19 +19176,27 @@ } }, "node_modules/p-retry": { - "version": "4.6.2", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", "dev": true, "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry/node_modules/retry": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "license": "MIT", "engines": { @@ -16909,6 +19205,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -16919,6 +19217,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "dev": true, "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", @@ -16934,62 +19233,11 @@ "node": ">= 14" } }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/pac-resolver": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, "license": "MIT", "dependencies": { "degenerator": "^5.0.0", @@ -16999,44 +19247,56 @@ "node": ">= 14" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/pacote": { - "version": "15.2.0", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", + "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^4.0.0", + "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", + "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { - "pacote": "lib/bin.js" + "pacote": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/pako": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true, "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -17046,8 +19306,24 @@ "node": ">=6" } }, + "node_modules/parse-imports": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.1.tgz", + "integrity": "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, "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, "license": "MIT", "dependencies": { @@ -17062,36 +19338,29 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse5": { - "version": "6.0.1", + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, - "node_modules/parse5-html-rewriting-stream": { - "version": "7.0.0", + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, "license": "MIT", - "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": ">= 0.10" } }, - "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "node_modules/parse5": { "version": "7.1.2", - "dev": true, + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "devOptional": true, "license": "MIT", "dependencies": { "entities": "^4.4.0" @@ -17100,23 +19369,29 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-sax-parser": { + "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dev": true, "license": "MIT", "dependencies": { - "parse5": "^7.0.0" + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-sax-parser/node_modules/parse5": { - "version": "7.1.2", + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "parse5": "^7.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -17124,6 +19399,8 @@ }, "node_modules/parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "license": "MIT", "engines": { @@ -17132,6 +19409,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -17140,6 +19419,9 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17147,11 +19429,16 @@ }, "node_modules/path-is-inside": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true, "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -17159,11 +19446,15 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.10.2", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -17171,27 +19462,30 @@ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "license": "ISC" }, "node_modules/path-to-regexp": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true, "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", "engines": { @@ -17207,35 +19501,45 @@ }, "node_modules/performance-now": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true, "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "devOptional": true, + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pify": { - "version": "4.0.1", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, "node_modules/pinkie": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "license": "MIT", "engines": { @@ -17244,6 +19548,8 @@ }, "node_modules/pinkie-promise": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "license": "MIT", "dependencies": { @@ -17254,20 +19560,19 @@ } }, "node_modules/piscina": { - "version": "4.0.0", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", "dev": true, "license": "MIT", - "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" - }, "optionalDependencies": { "nice-napi": "^1.0.2" } }, "node_modules/pkg-dir": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, "license": "MIT", "dependencies": { @@ -17282,6 +19587,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "license": "MIT", "dependencies": { @@ -17297,6 +19604,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "license": "MIT", "dependencies": { @@ -17311,6 +19620,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17325,6 +19636,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "license": "MIT", "dependencies": { @@ -17339,6 +19652,8 @@ }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "license": "MIT", "engines": { @@ -17346,7 +19661,9 @@ } }, "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "license": "MIT", "engines": { @@ -17381,18 +19698,10 @@ "node": ">=10.0.0" } }, - "node_modules/plist/node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, "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, "license": "MIT", "engines": { @@ -17400,7 +19709,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "dev": true, "funding": [ { @@ -17419,36 +19730,56 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-loader": { - "version": "7.3.3", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, "license": "MIT", "dependencies": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, "node_modules/postcss-modules-extract-imports": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "license": "ISC", "engines": { @@ -17460,6 +19791,8 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "license": "MIT", "dependencies": { @@ -17476,6 +19809,8 @@ }, "node_modules/postcss-modules-scope": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "license": "ISC", "dependencies": { @@ -17490,6 +19825,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==", "dev": true, "license": "ISC", "dependencies": { @@ -17503,7 +19840,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", "dependencies": { @@ -17516,6 +19855,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, "license": "MIT" }, @@ -17566,8 +19907,27 @@ "tar-stream": "^2.1.4" } }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -17590,19 +19950,10 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/proc-log": { - "version": "3.0.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", "engines": { @@ -17611,15 +19962,22 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, "license": "MIT" }, "node_modules/promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true, "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "license": "MIT", "dependencies": { @@ -17656,6 +20014,9 @@ }, "node_modules/protractor": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", + "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", + "deprecated": "We have news to share - Protractor is deprecated and will reach end-of-life by Summer 2023. To learn more and find out about other options please refer to this post on the Angular blog. Thank you for using and contributing to Protractor. https://goo.gle/state-of-e2e-in-angular", "dev": true, "license": "MIT", "dependencies": { @@ -17685,6 +20046,8 @@ }, "node_modules/protractor/node_modules/ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", "engines": { @@ -17693,6 +20056,8 @@ }, "node_modules/protractor/node_modules/ansi-styles": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, "license": "MIT", "engines": { @@ -17701,6 +20066,8 @@ }, "node_modules/protractor/node_modules/chalk": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "license": "MIT", "dependencies": { @@ -17716,6 +20083,8 @@ }, "node_modules/protractor/node_modules/cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "license": "ISC", "dependencies": { @@ -17726,6 +20095,8 @@ }, "node_modules/protractor/node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -17734,6 +20105,8 @@ }, "node_modules/protractor/node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -17743,124 +20116,128 @@ "node": ">=8" } }, - "node_modules/protractor/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/protractor/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, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/protractor/node_modules/glob": { - "version": "7.2.3", + "node_modules/protractor/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, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "p-locate": "^4.1.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/protractor/node_modules/source-map": { - "version": "0.5.7", - "dev": true, - "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/protractor/node_modules/source-map-support": { - "version": "0.4.18", + "node_modules/protractor/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, "license": "MIT", "dependencies": { - "source-map": "^0.5.6" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/protractor/node_modules/strip-ansi": { - "version": "3.0.1", + "node_modules/protractor/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, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/protractor/node_modules/supports-color": { - "version": "2.0.0", + "node_modules/protractor/node_modules/q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=0.6.0", + "teleport": ">=0.2.0" } }, - "node_modules/protractor/node_modules/wrap-ansi": { - "version": "6.2.0", + "node_modules/protractor/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/protractor/node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "source-map": "^0.5.6" } }, - "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/protractor/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/protractor/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/protractor/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, "node_modules/protractor/node_modules/y18n": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, "license": "ISC" }, "node_modules/protractor/node_modules/yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", "dependencies": { @@ -17882,6 +20259,8 @@ }, "node_modules/protractor/node_modules/yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "license": "ISC", "dependencies": { @@ -17894,6 +20273,8 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "license": "MIT", "dependencies": { @@ -17906,64 +20287,29 @@ }, "node_modules/proxy-addr/node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" + "node": ">= 0.10" } }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.0.2", - "debug": "4" + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" }, "engines": { "node": ">= 14" @@ -17973,37 +20319,31 @@ "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, "license": "MIT" }, "node_modules/prr": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "license": "MIT", "optional": true }, "node_modules/psl": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true, "license": "MIT" }, @@ -18016,6 +20356,9 @@ }, "node_modules/pump": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -18023,14 +20366,17 @@ } }, "node_modules/punycode": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" }, "node_modules/q": { - "version": "1.4.1", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "dev": true, "license": "MIT", "engines": { @@ -18040,6 +20386,8 @@ }, "node_modules/qjobs": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true, "license": "MIT", "engines": { @@ -18048,6 +20396,9 @@ }, "node_modules/qs": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" @@ -18059,13 +20410,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -18102,6 +20450,8 @@ }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18110,6 +20460,8 @@ }, "node_modules/range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "license": "MIT", "engines": { @@ -18118,6 +20470,8 @@ }, "node_modules/raw-body": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "license": "MIT", "dependencies": { @@ -18130,16 +20484,10 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "license": "MIT", "dependencies": { @@ -18182,48 +20530,6 @@ "node": ">=0.10.0" } }, - "node_modules/read-package-json": { - "version": "6.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -18380,7 +20686,9 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -18393,6 +20701,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -18402,6 +20712,19 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -18417,17 +20740,23 @@ } }, "node_modules/reflect-metadata": { - "version": "0.1.14", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "dev": true, "license": "Apache-2.0" }, "node_modules/regenerate": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, "license": "MIT" }, "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, "license": "MIT", "dependencies": { @@ -18439,10 +20768,14 @@ }, "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==", "license": "MIT" }, "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, "license": "MIT", "dependencies": { @@ -18451,6 +20784,8 @@ }, "node_modules/regex-parser": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", "dev": true, "license": "MIT" }, @@ -18463,6 +20798,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -18480,6 +20817,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -18496,6 +20835,8 @@ }, "node_modules/regjsparser": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -18507,6 +20848,8 @@ }, "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" @@ -18531,20 +20874,15 @@ "node": ">= 6" } }, - "node_modules/replace/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==", + "node_modules/replace/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/replace/node_modules/cliui": { @@ -18559,17 +20897,31 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/replace/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==", + "node_modules/replace/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, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" + } + }, + "node_modules/replace/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, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/replace/node_modules/minimatch": { @@ -18585,16 +20937,30 @@ "node": "*" } }, - "node_modules/replace/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/replace/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, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/replace/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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" }, "engines": { "node": ">=8" @@ -18646,6 +21012,9 @@ }, "node_modules/request": { "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -18676,6 +21045,8 @@ }, "node_modules/request/node_modules/form-data": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18689,26 +21060,19 @@ }, "node_modules/request/node_modules/qs": { "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.6" } }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "license": "MIT", "bin": { @@ -18717,6 +21081,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -18725,6 +21091,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -18732,16 +21100,22 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true, "license": "ISC" }, "node_modules/requires-port": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true, "license": "MIT" }, "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, "license": "MIT", "dependencies": { @@ -18757,15 +21131,19 @@ } }, "node_modules/resolve-from": { - "version": "5.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/resolve-url-loader": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -18781,6 +21159,8 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { @@ -18794,6 +21174,8 @@ }, "node_modules/resolve-url-loader/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, "license": "BSD-3-Clause", "engines": { @@ -18802,6 +21184,8 @@ }, "node_modules/restore-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", "dependencies": { "onetime": "^5.1.0", @@ -18811,8 +21195,16 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "license": "MIT", "engines": { @@ -18821,6 +21213,8 @@ }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "license": "MIT", "engines": { @@ -18829,61 +21223,121 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rimraf": { - "version": "3.0.2", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "glob": "^9.2.0" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/roboto-fontface": { "version": "0.10.0", + "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.10.0.tgz", + "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==", "license": "Apache-2.0" }, "node_modules/robust-predicates": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", "license": "Unlicense" }, "node_modules/rollup": { - "version": "3.29.4", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", "dev": true, "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.21.2", + "@rollup/rollup-android-arm64": "4.21.2", + "@rollup/rollup-darwin-arm64": "4.21.2", + "@rollup/rollup-darwin-x64": "4.21.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", + "@rollup/rollup-linux-arm64-gnu": "4.21.2", + "@rollup/rollup-linux-arm64-musl": "4.21.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", + "@rollup/rollup-linux-s390x-gnu": "4.21.2", + "@rollup/rollup-linux-x64-gnu": "4.21.2", + "@rollup/rollup-linux-x64-musl": "4.21.2", + "@rollup/rollup-win32-arm64-msvc": "4.21.2", + "@rollup/rollup-win32-ia32-msvc": "4.21.2", + "@rollup/rollup-win32-x64-msvc": "4.21.2", "fsevents": "~2.3.2" } }, @@ -18891,13 +21345,30 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true, "license": "MIT", "engines": { "node": "0.12.* || 4.* || 6.* || >= 7.*" } }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -18905,6 +21376,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -18927,10 +21400,14 @@ }, "node_modules/rw": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "license": "BSD-3-Clause" }, "node_modules/rxjs": { "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" @@ -18941,10 +21418,14 @@ }, "node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, "node_modules/safe-array-concat": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -18960,13 +21441,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -18985,6 +21463,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -19001,10 +21481,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sass": { - "version": "1.64.1", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -19020,28 +21504,30 @@ } }, "node_modules/sass-loader": { - "version": "13.3.2", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.0.tgz", + "integrity": "sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw==", "dev": true, "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", + "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -19052,11 +21538,16 @@ }, "sass-embedded": { "optional": true + }, + "webpack": { + "optional": true } } }, "node_modules/saucelabs": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", "dev": true, "dependencies": { "https-proxy-agent": "^2.2.1" @@ -19067,6 +21558,8 @@ }, "node_modules/saucelabs/node_modules/agent-base": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "license": "MIT", "dependencies": { @@ -19078,6 +21571,8 @@ }, "node_modules/saucelabs/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19086,6 +21581,8 @@ }, "node_modules/saucelabs/node_modules/https-proxy-agent": { "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -19097,23 +21594,16 @@ } }, "node_modules/sax": { - "version": "1.3.0", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", "dev": true, "license": "ISC" }, - "node_modules/saxes": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, "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, "license": "MIT", "dependencies": { @@ -19130,13 +21620,35 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/select-hose": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true, "license": "MIT" }, "node_modules/selenium-webdriver": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -19149,27 +21661,11 @@ "node": ">= 6.9.0" } }, - "node_modules/selenium-webdriver/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/selenium-webdriver/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -19181,6 +21677,8 @@ }, "node_modules/selenium-webdriver/node_modules/tmp": { "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", "dev": true, "license": "MIT", "dependencies": { @@ -19190,8 +21688,34 @@ "node": ">=0.4.0" } }, + "node_modules/selenium-webdriver/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/selenium-webdriver/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, "node_modules/selfsigned": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -19203,11 +21727,11 @@ } }, "node_modules/semver": { - "version": "7.6.0", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -19215,22 +21739,10 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/send": { "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "license": "MIT", "dependencies": { @@ -19254,6 +21766,8 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -19262,16 +21776,45 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-javascript": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -19280,6 +21823,8 @@ }, "node_modules/serve-index": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "license": "MIT", "dependencies": { @@ -19297,6 +21842,8 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -19305,6 +21852,8 @@ }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, "license": "MIT", "engines": { @@ -19313,6 +21862,8 @@ }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "license": "MIT", "dependencies": { @@ -19327,29 +21878,29 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true, "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true, "license": "ISC" }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-static": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "license": "MIT", "dependencies": { @@ -19364,11 +21915,16 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, "node_modules/set-function-length": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -19384,6 +21940,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -19398,16 +21956,22 @@ }, "node_modules/setimmediate": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true, "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "license": "MIT", "dependencies": { @@ -19450,6 +22014,9 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -19460,6 +22027,9 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -19467,6 +22037,8 @@ }, "node_modules/shell-quote": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, "license": "MIT", "funding": { @@ -19474,115 +22046,53 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", + "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==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/sigstore": { - "version": "1.9.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/sigstore/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sigstore/node_modules/lru-cache": { - "version": "7.18.3", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { - "node": ">=12" - } - }, - "node_modules/sigstore/node_modules/make-fetch-happen": { - "version": "11.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" + "node": ">=14" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.4", + "node_modules/sigstore": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "dev": true, - "license": "ISC", "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/simple-concat": { @@ -19705,20 +22215,27 @@ "license": "MIT" }, "node_modules/slash": { - "version": "4.0.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true, + "license": "ISC" + }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -19736,6 +22253,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -19751,6 +22269,7 @@ "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, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -19759,8 +22278,18 @@ "node": ">=7.0.0" } }, + "node_modules/slice-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, + "license": "MIT" + }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -19768,7 +22297,9 @@ } }, "node_modules/socket.io": { - "version": "4.7.3", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, "license": "MIT", "dependencies": { @@ -19778,47 +22309,27 @@ "debug": "~4.3.2", "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" } }, "node_modules/socket.io-parser": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "license": "MIT", "dependencies": { @@ -19831,6 +22342,8 @@ }, "node_modules/sockjs": { "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19841,6 +22354,8 @@ }, "node_modules/sockjs/node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", "bin": { @@ -19851,6 +22366,7 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, "license": "MIT", "dependencies": { "ip-address": "^9.0.5", @@ -19862,20 +22378,24 @@ } }, "node_modules/socks-proxy-agent": { - "version": "7.0.0", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": ">= 10" + "node": ">= 14" } }, "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, "license": "BSD-3-Clause", "engines": { @@ -19883,7 +22403,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -19891,16 +22413,17 @@ } }, "node_modules/source-map-loader": { - "version": "4.0.1", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.6", "iconv-lite": "^0.6.3", "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -19912,6 +22435,8 @@ }, "node_modules/source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "dependencies": { @@ -19921,6 +22446,8 @@ }, "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, "license": "BSD-3-Clause", "engines": { @@ -19929,10 +22456,15 @@ }, "node_modules/sourcemap-codec": { "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", "license": "MIT" }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -19940,13 +22472,28 @@ "spdx-license-ids": "^3.0.0" } }, + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/spdx-exceptions": { - "version": "2.3.0", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "3.0.1", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19955,12 +22502,16 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true, "license": "CC0-1.0" }, "node_modules/spdy": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "license": "MIT", "dependencies": { @@ -19976,6 +22527,8 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "license": "MIT", "dependencies": { @@ -20004,13 +22557,16 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/sprintf-js": { - "version": "1.0.3", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "license": "BSD-3-Clause" }, @@ -20018,10 +22574,13 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==", + "dev": true, "license": "MIT" }, "node_modules/sshpk": { "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20044,8 +22603,17 @@ "node": ">=0.10.0" } }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "license": "MIT" + }, "node_modules/ssri": { - "version": "10.0.5", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "license": "ISC", "dependencies": { @@ -20055,20 +22623,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/statuses": { - "version": "2.0.1", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/stream-buffers": { @@ -20085,16 +22647,25 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, "license": "MIT", "dependencies": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" } }, + "node_modules/stream-combiner2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, "node_modules/stream-combiner2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -20110,12 +22681,14 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, "license": "MIT" }, "node_modules/stream-combiner2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -20123,6 +22696,8 @@ }, "node_modules/streamroller": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "license": "MIT", "dependencies": { @@ -20134,10 +22709,45 @@ "node": ">=8.0" } }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.19.0.tgz", + "integrity": "sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==", "dev": true, "license": "MIT", "dependencies": { @@ -20151,6 +22761,8 @@ }, "node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -20158,6 +22770,9 @@ }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -20171,6 +22786,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -20184,6 +22801,8 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "license": "MIT", "dependencies": { @@ -20201,6 +22820,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20214,6 +22835,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { @@ -20230,6 +22853,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -20241,6 +22866,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -20252,6 +22879,8 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -20260,6 +22889,9 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -20280,6 +22912,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -20289,27 +22923,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - }, - "bin": { - "sl-log-transformer": "bin/sl-log-transformer.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/superagent": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", + "dev": true, "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", @@ -20327,24 +22946,11 @@ "node": ">=6.4.0 <13 || >=14" } }, - "node_modules/superagent/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/superagent/node_modules/formidable": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, "license": "MIT", "dependencies": { "dezalgo": "^1.0.4", @@ -20356,20 +22962,10 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -20381,6 +22977,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -20391,9 +22989,9 @@ } }, "node_modules/swiper": { - "version": "11.1.8", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.8.tgz", - "integrity": "sha512-sBFp7fA+IfZ/7BMcg8/JSEqDD1qZXBUyliT76yk3zIYVu2fMwFVAghhAJ9vBM5tJUtHW5qcD0pmeEGQs1EK14w==", + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.11.tgz", + "integrity": "sha512-077Aw3OrlZpkkBRf/6+44bGh/HZY/vsLEyate2db2KkJgYUIR5TvDgvvhcJtW/puXzw79w5KBc30DauEX6GZYQ==", "funding": [ { "type": "patreon", @@ -20404,25 +23002,42 @@ "url": "http://opencollective.com/swiper" } ], + "license": "MIT", "engines": { "node": ">= 4.7.0" } }, "node_modules/symbol-observable": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } }, "node_modules/tapable": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "license": "MIT", "engines": { @@ -20431,6 +23046,9 @@ }, "node_modules/tar": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, "license": "ISC", "dependencies": { "chownr": "^2.0.0", @@ -20459,7 +23077,7 @@ "bare-path": "^2.1.0" } }, - "node_modules/tar-fs/node_modules/tar-stream": { + "node_modules/tar-stream": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", @@ -20471,23 +23089,11 @@ "streamx": "^2.15.0" } }, - "node_modules/tar-stream": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -20498,6 +23104,9 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -20506,8 +23115,34 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, "license": "ISC" }, "node_modules/temp-dir": { @@ -20528,80 +23163,16 @@ "license": "MIT", "dependencies": { "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "license": "MIT", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tempy/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tempy/node_modules/type-fest": { @@ -20618,7 +23189,9 @@ } }, "node_modules/terser": { - "version": "5.29.1", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -20636,6 +23209,8 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "license": "MIT", "dependencies": { @@ -20669,6 +23244,8 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -20684,6 +23261,8 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -20692,11 +23271,15 @@ }, "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "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, "license": "MIT", "dependencies": { @@ -20714,45 +23297,15 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/text-decoder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", - "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -20771,11 +23324,29 @@ }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, "license": "MIT" }, "node_modules/through2": { @@ -20790,21 +23361,25 @@ }, "node_modules/thunky": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true, "license": "MIT" }, "node_modules/tmp": { - "version": "0.0.33", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, "engines": { - "node": ">=0.6.0" + "node": ">=14.14" } }, "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, "license": "MIT", "engines": { @@ -20826,6 +23401,8 @@ }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "license": "MIT", "engines": { @@ -20843,40 +23420,58 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { - "node": ">=6" + "node": ">=0.8" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">=6" } }, "node_modules/tr46": { - "version": "2.1.0", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, + "license": "MIT" + }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/tree-kill": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, "license": "MIT", "bin": { "tree-kill": "cli.js" @@ -20907,6 +23502,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -20949,6 +23546,8 @@ }, "node_modules/tsconfig-paths": { "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "dependencies": { @@ -20960,6 +23559,8 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { @@ -20970,121 +23571,30 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "dev": true, - "license": "MIT", - "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", - "dev": true, + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, "node_modules/tuf-js": { - "version": "1.1.7", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", "dev": true, "license": "MIT", "dependencies": { - "@tufjs/models": "1.0.4", + "@tufjs/models": "2.0.1", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/tuf-js/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tuf-js/node_modules/lru-cache": { - "version": "7.18.3", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "11.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "make-fetch-happen": "^13.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/tunnel-agent": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -21096,11 +23606,15 @@ }, "node_modules/tweetnacl": { "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true, "license": "Unlicense" }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -21112,6 +23626,9 @@ }, "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, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -21122,6 +23639,8 @@ }, "node_modules/type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "license": "MIT", "dependencies": { @@ -21134,6 +23653,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -21147,6 +23668,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -21165,6 +23688,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -21184,6 +23709,8 @@ }, "node_modules/typed-array-length": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "license": "MIT", "dependencies": { @@ -21203,6 +23730,8 @@ }, "node_modules/typed-assert": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true, "license": "MIT" }, @@ -21210,13 +23739,16 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { - "version": "4.9.5", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -21224,7 +23756,7 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/typescript-strict-plugin": { @@ -21247,6 +23779,8 @@ }, "node_modules/typescript-strict-plugin/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, "license": "MIT", "dependencies": { @@ -21259,16 +23793,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/typescript-strict-plugin/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/typescript-strict-plugin/node_modules/chalk": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "license": "MIT", "dependencies": { @@ -21281,6 +23809,8 @@ }, "node_modules/typescript-strict-plugin/node_modules/cliui": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", "dependencies": { @@ -21291,6 +23821,8 @@ }, "node_modules/typescript-strict-plugin/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, "license": "MIT", "dependencies": { @@ -21300,85 +23832,58 @@ "node": ">=7.0.0" } }, - "node_modules/typescript-strict-plugin/node_modules/execa": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/typescript-strict-plugin/node_modules/get-stream": { - "version": "5.2.0", + "node_modules/typescript-strict-plugin/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, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/typescript-strict-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, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/typescript-strict-plugin/node_modules/human-signals": { - "version": "1.1.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/typescript-strict-plugin/node_modules/minimatch": { - "version": "9.0.4", + "node_modules/typescript-strict-plugin/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, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/typescript-strict-plugin/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/typescript-strict-plugin/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/typescript-strict-plugin/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", "dependencies": { @@ -21394,16 +23899,10 @@ "node": ">=10" } }, - "node_modules/typescript-strict-plugin/node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/ua-parser-js": { - "version": "0.7.37", + "version": "0.7.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.38.tgz", + "integrity": "sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==", "dev": true, "funding": [ { @@ -21425,9 +23924,9 @@ } }, "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", + "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -21440,6 +23939,8 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "license": "MIT", "dependencies": { @@ -21460,11 +23961,16 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "5.26.5", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, "license": "MIT" }, "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, "license": "MIT", "engines": { @@ -21473,6 +23979,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -21485,6 +23993,8 @@ }, "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, "license": "MIT", "engines": { @@ -21493,14 +24003,31 @@ }, "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, "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-filename": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, "license": "ISC", "dependencies": { @@ -21512,6 +24039,8 @@ }, "node_modules/unique-slug": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, "license": "ISC", "dependencies": { @@ -21535,15 +24064,19 @@ } }, "node_modules/universalify": { - "version": "0.1.2", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", "engines": { @@ -21554,13 +24087,16 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -21578,8 +24114,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -21590,179 +24126,619 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vite": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.40", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" ], + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/vary": { - "version": "1.1.2", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/verror": { - "version": "1.10.0", - "dev": true, - "engines": [ - "node >=0.6.0" + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" ], + "dev": true, "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vite": { - "version": "4.5.3", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/void-elements": { - "version": "2.0.1", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "xml-name-validator": "^3.0.0" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, "node_modules/watchpack": { - "version": "2.4.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "license": "MIT", "dependencies": { @@ -21775,6 +24751,8 @@ }, "node_modules/wbuf": { "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "license": "MIT", "dependencies": { @@ -21783,13 +24761,24 @@ }, "node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT" + }, "node_modules/webdriver-js-extender": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21802,6 +24791,8 @@ }, "node_modules/webdriver-manager": { "version": "12.1.9", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.9.tgz", + "integrity": "sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21826,6 +24817,8 @@ }, "node_modules/webdriver-manager/node_modules/ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", "engines": { @@ -21834,14 +24827,31 @@ }, "node_modules/webdriver-manager/node_modules/ansi-styles": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/webdriver-manager/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/webdriver-manager/node_modules/chalk": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "license": "MIT", "dependencies": { @@ -21855,32 +24865,65 @@ "node": ">=0.10.0" } }, - "node_modules/webdriver-manager/node_modules/glob": { - "version": "7.2.3", + "node_modules/webdriver-manager/node_modules/del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" }, "engines": { - "node": "*" + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-manager/node_modules/globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=0.10.0" } }, "node_modules/webdriver-manager/node_modules/ini": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, "license": "ISC" }, + "node_modules/webdriver-manager/node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/webdriver-manager/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -21892,6 +24935,8 @@ }, "node_modules/webdriver-manager/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -21900,6 +24945,8 @@ }, "node_modules/webdriver-manager/node_modules/strip-ansi": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "license": "MIT", "dependencies": { @@ -21911,41 +24958,66 @@ }, "node_modules/webdriver-manager/node_modules/supports-color": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/webdriver-manager/node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webdriver-manager/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=4.0" } }, "node_modules/webidl-conversions": { - "version": "6.1.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10.4" - } + "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.90.3", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -21953,7 +25025,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -21973,18 +25045,21 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.2", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.3.0.tgz", + "integrity": "sha512-xD2qnNew+F6KwOGZR7kWdbIou/ud7cVqLEXeK1q0nHcNsX/u7ul/fSdlOTX4ntSL5FNFy7ZJJXbf0piF591JYw==", "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.12", + "memfs": "^4.6.0", "mime-types": "^2.1.31", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -22000,53 +25075,55 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", "dev": true, "license": "MIT", "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", + "html-entities": "^2.4.0", "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -22057,64 +25134,87 @@ } } }, - "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.4", + "node_modules/webpack-dev-server/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">= 12.13.0" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "@types/express": "^4.17.13" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "@types/express": { "optional": true } } }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/webpack-merge": { - "version": "5.9.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/webpack-sources": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "license": "MIT", "engines": { @@ -22123,6 +25223,8 @@ }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -22143,9 +25245,10 @@ }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -22159,24 +25262,58 @@ }, "node_modules/webpack/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "ajv": "^6.9.1" } }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "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, "license": "MIT", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -22192,6 +25329,8 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -22205,51 +25344,30 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.4.24", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "dev": true, - "license": "MIT" - }, "node_modules/whatwg-url": { - "version": "8.7.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -22263,6 +25381,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "license": "MIT", "dependencies": { @@ -22278,11 +25398,15 @@ }, "node_modules/which-module": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, "license": "ISC" }, "node_modules/which-typed-array": { "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "license": "MIT", "dependencies": { @@ -22299,16 +25423,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wildcard": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true, "license": "MIT" }, @@ -22316,6 +25434,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, "license": "MIT", "dependencies": { "execa": "^4.0.2" @@ -22327,51 +25446,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "license": "Apache-2.0", "engines": { - "node": ">=8.12.0" + "node": ">=0.10.0" } }, "node_modules/wordwrap": { @@ -22382,7 +25464,10 @@ "license": "MIT" }, "node_modules/wrap-ansi": { - "version": "7.0.0", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -22390,15 +25475,14 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -22415,6 +25499,8 @@ }, "node_modules/wrap-ansi-cjs/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, "license": "MIT", "dependencies": { @@ -22429,6 +25515,8 @@ }, "node_modules/wrap-ansi-cjs/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, "license": "MIT", "dependencies": { @@ -22438,8 +25526,18 @@ "node": ">=7.0.0" } }, + "node_modules/wrap-ansi-cjs/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, + "license": "MIT" + }, "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, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -22453,6 +25551,9 @@ }, "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, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -22461,14 +25562,25 @@ "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, + "license": "MIT" + }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -22477,18 +25589,25 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -22536,13 +25655,17 @@ "xml-js": "bin/cli.js" } }, - "node_modules/xml-name-validator": { - "version": "3.0.0", + "node_modules/xml-js/node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "dev": true, - "license": "Apache-2.0" + "license": "ISC" }, "node_modules/xml2js": { - "version": "0.4.23", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dev": true, "license": "MIT", "dependencies": { @@ -22553,18 +25676,25 @@ "node": ">=4.0.0" } }, - "node_modules/xmlbuilder": { + "node_modules/xml2js/node_modules/xmlbuilder": { "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, "license": "MIT", "engines": { "node": ">=4.0" } }, - "node_modules/xmlchars": { - "version": "2.2.0", + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8.0" + } }, "node_modules/xpath": { "version": "0.0.32", @@ -22588,6 +25718,8 @@ }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -22596,11 +25728,15 @@ }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -22617,7 +25753,19 @@ } }, "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { @@ -22637,6 +25785,8 @@ }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { @@ -22645,6 +25795,8 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -22654,12 +25806,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zone.js": { - "version": "0.13.3", + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zone.js": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", + "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==", + "license": "MIT" } } } diff --git a/ui/package.json b/ui/package.json index a5194f5d6bc..0e232477e3c 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,39 +1,39 @@ { "name": "openems-ui", - "version": "2024.8.0", + "version": "2024.9.0", "license": "AGPL-3.0", "private": true, "dependencies": { - "@angular/animations": "~16.2.12", - "@angular/common": "~16.2.12", - "@angular/core": "~16.2.12", - "@angular/forms": "~16.2.12", - "@angular/platform-browser": "~16.2.12", - "@angular/platform-browser-dynamic": "~16.2.12", - "@angular/router": "~16.2.12", - "@angular/service-worker": "~16.2.12", - "@capacitor-community/file-opener": "^1.0.5", - "@capacitor/android": "5.7.7", - "@capacitor/app": "^5.0.6", - "@capacitor/core": "5.7.7", - "@capacitor/filesystem": "^5.2.0", - "@capacitor/ios": "5.7.7", - "@capacitor/splash-screen": "^5.0.6", + "@angular/animations": "18.0.5", + "@angular/common": "18.0.5", + "@angular/core": "18.0.5", + "@angular/forms": "18.0.5", + "@angular/platform-browser": "18.0.5", + "@angular/platform-browser-dynamic": "18.0.5", + "@angular/router": "18.0.5", + "@angular/service-worker": "18.0.5", + "@capacitor-community/file-opener": "^6.0.0", + "@capacitor/android": "^6.0.0", + "@capacitor/app": "^6.0.0", + "@capacitor/core": "^6.0.0", + "@capacitor/filesystem": "^6.0.0", + "@capacitor/ios": "^6.0.0", + "@capacitor/splash-screen": "^6.0.0", "@ionic-native/core": "^5.36.0", "@ionic-native/file-opener": "^5.36.0", "@ionic/angular": "^6.7.5", - "@ionic/cli": "^7.1.6", "@ngx-formly/core": "^6.3.0", "@ngx-formly/ionic": "^6.3.6", "@ngx-formly/schematics": "^6.3.0", "@ngx-translate/core": "^15.0.0", "@nodro7/angular-mydatepicker": "^0.14.0", "capacitor-blob-writer": "^1.1.17", - "capacitor-ios-autofill-save-password": "^2.0.0", - "capacitor-secure-storage-plugin": "^0.9.0", - "chart.js": "^4.4.3", + "capacitor-ios-autofill-save-password": "^3.0.0", + "capacitor-secure-storage-plugin": "^0.10.0", + "chart.js": "^4.4.4", "chartjs-adapter-date-fns": "^3.0.0", "chartjs-plugin-annotation": "^3.0.1", + "chartjs-plugin-datalabels": "^2.2.0", "chartjs-plugin-zoom": "^2.0.1", "classlist.js": "^1.1.20150312", "compare-versions": "^6.1.1", @@ -41,41 +41,49 @@ "date-fns": "^2.30.0", "file-saver-es": "^2.0.5", "ng2-charts": "4.1.1", - "ngx-cookie-service": "^16.1.0", - "ngx-device-detector": "^6.0.2", + "ngx-cookie-service": "18.0.0", + "ngx-device-detector": "^8.0.0", "ngx-spinner": "^16.0.2", "roboto-fontface": "^0.10.0", "rxjs": "~6.6.7", - "swiper": "11.1.8", + "swiper": "11.1.11", "tslib": "^2.6.2", "uuid": "^10.0.0", - "zone.js": "~0.13.3" + "zone.js": "~0.14.7" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.14", - "@angular-eslint/builder": "^16.3.1", - "@angular-eslint/eslint-plugin": "^16.3.1", - "@angular-eslint/eslint-plugin-template": "^16.3.1", - "@angular-eslint/template-parser": "^16.3.1", - "@angular/cli": "^16.2.13", - "@angular/compiler": "^16.2.12", - "@angular/compiler-cli": "^16.2.12", - "@angular/language-service": "^16.2.12", - "@capacitor/assets": "^3.0.0", - "@capacitor/cli": "6.1.1", + "@angular-devkit/build-angular": "^18.0.5", + "@angular-devkit/core": "18.0.5", + "@angular-devkit/schematics": "18.0.5", + "@angular-eslint/builder": "^18.1.0", + "@angular-eslint/eslint-plugin": "^18.1.0", + "@angular-eslint/eslint-plugin-template": "^18.1.0", + "@angular-eslint/template-parser": "^18.1.0", + "@angular/cli": "18.1.0", + "@angular/compiler": "18.0.5", + "@angular/compiler-cli": "18.0.5", + "@angular/language-service": "18.0.5", + "@capacitor/assets": "^3.0.5", + "@capacitor/cli": "6.1.2", "@ionic/angular-toolkit": "^11.0.1", - "@stylistic/eslint-plugin": "^2.4.0", + "@ionic/cli": "^7.2.0", + "@stylistic/eslint-plugin": "^2.7.2", "@types/jasmine": "~4.3.6", "@types/jasminewd2": "~2.0.13", + "@types/json-schema": "^7.0.15", "@types/node": "^20.12.6", + "@types/qs": "^6.9.15", + "@types/range-parser": "^1.2.7", + "@types/send": "^0.17.4", "@types/uuid": "^10.0.0", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "@typescript-eslint/types": "^7.0.0", "eslint": "^8.57.0", "eslint-plugin-import": "2.29.1", - "eslint-plugin-jsdoc": "48.2.3", + "eslint-plugin-jsdoc": "48.10.0", "eslint-plugin-prefer-arrow": "1.2.3", - "eslint-plugin-unused-imports": "^3.2.0", + "eslint-plugin-unused-imports": "^4.1.3", "jasmine-core": "~4.5.0", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.2", @@ -86,7 +94,7 @@ "karma-jasmine-html-reporter": "^2.1.0", "protractor": "~7.0.0", "ts-node": "^10.9.2", - "typescript": "~4.9.5", + "typescript": "~5.4.5", "typescript-strict-plugin": "^2.4.4" }, "scripts": { diff --git a/ui/src/app/app-routing.module.ts b/ui/src/app/app-routing.module.ts index cee2a75e5c7..b04097ce80b 100644 --- a/ui/src/app/app-routing.module.ts +++ b/ui/src/app/app-routing.module.ts @@ -1,146 +1,151 @@ -import { NgModule } from '@angular/core'; -import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; -import { environment } from 'src/environments'; +import { NgModule } from "@angular/core"; +import { PreloadAllModules, RouterModule, Routes } from "@angular/router"; +import { environment } from "src/environments"; +import { ChangelogViewComponent } from "./changelog/view/view"; +import { EdgeComponent } from "./edge/edge.component"; +import { OverviewComponent as AutarchyChartOverviewComponent } from "./edge/history/common/autarchy/overview/overview"; +import { DetailsOverviewComponent as ConsumptionDetailsOverviewComponent } from "./edge/history/common/consumption/details/details.overview"; +import { OverviewComponent as ConsumptionChartOverviewComponent } from "./edge/history/common/consumption/overview/overview"; +import { DetailsOverviewComponent as GridDetailsOverviewComponent } from "./edge/history/common/grid/details/details.overview"; +import { OverviewComponent as GridChartOverviewComponent } from "./edge/history/common/grid/overview/overview"; +import { DetailsOverviewComponent } from "./edge/history/common/production/details/details.overview"; +import { DetailsOverviewComponent as DigitalOutputDetailsOverviewComponent } from "./edge/history/Controller/Io/DigitalOutput/details/details.overview"; +import { OverviewComponent as ProductionChartOverviewComponent } from "./edge/history/common/production/overview/overview"; +import { OverviewComponent as SelfconsumptionChartOverviewComponent } from "./edge/history/common/selfconsumption/overview/overview"; +import { OverviewComponent as ChannelthresholdChartOverviewComponent } from "./edge/history/Controller/ChannelThreshold/overview/overview"; +import { OverviewComponent as GridOptimizedChargeChartOverviewComponent } from "./edge/history/Controller/Ess/GridoptimizedCharge/overview/overview"; +import { OverviewComponent as TimeOfUseTariffOverviewComponent } from "./edge/history/Controller/Ess/TimeOfUseTariff/overview/overview"; +import { DelayedSellToGridChartOverviewComponent } from "./edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component"; +import { HeatingelementChartOverviewComponent } from "./edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component"; +import { HeatPumpChartOverviewComponent } from "./edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component"; +import { HistoryComponent as EdgeHistoryComponent } from "./edge/history/history.component"; +import { HistoryDataService } from "./edge/history/historydataservice"; +import { HistoryParentComponent } from "./edge/history/historyparent.component"; +import { AsymmetricPeakshavingChartOverviewComponent } from "./edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component"; +import { SymmetricPeakshavingChartOverviewComponent } from "./edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component"; +import { TimeslotPeakshavingChartOverviewComponent } from "./edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component"; +import { StorageChartOverviewComponent } from "./edge/history/storage/storagechartoverview/storagechartoverview.component"; +import { LiveComponent as EdgeLiveComponent } from "./edge/live/live.component"; +import { LiveDataService } from "./edge/live/livedataservice"; +import { AlertingComponent as EdgeSettingsAlerting } from "./edge/settings/alerting/alerting.component"; +import { IndexComponent as EdgeSettingsAppIndex } from "./edge/settings/app/index.component"; +import { InstallAppComponent as EdgeSettingsAppInstall } from "./edge/settings/app/install.component"; +import { SingleAppComponent as EdgeSettingsAppSingle } from "./edge/settings/app/single.component"; +import { UpdateAppComponent as EdgeSettingsAppUpdate } from "./edge/settings/app/update.component"; +import { ChannelsComponent as EdgeSettingsChannelsComponent } from "./edge/settings/channels/channels.component"; +import { IndexComponent as EdgeSettingsComponentInstallIndexComponentComponent } from "./edge/settings/component/install/index.component"; +import { ComponentInstallComponent as EdgeSettingsComponentInstallComponentComponent } from "./edge/settings/component/install/install.component"; +import { IndexComponent as EdgeSettingsComponentUpdateIndexComponentComponent } from "./edge/settings/component/update/index.component"; +import { ComponentUpdateComponent as EdgeSettingsComponentUpdateComponentComponent } from "./edge/settings/component/update/update.component"; +import { JsonrpcTestComponent } from "./edge/settings/jsonrpctest/jsonrpctest"; +import { NetworkComponent as EdgeSettingsNetworkComponent } from "./edge/settings/network/network.component"; +import { PowerAssistantComponent } from "./edge/settings/powerassistant/powerassistant"; +import { AliasUpdateComponent } from "./edge/settings/profile/aliasupdate.component"; +import { ProfileComponent as EdgeSettingsProfileComponent } from "./edge/settings/profile/profile.component"; +import { SettingsComponent as EdgeSettingsComponent } from "./edge/settings/settings.component"; +import { SystemComponent as EdgeSettingsSystemComponent } from "./edge/settings/system/system.component"; +import { SystemExecuteComponent as EdgeSettingsSystemExecuteComponent } from "./edge/settings/systemexecute/systemexecute.component"; +import { SystemLogComponent as EdgeSettingsSystemLogComponent } from "./edge/settings/systemlog/systemlog.component"; +import { LoginComponent } from "./index/login.component"; +import { OverViewComponent } from "./index/overview/overview.component"; +import { UserComponent } from "./user/user.component"; +import { LoadingScreenComponent } from "./index/shared/loading-screen"; +import { CurrentAndVoltageOverviewComponent } from "./shared/components/edge/meter/currentVoltage/currentVoltage.overview"; +import { DataService } from "./shared/components/shared/dataservice"; +import { hasEdgeRole } from "./shared/guards/functional-guards"; +import { Role } from "./shared/type/role"; +import { OverviewComponent as DigitalOutputChartOverviewComponent } from "./edge/history/Controller/Io/DigitalOutput/overview/overview"; -import { ChangelogViewComponent } from './changelog/view/view'; -import { EdgeComponent } from './edge/edge.component'; -import { OverviewComponent as AutarchyChartOverviewComponent } from './edge/history/common/autarchy/overview/overview'; -import { DetailsOverviewComponent as ConsumptionDetailsOverviewComponent } from './edge/history/common/consumption/details/details.overview'; -import { OverviewComponent as ConsumptionChartOverviewComponent } from './edge/history/common/consumption/overview/overview'; -import { OverviewComponent as GridChartOverviewComponent } from './edge/history/common/grid/overview/overview'; -import { DetailsOverviewComponent } from './edge/history/common/production/details/details.overview'; -import { OverviewComponent as ProductionChartOverviewComponent } from './edge/history/common/production/overview/overview'; -import { OverviewComponent as SelfconsumptionChartOverviewComponent } from './edge/history/common/selfconsumption/overview/overview'; -import { OverviewComponent as ChannelthresholdChartOverviewComponent } from './edge/history/Controller/ChannelThreshold/overview/overview'; -import { OverviewComponent as TimeOfUseTariffOverviewComponent } from './edge/history/Controller/Ess/TimeOfUseTariff/overview/overview'; -import { OverviewComponent as GridOptimizedChargeChartOverviewComponent } from './edge/history/Controller/Ess/GridoptimizedCharge/overview/overview'; -import { DelayedSellToGridChartOverviewComponent } from './edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component'; -import { FixDigitalOutputChartOverviewComponent } from './edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component'; -import { HeatingelementChartOverviewComponent } from './edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component'; -import { HeatPumpChartOverviewComponent } from './edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component'; -import { HistoryComponent as EdgeHistoryComponent } from './edge/history/history.component'; -import { HistoryDataService } from './edge/history/historydataservice'; -import { HistoryParentComponent } from './edge/history/historyparent.component'; -import { AsymmetricPeakshavingChartOverviewComponent } from './edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component'; -import { SymmetricPeakshavingChartOverviewComponent } from './edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component'; -import { TimeslotPeakshavingChartOverviewComponent } from './edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component'; -import { SinglethresholdChartOverviewComponent } from './edge/history/singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component'; -import { StorageChartOverviewComponent } from './edge/history/storage/storagechartoverview/storagechartoverview.component'; -import { LiveComponent as EdgeLiveComponent } from './edge/live/live.component'; -import { LiveDataService } from './edge/live/livedataservice'; -import { AlertingComponent as EdgeSettingsAlerting } from './edge/settings/alerting/alerting.component'; -import { IndexComponent as EdgeSettingsAppIndex } from './edge/settings/app/index.component'; -import { InstallAppComponent as EdgeSettingsAppInstall } from './edge/settings/app/install.component'; -import { SingleAppComponent as EdgeSettingsAppSingle } from './edge/settings/app/single.component'; -import { UpdateAppComponent as EdgeSettingsAppUpdate } from './edge/settings/app/update.component'; -import { ChannelsComponent as EdgeSettingsChannelsComponent } from './edge/settings/channels/channels.component'; -import { IndexComponent as EdgeSettingsComponentInstallIndexComponentComponent } from './edge/settings/component/install/index.component'; -import { ComponentInstallComponent as EdgeSettingsComponentInstallComponentComponent } from './edge/settings/component/install/install.component'; -import { IndexComponent as EdgeSettingsComponentUpdateIndexComponentComponent } from './edge/settings/component/update/index.component'; -import { ComponentUpdateComponent as EdgeSettingsComponentUpdateComponentComponent } from './edge/settings/component/update/update.component'; -import { JsonrpcTestComponent } from './edge/settings/jsonrpctest/jsonrpctest'; -import { NetworkComponent as EdgeSettingsNetworkComponent } from './edge/settings/network/network.component'; -import { PowerAssistantComponent } from './edge/settings/powerassistant/powerassistant'; -import { AliasUpdateComponent } from './edge/settings/profile/aliasupdate.component'; -import { ProfileComponent as EdgeSettingsProfileComponent } from './edge/settings/profile/profile.component'; -import { SettingsComponent as EdgeSettingsComponent } from './edge/settings/settings.component'; -import { SystemComponent as EdgeSettingsSystemComponent } from './edge/settings/system/system.component'; -import { SystemExecuteComponent as EdgeSettingsSystemExecuteComponent } from './edge/settings/systemexecute/systemexecute.component'; -import { SystemLogComponent as EdgeSettingsSystemLogComponent } from './edge/settings/systemlog/systemlog.component'; -import { LoginComponent } from './index/login.component'; -import { OverViewComponent } from './index/overview/overview.component'; -import { LoadingScreenComponent } from './index/shared/loading-screen'; -import { DataService } from './shared/components/shared/dataservice'; -import { UserComponent } from './user/user.component'; -import { CurrentAndVoltageOverviewComponent } from './shared/components/edge/meter/currentVoltage/currentVoltage.overview'; -const routes: Routes = [ +export const routes: Routes = [ // TODO should be removed in the future - { path: '', redirectTo: 'index', pathMatch: 'full' }, - { path: 'index', component: LoadingScreenComponent }, - { path: 'login', component: LoginComponent, data: { navbarTitle: environment.uiTitle } }, + { path: "", redirectTo: "index", pathMatch: "full" }, + { path: "index", component: LoadingScreenComponent }, + { path: "login", component: LoginComponent, data: { navbarTitle: environment.uiTitle } }, - { path: 'overview', component: OverViewComponent }, + { path: "overview", component: OverViewComponent }, - { path: 'user', component: UserComponent }, - { path: 'changelog', component: ChangelogViewComponent, data: { navbarTitleToBeTranslated: 'Menu.changelog' } }, + { path: "user", component: UserComponent, data: { navbarTitleToBeTranslated: "Menu.user" } }, + { path: "changelog", component: ChangelogViewComponent, data: { navbarTitleToBeTranslated: "Menu.changelog" } }, // Edge Pages { - path: 'device/:edgeId', component: EdgeComponent, children: [ - { path: '', redirectTo: 'live', pathMatch: 'full' }, + path: "device/:edgeId", component: EdgeComponent, children: [ + { path: "", redirectTo: "live", pathMatch: "full" }, { - path: 'live', data: { navbarTitle: environment.uiTitle }, providers: [{ + path: "live", data: { navbarTitle: environment.uiTitle }, providers: [{ useClass: LiveDataService, provide: DataService, }], component: EdgeLiveComponent, }, { - path: 'history', providers: [{ + path: "history", providers: [{ useClass: HistoryDataService, provide: DataService, }], component: HistoryParentComponent, children: [ - { path: '', component: EdgeHistoryComponent }, + { path: "", component: EdgeHistoryComponent }, // History Chart Pages - { path: ':componentId/asymmetricpeakshavingchart', component: AsymmetricPeakshavingChartOverviewComponent }, - { path: ':componentId/delayedselltogridchart', component: DelayedSellToGridChartOverviewComponent }, - { path: ':componentId/fixdigitaloutputchart', component: FixDigitalOutputChartOverviewComponent }, - { path: ':componentId/gridOptimizedChargeChart', component: GridOptimizedChargeChartOverviewComponent }, - { path: ':componentId/heatingelementchart', component: HeatingelementChartOverviewComponent }, - { path: ':componentId/heatpumpchart', component: HeatPumpChartOverviewComponent }, - { path: ':componentId/scheduleChart', component: TimeOfUseTariffOverviewComponent }, - { path: ':componentId/singlethresholdchart', component: SinglethresholdChartOverviewComponent }, - { path: ':componentId/symmetricpeakshavingchart', component: SymmetricPeakshavingChartOverviewComponent }, - { path: ':componentId/timeslotpeakshavingchart', component: TimeslotPeakshavingChartOverviewComponent }, - { path: 'autarchychart', component: AutarchyChartOverviewComponent }, - { path: 'consumptionchart', component: ConsumptionChartOverviewComponent }, - { path: 'consumptionchart/:componentId', component: ConsumptionDetailsOverviewComponent }, - { path: 'consumptionchart/:componentId/currentVoltage', component: CurrentAndVoltageOverviewComponent }, - { path: 'gridchart', component: GridChartOverviewComponent }, - { path: 'productionchart', component: ProductionChartOverviewComponent }, - { path: 'productionchart/:componentId', component: DetailsOverviewComponent }, - { path: 'productionchart/:componentId/currentVoltage', component: CurrentAndVoltageOverviewComponent }, - { path: 'selfconsumptionchart', component: SelfconsumptionChartOverviewComponent }, - { path: 'storagechart', component: StorageChartOverviewComponent }, + { path: ":componentId/asymmetricpeakshavingchart", component: AsymmetricPeakshavingChartOverviewComponent }, + { path: ":componentId/delayedselltogridchart", component: DelayedSellToGridChartOverviewComponent }, + { path: ":componentId/gridOptimizedChargeChart", component: GridOptimizedChargeChartOverviewComponent }, + { path: ":componentId/heatingelementchart", component: HeatingelementChartOverviewComponent }, + { path: ":componentId/heatpumpchart", component: HeatPumpChartOverviewComponent }, + { path: ":componentId/scheduleChart", component: TimeOfUseTariffOverviewComponent }, + { path: ":componentId/symmetricpeakshavingchart", component: SymmetricPeakshavingChartOverviewComponent }, + { path: ":componentId/timeslotpeakshavingchart", component: TimeslotPeakshavingChartOverviewComponent }, + { path: "autarchychart", component: AutarchyChartOverviewComponent }, + { path: "consumptionchart", component: ConsumptionChartOverviewComponent }, + { path: "consumptionchart/:componentId", component: ConsumptionDetailsOverviewComponent }, + { path: "consumptionchart/:componentId/currentVoltage", component: CurrentAndVoltageOverviewComponent }, + { path: "gridchart", component: GridChartOverviewComponent }, + { path: "gridchart/:componentId", component: GridDetailsOverviewComponent }, + { path: "gridchart/:componentId/currentVoltage", component: CurrentAndVoltageOverviewComponent }, + { path: "productionchart", component: ProductionChartOverviewComponent }, + { path: "productionchart/:componentId", component: DetailsOverviewComponent }, + { path: "productionchart/:componentId/currentVoltage", component: CurrentAndVoltageOverviewComponent }, + { path: "selfconsumptionchart", component: SelfconsumptionChartOverviewComponent }, + { path: "storagechart", component: StorageChartOverviewComponent }, // Controllers - { path: 'channelthresholdchart', component: ChannelthresholdChartOverviewComponent }, + { path: "channelthresholdchart", component: ChannelthresholdChartOverviewComponent }, + { path: "digitaloutputchart", component: DigitalOutputChartOverviewComponent }, + { path: "digitaloutputchart/:componentId", component: DigitalOutputDetailsOverviewComponent }, ], }, - { path: 'settings', data: { navbarTitleToBeTranslated: 'Menu.edgeSettings' }, component: EdgeSettingsComponent }, - { path: 'settings/channels', component: EdgeSettingsChannelsComponent }, - { path: 'settings/component.install', component: EdgeSettingsComponentInstallIndexComponentComponent, data: { navbarTitleToBeTranslated: 'Edge.Config.Index.addComponents' } }, - { path: 'settings/component.install/:factoryId', component: EdgeSettingsComponentInstallComponentComponent, data: { navbarTitleToBeTranslated: 'Edge.Config.Index.addComponents' } }, - { path: 'settings/component.update', component: EdgeSettingsComponentUpdateIndexComponentComponent, data: { navbarTitleToBeTranslated: 'Edge.Config.Index.adjustComponents' } }, - { path: 'settings/component.update/:componentId', component: EdgeSettingsComponentUpdateComponentComponent, data: { navbarTitleToBeTranslated: 'Edge.Config.Index.adjustComponents' } }, - { path: 'settings/network', component: EdgeSettingsNetworkComponent, data: { navbarTitleToBeTranslated: 'Edge.Config.Index.networkConfiguration' } }, - { path: 'settings/profile', component: EdgeSettingsProfileComponent }, - { path: 'settings/profile/:componentId', component: AliasUpdateComponent }, - { path: 'settings/systemexecute', component: EdgeSettingsSystemExecuteComponent }, - { path: 'settings/systemlog', component: EdgeSettingsSystemLogComponent, data: { navbarTitleToBeTranslated: 'Edge.Config.Index.liveLog' } }, - { path: 'settings/system', component: EdgeSettingsSystemComponent, data: { navbarTitleToBeTranslated: 'Edge.Config.Index.SYSTEM' } }, - { path: 'settings/app', data: { navbarTitle: environment.edgeShortName + ' Apps' }, component: EdgeSettingsAppIndex }, - { path: 'settings/app/install/:appId', component: EdgeSettingsAppInstall }, - { path: 'settings/app/update/:appId', component: EdgeSettingsAppUpdate }, - { path: 'settings/app/single/:appId', component: EdgeSettingsAppSingle }, - { path: 'settings/alerting', component: EdgeSettingsAlerting }, - { path: 'settings/jsonrpctest', component: JsonrpcTestComponent }, - { path: 'settings/powerAssistant', component: PowerAssistantComponent, data: { navbarTitle: 'Power-Assistant' } }, + { path: "settings", data: { navbarTitleToBeTranslated: "Menu.edgeSettings" }, component: EdgeSettingsComponent }, + { path: "settings/channels", component: EdgeSettingsChannelsComponent, canActivate: [hasEdgeRole(Role.ADMIN)], data: { navbarTitle: "Channels" } }, + { path: "settings/component.install", component: EdgeSettingsComponentInstallIndexComponentComponent, canActivate: [hasEdgeRole(Role.ADMIN)], data: { navbarTitleToBeTranslated: "Edge.Config.Index.addComponents" } }, + { path: "settings/component.install/:factoryId", component: EdgeSettingsComponentInstallComponentComponent, canActivate: [hasEdgeRole(Role.ADMIN)], data: { navbarTitleToBeTranslated: "Edge.Config.Index.addComponents" } }, + { path: "settings/component.update", component: EdgeSettingsComponentUpdateIndexComponentComponent, canActivate: [hasEdgeRole(Role.ADMIN)], data: { navbarTitleToBeTranslated: "Edge.Config.Index.adjustComponents" } }, + { path: "settings/component.update/:componentId", component: EdgeSettingsComponentUpdateComponentComponent, canActivate: [hasEdgeRole(Role.ADMIN)], data: { navbarTitleToBeTranslated: "Edge.Config.Index.adjustComponents" } }, + { path: "settings/network", component: EdgeSettingsNetworkComponent, canActivate: [hasEdgeRole(Role.INSTALLER)], data: { navbarTitleToBeTranslated: "Edge.Config.Index.networkConfiguration" } }, + { path: "settings/profile", component: EdgeSettingsProfileComponent, data: { navbarTitleToBeTranslated: "Edge.Config.Index.systemProfile" } }, + { path: "settings/profile/:componentId", component: AliasUpdateComponent, data: { navbarTitleToBeTranslated: "Edge.Config.Index.renameComponents" } }, + { path: "settings/systemexecute", component: EdgeSettingsSystemExecuteComponent, canActivate: [hasEdgeRole(Role.ADMIN)], data: { navbarTitleToBeTranslated: "Edge.Config.Index.systemExecute" } }, + { path: "settings/systemlog", component: EdgeSettingsSystemLogComponent, canActivate: [hasEdgeRole(Role.OWNER)], data: { navbarTitleToBeTranslated: "Edge.Config.Index.liveLog" } }, + { path: "settings/system", component: EdgeSettingsSystemComponent, canActivate: [hasEdgeRole(Role.OWNER)], data: { navbarTitleToBeTranslated: "Edge.Config.Index.SYSTEM" } }, + { path: "settings/app", canActivate: [hasEdgeRole(Role.OWNER)], data: { navbarTitle: environment.edgeShortName + " Apps" }, component: EdgeSettingsAppIndex }, + { path: "settings/app/install/:appId", component: EdgeSettingsAppInstall, canActivate: [hasEdgeRole(Role.OWNER)] }, + { path: "settings/app/update/:appId", component: EdgeSettingsAppUpdate, canActivate: [hasEdgeRole(Role.OWNER)] }, + { path: "settings/app/single/:appId", component: EdgeSettingsAppSingle, canActivate: [hasEdgeRole(Role.OWNER)] }, + { path: "settings/alerting", component: EdgeSettingsAlerting, canActivate: [hasEdgeRole(Role.OWNER)], data: { navbarTitleToBeTranslated: "Edge.Config.Index.alerting" } }, + { path: "settings/jsonrpctest", component: JsonrpcTestComponent, data: { navbarTitle: "Jsonrpc Test" } }, + { path: "settings/powerAssistant", component: PowerAssistantComponent, canActivate: [hasEdgeRole(Role.ADMIN)], data: { navbarTitle: "Power-Assistant" } }, ], }, - { path: 'demo', component: LoginComponent }, + { path: "demo", component: LoginComponent }, // Fallback - { path: '**', pathMatch: 'full', redirectTo: 'index' }, + { path: "**", pathMatch: "full", redirectTo: "index" }, ]; export const appRoutingProviders: any[] = []; @NgModule({ imports: [ - RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }), + RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules, paramsInheritanceStrategy: "always" }), ], exports: [RouterModule], }) diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts index 033478c4795..bcab88af3be 100644 --- a/ui/src/app/app.component.ts +++ b/ui/src/app/app.component.ts @@ -1,26 +1,25 @@ // @ts-strict-ignore -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { Meta, Title } from '@angular/platform-browser'; -import { NavigationEnd, Router } from '@angular/router'; -import { MenuController, ModalController, Platform, ToastController } from '@ionic/angular'; -import { Subject, Subscription } from 'rxjs'; -import { filter, takeUntil } from 'rxjs/operators'; - -import { environment } from '../environments'; -import { GlobalRouteChangeHandler } from './shared/service/globalRouteChangeHandler'; -import { Service, UserPermission, Websocket } from './shared/shared'; -import { Language } from './shared/type/language'; -import { SplashScreen } from '@capacitor/splash-screen'; -import { AppService } from './app.service'; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { Meta, Title } from "@angular/platform-browser"; +import { NavigationEnd, Router } from "@angular/router"; +import { SplashScreen } from "@capacitor/splash-screen"; +import { MenuController, ModalController, Platform, ToastController } from "@ionic/angular"; +import { Subject, Subscription } from "rxjs"; +import { filter, takeUntil } from "rxjs/operators"; +import { environment } from "../environments"; +import { AppService } from "./app.service"; +import { GlobalRouteChangeHandler } from "./shared/service/globalRouteChangeHandler"; +import { Service, UserPermission, Websocket } from "./shared/shared"; +import { Language } from "./shared/type/language"; @Component({ - selector: 'app-root', - templateUrl: 'app.component.html', + selector: "app-root", + templateUrl: "app.component.html", }) export class AppComponent implements OnInit, OnDestroy { public environment = environment; - public backUrl: string | boolean = '/'; + public backUrl: string | boolean = "/"; public enableSideMenu: boolean; public isSystemLogEnabled: boolean = false; @@ -55,8 +54,8 @@ export class AppComponent implements OnInit, OnDestroy { this.subscription.add( this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe((e: NavigationEnd) => { // Hide footer for history detail views - const segments = e.url.split('/'); - this.isHistoryDetailView = segments.slice(0, -1).includes('history'); + const segments = e.url.split("/"); + this.isHistoryDetailView = segments.slice(0, -1).includes("history"); })); this.appService.listen(); @@ -79,12 +78,12 @@ export class AppComponent implements OnInit, OnDestroy { this.service.notificationEvent.pipe(takeUntil(this.ngUnsubscribe)).subscribe(async notification => { const toast = await this.toastController.create({ message: notification.message, - position: 'top', + position: "top", duration: 2000, buttons: [ { - text: 'Ok', - role: 'cancel', + text: "Ok", + role: "cancel", }, ], }); @@ -93,9 +92,9 @@ export class AppComponent implements OnInit, OnDestroy { this.platform.ready().then(() => { // OEM colors exist only after ionic is initialized, so the notch color has to be set here - const notchColor = getComputedStyle(document.documentElement).getPropertyValue('--ion-color-background'); + const notchColor = getComputedStyle(document.documentElement).getPropertyValue("--ion-color-background"); this.meta.updateTag( - { name: 'theme-color', content: notchColor }, + { name: "theme-color", content: notchColor }, ); this.service.deviceHeight = this.platform.height(); this.service.deviceWidth = this.platform.width(); diff --git a/ui/src/app/app.module.ts b/ui/src/app/app.module.ts index 79a367d56af..8a191a18baa 100644 --- a/ui/src/app/app.module.ts +++ b/ui/src/app/app.module.ts @@ -1,35 +1,34 @@ -import { registerLocaleData } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import localDE from '@angular/common/locales/de'; -import { ErrorHandler, LOCALE_ID, NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { RouteReuseStrategy } from '@angular/router'; -import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; -import { FORMLY_CONFIG } from '@ngx-formly/core'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; -import { AngularMyDatePickerModule } from '@nodro7/angular-mydatepicker'; -import { CookieService } from 'ngx-cookie-service'; - -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { AppService } from './app.service'; -import { CheckForUpdateService } from './appupdateservice'; -import { ChangelogModule } from './changelog/changelog.module'; -import { EdgeModule } from './edge/edge.module'; -import { SettingsModule as EdgeSettingsModule } from './edge/settings/settings.module'; -import { SystemLogComponent } from './edge/settings/systemlog/systemlog.component'; -import { IndexModule } from './index/index.module'; -import { RegistrationModule } from './registration/registration.module'; -import { StatusSingleComponent } from './shared/components/status/single/status.component'; -import { ChartOptionsPopoverComponent } from './shared/legacy/chartoptions/popover/popover.component'; -import { MyErrorHandler } from './shared/service/myerrorhandler'; -import { Pagination } from './shared/service/pagination'; -import { SharedModule } from './shared/shared.module'; -import { registerTranslateExtension } from './shared/translate.extension'; -import { Language, MyTranslateLoader } from './shared/type/language'; -import { UserModule } from './user/user.module'; -import { DeviceDetectorService } from 'ngx-device-detector'; +import { registerLocaleData } from "@angular/common"; +import { HttpClientModule } from "@angular/common/http"; +import localDE from "@angular/common/locales/de"; +import { ErrorHandler, LOCALE_ID, NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { RouteReuseStrategy } from "@angular/router"; +import { IonicModule, IonicRouteStrategy } from "@ionic/angular"; +import { FORMLY_CONFIG } from "@ngx-formly/core"; +import { TranslateLoader, TranslateModule, TranslateService } from "@ngx-translate/core"; +import { AngularMyDatePickerModule } from "@nodro7/angular-mydatepicker"; +import { CookieService } from "ngx-cookie-service"; +import { DeviceDetectorService } from "ngx-device-detector"; +import { AppRoutingModule } from "./app-routing.module"; +import { AppComponent } from "./app.component"; +import { AppService } from "./app.service"; +import { CheckForUpdateService } from "./appupdateservice"; +import { ChangelogModule } from "./changelog/changelog.module"; +import { EdgeModule } from "./edge/edge.module"; +import { SettingsModule as EdgeSettingsModule } from "./edge/settings/settings.module"; +import { SystemLogComponent } from "./edge/settings/systemlog/systemlog.component"; +import { IndexModule } from "./index/index.module"; +import { RegistrationModule } from "./registration/registration.module"; +import { StatusSingleComponent } from "./shared/components/status/single/status.component"; +import { ChartOptionsPopoverComponent } from "./shared/legacy/chartoptions/popover/popover.component"; +import { MyErrorHandler } from "./shared/service/myerrorhandler"; +import { Pagination } from "./shared/service/pagination"; +import { SharedModule } from "./shared/shared.module"; +import { registerTranslateExtension } from "./shared/translate.extension"; +import { Language, MyTranslateLoader } from "./shared/type/language"; +import { UserModule } from "./user/user.module"; @NgModule({ declarations: [ diff --git a/ui/src/app/app.service.ts b/ui/src/app/app.service.ts index 5bff76b82b5..e544f51838a 100644 --- a/ui/src/app/app.service.ts +++ b/ui/src/app/app.service.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Injectable } from '@angular/core'; -import { App } from '@capacitor/app'; -import { Capacitor } from '@capacitor/core'; -import { Directory, Encoding, Filesystem } from '@capacitor/filesystem'; -import { FileOpener } from '@ionic-native/file-opener'; -import { AlertController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { saveAs } from 'file-saver-es'; -import { DeviceDetectorService, DeviceInfo } from 'ngx-device-detector'; -import { BehaviorSubject, Subject } from 'rxjs'; -import { environment } from 'src/environments'; -import { JsonrpcRequest } from './shared/jsonrpc/base'; +import { Injectable } from "@angular/core"; +import { App } from "@capacitor/app"; +import { Capacitor } from "@capacitor/core"; +import { Directory, Encoding, Filesystem } from "@capacitor/filesystem"; +import { FileOpener } from "@ionic-native/file-opener"; +import { AlertController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { saveAs } from "file-saver-es"; +import { DeviceDetectorService, DeviceInfo } from "ngx-device-detector"; +import { BehaviorSubject, Subject } from "rxjs"; +import { environment } from "src/environments"; +import { JsonrpcRequest } from "./shared/jsonrpc/base"; @Injectable() export class AppService { @@ -42,9 +42,9 @@ export class AppService { public static getAppStoreLink(): string | null { if (this.isMobile) { switch (AppService.deviceInfo.os) { - case 'iOS': + case "iOS": return environment.links.APP.IOS; - case 'Android': + case "Android": return environment.links.APP.ANDROID; default: return null; @@ -71,25 +71,25 @@ export class AppService { }); FileOpener.open(result.uri, data.type) - .then(() => console.log('File is opened')) - .catch(e => console.log('Error opening file', e)); + .then(() => console.log("File is opened")) + .catch(e => console.log("Error opening file", e)); - console.log('Wrote file', result.uri); + console.log("Wrote file", result.uri); } catch (e) { - console.error('Unable to write file', e); + console.error("Unable to write file", e); } }; } public listen() { // Don't use in web - if (AppService.platform === 'web') { + if (AppService.platform === "web") { return; } this.updateState(); - App.addListener('appStateChange', () => { + App.addListener("appStateChange", () => { this.updateState(); }); } @@ -128,7 +128,7 @@ export class AppService { encoding: Encoding.UTF8, }); - console.log('secrets:', contents); + console.log("secrets:", contents); }; await writeSecretFile(); @@ -146,16 +146,16 @@ export class AppService { header: header, message: message, buttons: [{ - text: this.translate.instant('INSTALLATION.BACK'), - role: 'cancel', + text: this.translate.instant("INSTALLATION.BACK"), + role: "cancel", }, { - text: this.translate.instant('INSTALLATION.FORWARD'), + text: this.translate.instant("INSTALLATION.FORWARD"), handler: () => { successCallback(); }, }], - cssClass: 'alertController', + cssClass: "alertController", }); (await alert).present(); } diff --git a/ui/src/app/appupdateservice.ts b/ui/src/app/appupdateservice.ts index 7029043c8fa..c7c02533b42 100644 --- a/ui/src/app/appupdateservice.ts +++ b/ui/src/app/appupdateservice.ts @@ -4,23 +4,13 @@ import { SwUpdate } from "@angular/service-worker"; import { Service } from "./shared/shared"; @Injectable({ - providedIn: 'root', + providedIn: "root", }) export class CheckForUpdateService { constructor(private update: SwUpdate, private service: Service, ) { } - - init() { - setInterval(async () => { - const updateFound = await this.update.checkForUpdate(); - console.log(updateFound ? 'A new version is available.' : 'Already on the latest version.'); - if (updateFound) { - window.location.reload(); - } - }, 10000); - } } // Will be used in Future @Injectable() @@ -29,16 +19,18 @@ export class LogUpdateService { constructor(updates: SwUpdate) { updates.versionUpdates.subscribe(evt => { switch (evt.type) { - case 'VERSION_DETECTED': + case "VERSION_DETECTED": console.log(`Downloading new app version: ${evt.version.hash}`); break; - case 'VERSION_READY': + case "VERSION_READY": console.log(`Current app version: ${evt.currentVersion.hash}`); console.log(`New app version ready for use: ${evt.latestVersion.hash}`); break; - case 'VERSION_INSTALLATION_FAILED': + case "VERSION_INSTALLATION_FAILED": console.log(`Failed to install app version '${evt.version.hash}': ${evt.error}`); break; + default: + break; } }); } diff --git a/ui/src/app/changelog/changelog.module.ts b/ui/src/app/changelog/changelog.module.ts index f59ea5869f9..b6a7a5810ae 100644 --- a/ui/src/app/changelog/changelog.module.ts +++ b/ui/src/app/changelog/changelog.module.ts @@ -1,7 +1,7 @@ -import { NgModule } from '@angular/core'; -import { SharedModule } from './../shared/shared.module'; -import { ChangelogComponent } from './view/component/changelog.component'; -import { ChangelogViewComponent } from './view/view'; +import { NgModule } from "@angular/core"; +import { SharedModule } from "./../shared/shared.module"; +import { ChangelogComponent } from "./view/component/changelog.component"; +import { ChangelogViewComponent } from "./view/view"; @NgModule({ imports: [ diff --git a/ui/src/app/changelog/view/component/changelog.component.ts b/ui/src/app/changelog/view/component/changelog.component.ts index cb3e44f3df8..9bba2dcddae 100644 --- a/ui/src/app/changelog/view/component/changelog.component.ts +++ b/ui/src/app/changelog/view/component/changelog.component.ts @@ -1,14 +1,14 @@ -import { Component } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { environment } from 'src/environments'; -import { Service } from '../../../shared/shared'; -import { Role } from '../../../shared/type/role'; -import { Changelog } from './changelog.constants'; +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { environment } from "src/environments"; +import { Service } from "../../../shared/shared"; +import { Role } from "../../../shared/type/role"; +import { Changelog } from "./changelog.constants"; @Component({ - selector: 'changelog', - templateUrl: './changelog.component.html', + selector: "changelog", + templateUrl: "./changelog.component.html", }) export class ChangelogComponent { @@ -21,9 +21,9 @@ export class ChangelogComponent { changes: Array }[] = [ { - version: 'x.y.z', + version: "x.y.z", changes: [ - Changelog.link("OpenEMS Releases", 'https://github.com/OpenEMS/openems/releases'), + Changelog.link("OpenEMS Releases", "https://github.com/OpenEMS/openems/releases"), ], }, ]; diff --git a/ui/src/app/changelog/view/component/changelog.constants.ts b/ui/src/app/changelog/view/component/changelog.constants.ts index e2c21860448..99de881dd8b 100644 --- a/ui/src/app/changelog/view/component/changelog.constants.ts +++ b/ui/src/app/changelog/view/component/changelog.constants.ts @@ -2,10 +2,10 @@ import { Role } from "src/app/shared/type/role"; export class Changelog { - public static readonly UI_VERSION = "2024.8.0"; + public static readonly UI_VERSION = "2024.9.0"; public static product(...products: Product[]) { - return products.map(product => Changelog.link(product.name, product.url)).join(", ") + '. '; + return products.map(product => Changelog.link(product.name, product.url)).join(", ") + ". "; } public static app(app: App, ...names: string[]) { @@ -15,7 +15,7 @@ export class Changelog { } public static openems(version: string) { - return 'Update auf OpenEMS Version ' + version + '. Mehr Details auf ' + Changelog.link('Github', 'https://github.com/OpenEMS/openems/releases/tag/' + version); + return "Update auf OpenEMS Version " + version + ". Mehr Details auf " + Changelog.link("Github", "https://github.com/OpenEMS/openems/releases/tag/" + version); } public static openemsComponent(openemsComponent: OpenemsComponent, change: string) { @@ -23,18 +23,18 @@ export class Changelog { } public static library(...libraries: Library[]) { - return 'Aktualisierung externer Programmbibliotheken: ' + libraries.map(library => library.name).join(", "); + return "Aktualisierung externer Programmbibliotheken: " + libraries.map(library => library.name).join(", "); } public static link(title: string, url: string) { - return '' + title + ''; + return "" + title + ""; } } export class Product { - public static readonly OPENEMS_EDGE = new Product('OpenEMS Edge', 'https://github.com/OpenEMS/openems'); - public static readonly OPENEMS_UI = new Product('OpenEMS Edge', 'https://github.com/OpenEMS/openems'); - public static readonly OPENEMS_BACKEND = new Product('OpenEMS Edge', 'https://github.com/OpenEMS/openems'); + public static readonly OPENEMS_EDGE = new Product("OpenEMS Edge", "https://github.com/OpenEMS/openems"); + public static readonly OPENEMS_UI = new Product("OpenEMS Edge", "https://github.com/OpenEMS/openems"); + public static readonly OPENEMS_BACKEND = new Product("OpenEMS Edge", "https://github.com/OpenEMS/openems"); // private to disallow creating other instances of this type private constructor(public readonly name: string, public readonly url: string) { @@ -48,8 +48,8 @@ export class App { } export class OpenemsComponent { - public static readonly PQ_PLUS_ZAEHLER = new OpenemsComponent('PQ-Plus Zähler', 'https://github.com/OpenEMS/openems/tree/develop/io.openems.edge.meter.pqplus'); - public static readonly SDM630_ZAEHLER = new OpenemsComponent('SDM 630 Zähler', 'https://github.com/OpenEMS/openems/tree/develop/io.openems.edge.meter.microcare.sdm630'); + public static readonly PQ_PLUS_ZAEHLER = new OpenemsComponent("PQ-Plus Zähler", "https://github.com/OpenEMS/openems/tree/develop/io.openems.edge.meter.pqplus"); + public static readonly SDM630_ZAEHLER = new OpenemsComponent("SDM 630 Zähler", "https://github.com/OpenEMS/openems/tree/develop/io.openems.edge.meter.microcare.sdm630"); // private to disallow creating other instances of this type private constructor(public readonly name: string, public readonly url: string) { @@ -58,49 +58,49 @@ export class OpenemsComponent { export class Library { // Java - public static readonly APACHE_FELIX_FILEINSTALL = new Library('Apache Felix File Install', 'org.apache.felix..fileinstall'); - public static readonly APACHE_FELIX_FRAMEWORK = new Library('Apache Felix Framework', 'org.apache.felix.framework'); - public static readonly APACHE_FELIX_HTTP_JETTY = new Library('Apache Felix HTTP Jetty', 'org.apache.felix.http.jetty'); - public static readonly APACHE_FELIX_INVENTORY = new Library('Apache Felix Inventory', 'org.apache.felix.inventory'); - public static readonly APACHE_FELIX_METATYPE = new Library('Apache Felix MetaType', 'org.apache.felix.metatype'); - public static readonly APACHE_FELIX_SCR = new Library('Apache Felix SCR', 'org.apache.felix.scr'); - public static readonly APACHE_FELIX_WEBCONSOLE = new Library('Apache Felix Webconsole', 'org.apache.felix.webconsole'); - public static readonly APACHE_FELIX_CONFIGADMIN = new Library('Apache Felix Configuration Admin', 'org.apache.felix.configadmin'); - public static readonly CHARGETIME_OCPP = new Library('Open Charge Alliance Java OCPP', 'eu.chargetime.ocpp'); // https://github.com/ChargeTimeEU/Java-OCA-OCPP - public static readonly ECLIPSE_OSGI = new Library('Eclipse OSGi', 'org.eclipse.osgi'); - public static readonly FASTEXCEL = new Library('fastexcel', 'fastexcel'); - public static readonly GRADLE = new Library('Gradle', 'gradle'); - public static readonly GUAVA = new Library('Guava', 'com.google.guava'); - public static readonly GSON = new Library('GSON', 'com.google.gson'); - public static readonly HIKARI_CP = new Library('HikariCP', 'hikaricp'); - public static readonly INFLUXDB = new Library('influxdb-java', 'influxdb-java'); - public static readonly JNA = new Library('JNA', 'net.java.dev.jna'); - public static readonly JAVA_WEBSOCKET = new Library('Java-WebSocket', 'org.java-websocket'); - public static readonly RETROFIT = new Library('Retrofit', 'com.squareup.retrofit'); - public static readonly MOSHI = new Library('Moshi', 'com.squareup.moshi'); - public static readonly MSGPACK = new Library('MsgPack', 'org.msgpack'); - public static readonly PAX_LOGGING = new Library('PAX Logging', 'org.ops4j.pax.logging'); - public static readonly OSGI_UTIL_FUNCTION = new Library('org.osgi.util.function', 'org.osgi.util.function'); - public static readonly OSGI_UTIL_PROMISE = new Library('org.osgi.util.promise', 'org.osgi.util.promise'); - public static readonly OSGI_SERVICE_JDBC = new Library('org.osgi.service.jdbc', 'org.osgi.service.jdbc'); - public static readonly POSTGRESQL = new Library('Postgresql', 'org.postgresql'); - public static readonly SLF4J = new Library('SLF4j', 'org.slf4j'); - public static readonly RRD4J = new Library('RRD4j', 'org.rrd4j'); - public static readonly OKHTTP = new Library('OkHttp', 'com.squareup.okhttp3'); - public static readonly OKIO = new Library('Okio', 'com.squareup.okio'); + public static readonly APACHE_FELIX_FILEINSTALL = new Library("Apache Felix File Install", "org.apache.felix..fileinstall"); + public static readonly APACHE_FELIX_FRAMEWORK = new Library("Apache Felix Framework", "org.apache.felix.framework"); + public static readonly APACHE_FELIX_HTTP_JETTY = new Library("Apache Felix HTTP Jetty", "org.apache.felix.http.jetty"); + public static readonly APACHE_FELIX_INVENTORY = new Library("Apache Felix Inventory", "org.apache.felix.inventory"); + public static readonly APACHE_FELIX_METATYPE = new Library("Apache Felix MetaType", "org.apache.felix.metatype"); + public static readonly APACHE_FELIX_SCR = new Library("Apache Felix SCR", "org.apache.felix.scr"); + public static readonly APACHE_FELIX_WEBCONSOLE = new Library("Apache Felix Webconsole", "org.apache.felix.webconsole"); + public static readonly APACHE_FELIX_CONFIGADMIN = new Library("Apache Felix Configuration Admin", "org.apache.felix.configadmin"); + public static readonly CHARGETIME_OCPP = new Library("Open Charge Alliance Java OCPP", "eu.chargetime.ocpp"); // https://github.com/ChargeTimeEU/Java-OCA-OCPP + public static readonly ECLIPSE_OSGI = new Library("Eclipse OSGi", "org.eclipse.osgi"); + public static readonly FASTEXCEL = new Library("fastexcel", "fastexcel"); + public static readonly GRADLE = new Library("Gradle", "gradle"); + public static readonly GUAVA = new Library("Guava", "com.google.guava"); + public static readonly GSON = new Library("GSON", "com.google.gson"); + public static readonly HIKARI_CP = new Library("HikariCP", "hikaricp"); + public static readonly INFLUXDB = new Library("influxdb-java", "influxdb-java"); + public static readonly JNA = new Library("JNA", "net.java.dev.jna"); + public static readonly JAVA_WEBSOCKET = new Library("Java-WebSocket", "org.java-websocket"); + public static readonly RETROFIT = new Library("Retrofit", "com.squareup.retrofit"); + public static readonly MOSHI = new Library("Moshi", "com.squareup.moshi"); + public static readonly MSGPACK = new Library("MsgPack", "org.msgpack"); + public static readonly PAX_LOGGING = new Library("PAX Logging", "org.ops4j.pax.logging"); + public static readonly OSGI_UTIL_FUNCTION = new Library("org.osgi.util.function", "org.osgi.util.function"); + public static readonly OSGI_UTIL_PROMISE = new Library("org.osgi.util.promise", "org.osgi.util.promise"); + public static readonly OSGI_SERVICE_JDBC = new Library("org.osgi.service.jdbc", "org.osgi.service.jdbc"); + public static readonly POSTGRESQL = new Library("Postgresql", "org.postgresql"); + public static readonly SLF4J = new Library("SLF4j", "org.slf4j"); + public static readonly RRD4J = new Library("RRD4j", "org.rrd4j"); + public static readonly OKHTTP = new Library("OkHttp", "com.squareup.okhttp3"); + public static readonly OKIO = new Library("Okio", "com.squareup.okio"); // UI - public static readonly ANGULAR = new Library('Angular', 'angular'); - public static readonly D3 = new Library('d3', 'd3'); - public static readonly DATE_FNS = new Library('date-fns', 'date-fns'); // https://date-fns.org/ - public static readonly IONIC = new Library('Ionic', 'ionic'); - public static readonly MYDATEPICKER = new Library('MyDatePicker', 'mydatepicker'); - public static readonly NG2_CHARTS = new Library('ng2-charts', 'ng2-charts'); - public static readonly NGX_COOKIE_SERVICE = new Library('ngx-cookie-service', 'ngx-cookie-service'); - public static readonly NGX_FORMLY = new Library('ngx-formly', 'ngx-formly'); - public static readonly NGX_SPINNER = new Library('ngx-spinner', 'ngx-spinner'); - public static readonly RXJS = new Library('RxJs', 'rxjs'); - public static readonly UUID = new Library('UUID', 'uuid'); + public static readonly ANGULAR = new Library("Angular", "angular"); + public static readonly D3 = new Library("d3", "d3"); + public static readonly DATE_FNS = new Library("date-fns", "date-fns"); // https://date-fns.org/ + public static readonly IONIC = new Library("Ionic", "ionic"); + public static readonly MYDATEPICKER = new Library("MyDatePicker", "mydatepicker"); + public static readonly NG2_CHARTS = new Library("ng2-charts", "ng2-charts"); + public static readonly NGX_COOKIE_SERVICE = new Library("ngx-cookie-service", "ngx-cookie-service"); + public static readonly NGX_FORMLY = new Library("ngx-formly", "ngx-formly"); + public static readonly NGX_SPINNER = new Library("ngx-spinner", "ngx-spinner"); + public static readonly RXJS = new Library("RxJs", "rxjs"); + public static readonly UUID = new Library("UUID", "uuid"); // private to disallow creating other instances of this type private constructor(public readonly name: string, public readonly url: string) { diff --git a/ui/src/app/changelog/view/view.html b/ui/src/app/changelog/view/view.html index ee8a40dc029..2746d025db1 100644 --- a/ui/src/app/changelog/view/view.html +++ b/ui/src/app/changelog/view/view.html @@ -1,4 +1,4 @@

- \ No newline at end of file + diff --git a/ui/src/app/changelog/view/view.ts b/ui/src/app/changelog/view/view.ts index d196a7a4856..7a08765ad46 100644 --- a/ui/src/app/changelog/view/view.ts +++ b/ui/src/app/changelog/view/view.ts @@ -1,7 +1,7 @@ import { Component } from "@angular/core"; @Component({ - selector: 'changelogViewComponent', - templateUrl: './view.html', + selector: "changelogViewComponent", + templateUrl: "./view.html", }) export class ChangelogViewComponent { } diff --git a/ui/src/app/edge/edge.component.ts b/ui/src/app/edge/edge.component.ts index 8f6f8c7e965..fdeeebc3a3c 100644 --- a/ui/src/app/edge/edge.component.ts +++ b/ui/src/app/edge/edge.component.ts @@ -4,7 +4,6 @@ import { ActivatedRoute, Router } from "@angular/router"; import { SubscribeEdgesRequest } from "src/app/shared/jsonrpc/request/subscribeEdgesRequest"; import { ChannelAddress, Edge, Service, Websocket } from "src/app/shared/shared"; - /*** This component is needed as a routing parent and acts as a transit station without being displayed.*/ @Component({ selector: "edge", @@ -31,7 +30,7 @@ export class EdgeComponent implements OnInit, OnDestroy { public ngOnInit(): void { this.activatedRoute.params.subscribe((params) => { // Set CurrentEdge in Metadata - const edgeId = params['edgeId']; + const edgeId = params["edgeId"]; this.service.updateCurrentEdge(edgeId).then((edge) => { this.edge = edge; @@ -40,12 +39,12 @@ export class EdgeComponent implements OnInit, OnDestroy { .then(() => { // Subscribe on these channels for the state in HeaderComponent - edge.subscribeChannels(this.websocket, '', [ - new ChannelAddress('_sum', 'State'), + edge.subscribeChannels(this.websocket, "", [ + new ChannelAddress("_sum", "State"), ]); }); }).catch(() => { - this.router.navigate(['index']); + this.router.navigate(["index"]); }); }); } diff --git a/ui/src/app/edge/edge.module.ts b/ui/src/app/edge/edge.module.ts index 14c27cb4243..38a9176e4a1 100644 --- a/ui/src/app/edge/edge.module.ts +++ b/ui/src/app/edge/edge.module.ts @@ -1,8 +1,8 @@ -import { HistoryModule } from './history/history.module'; -import { LiveModule } from './live/live.module'; -import { NgModule } from '@angular/core'; -import { SharedModule } from './../shared/shared.module'; -import { EdgeComponent } from './edge.component'; +import { NgModule } from "@angular/core"; +import { SharedModule } from "./../shared/shared.module"; +import { EdgeComponent } from "./edge.component"; +import { HistoryModule } from "./history/history.module"; +import { LiveModule } from "./live/live.module"; @NgModule({ declarations: [ diff --git a/ui/src/app/edge/history/Controller/ChannelThreshold/chart/totalchart.component.ts b/ui/src/app/edge/history/Controller/ChannelThreshold/chart/totalchart.component.ts index 56270897edd..29658f87838 100644 --- a/ui/src/app/edge/history/Controller/ChannelThreshold/chart/totalchart.component.ts +++ b/ui/src/app/edge/history/Controller/ChannelThreshold/chart/totalchart.component.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, Utils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; @Component({ - selector: 'totalChart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', + selector: "totalChart", + templateUrl: "../../../../../shared/components/chart/abstracthistorychart.html", }) export class TotalChartComponent extends AbstractHistoryChart { @@ -20,9 +20,9 @@ export class TotalChartComponent extends AbstractHistoryChart { const input: HistoryUtils.InputChannel[] = []; for (const controllerId of controller) { - const powerChannel = ChannelAddress.fromString(config.getComponentProperties(controllerId)['outputChannelAddress']); + const powerChannel = ChannelAddress.fromString(config.getComponentProperties(controllerId)["outputChannelAddress"]); components[controllerId] = powerChannel.channelId; - input.push({ name: controllerId, powerChannel: powerChannel, energyChannel: new ChannelAddress(controllerId, 'CumulatedActiveTime') }); + input.push({ name: controllerId, powerChannel: powerChannel, energyChannel: new ChannelAddress(controllerId, "CumulatedActiveTime") }); } return { @@ -31,14 +31,14 @@ export class TotalChartComponent extends AbstractHistoryChart { const output: HistoryUtils.DisplayValue[] = []; - const colors: string[] = ['rgb(0,0,139)', 'rgb(0,191,255)', 'rgb(0,0,56)', 'rgb(77,77,174)']; + const colors: string[] = ["rgb(0,0,139)", "rgb(0,191,255)", "rgb(0,0,56)", "rgb(77,77,174)"]; for (let i = 0; i < controller.length; i++) { const controllerId = controller[i]; output.push({ name: components[controllerId] ?? controllerId, nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyQueryResponse?.result.data[controllerId + '/CumulatedActiveTime'] ?? null; + return energyQueryResponse?.result.data[controllerId + "/CumulatedActiveTime"] ?? null; }, converter: () => { @@ -54,11 +54,11 @@ export class TotalChartComponent extends AbstractHistoryChart { return output; }, tooltip: { - formatNumber: '1.0-0', + formatNumber: "1.0-0", }, yAxes: [{ - unit: YAxisTitle.RELAY, - position: 'left', + unit: YAxisType.RELAY, + position: "left", yAxisId: ChartAxis.LEFT, }], }; diff --git a/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.html b/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.html index 79d645191eb..17aa513987c 100644 --- a/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.html +++ b/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.html @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.ts b/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.ts index e9c42616532..54403badbeb 100644 --- a/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.ts +++ b/ui/src/app/edge/history/Controller/ChannelThreshold/flat/flat.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; +import { Component } from "@angular/core"; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { Converter } from 'src/app/shared/components/shared/converter'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { Converter } from "src/app/shared/components/shared/converter"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; @Component({ - selector: 'channelthresholdWidget', - templateUrl: './flat.html', + selector: "channelthresholdWidget", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -20,14 +20,14 @@ export class FlatComponent extends AbstractFlatWidget { protected override getChannelAddresses(): ChannelAddress[] { - this.controllers = this.config.getComponentsByFactory('Controller.ChannelThreshold').concat(this.config.getComponentsImplementingNature('io.openems.impl.controller.channelthreshold.ChannelThresholdController')); + this.controllers = this.config.getComponentsByFactory("Controller.ChannelThreshold").concat(this.config.getComponentsImplementingNature("io.openems.impl.controller.channelthreshold.ChannelThresholdController")); const channelAddresses: ChannelAddress[] = []; for (const controller of this.controllers) { - const output: ChannelAddress | null = ChannelAddress.fromString(controller.properties['outputChannelAddress']); + const output: ChannelAddress | null = ChannelAddress.fromString(controller.properties["outputChannelAddress"]); this.displayName.set(controller.id, this.getDisplayName(controller, output)); - channelAddresses.push(new ChannelAddress(controller.id, 'CumulatedActiveTime')); + channelAddresses.push(new ChannelAddress(controller.id, "CumulatedActiveTime")); } return channelAddresses; } diff --git a/ui/src/app/edge/history/Controller/ChannelThreshold/overview/overview.html b/ui/src/app/edge/history/Controller/ChannelThreshold/overview/overview.html index e761c780138..5c47abc06bf 100644 --- a/ui/src/app/edge/history/Controller/ChannelThreshold/overview/overview.html +++ b/ui/src/app/edge/history/Controller/ChannelThreshold/overview/overview.html @@ -1,4 +1,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/Controller/ChannelThreshold/overview/overview.ts b/ui/src/app/edge/history/Controller/ChannelThreshold/overview/overview.ts index 8ff3f52f7cd..5d6f53c8e92 100644 --- a/ui/src/app/edge/history/Controller/ChannelThreshold/overview/overview.ts +++ b/ui/src/app/edge/history/Controller/ChannelThreshold/overview/overview.ts @@ -2,7 +2,7 @@ import { Component } from "@angular/core"; import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; @Component({ - selector: 'overview', - templateUrl: './overview.html', + selector: "overview", + templateUrl: "./overview.html", }) export class OverviewComponent extends AbstractHistoryChartOverview { } diff --git a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/chart/chart.ts b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/chart/chart.ts index f016859e52f..88a6d60c838 100644 --- a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/chart/chart.ts +++ b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/chart/chart.ts @@ -1,86 +1,86 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { ChartAxis, HistoryUtils, Utils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { ChartAxis, HistoryUtils, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; @Component({ - selector: 'gridOptimizedChargeChart', - templateUrl: '../../../../../../shared/components/chart/abstracthistorychart.html', + selector: "gridOptimizedChargeChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class GridOptimizedChargeChartComponent extends AbstractHistoryChart { public static getChartData(component: EdgeConfig.Component, translate: TranslateService): HistoryUtils.ChartData { return { input: [ { - name: 'DelayChargeMaximumChargeLimit', - powerChannel: new ChannelAddress(component.id, 'DelayChargeMaximumChargeLimit'), + name: "DelayChargeMaximumChargeLimit", + powerChannel: new ChannelAddress(component.id, "DelayChargeMaximumChargeLimit"), }, { - name: 'SellToGridLimitMinimumChargeLimit', - powerChannel: new ChannelAddress(component.id, 'SellToGridLimitMinimumChargeLimit'), + name: "SellToGridLimitMinimumChargeLimit", + powerChannel: new ChannelAddress(component.id, "SellToGridLimitMinimumChargeLimit"), converter: HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO, }, { - name: 'ProductionDcActualPower', - powerChannel: new ChannelAddress('_sum', 'ProductionDcActualPower'), + name: "ProductionDcActualPower", + powerChannel: new ChannelAddress("_sum", "ProductionDcActualPower"), }, { - name: 'EssActivePower', - powerChannel: new ChannelAddress('_sum', 'EssActivePower'), + name: "EssActivePower", + powerChannel: new ChannelAddress("_sum", "EssActivePower"), }, { - name: 'EssSoc', - powerChannel: new ChannelAddress('_sum', 'EssSoc'), + name: "EssSoc", + powerChannel: new ChannelAddress("_sum", "EssSoc"), }, ], output: (data: HistoryUtils.ChannelData) => ([ { - name: translate.instant('Edge.Index.Widgets.GridOptimizedCharge.maximumCharge'), - converter: () => data['DelayChargeMaximumChargeLimit'], - color: 'rgb(253,197,7)', + name: translate.instant("Edge.Index.Widgets.GridOptimizedCharge.maximumCharge"), + converter: () => data["DelayChargeMaximumChargeLimit"], + color: "rgb(253,197,7)", borderDash: [3, 3], }, { - name: translate.instant('Edge.Index.Widgets.GridOptimizedCharge.minimumCharge'), - converter: () => data['SellToGridLimitMinimumChargeLimit'], - color: 'rgb(200,0,0)', + name: translate.instant("Edge.Index.Widgets.GridOptimizedCharge.minimumCharge"), + converter: () => data["SellToGridLimitMinimumChargeLimit"], + color: "rgb(200,0,0)", borderDash: [3, 3], }, { - name: translate.instant('General.chargePower'), + name: translate.instant("General.chargePower"), converter: () => - (data['ProductionDcActualPower'] + (data["ProductionDcActualPower"] ? - data['ProductionDcActualPower'].map((value, index) => { - return Utils.subtractSafely(data['EssActivePower'][index], value); + data["ProductionDcActualPower"].map((value, index) => { + return Utils.subtractSafely(data["EssActivePower"][index], value); }) : - data['EssActivePower'])?.map(val => HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(val)) ?? null, - color: 'rgb(0,223,0)', + data["EssActivePower"])?.map(val => HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(val)) ?? null, + color: "rgb(0,223,0)", }, { - name: translate.instant('General.soc'), - converter: () => data['EssSoc'].map(el => Utils.multiplySafely(el, 1000)), - color: 'rgb(189, 195, 199)', + name: translate.instant("General.soc"), + converter: () => data["EssSoc"].map(el => Utils.multiplySafely(el, 1000)), + color: "rgb(189, 195, 199)", borderDash: [10, 10], yAxisId: ChartAxis.RIGHT, custom: { - unit: YAxisTitle.PERCENTAGE, + unit: YAxisType.PERCENTAGE, }, }, ]), tooltip: { - formatNumber: '1.0-2', + formatNumber: "1.0-2", }, yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }, { - unit: YAxisTitle.PERCENTAGE, - position: 'right', + unit: YAxisType.PERCENTAGE, + position: "right", yAxisId: ChartAxis.RIGHT, displayGrid: false, }], diff --git a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/chart/sellToGridLimitChart.component.ts b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/chart/sellToGridLimitChart.component.ts index c1ebb017450..77072343e95 100644 --- a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/chart/sellToGridLimitChart.component.ts +++ b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/chart/sellToGridLimitChart.component.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { ChartAxis, HistoryUtils, Utils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { ChartAxis, HistoryUtils, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress } from "src/app/shared/shared"; @Component({ - selector: 'sellToGridLimitChart', - templateUrl: '../../../../../../shared/components/chart/abstracthistorychart.html', + selector: "sellToGridLimitChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class SellToGridLimitChartComponent extends AbstractHistoryChart { @@ -15,56 +15,56 @@ export class SellToGridLimitChartComponent extends AbstractHistoryChart { return { input: [ { - name: 'ActivePower', - powerChannel: new ChannelAddress(gridmeterId, 'ActivePower'), + name: "ActivePower", + powerChannel: new ChannelAddress(gridmeterId, "ActivePower"), converter: HistoryUtils.ValueConverter.ONLY_NEGATIVE_AND_NEGATIVE_AS_POSITIVE, }, { - name: '_PropertyMaximumSellToGridPower', - powerChannel: new ChannelAddress(componentId, '_PropertyMaximumSellToGridPower'), + name: "_PropertyMaximumSellToGridPower", + powerChannel: new ChannelAddress(componentId, "_PropertyMaximumSellToGridPower"), }, { - name: 'ProductionActivePower', - powerChannel: new ChannelAddress('_sum', 'ProductionActivePower'), + name: "ProductionActivePower", + powerChannel: new ChannelAddress("_sum", "ProductionActivePower"), }, ], output: (data: HistoryUtils.ChannelData) => ([ { - name: translate.instant('General.gridSell'), - converter: () => data['ActivePower'], - color: 'rgb(0,0,200)', + name: translate.instant("General.gridSell"), + converter: () => data["ActivePower"], + color: "rgb(0,0,200)", }, { - name: translate.instant('Edge.Index.Widgets.GridOptimizedCharge.maximumGridFeedIn'), - converter: () => data['_PropertyMaximumSellToGridPower'], - color: 'rgb(0,0,0)', + name: translate.instant("Edge.Index.Widgets.GridOptimizedCharge.maximumGridFeedIn"), + converter: () => data["_PropertyMaximumSellToGridPower"], + color: "rgb(0,0,0)", borderDash: [3, 3], }, { - name: translate.instant('Edge.Index.Widgets.GridOptimizedCharge.MAXIMUM_GRIDSELL_WITH_CHARGE'), - converter: () => data['_PropertyMaximumSellToGridPower'].map(el => Utils.multiplySafely(el, 0.95)), - color: 'rgb(200,0,0)', + name: translate.instant("Edge.Index.Widgets.GridOptimizedCharge.MAXIMUM_GRIDSELL_WITH_CHARGE"), + converter: () => data["_PropertyMaximumSellToGridPower"].map(el => Utils.multiplySafely(el, 0.95)), + color: "rgb(200,0,0)", borderDash: [3, 3], }, { - name: translate.instant('General.production'), - converter: () => data['ProductionActivePower'], - color: 'rgb(45,143,171)', + name: translate.instant("General.production"), + converter: () => data["ProductionActivePower"], + color: "rgb(45,143,171)", }, ]), tooltip: { - formatNumber: '1.0-2', + formatNumber: "1.0-2", }, yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }], }; } protected getChartData(): HistoryUtils.ChartData { - const gridMeterId = this.config.getComponentProperties(this.component.id)['meter.id']; + const gridMeterId = this.config.getComponentProperties(this.component.id)["meter.id"]; return SellToGridLimitChartComponent.getChartData(gridMeterId, this.component.id, this.translate); } diff --git a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/flat/flat.ts b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/flat/flat.ts index 60c63aa9d5a..67cd22d5d32 100644 --- a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/flat/flat.ts +++ b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/flat/flat.ts @@ -1,12 +1,12 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { Converter } from 'src/app/shared/components/shared/converter'; -import { Filter } from 'src/app/shared/components/shared/filter'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { Converter } from "src/app/shared/components/shared/converter"; +import { Filter } from "src/app/shared/components/shared/filter"; @Component({ - selector: 'gridOptimizedChargeWidget', - templateUrl: './flat.html', + selector: "gridOptimizedChargeWidget", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { protected FORMAT_SECONDS_TO_DURATION = Converter.FORMAT_SECONDS_TO_DURATION(this.translate.currentLang); diff --git a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/overview/overview.html b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/overview/overview.html index 370e95f0b7e..0c7ce394dd6 100644 --- a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/overview/overview.html +++ b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/overview/overview.html @@ -1,5 +1,4 @@ - + diff --git a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/overview/overview.ts b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/overview/overview.ts index 0fdf540900f..f5e4cab17f3 100644 --- a/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/overview/overview.ts +++ b/ui/src/app/edge/history/Controller/Ess/GridoptimizedCharge/overview/overview.ts @@ -1,9 +1,9 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/abstractHistoryChartOverview'; +import { Component } from "@angular/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; @Component({ - selector: 'gridoptimizedcharge-chart-overview', - templateUrl: './overview.html', + selector: "gridoptimizedcharge-chart-overview", + templateUrl: "./overview.html", }) export class OverviewComponent extends AbstractHistoryChartOverview { } diff --git a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/chart/chart.ts b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/chart/chart.ts index 8bd48521984..6a7850fcafb 100644 --- a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/chart/chart.ts +++ b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/chart/chart.ts @@ -1,15 +1,15 @@ // @ts-strict-ignore -import { Component, Input } from '@angular/core'; -import * as Chart from 'chart.js'; -import { calculateResolution, ChronoUnit, Resolution } from 'src/app/edge/history/shared'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { ChartAxis, HistoryUtils, TimeOfUseTariffUtils, Utils, YAxisTitle } from 'src/app/shared/service/utils'; +import { Component, Input } from "@angular/core"; +import * as Chart from "chart.js"; +import { calculateResolution, ChronoUnit, Resolution } from "src/app/edge/history/shared"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { ChartAxis, HistoryUtils, TimeOfUseTariffUtils, Utils, YAxisType } from "src/app/shared/service/utils"; import { ChannelAddress, Currency, EdgeConfig } from "src/app/shared/shared"; -import { ColorUtils } from 'src/app/shared/utils/color/color.utils'; +import { ColorUtils } from "src/app/shared/utils/color/color.utils"; @Component({ - selector: 'scheduleChart', - templateUrl: '../../../../../../shared/components/chart/abstracthistorychart.html', + selector: "scheduleChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class ChartComponent extends AbstractHistoryChart { @@ -19,76 +19,76 @@ export class ChartComponent extends AbstractHistoryChart { protected override getChartData(): HistoryUtils.ChartData { // Assigning the component to be able to use the id. - const componentId: string = this.config.getComponentIdsByFactory('Controller.Ess.Time-Of-Use-Tariff')[0]; + const componentId: string = this.config.getComponentIdsByFactory("Controller.Ess.Time-Of-Use-Tariff")[0]; this.component = this.config.components[componentId]; - const currency = this.config.components['_meta'].properties.currency; + const currency = this.config.components["_meta"].properties.currency; this.currencyLabel = Currency.getCurrencyLabelByCurrency(currency); - this.chartType = 'bar'; + this.chartType = "bar"; return { input: [ { - name: 'QuarterlyPrice', - powerChannel: ChannelAddress.fromString(this.component.id + '/QuarterlyPrices'), + name: "QuarterlyPrice", + powerChannel: ChannelAddress.fromString(this.component.id + "/QuarterlyPrices"), }, { - name: 'StateMachine', - powerChannel: ChannelAddress.fromString(this.component.id + '/StateMachine'), + name: "StateMachine", + powerChannel: ChannelAddress.fromString(this.component.id + "/StateMachine"), }, { - name: 'Soc', - powerChannel: ChannelAddress.fromString('_sum/EssSoc'), + name: "Soc", + powerChannel: ChannelAddress.fromString("_sum/EssSoc"), }, { - name: 'GridBuy', - powerChannel: ChannelAddress.fromString('_sum/GridActivePower'), + name: "GridBuy", + powerChannel: ChannelAddress.fromString("_sum/GridActivePower"), converter: HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO, }, ], output: (data: HistoryUtils.ChannelData) => { return [{ - name: this.translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING'), + name: this.translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING"), converter: () => this.getDataset(data, TimeOfUseTariffUtils.State.Balancing), - color: 'rgb(51,102,0)', + color: "rgb(51,102,0)", stack: 1, order: 1, }, { - name: this.translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID'), + name: this.translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID"), converter: () => this.getDataset(data, TimeOfUseTariffUtils.State.ChargeGrid), - color: 'rgb(0, 204, 204)', + color: "rgb(0, 204, 204)", stack: 1, order: 1, }, { - name: this.translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE'), + name: this.translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE"), converter: () => this.getDataset(data, TimeOfUseTariffUtils.State.DelayDischarge), - color: 'rgb(0,0,0)', + color: "rgb(0,0,0)", stack: 1, order: 1, }, { - name: this.translate.instant('General.soc'), - converter: () => data['Soc']?.map(value => Utils.multiplySafely(value, 1000)), - color: 'rgb(189, 195, 199)', + name: this.translate.instant("General.soc"), + converter: () => data["Soc"]?.map(value => Utils.multiplySafely(value, 1000)), + color: "rgb(189, 195, 199)", borderDash: [10, 10], yAxisId: ChartAxis.RIGHT, custom: { - type: 'line', - unit: YAxisTitle.PERCENTAGE, - formatNumber: '1.0-0', + type: "line", + unit: YAxisType.PERCENTAGE, + formatNumber: "1.0-0", }, order: 0, }, { - name: this.translate.instant('General.gridBuy'), - converter: () => data['GridBuy'], - color: 'rgb(0,0,0)', + name: this.translate.instant("General.gridBuy"), + converter: () => data["GridBuy"], + color: "rgb(0,0,0)", yAxisId: ChartAxis.RIGHT_2, custom: { - type: 'line', - formatNumber: '1.0-0', + type: "line", + formatNumber: "1.0-0", }, hiddenOnInit: true, order: 2, @@ -96,22 +96,22 @@ export class ChartComponent extends AbstractHistoryChart { ]; }, tooltip: { - formatNumber: '1.1-4', + formatNumber: "1.1-4", }, yAxes: [{ - unit: YAxisTitle.CURRENCY, - position: 'left', + unit: YAxisType.CURRENCY, + position: "left", yAxisId: ChartAxis.LEFT, }, { - unit: YAxisTitle.PERCENTAGE, - position: 'right', + unit: YAxisType.PERCENTAGE, + position: "right", yAxisId: ChartAxis.RIGHT, displayGrid: false, }, { - unit: YAxisTitle.POWER, - position: 'right', + unit: YAxisType.POWER, + position: "right", yAxisId: ChartAxis.RIGHT_2, displayGrid: false, }, @@ -126,7 +126,7 @@ export class ChartComponent extends AbstractHistoryChart { const unit: Resolution = { unit: ChronoUnit.Type.MINUTES, value: 15 }; this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to, unit) .then((dataResponse) => { - this.chartType = 'line'; + this.chartType = "line"; this.chartObject = this.getChartData(); const displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, dataResponse); @@ -135,10 +135,10 @@ export class ChartComponent extends AbstractHistoryChart { this.labels = displayValues.labels; this.setChartLabel(); - this.options.scales.x['time'].unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).timeFormat; - this.options.scales.x.ticks['source'] = 'auto'; + this.options.scales.x["time"].unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).timeFormat; + this.options.scales.x.ticks["source"] = "auto"; this.options.scales.x.grid = { offset: false }; - this.options.plugins.tooltip.mode = 'index'; + this.options.plugins.tooltip.mode = "index"; this.options.scales.x.ticks.maxTicksLimit = 30; this.options.scales[ChartAxis.LEFT].min = this.getMinimumAxisValue(this.datasets); @@ -148,7 +148,7 @@ export class ChartComponent extends AbstractHistoryChart { backgroundColor: item.dataset.backgroundColor, }; }; - this.options.scales.x['bounds'] = 'ticks'; + this.options.scales.x["bounds"] = "ticks"; this.options.plugins.tooltip.callbacks.label = (item: Chart.TooltipItem) => { const label = item.dataset.label; @@ -157,17 +157,17 @@ export class ChartComponent extends AbstractHistoryChart { return TimeOfUseTariffUtils.getLabel(value, label, this.translate, this.currencyLabel); }; - this.options.scales[ChartAxis.LEFT]['title'].text = this.currencyLabel; + this.options.scales[ChartAxis.LEFT]["title"].text = this.currencyLabel; this.datasets = this.datasets.map((el) => { - const opacity = el.type === 'line' ? 0.2 : 0.5; + const opacity = el.type === "line" ? 0.2 : 0.5; el.backgroundColor = ColorUtils.changeOpacityFromRGBA(el.backgroundColor.toString(), opacity); el.borderColor = ColorUtils.changeOpacityFromRGBA(el.borderColor.toString(), 1); return el; }); - this.options.scales.x['offset'] = false; - this.options['animation'] = false; + this.options.scales.x["offset"] = false; + this.options["animation"] = false; }); } @@ -179,9 +179,9 @@ export class ChartComponent extends AbstractHistoryChart { * @returns the desired state array data. */ private getDataset(data: HistoryUtils.ChannelData, desiredState): any[] { - const prices = data['QuarterlyPrice'] + const prices = data["QuarterlyPrice"] .map(val => TimeOfUseTariffUtils.formatPrice(Utils.multiplySafely(val, 1000))); - const states = data['StateMachine'] + const states = data["StateMachine"] .map(val => Utils.multiplySafely(val, 1000)); const length = prices.length; const dataset = Array(length).fill(null); @@ -207,9 +207,9 @@ export class ChartComponent extends AbstractHistoryChart { private getMinimumAxisValue(datasets: Chart.ChartDataset[]): number { const labels = [ - this.translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING'), - this.translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID'), - this.translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE'), + this.translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING"), + this.translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID"), + this.translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE"), ]; const finalArray: number[] = labels diff --git a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/flat/flat.ts b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/flat/flat.ts index 3eb8b26a26f..126647bbd92 100644 --- a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/flat/flat.ts +++ b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/flat/flat.ts @@ -1,12 +1,12 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input } from "@angular/core"; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChannelAddress, CurrentData } from 'src/app/shared/shared'; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChannelAddress, CurrentData } from "src/app/shared/shared"; @Component({ - selector: 'timeOfUseTariffWidget', - templateUrl: './flat.html', + selector: "timeOfUseTariffWidget", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -17,14 +17,14 @@ export class FlatComponent extends AbstractFlatWidget { override getChannelAddresses(): ChannelAddress[] { return [ - new ChannelAddress(this.componentId, 'DelayedTime'), - new ChannelAddress(this.componentId, 'ChargedTime'), + new ChannelAddress(this.componentId, "DelayedTime"), + new ChannelAddress(this.componentId, "ChargedTime"), ]; } protected override onCurrentData(currentData: CurrentData) { - this.delayedActiveTimeOverPeriod = currentData.allComponents[this.componentId + '/DelayedTime']; - this.chargedConsumptionActiveTimeOverPeriod = currentData.allComponents[this.componentId + '/ChargedTime']; + this.delayedActiveTimeOverPeriod = currentData.allComponents[this.componentId + "/DelayedTime"]; + this.chargedConsumptionActiveTimeOverPeriod = currentData.allComponents[this.componentId + "/ChargedTime"]; } } diff --git a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/overview/overview.ts b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/overview/overview.ts index a3f812c1a88..51ed8f95a67 100644 --- a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/overview/overview.ts +++ b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/overview/overview.ts @@ -1,7 +1,7 @@ -import { Component } from '@angular/core'; -import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/abstractHistoryChartOverview'; +import { Component } from "@angular/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; @Component({ - templateUrl: './overview.html', + templateUrl: "./overview.html", }) export class OverviewComponent extends AbstractHistoryChartOverview { } diff --git a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/timeOfUseTariff.module.ts b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/timeOfUseTariff.module.ts index 16ac1004777..fbd0c4c0428 100644 --- a/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/timeOfUseTariff.module.ts +++ b/ui/src/app/edge/history/Controller/Ess/TimeOfUseTariff/timeOfUseTariff.module.ts @@ -1,9 +1,9 @@ import { NgModule } from "@angular/core"; import { BrowserModule } from "@angular/platform-browser"; import { SharedModule } from "src/app/shared/shared.module"; +import { ChartComponent } from "./chart/chart"; import { FlatComponent } from "./flat/flat"; import { OverviewComponent } from "./overview/overview"; -import { ChartComponent } from "./chart/chart"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/history/Controller/Ess/ess.module.ts b/ui/src/app/edge/history/Controller/Ess/ess.module.ts new file mode 100644 index 00000000000..feff7fa422d --- /dev/null +++ b/ui/src/app/edge/history/Controller/Ess/ess.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from "@angular/core"; +import { TimeOfUseTariff } from "./TimeOfUseTariff/timeOfUseTariff.module"; + +@NgModule({ + imports: [ + TimeOfUseTariff, + ], + exports: [ + TimeOfUseTariff, + ], +}) +export class ControllerEss { } diff --git a/ui/src/app/edge/history/Controller/Io/DigitalOutput/chart/chart.ts b/ui/src/app/edge/history/Controller/Io/DigitalOutput/chart/chart.ts new file mode 100644 index 00000000000..9daf18f5179 --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/DigitalOutput/chart/chart.ts @@ -0,0 +1,68 @@ +import { Component } from "@angular/core"; + +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { Name } from "src/app/shared/components/shared/name"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; + +@Component({ + selector: "totalChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", +}) +export class TotalChartComponent extends AbstractHistoryChart { + + public static getChartData(config: EdgeConfig, chartType: "bar" | "line"): HistoryUtils.ChartData { + + const fixDigitalOutputControllers: EdgeConfig.Component[] = config.getComponentsByFactory("Controller.Io.FixDigitalOutput"); + const singleThresholdControllers: EdgeConfig.Component[] = config.getComponentsByFactory("Controller.IO.ChannelSingleThreshold"); + const controllers = [...fixDigitalOutputControllers, ...singleThresholdControllers]; + const input: HistoryUtils.InputChannel[] = []; + + for (const controller of controllers) { + const powerChannel = ChannelAddress.fromString(Array.isArray(config.getComponentProperties(controller.id)["outputChannelAddress"]) + ? config.getComponentProperties(controller.id)["outputChannelAddress"][0] + : config.getComponentProperties(controller.id)["outputChannelAddress"]); + input.push({ name: controller.id, powerChannel: powerChannel, energyChannel: new ChannelAddress(controller.id, "CumulatedActiveTime") }); + } + + return { + input: input, + output: (data: HistoryUtils.ChannelData) => { + const output: HistoryUtils.DisplayValue[] = []; + const colors: string[] = ["rgb(0,0,139)", "rgb(0,191,255)", "rgb(0,0,56)", "rgb(77,77,174)"]; + + for (let i = 0; i < controllers.length; i++) { + const controller = controllers[i]; + output.push({ + name: Name.METER_ALIAS_OR_ID(controller), + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { + return energyQueryResponse?.result.data[controller.id + "/CumulatedActiveTime"] ?? null; + }, + converter: () => { + + return data[controller.id] + // TODO add logic to not have to adjust non power data manually + .map(val => Utils.multiplySafely(val, 1000)); + }, + color: colors[i % colors.length], + stack: 0, + }); + } + return output; + }, + tooltip: { + formatNumber: "1.0-0", + }, + yAxes: [{ + unit: chartType === "line" ? YAxisType.RELAY : YAxisType.TIME, + position: "left", + yAxisId: ChartAxis.LEFT, + }], + }; + } + + protected override getChartData(): HistoryUtils.ChartData { + return TotalChartComponent.getChartData(this.config, this.chartType); + } +} diff --git a/ui/src/app/edge/history/Controller/Io/DigitalOutput/details/chart/chart.ts b/ui/src/app/edge/history/Controller/Io/DigitalOutput/details/chart/chart.ts new file mode 100644 index 00000000000..91c271d820a --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/DigitalOutput/details/chart/chart.ts @@ -0,0 +1,163 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { Name } from "src/app/shared/components/shared/name"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; + +@Component({ + selector: "detailChart", + templateUrl: "../../../../../../../shared/components/chart/abstracthistorychart.html", +}) +export class ChartComponent extends AbstractHistoryChart { + + public static getChartData(config: EdgeConfig, chartType: "line" | "bar", route: ActivatedRoute, translate: TranslateService): HistoryUtils.ChartData { + const controller: EdgeConfig.Component = config.getComponent(route.snapshot.params.componentId); + + const input: HistoryUtils.InputChannel[] = []; + let inputChannel: ChannelAddress | null = null; + const outputChannel = ChannelAddress.fromString(Array.isArray(config.getComponentProperties(controller.id)["outputChannelAddress"]) + ? config.getComponentProperties(controller.id)["outputChannelAddress"][0] + : config.getComponentProperties(controller.id)["outputChannelAddress"]); + + if (controller.factoryId === "Controller.IO.ChannelSingleThreshold") { + inputChannel = ChannelAddress.fromString(config.getComponentProperties(controller.id)["inputChannelAddress"]); + input.push({ + name: inputChannel.toString(), powerChannel: inputChannel, + }); + } + + input.push({ + name: controller.id + "output", powerChannel: outputChannel, energyChannel: new ChannelAddress(controller.id, "CumulatedActiveTime"), + }); + + return { + input: input, + output: (data: HistoryUtils.ChannelData) => { + const output: HistoryUtils.DisplayValue[] = []; + + output.push({ + name: Name.METER_ALIAS_OR_ID(controller), + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { + return energyQueryResponse?.result.data[controller.id + "/CumulatedActiveTime"] ?? null; + }, + converter: () => { + + if (chartType == "line") { + return data[controller.id + "output"]?.map(val => Utils.multiplySafely(1000, val)); + } + + return data[controller.id + "output"] + // TODO add logic to not have to adjust non power data manually + ?.map(val => Utils.multiplySafely(val, 1000)); + }, + color: "rgb(0,191,255)", + stack: 0, + }); + + if (inputChannel) { + output.push(ChartComponent.getDisplayValue(data, inputChannel, translate)); + } + + return output; + }, + tooltip: { + formatNumber: "1.0-0", + }, + yAxes: ChartComponent.getYAxes(inputChannel, chartType), + }; + } + protected static getInputChannelLabel(translate: TranslateService, channelAddress: ChannelAddress): string { + switch (channelAddress.channelId) { + case "GridActivePower": + return translate.instant("General.grid"); + case "ProductionActivePower": + return translate.instant("General.production"); + case "EssSoc": + return translate.instant("General.soc"); + default: + return translate.instant("Edge.Index.Widgets.Singlethreshold.other"); + } + } + + protected static getYAxes(inputChannel: ChannelAddress | null, chartType: "line" | "bar"): HistoryUtils.yAxes[] { + const leftYAxis: HistoryUtils.yAxes = { + unit: chartType === "line" ? YAxisType.RELAY : YAxisType.TIME, + position: "left", + yAxisId: ChartAxis.LEFT, + }; + const yAxes: HistoryUtils.yAxes[] = [leftYAxis]; + + if (!inputChannel) { + return yAxes; + } + + if (chartType !== "line") { + return yAxes; + } + + switch (inputChannel.channelId) { + case "EssSoc": + yAxes.push({ + unit: YAxisType.PERCENTAGE, + position: "right", + yAxisId: ChartAxis.RIGHT, + }); + break; + default: + yAxes.push({ + unit: YAxisType.ENERGY, + position: "right", + yAxisId: ChartAxis.RIGHT, + }); + break; + } + return yAxes; + } + + protected static getYAxisId(inputChannel: ChannelAddress): ChartAxis { + if (!inputChannel) { + return ChartAxis.LEFT; + } + + switch (inputChannel.channelId) { + case "EssSoc": + default: + return ChartAxis.RIGHT; + } + } + + protected static getColor(inputChannel: ChannelAddress): string { + if (!inputChannel || inputChannel.channelId != "EssSoc") { + return "rgb(0,0,0)"; + } + return "rgb(189,195,199)"; + } + + protected static getConverter(inputChannel: ChannelAddress, data: HistoryUtils.ChannelData): () => {} { + if (!inputChannel || inputChannel.channelId != "EssSoc") { + return () => data[inputChannel.toString()]; + } + + return () => data[inputChannel.toString()] + // TODO add logic to not have to adjust non power data manually + ?.map((val: number) => Utils.multiplySafely(val, 1000)); + } + + private static getDisplayValue(data: HistoryUtils.ChannelData, inputChannel: ChannelAddress, translate: TranslateService): HistoryUtils.DisplayValue { + return { + name: ChartComponent.getInputChannelLabel(translate, inputChannel), + converter: ChartComponent.getConverter(inputChannel, data), + color: ChartComponent.getColor(inputChannel), + yAxisId: ChartAxis.RIGHT, + stack: 1, + }; + } + protected override getChartData(): HistoryUtils.ChartData { + return ChartComponent.getChartData(this.config, this.chartType, this.route, this.translate); + } + + +} diff --git a/ui/src/app/edge/history/Controller/Io/DigitalOutput/details/details.overview.html b/ui/src/app/edge/history/Controller/Io/DigitalOutput/details/details.overview.html new file mode 100644 index 00000000000..546f5640513 --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/DigitalOutput/details/details.overview.html @@ -0,0 +1,4 @@ + + + + diff --git a/ui/src/app/edge/history/Controller/Io/DigitalOutput/details/details.overview.ts b/ui/src/app/edge/history/Controller/Io/DigitalOutput/details/details.overview.ts new file mode 100644 index 00000000000..df7cf0ec298 --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/DigitalOutput/details/details.overview.ts @@ -0,0 +1,7 @@ +import { Component } from "@angular/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; + +@Component({ + templateUrl: "./details.overview.html", +}) +export class DetailsOverviewComponent extends AbstractHistoryChartOverview { } diff --git a/ui/src/app/edge/history/Controller/Io/DigitalOutput/digitalOutput.module.ts b/ui/src/app/edge/history/Controller/Io/DigitalOutput/digitalOutput.module.ts new file mode 100644 index 00000000000..df92f38b353 --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/DigitalOutput/digitalOutput.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { TotalChartComponent } from "./chart/chart"; +import { FlatComponent } from "./flat/flat"; +import { OverviewComponent } from "./overview/overview"; +import { ChartComponent } from "./details/chart/chart"; +import { DetailsOverviewComponent } from "./details/details.overview"; +import { FooterNavigationModule } from "src/app/shared/components/footer/subnavigation/footerNavigation.module"; + +@NgModule({ + imports: [ + BrowserModule, + SharedModule, + FooterNavigationModule, + ], + declarations: [ + FlatComponent, + OverviewComponent, + TotalChartComponent, + DetailsOverviewComponent, + ChartComponent, + ], + exports: [ + FlatComponent, + OverviewComponent, + TotalChartComponent, + DetailsOverviewComponent, + ChartComponent, + ], +}) +export class DigitalOutput { } diff --git a/ui/src/app/edge/history/Controller/Io/DigitalOutput/flat/flat.html b/ui/src/app/edge/history/Controller/Io/DigitalOutput/flat/flat.html new file mode 100644 index 00000000000..95886fc8abf --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/DigitalOutput/flat/flat.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + diff --git a/ui/src/app/edge/history/Controller/Io/DigitalOutput/flat/flat.ts b/ui/src/app/edge/history/Controller/Io/DigitalOutput/flat/flat.ts new file mode 100644 index 00000000000..36aba75e504 --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/DigitalOutput/flat/flat.ts @@ -0,0 +1,22 @@ +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { TextIndentation } from "src/app/shared/components/modal/modal-line/modal-line"; +import { Converter } from "src/app/shared/components/shared/converter"; +import { EdgeConfig } from "src/app/shared/shared"; + +@Component({ + selector: "DigitalOutputWidget", + templateUrl: "./flat.html", +}) +export class FlatComponent extends AbstractFlatWidget { + protected FORMAT_SECONDS_TO_DURATION = Converter.FORMAT_SECONDS_TO_DURATION(this.translate.currentLang); + protected fixDigitalOutputControllers: EdgeConfig.Component[] = []; + protected singleThresholdControllers: EdgeConfig.Component[] = []; + + protected readonly TextIndentation = TextIndentation; + + protected override afterIsInitialized(): void { + this.fixDigitalOutputControllers = this.config?.getComponentsByFactory("Controller.Io.FixDigitalOutput"); + this.singleThresholdControllers = this.config?.getComponentsByFactory("Controller.IO.ChannelSingleThreshold"); + } +} diff --git a/ui/src/app/edge/history/Controller/Io/DigitalOutput/overview/overview.html b/ui/src/app/edge/history/Controller/Io/DigitalOutput/overview/overview.html new file mode 100644 index 00000000000..4c3b034653b --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/DigitalOutput/overview/overview.html @@ -0,0 +1,5 @@ + + + + diff --git a/ui/src/app/edge/history/Controller/Io/DigitalOutput/overview/overview.ts b/ui/src/app/edge/history/Controller/Io/DigitalOutput/overview/overview.ts new file mode 100644 index 00000000000..c3eeec802be --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/DigitalOutput/overview/overview.ts @@ -0,0 +1,36 @@ +// @ts-strict-ignore +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; +import { NavigationOption } from "src/app/shared/components/footer/subnavigation/footerNavigation"; +import { ChannelAddress, EdgeConfig, Service } from "src/app/shared/shared"; + +@Component({ + selector: "overview", + templateUrl: "./overview.html", +}) +export class OverviewComponent extends AbstractHistoryChartOverview { + + protected navigationButtons: NavigationOption[] = []; + + constructor( + public override service: Service, + protected override route: ActivatedRoute, + public override modalCtrl: ModalController, + private router: Router, + ) { + super(service, route, modalCtrl); + } + + protected override getChannelAddresses(): ChannelAddress[] { + const fixDigitalOutputControllers: EdgeConfig.Component[] = this.config.getComponentsByFactory("Controller.Io.FixDigitalOutput"); + const singleThresholdControllers: EdgeConfig.Component[] = this.config.getComponentsByFactory("Controller.IO.ChannelSingleThreshold"); + const controllers = [...fixDigitalOutputControllers, ...singleThresholdControllers]; + + this.navigationButtons = controllers.map(el => ( + { id: el.id, alias: el.alias, callback: () => { this.router.navigate(["./" + el.id], { relativeTo: this.route }); } } + )); + return []; + } +} diff --git a/ui/src/app/edge/history/Controller/Io/Io.module.ts b/ui/src/app/edge/history/Controller/Io/Io.module.ts new file mode 100644 index 00000000000..caeda2b8417 --- /dev/null +++ b/ui/src/app/edge/history/Controller/Io/Io.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from "@angular/core"; +import { DigitalOutput } from "./DigitalOutput/digitalOutput.module"; + +@NgModule({ + imports: [ + DigitalOutput, + ], + exports: [ + DigitalOutput, + ], +}) +export class ControllerIo { } diff --git a/ui/src/app/edge/history/Controller/controller.module.ts b/ui/src/app/edge/history/Controller/controller.module.ts index 4be2b267717..dec242649f6 100644 --- a/ui/src/app/edge/history/Controller/controller.module.ts +++ b/ui/src/app/edge/history/Controller/controller.module.ts @@ -1,16 +1,21 @@ import { NgModule } from "@angular/core"; - +import { ControllerEss } from "./Ess/ess.module"; +import { ControllerIo } from "./Io/Io.module"; import { ChannelThreshold } from "./ChannelThreshold/channelThreshold.module"; import { GridOptimizeCharge } from "./Ess/GridoptimizedCharge/gridOptimizeCharge.module"; import { TimeOfUseTariff } from "./Ess/TimeOfUseTariff/timeOfUseTariff.module"; @NgModule({ imports: [ + ControllerEss, + ControllerIo, ChannelThreshold, TimeOfUseTariff, GridOptimizeCharge, ], exports: [ + ControllerEss, + ControllerIo, ChannelThreshold, TimeOfUseTariff, GridOptimizeCharge, diff --git a/ui/src/app/edge/history/abstracthistorychart.html b/ui/src/app/edge/history/abstracthistorychart.html index 086f2be9aff..b9b3c9edc7d 100644 --- a/ui/src/app/edge/history/abstracthistorychart.html +++ b/ui/src/app/edge/history/abstracthistorychart.html @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/abstracthistorychart.ts b/ui/src/app/edge/history/abstracthistorychart.ts index ded3ceb8226..0891b3f453e 100644 --- a/ui/src/app/edge/history/abstracthistorychart.ts +++ b/ui/src/app/edge/history/abstracthistorychart.ts @@ -1,19 +1,18 @@ // @ts-strict-ignore -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import { AbstractHistoryChart as NewAbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { JsonrpcResponseError } from 'src/app/shared/jsonrpc/base'; +import { TranslateService } from "@ngx-translate/core"; +import * as Chart from "chart.js"; +import { AbstractHistoryChart as NewAbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { ChartConstants, XAxisType } from "src/app/shared/components/chart/chart.constants"; +import { JsonrpcResponseError } from "src/app/shared/jsonrpc/base"; import { QueryHistoricTimeseriesDataRequest } from "src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest"; -import { QueryHistoricTimeseriesEnergyPerPeriodRequest } from 'src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest'; +import { QueryHistoricTimeseriesEnergyPerPeriodRequest } from "src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest"; import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; -import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse'; -import { ChartAxis, HistoryUtils, Utils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, Edge, EdgeConfig, Service } from 'src/app/shared/shared'; -import { DateUtils } from 'src/app/shared/utils/date/dateutils'; -import { DateTimeUtils } from 'src/app/shared/utils/datetime/datetime-utils'; - -import { calculateResolution, ChronoUnit, DEFAULT_TIME_CHART_OPTIONS, EMPTY_DATASET, Resolution, setLabelVisible } from './shared'; -import { ChartConstants } from 'src/app/shared/components/chart/chart.constants'; +import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse"; +import { ChartAxis, HistoryUtils, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, Edge, EdgeConfig, Service } from "src/app/shared/shared"; +import { DateUtils } from "src/app/shared/utils/date/dateutils"; +import { DateTimeUtils } from "src/app/shared/utils/datetime/datetime-utils"; +import { ChronoUnit, DEFAULT_TIME_CHART_OPTIONS, EMPTY_DATASET, Resolution, calculateResolution, setLabelVisible } from "./shared"; // NOTE: Auto-refresh of widgets is currently disabled to reduce server load export abstract class AbstractHistoryChart { @@ -38,24 +37,29 @@ export abstract class AbstractHistoryChart { protected hasSubscribed: boolean = false; /** @deprecated*/ - protected unit: YAxisTitle = YAxisTitle.ENERGY; + protected unit: YAxisType = YAxisType.ENERGY; + /** @deprecated*/ + protected formatNumber: string = "1.0-2"; /** @deprecated*/ - protected formatNumber: string = '1.0-2'; + protected xAxisType: XAxisType = XAxisType.TIMESERIES; // Colors for Phase 1-3 protected phase1Color = { - backgroundColor: 'rgba(255,127,80,0.05)', - borderColor: 'rgba(255,127,80,1)', + backgroundColor: "rgba(255,127,80,0.05)", + borderColor: "rgba(255,127,80,1)", }; protected phase2Color = { - backgroundColor: 'rgba(0,0,255,0.1)', - borderColor: 'rgba(0,0,255,1)', + backgroundColor: "rgba(0,0,255,0.1)", + borderColor: "rgba(0,0,255,1)", }; protected phase3Color = { - backgroundColor: 'rgba(128,128,0,0.1)', - borderColor: 'rgba(128,128,0,1)', + backgroundColor: "rgba(128,128,0,0.1)", + borderColor: "rgba(128,128,0,1)", }; + private activeQueryData: string; + private debounceTimeout: any | null = null; + constructor( public readonly spinnerId: string, protected service: Service, @@ -66,21 +70,21 @@ export abstract class AbstractHistoryChart { * Generates a Tooltip Title string from a 'fromDate' and 'toDate'. * * @param fromDate the From-Date - * @param toDate the To-Date + * @param toDate the To-Date * @param date Date from TooltipItem * @returns period for Tooltip Header */ protected static toTooltipTitle(fromDate: Date, toDate: Date, date: Date, service: Service): string { const unit = calculateResolution(service, fromDate, toDate).resolution.unit; if (unit == ChronoUnit.Type.MONTHS) { - return date.toLocaleDateString('default', { month: 'long' }); + return date.toLocaleDateString("default", { month: "long" }); } else if (unit == ChronoUnit.Type.DAYS) { - return date.toLocaleDateString('default', { day: '2-digit', month: 'long' }); + return date.toLocaleDateString("default", { day: "2-digit", month: "long" }); } else { // Default - return date.toLocaleString('default', { day: '2-digit', month: '2-digit', year: '2-digit' }) + ' ' + date.toLocaleTimeString('default', { hour12: false, hour: '2-digit', minute: '2-digit' }); + return date.toLocaleString("default", { day: "2-digit", month: "2-digit", year: "2-digit" }) + " " + date.toLocaleTimeString("default", { hour12: false, hour: "2-digit", minute: "2-digit" }); } } @@ -106,16 +110,16 @@ export abstract class AbstractHistoryChart { } /** - * - * Sets chart options - * - * @deprecated used for charts not using {@link NewAbstractHistoryChart} but {@link AbstractHistoryChart} - */ + * + * Sets chart options + * + * @deprecated used for charts not using {@link NewAbstractHistoryChart} but {@link AbstractHistoryChart} + */ public setOptions(options: Chart.ChartOptions): Promise { return new Promise((resolve) => { const locale = this.service.translate.currentLang; - const yAxis: HistoryUtils.yAxes = { position: 'left', unit: this.unit, yAxisId: ChartAxis.LEFT }; + const yAxis: HistoryUtils.yAxes = { position: "left", unit: this.unit, yAxisId: ChartAxis.LEFT }; const chartObject: HistoryUtils.ChartData = { input: [], output: () => [], @@ -129,10 +133,11 @@ export abstract class AbstractHistoryChart { const colors = this.colors; const translate = this.translate; this.service.getConfig().then((conf) => { - options.datasets.line.borderWidth = 2; + + options = NewAbstractHistoryChart.getDefaultOptions(this.xAxisType, this.service, this.labels); /** Hide default displayed yAxis */ - options.scales['y'] = { + options.scales["y"] = { display: false, }; @@ -150,7 +155,7 @@ export abstract class AbstractHistoryChart { const value = tooltipItem.dataset.data[tooltipItem.dataIndex]; const customUnit = tooltipItem.dataset.unit ?? null; - return label.split(":")[0] + ": " + NewAbstractHistoryChart.getToolTipsSuffix("", value, formatNumber, customUnit ?? unit, 'line', locale, translate, conf); + return label.split(":")[0] + ": " + NewAbstractHistoryChart.getToolTipsSuffix("", value, formatNumber, customUnit ?? unit, "line", locale, translate, conf); }; options.plugins.tooltip.callbacks.labelColor = (item: Chart.TooltipItem) => { @@ -184,10 +189,10 @@ export abstract class AbstractHistoryChart { text: dataset.label, datasetIndex: index, fillStyle: color.backgroundColor, - fontColor: getComputedStyle(document.documentElement).getPropertyValue('--ion-color-text'), + fontColor: getComputedStyle(document.documentElement).getPropertyValue("--ion-color-text"), hidden: !chart.isDatasetVisible(index), lineWidth: 2, - ...(dataset['borderDash'] && { lineDash: dataset['borderDash'] }), + ...(dataset["borderDash"] && { lineDash: dataset["borderDash"] }), strokeStyle: color.borderColor, }); }); @@ -218,29 +223,31 @@ export abstract class AbstractHistoryChart { }; const timeFormat = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).timeFormat; - options.scales.x['time'].unit = timeFormat; + options.scales.x["time"].unit = timeFormat; switch (timeFormat) { - case 'hour': - options.scales.x.ticks['source'] = 'auto';//labels,auto + case "hour": + options.scales.x.ticks["source"] = "auto";//labels,auto options.scales.x.ticks.maxTicksLimit = 31; break; - case 'day': - case 'month': - options.scales.x.ticks['source'] = 'data'; + case "day": + case "month": + options.scales.x.ticks["source"] = "data"; + break; + default: break; } // Only one yAxis defined - options = NewAbstractHistoryChart.getYAxisOptions(options, yAxis, this.translate, 'line', locale, ChartConstants.EMPTY_DATASETS, false); + options = NewAbstractHistoryChart.getYAxisOptions(options, yAxis, this.translate, "line", locale, ChartConstants.EMPTY_DATASETS, false); - options.scales.x['stacked'] = true; - options.scales[ChartAxis.LEFT]['stacked'] = false; - options = NewAbstractHistoryChart.applyChartTypeSpecificOptionsChanges('line', options, this.service, chartObject); + options.scales.x["stacked"] = true; + options.scales[ChartAxis.LEFT]["stacked"] = false; + options = NewAbstractHistoryChart.applyChartTypeSpecificOptionsChanges("line", options, this.service, chartObject); /** Overwrite default yAxisId */ this.datasets = this.datasets .map(el => { - el['yAxisID'] = ChartAxis.LEFT; + el["yAxisID"] = ChartAxis.LEFT; return el; }); }).then(() => { @@ -265,34 +272,47 @@ export abstract class AbstractHistoryChart { this.errorResponse = null; - const result: Promise = new Promise((resolve, reject) => { - this.service.getCurrentEdge().then(edge => { - this.service.getConfig().then(config => { - this.setLabel(config); - this.getChannelAddresses(edge, config).then(channelAddresses => { - - const request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, this.edge?.firstSetupProtocol), toDate, channelAddresses, resolution); - edge.sendRequest(this.service.websocket, request).then(response => { - resolve(response as QueryHistoricTimeseriesDataResponse); - }).catch(error => { - this.errorResponse = error; - resolve(new QueryHistoricTimeseriesDataResponse(error.id, { - timestamps: [null], data: { null: null }, - })); + if (this.debounceTimeout) { + clearTimeout(this.debounceTimeout); + } + + this.debounceTimeout = setTimeout(() => { + const result: Promise = new Promise((resolve, reject) => { + this.service.getCurrentEdge().then(edge => { + this.service.getConfig().then(config => { + this.setLabel(config); + this.getChannelAddresses(edge, config).then(channelAddresses => { + const request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, this.edge?.firstSetupProtocol), toDate, channelAddresses, resolution); + edge.sendRequest(this.service.websocket, request).then(response => { + resolve(response as QueryHistoricTimeseriesDataResponse); + this.activeQueryData = request.id; + }).catch(error => { + this.errorResponse = error; + resolve(new QueryHistoricTimeseriesDataResponse(error.id, { + timestamps: [null], data: { null: null }, + })); + }); }); }); }); + }).then((response) => { + if (this.activeQueryData !== response.id) { + return; + } + if (Utils.isDataEmpty(response)) { + this.loading = false; + this.service.stopSpinner(this.spinnerId); + this.initializeChart(); + } + return DateTimeUtils.normalizeTimestamps(resolution.unit, response); }); - }).then((response) => { - if (Utils.isDataEmpty(response)) { - this.loading = false; - this.service.stopSpinner(this.spinnerId); - this.initializeChart(); - } - return DateTimeUtils.normalizeTimestamps(resolution.unit, response); - }); - return result; + return result; + }, ChartConstants.REQUEST_TIMEOUT); + + return new Promise((resolve) => { + resolve(new QueryHistoricTimeseriesDataResponse("", { timestamps: [], data: {} })); + }); } /** @@ -401,7 +421,7 @@ export abstract class AbstractHistoryChart { * @param spinnerSelector to stop spinner */ protected initializeChart() { - EMPTY_DATASET[0].label = this.translate.instant('Edge.History.noData'); + EMPTY_DATASET[0].label = this.translate.instant("Edge.History.noData"); this.datasets = EMPTY_DATASET; this.labels = []; this.loading = false; diff --git a/ui/src/app/edge/history/abstracthistorywidget.ts b/ui/src/app/edge/history/abstracthistorywidget.ts index 8f07ccf5cc4..2af3a49bc47 100644 --- a/ui/src/app/edge/history/abstracthistorywidget.ts +++ b/ui/src/app/edge/history/abstracthistorywidget.ts @@ -1,14 +1,17 @@ // @ts-strict-ignore -import { JsonrpcResponseError } from 'src/app/shared/jsonrpc/base'; -import { QueryHistoricTimeseriesDataRequest } from 'src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest'; -import { QueryHistoricTimeseriesDataResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { ChannelAddress, Edge, EdgeConfig, Service } from 'src/app/shared/shared'; -import { calculateResolution } from './shared'; -import { DateUtils } from 'src/app/shared/utils/date/dateutils'; +import { JsonrpcResponseError } from "src/app/shared/jsonrpc/base"; +import { QueryHistoricTimeseriesDataRequest } from "src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest"; +import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; +import { ChannelAddress, Edge, EdgeConfig, Service } from "src/app/shared/shared"; +import { DateUtils } from "src/app/shared/utils/date/dateutils"; +import { DateTimeUtils } from "src/app/shared/utils/datetime/datetime-utils"; +import { calculateResolution } from "./shared"; // NOTE: Auto-refresh of widgets is currently disabled to reduce server load export abstract class AbstractHistoryWidget { + private activeQueryData: string; + //observable is used to fetch new widget data every 5 minutes // private refreshWidgetData = interval(600000); @@ -52,13 +55,14 @@ export abstract class AbstractHistoryWidget { protected queryHistoricTimeseriesData(fromDate: Date, toDate: Date): Promise { const resolution = calculateResolution(this.service, fromDate, toDate).resolution; - return new Promise((resolve, reject) => { + const result: Promise = new Promise((resolve, reject) => { this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.getChannelAddresses(edge, config).then(channelAddresses => { const request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, edge?.firstSetupProtocol), toDate, channelAddresses, resolution); edge.sendRequest(this.service.websocket, request).then(response => { const result = (response as QueryHistoricTimeseriesDataResponse).result; + this.activeQueryData = response.id; if (Object.keys(result.data).length != 0 && Object.keys(result.timestamps).length != 0) { resolve(response as QueryHistoricTimeseriesDataResponse); } else { @@ -68,7 +72,13 @@ export abstract class AbstractHistoryWidget { }).catch(reason => reject(reason)); }); }); + }).then((response) => { + if (this.activeQueryData !== response.id) { + return; + } + return DateTimeUtils.normalizeTimestamps(resolution.unit, response); }); + return result; } /** diff --git a/ui/src/app/edge/history/chpsoc/chart.component.ts b/ui/src/app/edge/history/chpsoc/chart.component.ts index 3be26bf6160..89019ad7b87 100644 --- a/ui/src/app/edge/history/chpsoc/chart.component.ts +++ b/ui/src/app/edge/history/chpsoc/chart.component.ts @@ -1,16 +1,15 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; - -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; -import { YAxisTitle } from 'src/app/shared/service/utils'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, Edge, EdgeConfig, Service } from "../../../shared/shared"; +import { AbstractHistoryChart } from "../abstracthistorychart"; @Component({ - selector: 'chpsocchart', - templateUrl: '../abstracthistorychart.html', + selector: "chpsocchart", + templateUrl: "../abstracthistorychart.html", }) export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -31,7 +30,6 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -49,10 +47,10 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getCurrentEdge().then(() => { this.service.getConfig().then(config => { - const outputChannel = config.getComponentProperties(this.componentId)['outputChannelAddress']; - const inputChannel = config.getComponentProperties(this.componentId)['inputChannelAddress']; - const lowThreshold = this.componentId + '/_PropertyLowThreshold'; - const highThreshold = this.componentId + '/_PropertyHighThreshold'; + const outputChannel = config.getComponentProperties(this.componentId)["outputChannelAddress"]; + const inputChannel = config.getComponentProperties(this.componentId)["inputChannelAddress"]; + const lowThreshold = this.componentId + "/_PropertyLowThreshold"; + const highThreshold = this.componentId + "/_PropertyHighThreshold"; const result = response.result; // convert labels const labels: Date[] = []; @@ -80,8 +78,8 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit data: data, }); this.colors.push({ - backgroundColor: 'rgba(0,191,255,0.05)', - borderColor: 'rgba(0,191,255,1)', + backgroundColor: "rgba(0,191,255,0.05)", + borderColor: "rgba(0,191,255,1)", }); } else { const data = result.data[channel].map(value => { @@ -95,34 +93,34 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit }); if (channel == inputChannel) { datasets.push({ - label: this.translate.instant('General.soc'), + label: this.translate.instant("General.soc"), data: data, }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(0,223,0,1)", }); } if (channel == lowThreshold) { datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.CHP.lowThreshold'), + label: this.translate.instant("Edge.Index.Widgets.CHP.lowThreshold"), data: data, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(0,191,255,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(0,191,255,1)", }); } if (channel == highThreshold) { datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.CHP.highThreshold'), + label: this.translate.instant("Edge.Index.Widgets.CHP.highThreshold"), data: data, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(0,191,255,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(0,191,255,1)", }); } } @@ -145,20 +143,20 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit this.initializeChart(); return; }).finally(() => { - this.unit = YAxisTitle.PERCENTAGE; + this.unit = YAxisType.PERCENTAGE; this.setOptions(this.options); }); } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); - const inputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['inputChannelAddress']); + const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)["outputChannelAddress"]); + const inputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)["inputChannelAddress"]); const result: ChannelAddress[] = [ outputChannel, inputChannel, - new ChannelAddress(this.componentId, '_PropertyHighThreshold'), - new ChannelAddress(this.componentId, '_PropertyLowThreshold'), + new ChannelAddress(this.componentId, "_PropertyHighThreshold"), + new ChannelAddress(this.componentId, "_PropertyLowThreshold"), ]; resolve(result); }); diff --git a/ui/src/app/edge/history/chpsoc/chpsocchartoverview/chpsocchartoverview.component.html b/ui/src/app/edge/history/chpsoc/chpsocchartoverview/chpsocchartoverview.component.html index 45e614e2e66..44ed82a5b13 100644 --- a/ui/src/app/edge/history/chpsoc/chpsocchartoverview/chpsocchartoverview.component.html +++ b/ui/src/app/edge/history/chpsoc/chpsocchartoverview/chpsocchartoverview.component.html @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/chpsoc/chpsocchartoverview/chpsocchartoverview.component.ts b/ui/src/app/edge/history/chpsoc/chpsocchartoverview/chpsocchartoverview.component.ts index da9418c8c68..56db2b42f82 100644 --- a/ui/src/app/edge/history/chpsoc/chpsocchartoverview/chpsocchartoverview.component.ts +++ b/ui/src/app/edge/history/chpsoc/chpsocchartoverview/chpsocchartoverview.component.ts @@ -1,10 +1,10 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Edge, EdgeConfig, Service } from '../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { Edge, EdgeConfig, Service } from "../../../../shared/shared"; @Component({ selector: ChpSocChartOverviewComponent.SELECTOR, - templateUrl: './chpsocchartoverview.component.html', + templateUrl: "./chpsocchartoverview.component.html", }) export class ChpSocChartOverviewComponent implements OnInit { @@ -19,7 +19,7 @@ export class ChpSocChartOverviewComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.edge = edge; this.config = config; diff --git a/ui/src/app/edge/history/chpsoc/widget.component.ts b/ui/src/app/edge/history/chpsoc/widget.component.ts index a72c4c2fb34..9056355309b 100644 --- a/ui/src/app/edge/history/chpsoc/widget.component.ts +++ b/ui/src/app/edge/history/chpsoc/widget.component.ts @@ -1,15 +1,15 @@ -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { QueryHistoricTimeseriesDataResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryWidget } from '../abstracthistorywidget'; -import { calculateActiveTimeOverPeriod } from '../shared'; +import { ChannelAddress, Edge, EdgeConfig, Service } from "../../../shared/shared"; +import { AbstractHistoryWidget } from "../abstracthistorywidget"; +import { calculateActiveTimeOverPeriod } from "../shared"; @Component({ selector: ChpSocWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', + templateUrl: "./widget.component.html", }) export class ChpSocWidgetComponent extends AbstractHistoryWidget implements OnInit, OnChanges, OnDestroy { @@ -29,8 +29,8 @@ export class ChpSocWidgetComponent extends AbstractHistoryWidget implements OnIn } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(response => { - this.edge = response; + this.service.getCurrentEdge().then(edge => { + this.edge = edge; this.service.getConfig().then(config => { this.component = config.getComponent(this.componentId); }); @@ -50,7 +50,7 @@ export class ChpSocWidgetComponent extends AbstractHistoryWidget implements OnIn this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).then(response => { this.service.getConfig().then(config => { const result = (response as QueryHistoricTimeseriesDataResponse).result; - const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); + const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)["outputChannelAddress"]); this.activeSecondsOverPeriod = calculateActiveTimeOverPeriod(outputChannel, result); }); }); @@ -58,7 +58,7 @@ export class ChpSocWidgetComponent extends AbstractHistoryWidget implements OnIn protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); + const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)["outputChannelAddress"]); const channeladdresses = [outputChannel]; resolve(channeladdresses); }); diff --git a/ui/src/app/edge/history/common/autarchy/Autarchy.ts b/ui/src/app/edge/history/common/autarchy/Autarchy.ts index 1407ff291e6..cc35ac3c7ce 100644 --- a/ui/src/app/edge/history/common/autarchy/Autarchy.ts +++ b/ui/src/app/edge/history/common/autarchy/Autarchy.ts @@ -1,9 +1,9 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { FlatComponent } from './flat/flat'; -import { ChartComponent } from './chart/chart'; -import { OverviewComponent } from './overview/overview'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { ChartComponent } from "./chart/chart"; +import { FlatComponent } from "./flat/flat"; +import { OverviewComponent } from "./overview/overview"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/history/common/autarchy/chart/chart.ts b/ui/src/app/edge/history/common/autarchy/chart/chart.ts index e7a0998880c..8a17580e381 100644 --- a/ui/src/app/edge/history/common/autarchy/chart/chart.ts +++ b/ui/src/app/edge/history/common/autarchy/chart/chart.ts @@ -1,52 +1,52 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, Utils } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, Utils } from "src/app/shared/shared"; @Component({ - selector: 'autarchychart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', + selector: "autarchychart", + templateUrl: "../../../../../shared/components/chart/abstracthistorychart.html", }) export class ChartComponent extends AbstractHistoryChart { protected override getChartData(): HistoryUtils.ChartData { - this.spinnerId = 'autarchy-chart'; + this.spinnerId = "autarchy-chart"; return { input: [{ - name: 'Consumption', - powerChannel: ChannelAddress.fromString('_sum/ConsumptionActivePower'), - energyChannel: ChannelAddress.fromString('_sum/ConsumptionActiveEnergy'), + name: "Consumption", + powerChannel: ChannelAddress.fromString("_sum/ConsumptionActivePower"), + energyChannel: ChannelAddress.fromString("_sum/ConsumptionActiveEnergy"), }, { - name: 'GridBuy', - powerChannel: ChannelAddress.fromString('_sum/GridActivePower'), - energyChannel: ChannelAddress.fromString('_sum/GridBuyActiveEnergy'), + name: "GridBuy", + powerChannel: ChannelAddress.fromString("_sum/GridActivePower"), + energyChannel: ChannelAddress.fromString("_sum/GridBuyActiveEnergy"), converter: HistoryUtils.ValueConverter.NON_NULL_OR_NEGATIVE, }], output: (data: HistoryUtils.ChannelData) => { return [{ - name: this.translate.instant('General.autarchy'), + name: this.translate.instant("General.autarchy"), nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return Utils.calculateAutarchy(energyValues?.result.data['_sum/GridBuyActiveEnergy'] ?? null, energyValues?.result.data['_sum/ConsumptionActiveEnergy'] ?? null); + return Utils.calculateAutarchy(energyValues?.result.data["_sum/GridBuyActiveEnergy"] ?? null, energyValues?.result.data["_sum/ConsumptionActiveEnergy"] ?? null); }, converter: () => { - return data['Consumption'] + return data["Consumption"] ?.map((value, index) => - Utils.calculateAutarchy(data['GridBuy'][index], value), + Utils.calculateAutarchy(data["GridBuy"][index], value), ); }, - color: 'rgb(0,152,204)', + color: "rgb(0,152,204)", }]; }, tooltip: { - formatNumber: '1.0-0', + formatNumber: "1.0-0", }, yAxes: [{ - unit: YAxisTitle.PERCENTAGE, - position: 'left', + unit: YAxisType.PERCENTAGE, + position: "left", yAxisId: ChartAxis.LEFT, }], }; diff --git a/ui/src/app/edge/history/common/autarchy/flat/flat.html b/ui/src/app/edge/history/common/autarchy/flat/flat.html index e6e5fe45c4a..632cc21b2df 100644 --- a/ui/src/app/edge/history/common/autarchy/flat/flat.html +++ b/ui/src/app/edge/history/common/autarchy/flat/flat.html @@ -2,4 +2,4 @@ routerLink="/device/{{edge.id}}/history/autarchychart" *ngIf="isInitialized"> - \ No newline at end of file + diff --git a/ui/src/app/edge/history/common/autarchy/flat/flat.ts b/ui/src/app/edge/history/common/autarchy/flat/flat.ts index 748253a44bd..429cca30b54 100644 --- a/ui/src/app/edge/history/common/autarchy/flat/flat.ts +++ b/ui/src/app/edge/history/common/autarchy/flat/flat.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, Utils } from '../../../../../shared/shared'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, Utils } from "../../../../../shared/shared"; @Component({ - selector: 'autarchyWidget', - templateUrl: './flat.html', + selector: "autarchyWidget", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -14,14 +14,14 @@ export class FlatComponent extends AbstractFlatWidget { protected override onCurrentData(currentData: CurrentData) { this.autarchyValue = Utils.calculateAutarchy( - currentData.allComponents['_sum/GridBuyActiveEnergy'] / 1000, - currentData.allComponents['_sum/ConsumptionActiveEnergy'] / 1000); + currentData.allComponents["_sum/GridBuyActiveEnergy"] / 1000, + currentData.allComponents["_sum/ConsumptionActiveEnergy"] / 1000); } protected override getChannelAddresses(): ChannelAddress[] { return [ - new ChannelAddress('_sum', 'GridBuyActiveEnergy'), - new ChannelAddress('_sum', 'ConsumptionActiveEnergy'), + new ChannelAddress("_sum", "GridBuyActiveEnergy"), + new ChannelAddress("_sum", "ConsumptionActiveEnergy"), ]; } } diff --git a/ui/src/app/edge/history/common/autarchy/overview/overview.html b/ui/src/app/edge/history/common/autarchy/overview/overview.html index 6daae33cb38..63b79fdd217 100644 --- a/ui/src/app/edge/history/common/autarchy/overview/overview.html +++ b/ui/src/app/edge/history/common/autarchy/overview/overview.html @@ -1,4 +1,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/common/autarchy/overview/overview.ts b/ui/src/app/edge/history/common/autarchy/overview/overview.ts index a3f812c1a88..51ed8f95a67 100644 --- a/ui/src/app/edge/history/common/autarchy/overview/overview.ts +++ b/ui/src/app/edge/history/common/autarchy/overview/overview.ts @@ -1,7 +1,7 @@ -import { Component } from '@angular/core'; -import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/abstractHistoryChartOverview'; +import { Component } from "@angular/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; @Component({ - templateUrl: './overview.html', + templateUrl: "./overview.html", }) export class OverviewComponent extends AbstractHistoryChartOverview { } diff --git a/ui/src/app/edge/history/common/common.ts b/ui/src/app/edge/history/common/common.ts index 2dad8182fd7..bdfda86d25d 100644 --- a/ui/src/app/edge/history/common/common.ts +++ b/ui/src/app/edge/history/common/common.ts @@ -1,11 +1,10 @@ -import { NgModule } from '@angular/core'; - -import { Common_Autarchy } from './autarchy/Autarchy'; -import { CommonEnergyMonitor } from './energy/energy'; -import { Common_Grid } from './grid/grid'; -import { Common_Production } from './production/production'; -import { Common_Selfconsumption } from './selfconsumption/SelfConsumption'; -import { Common_Consumption } from './consumption/Consumption'; +import { NgModule } from "@angular/core"; +import { Common_Autarchy } from "./autarchy/Autarchy"; +import { Common_Consumption } from "./consumption/Consumption"; +import { CommonEnergyMonitor } from "./energy/energy"; +import { Common_Grid } from "./grid/grid"; +import { Common_Production } from "./production/production"; +import { Common_Selfconsumption } from "./selfconsumption/SelfConsumption"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/history/common/consumption/Consumption.ts b/ui/src/app/edge/history/common/consumption/Consumption.ts index e6ce25df02b..c36c786695d 100644 --- a/ui/src/app/edge/history/common/consumption/Consumption.ts +++ b/ui/src/app/edge/history/common/consumption/Consumption.ts @@ -1,14 +1,16 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { FooterNavigationModule } from 'src/app/shared/components/footer/subnavigation/footerNavigation.module'; -import { SharedModule } from 'src/app/shared/shared.module'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { FooterNavigationModule } from "src/app/shared/components/footer/subnavigation/footerNavigation.module"; +import { SharedModule } from "src/app/shared/shared.module"; -import { ChartComponent } from './chart/chart'; -import { ChartComponent as DetailsChartComponent } from './details/chart/chart'; -import { DetailsOverviewComponent } from './details/details.overview'; -import { FlatComponent } from './flat/flat'; -import { OverviewComponent } from './overview/overview'; -import { CurrentVoltageModule } from 'src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule'; +import { CurrentVoltageModule } from "src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule"; +import { ChartComponent } from "./chart/chart"; +import { ConsumptionMeterChartDetailsComponent } from "./details/chart/consumptionMeter"; +import { EvcsChartDetailsComponent } from "./details/chart/evcs"; +import { SumChartDetailsComponent } from "./details/chart/sum"; +import { DetailsOverviewComponent } from "./details/details.overview"; +import { FlatComponent } from "./flat/flat"; +import { OverviewComponent } from "./overview/overview"; @NgModule({ imports: [ @@ -25,7 +27,9 @@ import { CurrentVoltageModule } from 'src/app/shared/components/edge/meter/curre // consumptionChart:componentId DetailsOverviewComponent, - DetailsChartComponent, + ConsumptionMeterChartDetailsComponent, + EvcsChartDetailsComponent, + SumChartDetailsComponent, ], exports: [ // consumptionChart @@ -35,7 +39,9 @@ import { CurrentVoltageModule } from 'src/app/shared/components/edge/meter/curre // consumptionChart:componentId DetailsOverviewComponent, - DetailsChartComponent, + ConsumptionMeterChartDetailsComponent, + EvcsChartDetailsComponent, + SumChartDetailsComponent, ], }) export class Common_Consumption { } diff --git a/ui/src/app/edge/history/common/consumption/chart/channels.spec.ts b/ui/src/app/edge/history/common/consumption/chart/channels.spec.ts index fdb26cdf064..1b92f47b159 100644 --- a/ui/src/app/edge/history/common/consumption/chart/channels.spec.ts +++ b/ui/src/app/edge/history/common/consumption/chart/channels.spec.ts @@ -23,12 +23,12 @@ export namespace History { }), dataChannelWithValues: new QueryHistoricTimeseriesDataResponse("0", { data: { - '_sum/ConsumptionActivePower': [null, null, null, 565.8045977011494, 560.5148514851485, 561.425925925926, 573.2169811320755, 565.8080808080808, 587.9803921568628, 584.2389380530974, 607.4818181818182, 605.0275229357799, 595.6407766990292, 602.5294117647059, 578.1684210526316, 581.6813186813187, 649.5166666666667, 560.3, 567.0373831775701, 629.7672413793103, 568.8613861386139, 589.6039603960396, 634.5090909090909, 622.6633663366337, 617.7196261682243, 608.122641509434, 602.78, 650.8155339805825, 605.8877551020408, 594.3904761904762, 576.36, 565.066037735849, 587.495145631068, 626.375, 681.9428571428572, 650.4629629629629, 631.373831775701, 687.25, 560.2452830188679, 527.8952380952381, 620.2222222222222, 546.6355140186915, 587.8130841121496, 604, 616.295918367347, 578.940594059406, 594.3396226415094, 648.1078431372549, null, null, null, 565.2183908045977, 573.6481481481482, 536.5462962962963, 558.081081081081, 574.7543859649123, 574.3557692307693, 596.9047619047619, 654.072072072072, 615.21, 612.8045977011494, 636.11, 613.7948717948718, 538.8857142857142, 537.1157894736842, 551.1634615384615, 558.8809523809524, 559.1222222222223, 618.5576923076923, 654.3287671232877, 616.0574712643678, 588.9056603773585, 578.7096774193549, 583.0360360360361, 572.5700934579439, 595.2631578947369, 745.0888888888888, 820.7323943661971, 2651.1923076923076, 8063.131147540984, 6952.055555555556, 7413.41052631579, 6695.175, 6688.301075268817, 7135.544444444445, 6935.6125, 6768.398148148148, 6962.593220338983, 3449.51968503937, 677.4427860696518, 982.7305699481865, 858.2012987012987, 767.8924050632911, 761.950495049505, 682.1319796954315, 725.4198473282443, 702.1286549707602, 730.9484536082474, 739, 730.572864321608, 754.7467532467532, 657.373417721519, 640.9480519480519, 669.8156424581006, 787.6280991735537, 2931.229357798165, 1954.2808988764045, 777.5346534653465, 1098.538860103627, 1244.1524390243903, 2919.4913793103447, 2987.4188034188032, 3414.029411764706, 1355.2, 2714.2824427480914, 2657.8703703703704, 2873.892307692308, 6140.337078651685, 3966.560606060606, 3021.5789473684213, 1774.1875, 1076.46, 1426.8691588785048, 1261.0386740331492, 1019.3491124260355, 1194.960199004975, 1241.2878787878788, 3323, 3968.45625, 1468.0961538461538, 3630.4166666666665, 2269.5301204819275, 2554.391025641026, 1845.7888888888888, 1728.9767441860465, 2862.08, 2324.1241379310345, 1964.0169491525423, 1808.4, 3466.05035971223, 2297.4397590361446, 2530.0493827160494, 2439.3584905660377, 2007.9060773480662, 1751.5, 1416.3181818181818, 1429.2298850574712, 1452.0298507462687, 1489.720430107527, 1633.095238095238, 1826.2928571428572, 1610.1904761904761, 1680.9292929292928, 2881.743119266055, 3585.1634615384614, 3689.1666666666665, 3657.340277777778, 3643.5348837209303, 3714.8645833333335, 3731.375, 3744.79, 3636.2363636363634, 4273.113924050633, 3446.2, 3538.714285714286, 3790.6065573770493, 3527.675, 3467.671232876712, 3559.5, 3798.2, 5460.666666666667, 1309.4406779661017, 1535.7454545454545, 3423.8260869565215, 3382.3636363636365, 3400.6315789473683, 2950.75, 3386.731707317073, 2506, 1447.1666666666667, 1442.6, 946, 942.578947368421, 950.7142857142857, 947, 976.2857142857143, 1786.2857142857142, 1513.5777777777778, 1499.5625, 1338, 1327.8125, 1273.9175257731958, 1438.7457627118645, 1248.4186046511627, 1286.6693548387098, 1284.8934911242604, 1223.7952755905512, 748.09375, 871.7684210526315, 844.5338983050848, 791.675, 804.1932773109244, 730.3737373737374, 705.5024390243902, 687.2407407407408, 690.9939759036145, 751, 765.139344262295, 686.8717948717949, 669.7434210526316, 1767.8091603053435, 724.6764705882352, 748.2772277227723, 940.1142857142858, 750.368, 1366.0232558139535, 727.4137931034483, 710.719512195122, 689.8555555555556, 739.453488372093, 817.875, 730.4303797468355, 735.5890410958904, 738.2258064516129, 1906.9217391304348, 2290.785714285714, 1207.5072463768115, 1167.5890410958905, 1229.0208333333333, 1192.3777777777777, 1208.871794871795, 1367.715909090909, 1284.2233009708739, 1163.1739130434783, 1152.53, 1161.4545454545455, 1219.5681818181818, 1183.752808988764, 1197.778947368421, 1233.888888888889, 1275.070588235294, 1235.554054054054, 1207.83908045977, 1241.6184210526317, 1159.042735042735, 1138.2948717948718, 1106.9915966386554, 1171.4504504504505, 1223.822429906542, 1122.169642857143, 1018.8928571428571, 981.8285714285714, 998.8363636363637, 6056.572916666667, 7225.528846153846, 7193.834782608696, 7507.321100917431, 7588.695238095238, 7678.689189189189, 9469.633027522936, 10236.186046511628, 10106.608695652174, 9989.125, 9948.229357798165, 9796.030927835052, 9704.217391304348, 8454.028571428571, 6813.476190476191, 6706.782608695652, 6523.452173913043, 6661.553571428572, 5620.777777777777, 812.3142857142857, 809.5892857142857, 866.4786324786324, 877.8319327731092, 810.8141592920354, 815.7121212121212, 770.6470588235294, 763.3157894736842, 781.5151515151515, 807.5833333333334, 824.743119266055, 876.2151898734177, 882.424, 750.2213114754098, 675.9549549549549, 637.1222222222223], - '_sum/ConsumptionActivePowerL1': [null, null, null, 188.60153256704982, 186.83828382838283, 187.141975308642, 191.07232704402517, 188.60269360269362, 195.99346405228758, 194.7463126843658, 202.4939393939394, 201.6758409785933, 198.54692556634305, 200.84313725490196, 192.7228070175439, 193.89377289377288, 216.50555555555556, 186.76666666666665, 189.01246105919003, 209.92241379310346, 189.6204620462046, 196.53465346534654, 211.5030303030303, 207.55445544554456, 205.90654205607476, 202.7075471698113, 200.92666666666665, 216.93851132686083, 201.9625850340136, 198.13015873015874, 192.12, 188.35534591194968, 195.831715210356, 208.79166666666666, 227.31428571428572, 216.820987654321, 210.45794392523365, 229.08333333333334, 186.74842767295596, 175.9650793650794, 206.74074074074073, 182.21183800623052, 195.93769470404985, 201.33333333333334, 205.43197278911566, 192.98019801980197, 198.11320754716982, 216.0359477124183, null, null, null, 188.40613026819923, 191.21604938271605, 178.84876543209876, 186.027027027027, 191.58479532163744, 191.4519230769231, 198.96825396825398, 218.02402402402402, 205.07000000000002, 204.26819923371647, 212.03666666666666, 204.59829059829062, 179.6285714285714, 179.03859649122808, 183.72115384615384, 186.2936507936508, 186.3740740740741, 206.18589743589743, 218.1095890410959, 205.35249042145594, 196.30188679245282, 192.90322580645162, 194.34534534534535, 190.85669781931463, 198.42105263157896, 248.36296296296294, 273.57746478873236, 883.7307692307692, 2687.7103825136614, 2317.3518518518517, 2471.1368421052634, 2231.725, 2229.4336917562723, 2378.514814814815, 2311.8708333333334, 2256.1327160493825, 2320.864406779661, 1149.8398950131234, 225.81426202321725, 327.5768566493955, 286.06709956709955, 255.96413502109704, 253.983498349835, 227.37732656514382, 241.80661577608143, 234.04288499025338, 243.64948453608247, 246.33333333333334, 243.52428810720266, 251.58225108225108, 219.12447257383965, 213.64935064935062, 223.27188081936686, 262.5426997245179, 977.0764525993883, 651.4269662921348, 259.1782178217822, 366.1796200345423, 414.7174796747968, 973.1637931034483, 995.8062678062678, 1138.0098039215686, 451.73333333333335, 904.7608142493638, 885.9567901234568, 957.9641025641026, 2046.7790262172284, 1322.1868686868686, 1007.1929824561404, 591.3958333333334, 358.82, 475.6230529595016, 420.3462246777164, 339.78303747534517, 398.3200663349917, 413.76262626262627, 1107.6666666666667, 1322.8187500000001, 489.3653846153846, 1210.138888888889, 756.5100401606425, 851.4636752136753, 615.2629629629629, 576.3255813953489, 954.0266666666666, 774.7080459770115, 654.6723163841808, 602.8000000000001, 1155.3501199040768, 765.8132530120482, 843.3497942386831, 813.1194968553459, 669.3020257826887, 583.8333333333334, 472.10606060606057, 476.4099616858237, 484.00995024875624, 496.57347670250897, 544.3650793650794, 608.7642857142857, 536.7301587301587, 560.3097643097643, 960.5810397553518, 1195.054487179487, 1229.7222222222222, 1219.1134259259259, 1214.5116279069769, 1238.2881944444446, 1243.7916666666667, 1248.2633333333333, 1212.0787878787878, 1424.3713080168775, 1148.7333333333333, 1179.5714285714287, 1263.535519125683, 1175.8916666666667, 1155.890410958904, 1186.5, 1266.0666666666666, 1820.2222222222224, 436.48022598870057, 511.91515151515154, 1141.2753623188405, 1127.4545454545455, 1133.5438596491229, 983.5833333333334, 1128.910569105691, 835.3333333333334, 482.3888888888889, 480.8666666666666, 315.3333333333333, 314.1929824561403, 316.90476190476187, 315.6666666666667, 325.42857142857144, 595.4285714285714, 504.52592592592595, 499.8541666666667, 446, 442.6041666666667, 424.63917525773195, 479.5819209039548, 416.1395348837209, 428.8897849462366, 428.29783037475346, 407.93175853018374, 249.36458333333334, 290.58947368421053, 281.51129943502826, 263.89166666666665, 268.0644257703081, 243.45791245791247, 235.16747967479674, 229.08024691358025, 230.33132530120483, 250.33333333333334, 255.04644808743168, 228.95726495726498, 223.24780701754386, 589.2697201017812, 241.55882352941174, 249.42574257425744, 313.37142857142857, 250.12266666666667, 455.3410852713178, 242.47126436781608, 236.90650406504065, 229.95185185185187, 246.484496124031, 272.625, 243.47679324894514, 245.19634703196346, 246.07526881720432, 635.640579710145, 763.5952380952381, 402.50241545893715, 389.1963470319635, 409.6736111111111, 397.4592592592592, 402.95726495726495, 455.905303030303, 428.074433656958, 387.72463768115944, 384.1766666666667, 387.1515151515152, 406.52272727272725, 394.5842696629213, 399.25964912280705, 411.2962962962963, 425.0235294117647, 411.8513513513513, 402.61302681992333, 413.8728070175439, 386.34757834757835, 379.43162393162396, 368.99719887955183, 390.4834834834835, 407.94080996884736, 374.05654761904765, 339.63095238095235, 327.2761904761905, 332.94545454545454, 2018.857638888889, 2408.5096153846152, 2397.9449275362317, 2502.440366972477, 2529.5650793650793, 2559.563063063063, 3156.544342507645, 3412.062015503876, 3368.8695652173915, 3329.7083333333335, 3316.0764525993886, 3265.343642611684, 3234.7391304347825, 2818.0095238095237, 2271.15873015873, 2235.5942028985505, 2174.4840579710144, 2220.5178571428573, 1873.5925925925924, 270.77142857142854, 269.86309523809524, 288.8262108262108, 292.6106442577031, 270.27138643067843, 271.9040404040404, 256.88235294117646, 254.43859649122805, 260.5050505050505, 269.19444444444446, 274.914373088685, 292.07172995780587, 294.1413333333333, 250.0737704918033, 225.31831831831832, 212.3740740740741], - '_sum/ConsumptionActivePowerL2': [null, null, null, 188.60153256704982, 186.83828382838283, 187.141975308642, 191.07232704402517, 188.60269360269362, 195.99346405228758, 194.7463126843658, 202.4939393939394, 201.6758409785933, 198.54692556634305, 200.84313725490196, 192.7228070175439, 193.89377289377288, 216.50555555555556, 186.76666666666665, 189.01246105919003, 209.92241379310346, 189.6204620462046, 196.53465346534654, 211.5030303030303, 207.55445544554456, 205.90654205607476, 202.7075471698113, 200.92666666666665, 216.93851132686083, 201.9625850340136, 198.13015873015874, 192.12, 188.35534591194968, 195.831715210356, 208.79166666666666, 227.31428571428572, 216.820987654321, 210.45794392523365, 229.08333333333334, 186.74842767295596, 175.9650793650794, 206.74074074074073, 182.21183800623052, 195.93769470404985, 201.33333333333334, 205.43197278911566, 192.98019801980197, 198.11320754716982, 216.0359477124183, null, null, null, 188.40613026819923, 191.21604938271605, 178.84876543209876, 186.027027027027, 191.58479532163744, 191.4519230769231, 198.96825396825398, 218.02402402402402, 205.07000000000002, 204.26819923371647, 212.03666666666666, 204.59829059829062, 179.6285714285714, 179.03859649122808, 183.72115384615384, 186.2936507936508, 186.3740740740741, 206.18589743589743, 218.1095890410959, 205.35249042145594, 196.30188679245282, 192.90322580645162, 194.34534534534535, 190.85669781931463, 198.42105263157896, 248.36296296296294, 273.57746478873236, 883.7307692307692, 2687.7103825136614, 2317.3518518518517, 2471.1368421052634, 2231.725, 2229.4336917562723, 2378.514814814815, 2311.8708333333334, 2256.1327160493825, 2320.864406779661, 1149.8398950131234, 225.81426202321725, 327.5768566493955, 286.06709956709955, 255.96413502109704, 253.983498349835, 227.37732656514382, 241.80661577608143, 234.04288499025338, 243.64948453608247, 246.33333333333334, 243.52428810720266, 251.58225108225108, 219.12447257383965, 213.64935064935062, 223.27188081936686, 262.5426997245179, 977.0764525993883, 651.4269662921348, 259.1782178217822, 366.1796200345423, 414.7174796747968, 973.1637931034483, 995.8062678062678, 1138.0098039215686, 451.73333333333335, 904.7608142493638, 885.9567901234568, 957.9641025641026, 2046.7790262172284, 1322.1868686868686, 1007.1929824561404, 591.3958333333334, 358.82, 475.6230529595016, 420.3462246777164, 339.78303747534517, 398.3200663349917, 413.76262626262627, 1107.6666666666667, 1322.8187500000001, 489.3653846153846, 1210.138888888889, 756.5100401606425, 851.4636752136753, 615.2629629629629, 576.3255813953489, 954.0266666666666, 774.7080459770115, 654.6723163841808, 602.8000000000001, 1155.3501199040768, 765.8132530120482, 843.3497942386831, 813.1194968553459, 669.3020257826887, 583.8333333333334, 472.10606060606057, 476.4099616858237, 484.00995024875624, 496.57347670250897, 544.3650793650794, 608.7642857142857, 536.7301587301587, 560.3097643097643, 960.5810397553518, 1195.054487179487, 1229.7222222222222, 1219.1134259259259, 1214.5116279069769, 1238.2881944444446, 1243.7916666666667, 1248.2633333333333, 1212.0787878787878, 1424.3713080168775, 1148.7333333333333, 1179.5714285714287, 1263.535519125683, 1175.8916666666667, 1155.890410958904, 1186.5, 1266.0666666666666, 1820.2222222222224, 436.48022598870057, 511.91515151515154, 1141.2753623188405, 1127.4545454545455, 1133.5438596491229, 983.5833333333334, 1128.910569105691, 835.3333333333334, 482.3888888888889, 480.8666666666666, 315.3333333333333, 314.1929824561403, 316.90476190476187, 315.6666666666667, 325.42857142857144, 595.4285714285714, 504.52592592592595, 499.8541666666667, 446, 442.6041666666667, 424.63917525773195, 479.5819209039548, 416.1395348837209, 428.8897849462366, 428.29783037475346, 407.93175853018374, 249.36458333333334, 290.58947368421053, 281.51129943502826, 263.89166666666665, 268.0644257703081, 243.45791245791247, 235.16747967479674, 229.08024691358025, 230.33132530120483, 250.33333333333334, 255.04644808743168, 228.95726495726498, 223.24780701754386, 589.2697201017812, 241.55882352941174, 249.42574257425744, 313.37142857142857, 250.12266666666667, 455.3410852713178, 242.47126436781608, 236.90650406504065, 229.95185185185187, 246.484496124031, 272.625, 243.47679324894514, 245.19634703196346, 246.07526881720432, 635.640579710145, 763.5952380952381, 402.50241545893715, 389.1963470319635, 409.6736111111111, 397.4592592592592, 402.95726495726495, 455.905303030303, 428.074433656958, 387.72463768115944, 384.1766666666667, 387.1515151515152, 406.52272727272725, 394.5842696629213, 399.25964912280705, 411.2962962962963, 425.0235294117647, 411.8513513513513, 402.61302681992333, 413.8728070175439, 386.34757834757835, 379.43162393162396, 368.99719887955183, 390.4834834834835, 407.94080996884736, 374.05654761904765, 339.63095238095235, 327.2761904761905, 332.94545454545454, 2018.857638888889, 2408.5096153846152, 2397.9449275362317, 2502.440366972477, 2529.5650793650793, 2559.563063063063, 3156.544342507645, 3412.062015503876, 3368.8695652173915, 3329.7083333333335, 3316.0764525993886, 3265.343642611684, 3234.7391304347825, 2818.0095238095237, 2271.15873015873, 2235.5942028985505, 2174.4840579710144, 2220.5178571428573, 1873.5925925925924, 270.77142857142854, 269.86309523809524, 288.8262108262108, 292.6106442577031, 270.27138643067843, 271.9040404040404, 256.88235294117646, 254.43859649122805, 260.5050505050505, 269.19444444444446, 274.914373088685, 292.07172995780587, 294.1413333333333, 250.0737704918033, 225.31831831831832, 212.3740740740741], - '_sum/ConsumptionActivePowerL3': [null, null, null, 188.60153256704982, 186.83828382838283, 187.141975308642, 191.07232704402517, 188.60269360269362, 195.99346405228758, 194.7463126843658, 202.4939393939394, 201.6758409785933, 198.54692556634305, 200.84313725490196, 192.7228070175439, 193.89377289377288, 216.50555555555556, 186.76666666666665, 189.01246105919003, 209.92241379310346, 189.6204620462046, 196.53465346534654, 211.5030303030303, 207.55445544554456, 205.90654205607476, 202.7075471698113, 200.92666666666665, 216.93851132686083, 201.9625850340136, 198.13015873015874, 192.12, 188.35534591194968, 195.831715210356, 208.79166666666666, 227.31428571428572, 216.820987654321, 210.45794392523365, 229.08333333333334, 186.74842767295596, 175.9650793650794, 206.74074074074073, 182.21183800623052, 195.93769470404985, 201.33333333333334, 205.43197278911566, 192.98019801980197, 198.11320754716982, 216.0359477124183, null, null, null, 188.40613026819923, 191.21604938271605, 178.84876543209876, 186.027027027027, 191.58479532163744, 191.4519230769231, 198.96825396825398, 218.02402402402402, 205.07000000000002, 204.26819923371647, 212.03666666666666, 204.59829059829062, 179.6285714285714, 179.03859649122808, 183.72115384615384, 186.2936507936508, 186.3740740740741, 206.18589743589743, 218.1095890410959, 205.35249042145594, 196.30188679245282, 192.90322580645162, 194.34534534534535, 190.85669781931463, 198.42105263157896, 248.36296296296294, 273.57746478873236, 883.7307692307692, 2687.7103825136614, 2317.3518518518517, 2471.1368421052634, 2231.725, 2229.4336917562723, 2378.514814814815, 2311.8708333333334, 2256.1327160493825, 2320.864406779661, 1149.8398950131234, 225.81426202321725, 327.5768566493955, 286.06709956709955, 255.96413502109704, 253.983498349835, 227.37732656514382, 241.80661577608143, 234.04288499025338, 243.64948453608247, 246.33333333333334, 243.52428810720266, 251.58225108225108, 219.12447257383965, 213.64935064935062, 223.27188081936686, 262.5426997245179, 977.0764525993883, 651.4269662921348, 259.1782178217822, 366.1796200345423, 414.7174796747968, 973.1637931034483, 995.8062678062678, 1138.0098039215686, 451.73333333333335, 904.7608142493638, 885.9567901234568, 957.9641025641026, 2046.7790262172284, 1322.1868686868686, 1007.1929824561404, 591.3958333333334, 358.82, 475.6230529595016, 420.3462246777164, 339.78303747534517, 398.3200663349917, 413.76262626262627, 1107.6666666666667, 1322.8187500000001, 489.3653846153846, 1210.138888888889, 756.5100401606425, 851.4636752136753, 615.2629629629629, 576.3255813953489, 954.0266666666666, 774.7080459770115, 654.6723163841808, 602.8000000000001, 1155.3501199040768, 765.8132530120482, 843.3497942386831, 813.1194968553459, 669.3020257826887, 583.8333333333334, 472.10606060606057, 476.4099616858237, 484.00995024875624, 496.57347670250897, 544.3650793650794, 608.7642857142857, 536.7301587301587, 560.3097643097643, 960.5810397553518, 1195.054487179487, 1229.7222222222222, 1219.1134259259259, 1214.5116279069769, 1238.2881944444446, 1243.7916666666667, 1248.2633333333333, 1212.0787878787878, 1424.3713080168775, 1148.7333333333333, 1179.5714285714287, 1263.535519125683, 1175.8916666666667, 1155.890410958904, 1186.5, 1266.0666666666666, 1820.2222222222224, 436.48022598870057, 511.91515151515154, 1141.2753623188405, 1127.4545454545455, 1133.5438596491229, 983.5833333333334, 1128.910569105691, 835.3333333333334, 482.3888888888889, 480.8666666666666, 315.3333333333333, 314.1929824561403, 316.90476190476187, 315.6666666666667, 325.42857142857144, 595.4285714285714, 504.52592592592595, 499.8541666666667, 446, 442.6041666666667, 424.63917525773195, 479.5819209039548, 416.1395348837209, 428.8897849462366, 428.29783037475346, 407.93175853018374, 249.36458333333334, 290.58947368421053, 281.51129943502826, 263.89166666666665, 268.0644257703081, 243.45791245791247, 235.16747967479674, 229.08024691358025, 230.33132530120483, 250.33333333333334, 255.04644808743168, 228.95726495726498, 223.24780701754386, 589.2697201017812, 241.55882352941174, 249.42574257425744, 313.37142857142857, 250.12266666666667, 455.3410852713178, 242.47126436781608, 236.90650406504065, 229.95185185185187, 246.484496124031, 272.625, 243.47679324894514, 245.19634703196346, 246.07526881720432, 635.640579710145, 763.5952380952381, 402.50241545893715, 389.1963470319635, 409.6736111111111, 397.4592592592592, 402.95726495726495, 455.905303030303, 428.074433656958, 387.72463768115944, 384.1766666666667, 387.1515151515152, 406.52272727272725, 394.5842696629213, 399.25964912280705, 411.2962962962963, 425.0235294117647, 411.8513513513513, 402.61302681992333, 413.8728070175439, 386.34757834757835, 379.43162393162396, 368.99719887955183, 390.4834834834835, 407.94080996884736, 374.05654761904765, 339.63095238095235, 327.2761904761905, 332.94545454545454, 2018.857638888889, 2408.5096153846152, 2397.9449275362317, 2502.440366972477, 2529.5650793650793, 2559.563063063063, 3156.544342507645, 3412.062015503876, 3368.8695652173915, 3329.7083333333335, 3316.0764525993886, 3265.343642611684, 3234.7391304347825, 2818.0095238095237, 2271.15873015873, 2235.5942028985505, 2174.4840579710144, 2220.5178571428573, 1873.5925925925924, 270.77142857142854, 269.86309523809524, 288.8262108262108, 292.6106442577031, 270.27138643067843, 271.9040404040404, 256.88235294117646, 254.43859649122805, 260.5050505050505, 269.19444444444446, 274.914373088685, 292.07172995780587, 294.1413333333333, 250.0737704918033, 225.31831831831832, 212.3740740740741], - 'evcs0/ChargePower': [null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, null, 0, 4104.142857142857, 5829.969696969697, 5806.212121212121, 6195.333333333333, 5777.333333333333, 5786.25, 5789.727272727273, 5789.571428571428, 5783.0526315789475, 5772.657142857143, 4864.8421052631575, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, 0, null, null, 0, 0, null, 0, 0, null, 0, 0, null, 0, 0, 0, 0, 0, 0, null, 0, null, null, 0, 0, null, null, 0, 0, 0, null, 0, null, null, 0, 0, null, 0, null, null, null, null, 0, null, 0, 0, null, null, null, null, null, 0, null, null, null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 0, null, 0, null, 0, 0, 0, 0, 0, 0, null, null, 0, 0, null, 0, 0, 0, null, null, 0, 0, null, 0, 0, null, null, null, 0, null, null, null, null, null, null, 0, 0, 0, null, 0, 0, 0, 0, null, 0, null, 0, null, 0, 0, 0, null, 0, 0, 0, 0, 0, 5213.0952380952385, 5787.580645161291, 5789.484848484848, 5790.818181818182, 5807.34375, 5820.136363636364, 5798.862068965517, 5809.041666666667, 5805.5625, 5794.346153846154, 5798, 5740.214285714285, 5727.242424242424, 5742.542857142857, 5753.424242424242, 5752.4, 5731.966666666666, 5734.323529411765, 5335.586206896552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null], - 'meter0/ActivePower': [124.28571428571429, 0, null, 0, 173.33333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113.33333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113.33333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113.33333333333333, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2126.875, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176.25, 175.83333333333334, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ConsumptionActivePower": [null, null, null, 565.8045977011494, 560.5148514851485, 561.425925925926, 573.2169811320755, 565.8080808080808, 587.9803921568628, 584.2389380530974, 607.4818181818182, 605.0275229357799, 595.6407766990292, 602.5294117647059, 578.1684210526316, 581.6813186813187, 649.5166666666667, 560.3, 567.0373831775701, 629.7672413793103, 568.8613861386139, 589.6039603960396, 634.5090909090909, 622.6633663366337, 617.7196261682243, 608.122641509434, 602.78, 650.8155339805825, 605.8877551020408, 594.3904761904762, 576.36, 565.066037735849, 587.495145631068, 626.375, 681.9428571428572, 650.4629629629629, 631.373831775701, 687.25, 560.2452830188679, 527.8952380952381, 620.2222222222222, 546.6355140186915, 587.8130841121496, 604, 616.295918367347, 578.940594059406, 594.3396226415094, 648.1078431372549, null, null, null, 565.2183908045977, 573.6481481481482, 536.5462962962963, 558.081081081081, 574.7543859649123, 574.3557692307693, 596.9047619047619, 654.072072072072, 615.21, 612.8045977011494, 636.11, 613.7948717948718, 538.8857142857142, 537.1157894736842, 551.1634615384615, 558.8809523809524, 559.1222222222223, 618.5576923076923, 654.3287671232877, 616.0574712643678, 588.9056603773585, 578.7096774193549, 583.0360360360361, 572.5700934579439, 595.2631578947369, 745.0888888888888, 820.7323943661971, 2651.1923076923076, 8063.131147540984, 6952.055555555556, 7413.41052631579, 6695.175, 6688.301075268817, 7135.544444444445, 6935.6125, 6768.398148148148, 6962.593220338983, 3449.51968503937, 677.4427860696518, 982.7305699481865, 858.2012987012987, 767.8924050632911, 761.950495049505, 682.1319796954315, 725.4198473282443, 702.1286549707602, 730.9484536082474, 739, 730.572864321608, 754.7467532467532, 657.373417721519, 640.9480519480519, 669.8156424581006, 787.6280991735537, 2931.229357798165, 1954.2808988764045, 777.5346534653465, 1098.538860103627, 1244.1524390243903, 2919.4913793103447, 2987.4188034188032, 3414.029411764706, 1355.2, 2714.2824427480914, 2657.8703703703704, 2873.892307692308, 6140.337078651685, 3966.560606060606, 3021.5789473684213, 1774.1875, 1076.46, 1426.8691588785048, 1261.0386740331492, 1019.3491124260355, 1194.960199004975, 1241.2878787878788, 3323, 3968.45625, 1468.0961538461538, 3630.4166666666665, 2269.5301204819275, 2554.391025641026, 1845.7888888888888, 1728.9767441860465, 2862.08, 2324.1241379310345, 1964.0169491525423, 1808.4, 3466.05035971223, 2297.4397590361446, 2530.0493827160494, 2439.3584905660377, 2007.9060773480662, 1751.5, 1416.3181818181818, 1429.2298850574712, 1452.0298507462687, 1489.720430107527, 1633.095238095238, 1826.2928571428572, 1610.1904761904761, 1680.9292929292928, 2881.743119266055, 3585.1634615384614, 3689.1666666666665, 3657.340277777778, 3643.5348837209303, 3714.8645833333335, 3731.375, 3744.79, 3636.2363636363634, 4273.113924050633, 3446.2, 3538.714285714286, 3790.6065573770493, 3527.675, 3467.671232876712, 3559.5, 3798.2, 5460.666666666667, 1309.4406779661017, 1535.7454545454545, 3423.8260869565215, 3382.3636363636365, 3400.6315789473683, 2950.75, 3386.731707317073, 2506, 1447.1666666666667, 1442.6, 946, 942.578947368421, 950.7142857142857, 947, 976.2857142857143, 1786.2857142857142, 1513.5777777777778, 1499.5625, 1338, 1327.8125, 1273.9175257731958, 1438.7457627118645, 1248.4186046511627, 1286.6693548387098, 1284.8934911242604, 1223.7952755905512, 748.09375, 871.7684210526315, 844.5338983050848, 791.675, 804.1932773109244, 730.3737373737374, 705.5024390243902, 687.2407407407408, 690.9939759036145, 751, 765.139344262295, 686.8717948717949, 669.7434210526316, 1767.8091603053435, 724.6764705882352, 748.2772277227723, 940.1142857142858, 750.368, 1366.0232558139535, 727.4137931034483, 710.719512195122, 689.8555555555556, 739.453488372093, 817.875, 730.4303797468355, 735.5890410958904, 738.2258064516129, 1906.9217391304348, 2290.785714285714, 1207.5072463768115, 1167.5890410958905, 1229.0208333333333, 1192.3777777777777, 1208.871794871795, 1367.715909090909, 1284.2233009708739, 1163.1739130434783, 1152.53, 1161.4545454545455, 1219.5681818181818, 1183.752808988764, 1197.778947368421, 1233.888888888889, 1275.070588235294, 1235.554054054054, 1207.83908045977, 1241.6184210526317, 1159.042735042735, 1138.2948717948718, 1106.9915966386554, 1171.4504504504505, 1223.822429906542, 1122.169642857143, 1018.8928571428571, 981.8285714285714, 998.8363636363637, 6056.572916666667, 7225.528846153846, 7193.834782608696, 7507.321100917431, 7588.695238095238, 7678.689189189189, 9469.633027522936, 10236.186046511628, 10106.608695652174, 9989.125, 9948.229357798165, 9796.030927835052, 9704.217391304348, 8454.028571428571, 6813.476190476191, 6706.782608695652, 6523.452173913043, 6661.553571428572, 5620.777777777777, 812.3142857142857, 809.5892857142857, 866.4786324786324, 877.8319327731092, 810.8141592920354, 815.7121212121212, 770.6470588235294, 763.3157894736842, 781.5151515151515, 807.5833333333334, 824.743119266055, 876.2151898734177, 882.424, 750.2213114754098, 675.9549549549549, 637.1222222222223], + "_sum/ConsumptionActivePowerL1": [null, null, null, 188.60153256704982, 186.83828382838283, 187.141975308642, 191.07232704402517, 188.60269360269362, 195.99346405228758, 194.7463126843658, 202.4939393939394, 201.6758409785933, 198.54692556634305, 200.84313725490196, 192.7228070175439, 193.89377289377288, 216.50555555555556, 186.76666666666665, 189.01246105919003, 209.92241379310346, 189.6204620462046, 196.53465346534654, 211.5030303030303, 207.55445544554456, 205.90654205607476, 202.7075471698113, 200.92666666666665, 216.93851132686083, 201.9625850340136, 198.13015873015874, 192.12, 188.35534591194968, 195.831715210356, 208.79166666666666, 227.31428571428572, 216.820987654321, 210.45794392523365, 229.08333333333334, 186.74842767295596, 175.9650793650794, 206.74074074074073, 182.21183800623052, 195.93769470404985, 201.33333333333334, 205.43197278911566, 192.98019801980197, 198.11320754716982, 216.0359477124183, null, null, null, 188.40613026819923, 191.21604938271605, 178.84876543209876, 186.027027027027, 191.58479532163744, 191.4519230769231, 198.96825396825398, 218.02402402402402, 205.07000000000002, 204.26819923371647, 212.03666666666666, 204.59829059829062, 179.6285714285714, 179.03859649122808, 183.72115384615384, 186.2936507936508, 186.3740740740741, 206.18589743589743, 218.1095890410959, 205.35249042145594, 196.30188679245282, 192.90322580645162, 194.34534534534535, 190.85669781931463, 198.42105263157896, 248.36296296296294, 273.57746478873236, 883.7307692307692, 2687.7103825136614, 2317.3518518518517, 2471.1368421052634, 2231.725, 2229.4336917562723, 2378.514814814815, 2311.8708333333334, 2256.1327160493825, 2320.864406779661, 1149.8398950131234, 225.81426202321725, 327.5768566493955, 286.06709956709955, 255.96413502109704, 253.983498349835, 227.37732656514382, 241.80661577608143, 234.04288499025338, 243.64948453608247, 246.33333333333334, 243.52428810720266, 251.58225108225108, 219.12447257383965, 213.64935064935062, 223.27188081936686, 262.5426997245179, 977.0764525993883, 651.4269662921348, 259.1782178217822, 366.1796200345423, 414.7174796747968, 973.1637931034483, 995.8062678062678, 1138.0098039215686, 451.73333333333335, 904.7608142493638, 885.9567901234568, 957.9641025641026, 2046.7790262172284, 1322.1868686868686, 1007.1929824561404, 591.3958333333334, 358.82, 475.6230529595016, 420.3462246777164, 339.78303747534517, 398.3200663349917, 413.76262626262627, 1107.6666666666667, 1322.8187500000001, 489.3653846153846, 1210.138888888889, 756.5100401606425, 851.4636752136753, 615.2629629629629, 576.3255813953489, 954.0266666666666, 774.7080459770115, 654.6723163841808, 602.8000000000001, 1155.3501199040768, 765.8132530120482, 843.3497942386831, 813.1194968553459, 669.3020257826887, 583.8333333333334, 472.10606060606057, 476.4099616858237, 484.00995024875624, 496.57347670250897, 544.3650793650794, 608.7642857142857, 536.7301587301587, 560.3097643097643, 960.5810397553518, 1195.054487179487, 1229.7222222222222, 1219.1134259259259, 1214.5116279069769, 1238.2881944444446, 1243.7916666666667, 1248.2633333333333, 1212.0787878787878, 1424.3713080168775, 1148.7333333333333, 1179.5714285714287, 1263.535519125683, 1175.8916666666667, 1155.890410958904, 1186.5, 1266.0666666666666, 1820.2222222222224, 436.48022598870057, 511.91515151515154, 1141.2753623188405, 1127.4545454545455, 1133.5438596491229, 983.5833333333334, 1128.910569105691, 835.3333333333334, 482.3888888888889, 480.8666666666666, 315.3333333333333, 314.1929824561403, 316.90476190476187, 315.6666666666667, 325.42857142857144, 595.4285714285714, 504.52592592592595, 499.8541666666667, 446, 442.6041666666667, 424.63917525773195, 479.5819209039548, 416.1395348837209, 428.8897849462366, 428.29783037475346, 407.93175853018374, 249.36458333333334, 290.58947368421053, 281.51129943502826, 263.89166666666665, 268.0644257703081, 243.45791245791247, 235.16747967479674, 229.08024691358025, 230.33132530120483, 250.33333333333334, 255.04644808743168, 228.95726495726498, 223.24780701754386, 589.2697201017812, 241.55882352941174, 249.42574257425744, 313.37142857142857, 250.12266666666667, 455.3410852713178, 242.47126436781608, 236.90650406504065, 229.95185185185187, 246.484496124031, 272.625, 243.47679324894514, 245.19634703196346, 246.07526881720432, 635.640579710145, 763.5952380952381, 402.50241545893715, 389.1963470319635, 409.6736111111111, 397.4592592592592, 402.95726495726495, 455.905303030303, 428.074433656958, 387.72463768115944, 384.1766666666667, 387.1515151515152, 406.52272727272725, 394.5842696629213, 399.25964912280705, 411.2962962962963, 425.0235294117647, 411.8513513513513, 402.61302681992333, 413.8728070175439, 386.34757834757835, 379.43162393162396, 368.99719887955183, 390.4834834834835, 407.94080996884736, 374.05654761904765, 339.63095238095235, 327.2761904761905, 332.94545454545454, 2018.857638888889, 2408.5096153846152, 2397.9449275362317, 2502.440366972477, 2529.5650793650793, 2559.563063063063, 3156.544342507645, 3412.062015503876, 3368.8695652173915, 3329.7083333333335, 3316.0764525993886, 3265.343642611684, 3234.7391304347825, 2818.0095238095237, 2271.15873015873, 2235.5942028985505, 2174.4840579710144, 2220.5178571428573, 1873.5925925925924, 270.77142857142854, 269.86309523809524, 288.8262108262108, 292.6106442577031, 270.27138643067843, 271.9040404040404, 256.88235294117646, 254.43859649122805, 260.5050505050505, 269.19444444444446, 274.914373088685, 292.07172995780587, 294.1413333333333, 250.0737704918033, 225.31831831831832, 212.3740740740741], + "_sum/ConsumptionActivePowerL2": [null, null, null, 188.60153256704982, 186.83828382838283, 187.141975308642, 191.07232704402517, 188.60269360269362, 195.99346405228758, 194.7463126843658, 202.4939393939394, 201.6758409785933, 198.54692556634305, 200.84313725490196, 192.7228070175439, 193.89377289377288, 216.50555555555556, 186.76666666666665, 189.01246105919003, 209.92241379310346, 189.6204620462046, 196.53465346534654, 211.5030303030303, 207.55445544554456, 205.90654205607476, 202.7075471698113, 200.92666666666665, 216.93851132686083, 201.9625850340136, 198.13015873015874, 192.12, 188.35534591194968, 195.831715210356, 208.79166666666666, 227.31428571428572, 216.820987654321, 210.45794392523365, 229.08333333333334, 186.74842767295596, 175.9650793650794, 206.74074074074073, 182.21183800623052, 195.93769470404985, 201.33333333333334, 205.43197278911566, 192.98019801980197, 198.11320754716982, 216.0359477124183, null, null, null, 188.40613026819923, 191.21604938271605, 178.84876543209876, 186.027027027027, 191.58479532163744, 191.4519230769231, 198.96825396825398, 218.02402402402402, 205.07000000000002, 204.26819923371647, 212.03666666666666, 204.59829059829062, 179.6285714285714, 179.03859649122808, 183.72115384615384, 186.2936507936508, 186.3740740740741, 206.18589743589743, 218.1095890410959, 205.35249042145594, 196.30188679245282, 192.90322580645162, 194.34534534534535, 190.85669781931463, 198.42105263157896, 248.36296296296294, 273.57746478873236, 883.7307692307692, 2687.7103825136614, 2317.3518518518517, 2471.1368421052634, 2231.725, 2229.4336917562723, 2378.514814814815, 2311.8708333333334, 2256.1327160493825, 2320.864406779661, 1149.8398950131234, 225.81426202321725, 327.5768566493955, 286.06709956709955, 255.96413502109704, 253.983498349835, 227.37732656514382, 241.80661577608143, 234.04288499025338, 243.64948453608247, 246.33333333333334, 243.52428810720266, 251.58225108225108, 219.12447257383965, 213.64935064935062, 223.27188081936686, 262.5426997245179, 977.0764525993883, 651.4269662921348, 259.1782178217822, 366.1796200345423, 414.7174796747968, 973.1637931034483, 995.8062678062678, 1138.0098039215686, 451.73333333333335, 904.7608142493638, 885.9567901234568, 957.9641025641026, 2046.7790262172284, 1322.1868686868686, 1007.1929824561404, 591.3958333333334, 358.82, 475.6230529595016, 420.3462246777164, 339.78303747534517, 398.3200663349917, 413.76262626262627, 1107.6666666666667, 1322.8187500000001, 489.3653846153846, 1210.138888888889, 756.5100401606425, 851.4636752136753, 615.2629629629629, 576.3255813953489, 954.0266666666666, 774.7080459770115, 654.6723163841808, 602.8000000000001, 1155.3501199040768, 765.8132530120482, 843.3497942386831, 813.1194968553459, 669.3020257826887, 583.8333333333334, 472.10606060606057, 476.4099616858237, 484.00995024875624, 496.57347670250897, 544.3650793650794, 608.7642857142857, 536.7301587301587, 560.3097643097643, 960.5810397553518, 1195.054487179487, 1229.7222222222222, 1219.1134259259259, 1214.5116279069769, 1238.2881944444446, 1243.7916666666667, 1248.2633333333333, 1212.0787878787878, 1424.3713080168775, 1148.7333333333333, 1179.5714285714287, 1263.535519125683, 1175.8916666666667, 1155.890410958904, 1186.5, 1266.0666666666666, 1820.2222222222224, 436.48022598870057, 511.91515151515154, 1141.2753623188405, 1127.4545454545455, 1133.5438596491229, 983.5833333333334, 1128.910569105691, 835.3333333333334, 482.3888888888889, 480.8666666666666, 315.3333333333333, 314.1929824561403, 316.90476190476187, 315.6666666666667, 325.42857142857144, 595.4285714285714, 504.52592592592595, 499.8541666666667, 446, 442.6041666666667, 424.63917525773195, 479.5819209039548, 416.1395348837209, 428.8897849462366, 428.29783037475346, 407.93175853018374, 249.36458333333334, 290.58947368421053, 281.51129943502826, 263.89166666666665, 268.0644257703081, 243.45791245791247, 235.16747967479674, 229.08024691358025, 230.33132530120483, 250.33333333333334, 255.04644808743168, 228.95726495726498, 223.24780701754386, 589.2697201017812, 241.55882352941174, 249.42574257425744, 313.37142857142857, 250.12266666666667, 455.3410852713178, 242.47126436781608, 236.90650406504065, 229.95185185185187, 246.484496124031, 272.625, 243.47679324894514, 245.19634703196346, 246.07526881720432, 635.640579710145, 763.5952380952381, 402.50241545893715, 389.1963470319635, 409.6736111111111, 397.4592592592592, 402.95726495726495, 455.905303030303, 428.074433656958, 387.72463768115944, 384.1766666666667, 387.1515151515152, 406.52272727272725, 394.5842696629213, 399.25964912280705, 411.2962962962963, 425.0235294117647, 411.8513513513513, 402.61302681992333, 413.8728070175439, 386.34757834757835, 379.43162393162396, 368.99719887955183, 390.4834834834835, 407.94080996884736, 374.05654761904765, 339.63095238095235, 327.2761904761905, 332.94545454545454, 2018.857638888889, 2408.5096153846152, 2397.9449275362317, 2502.440366972477, 2529.5650793650793, 2559.563063063063, 3156.544342507645, 3412.062015503876, 3368.8695652173915, 3329.7083333333335, 3316.0764525993886, 3265.343642611684, 3234.7391304347825, 2818.0095238095237, 2271.15873015873, 2235.5942028985505, 2174.4840579710144, 2220.5178571428573, 1873.5925925925924, 270.77142857142854, 269.86309523809524, 288.8262108262108, 292.6106442577031, 270.27138643067843, 271.9040404040404, 256.88235294117646, 254.43859649122805, 260.5050505050505, 269.19444444444446, 274.914373088685, 292.07172995780587, 294.1413333333333, 250.0737704918033, 225.31831831831832, 212.3740740740741], + "_sum/ConsumptionActivePowerL3": [null, null, null, 188.60153256704982, 186.83828382838283, 187.141975308642, 191.07232704402517, 188.60269360269362, 195.99346405228758, 194.7463126843658, 202.4939393939394, 201.6758409785933, 198.54692556634305, 200.84313725490196, 192.7228070175439, 193.89377289377288, 216.50555555555556, 186.76666666666665, 189.01246105919003, 209.92241379310346, 189.6204620462046, 196.53465346534654, 211.5030303030303, 207.55445544554456, 205.90654205607476, 202.7075471698113, 200.92666666666665, 216.93851132686083, 201.9625850340136, 198.13015873015874, 192.12, 188.35534591194968, 195.831715210356, 208.79166666666666, 227.31428571428572, 216.820987654321, 210.45794392523365, 229.08333333333334, 186.74842767295596, 175.9650793650794, 206.74074074074073, 182.21183800623052, 195.93769470404985, 201.33333333333334, 205.43197278911566, 192.98019801980197, 198.11320754716982, 216.0359477124183, null, null, null, 188.40613026819923, 191.21604938271605, 178.84876543209876, 186.027027027027, 191.58479532163744, 191.4519230769231, 198.96825396825398, 218.02402402402402, 205.07000000000002, 204.26819923371647, 212.03666666666666, 204.59829059829062, 179.6285714285714, 179.03859649122808, 183.72115384615384, 186.2936507936508, 186.3740740740741, 206.18589743589743, 218.1095890410959, 205.35249042145594, 196.30188679245282, 192.90322580645162, 194.34534534534535, 190.85669781931463, 198.42105263157896, 248.36296296296294, 273.57746478873236, 883.7307692307692, 2687.7103825136614, 2317.3518518518517, 2471.1368421052634, 2231.725, 2229.4336917562723, 2378.514814814815, 2311.8708333333334, 2256.1327160493825, 2320.864406779661, 1149.8398950131234, 225.81426202321725, 327.5768566493955, 286.06709956709955, 255.96413502109704, 253.983498349835, 227.37732656514382, 241.80661577608143, 234.04288499025338, 243.64948453608247, 246.33333333333334, 243.52428810720266, 251.58225108225108, 219.12447257383965, 213.64935064935062, 223.27188081936686, 262.5426997245179, 977.0764525993883, 651.4269662921348, 259.1782178217822, 366.1796200345423, 414.7174796747968, 973.1637931034483, 995.8062678062678, 1138.0098039215686, 451.73333333333335, 904.7608142493638, 885.9567901234568, 957.9641025641026, 2046.7790262172284, 1322.1868686868686, 1007.1929824561404, 591.3958333333334, 358.82, 475.6230529595016, 420.3462246777164, 339.78303747534517, 398.3200663349917, 413.76262626262627, 1107.6666666666667, 1322.8187500000001, 489.3653846153846, 1210.138888888889, 756.5100401606425, 851.4636752136753, 615.2629629629629, 576.3255813953489, 954.0266666666666, 774.7080459770115, 654.6723163841808, 602.8000000000001, 1155.3501199040768, 765.8132530120482, 843.3497942386831, 813.1194968553459, 669.3020257826887, 583.8333333333334, 472.10606060606057, 476.4099616858237, 484.00995024875624, 496.57347670250897, 544.3650793650794, 608.7642857142857, 536.7301587301587, 560.3097643097643, 960.5810397553518, 1195.054487179487, 1229.7222222222222, 1219.1134259259259, 1214.5116279069769, 1238.2881944444446, 1243.7916666666667, 1248.2633333333333, 1212.0787878787878, 1424.3713080168775, 1148.7333333333333, 1179.5714285714287, 1263.535519125683, 1175.8916666666667, 1155.890410958904, 1186.5, 1266.0666666666666, 1820.2222222222224, 436.48022598870057, 511.91515151515154, 1141.2753623188405, 1127.4545454545455, 1133.5438596491229, 983.5833333333334, 1128.910569105691, 835.3333333333334, 482.3888888888889, 480.8666666666666, 315.3333333333333, 314.1929824561403, 316.90476190476187, 315.6666666666667, 325.42857142857144, 595.4285714285714, 504.52592592592595, 499.8541666666667, 446, 442.6041666666667, 424.63917525773195, 479.5819209039548, 416.1395348837209, 428.8897849462366, 428.29783037475346, 407.93175853018374, 249.36458333333334, 290.58947368421053, 281.51129943502826, 263.89166666666665, 268.0644257703081, 243.45791245791247, 235.16747967479674, 229.08024691358025, 230.33132530120483, 250.33333333333334, 255.04644808743168, 228.95726495726498, 223.24780701754386, 589.2697201017812, 241.55882352941174, 249.42574257425744, 313.37142857142857, 250.12266666666667, 455.3410852713178, 242.47126436781608, 236.90650406504065, 229.95185185185187, 246.484496124031, 272.625, 243.47679324894514, 245.19634703196346, 246.07526881720432, 635.640579710145, 763.5952380952381, 402.50241545893715, 389.1963470319635, 409.6736111111111, 397.4592592592592, 402.95726495726495, 455.905303030303, 428.074433656958, 387.72463768115944, 384.1766666666667, 387.1515151515152, 406.52272727272725, 394.5842696629213, 399.25964912280705, 411.2962962962963, 425.0235294117647, 411.8513513513513, 402.61302681992333, 413.8728070175439, 386.34757834757835, 379.43162393162396, 368.99719887955183, 390.4834834834835, 407.94080996884736, 374.05654761904765, 339.63095238095235, 327.2761904761905, 332.94545454545454, 2018.857638888889, 2408.5096153846152, 2397.9449275362317, 2502.440366972477, 2529.5650793650793, 2559.563063063063, 3156.544342507645, 3412.062015503876, 3368.8695652173915, 3329.7083333333335, 3316.0764525993886, 3265.343642611684, 3234.7391304347825, 2818.0095238095237, 2271.15873015873, 2235.5942028985505, 2174.4840579710144, 2220.5178571428573, 1873.5925925925924, 270.77142857142854, 269.86309523809524, 288.8262108262108, 292.6106442577031, 270.27138643067843, 271.9040404040404, 256.88235294117646, 254.43859649122805, 260.5050505050505, 269.19444444444446, 274.914373088685, 292.07172995780587, 294.1413333333333, 250.0737704918033, 225.31831831831832, 212.3740740740741], + "evcs0/ChargePower": [null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, null, 0, 4104.142857142857, 5829.969696969697, 5806.212121212121, 6195.333333333333, 5777.333333333333, 5786.25, 5789.727272727273, 5789.571428571428, 5783.0526315789475, 5772.657142857143, 4864.8421052631575, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, 0, null, null, 0, 0, null, 0, 0, null, 0, 0, null, 0, 0, 0, 0, 0, 0, null, 0, null, null, 0, 0, null, null, 0, 0, 0, null, 0, null, null, 0, 0, null, 0, null, null, null, null, 0, null, 0, 0, null, null, null, null, null, 0, null, null, null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 0, null, 0, null, 0, 0, 0, 0, 0, 0, null, null, 0, 0, null, 0, 0, 0, null, null, 0, 0, null, 0, 0, null, null, null, 0, null, null, null, null, null, null, 0, 0, 0, null, 0, 0, 0, 0, null, 0, null, 0, null, 0, 0, 0, null, 0, 0, 0, 0, 0, 5213.0952380952385, 5787.580645161291, 5789.484848484848, 5790.818181818182, 5807.34375, 5820.136363636364, 5798.862068965517, 5809.041666666667, 5805.5625, 5794.346153846154, 5798, 5740.214285714285, 5727.242424242424, 5742.542857142857, 5753.424242424242, 5752.4, 5731.966666666666, 5734.323529411765, 5335.586206896552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null], + "meter0/ActivePower": [124.28571428571429, 0, null, 0, 173.33333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113.33333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113.33333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113.33333333333333, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2126.875, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176.25, 175.83333333333334, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], }, timestamps: ["2023-07-02T22:00:00Z", "2023-07-02T22:05:00Z", "2023-07-02T22:10:00Z", "2023-07-02T22:15:00Z", "2023-07-02T22:20:00Z", "2023-07-02T22:25:00Z", "2023-07-02T22:30:00Z", "2023-07-02T22:35:00Z", "2023-07-02T22:40:00Z", "2023-07-02T22:45:00Z", "2023-07-02T22:50:00Z", "2023-07-02T22:55:00Z", "2023-07-02T23:00:00Z", "2023-07-02T23:05:00Z", "2023-07-02T23:10:00Z", "2023-07-02T23:15:00Z", "2023-07-02T23:20:00Z", "2023-07-02T23:25:00Z", "2023-07-02T23:30:00Z", "2023-07-02T23:35:00Z", "2023-07-02T23:40:00Z", "2023-07-02T23:45:00Z", "2023-07-02T23:50:00Z", "2023-07-02T23:55:00Z", "2023-07-03T00:00:00Z", "2023-07-03T00:05:00Z", "2023-07-03T00:10:00Z", "2023-07-03T00:15:00Z", "2023-07-03T00:20:00Z", "2023-07-03T00:25:00Z", "2023-07-03T00:30:00Z", "2023-07-03T00:35:00Z", "2023-07-03T00:40:00Z", "2023-07-03T00:45:00Z", "2023-07-03T00:50:00Z", "2023-07-03T00:55:00Z", "2023-07-03T01:00:00Z", "2023-07-03T01:05:00Z", "2023-07-03T01:10:00Z", "2023-07-03T01:15:00Z", "2023-07-03T01:20:00Z", "2023-07-03T01:25:00Z", "2023-07-03T01:30:00Z", "2023-07-03T01:35:00Z", "2023-07-03T01:40:00Z", "2023-07-03T01:45:00Z", "2023-07-03T01:50:00Z", "2023-07-03T01:55:00Z", "2023-07-03T02:00:00Z", "2023-07-03T02:05:00Z", "2023-07-03T02:10:00Z", "2023-07-03T02:15:00Z", "2023-07-03T02:20:00Z", "2023-07-03T02:25:00Z", "2023-07-03T02:30:00Z", "2023-07-03T02:35:00Z", "2023-07-03T02:40:00Z", "2023-07-03T02:45:00Z", "2023-07-03T02:50:00Z", "2023-07-03T02:55:00Z", "2023-07-03T03:00:00Z", "2023-07-03T03:05:00Z", "2023-07-03T03:10:00Z", "2023-07-03T03:15:00Z", "2023-07-03T03:20:00Z", "2023-07-03T03:25:00Z", "2023-07-03T03:30:00Z", "2023-07-03T03:35:00Z", "2023-07-03T03:40:00Z", "2023-07-03T03:45:00Z", "2023-07-03T03:50:00Z", "2023-07-03T03:55:00Z", "2023-07-03T04:00:00Z", "2023-07-03T04:05:00Z", "2023-07-03T04:10:00Z", "2023-07-03T04:15:00Z", "2023-07-03T04:20:00Z", "2023-07-03T04:25:00Z", "2023-07-03T04:30:00Z", "2023-07-03T04:35:00Z", "2023-07-03T04:40:00Z", "2023-07-03T04:45:00Z", "2023-07-03T04:50:00Z", "2023-07-03T04:55:00Z", "2023-07-03T05:00:00Z", "2023-07-03T05:05:00Z", "2023-07-03T05:10:00Z", "2023-07-03T05:15:00Z", "2023-07-03T05:20:00Z", "2023-07-03T05:25:00Z", "2023-07-03T05:30:00Z", "2023-07-03T05:35:00Z", "2023-07-03T05:40:00Z", "2023-07-03T05:45:00Z", "2023-07-03T05:50:00Z", "2023-07-03T05:55:00Z", "2023-07-03T06:00:00Z", "2023-07-03T06:05:00Z", "2023-07-03T06:10:00Z", "2023-07-03T06:15:00Z", "2023-07-03T06:20:00Z", "2023-07-03T06:25:00Z", "2023-07-03T06:30:00Z", "2023-07-03T06:35:00Z", "2023-07-03T06:40:00Z", "2023-07-03T06:45:00Z", "2023-07-03T06:50:00Z", "2023-07-03T06:55:00Z", "2023-07-03T07:00:00Z", "2023-07-03T07:05:00Z", "2023-07-03T07:10:00Z", "2023-07-03T07:15:00Z", "2023-07-03T07:20:00Z", "2023-07-03T07:25:00Z", "2023-07-03T07:30:00Z", "2023-07-03T07:35:00Z", "2023-07-03T07:40:00Z", "2023-07-03T07:45:00Z", "2023-07-03T07:50:00Z", "2023-07-03T07:55:00Z", "2023-07-03T08:00:00Z", "2023-07-03T08:05:00Z", "2023-07-03T08:10:00Z", "2023-07-03T08:15:00Z", "2023-07-03T08:20:00Z", "2023-07-03T08:25:00Z", "2023-07-03T08:30:00Z", "2023-07-03T08:35:00Z", "2023-07-03T08:40:00Z", "2023-07-03T08:45:00Z", "2023-07-03T08:50:00Z", "2023-07-03T08:55:00Z", "2023-07-03T09:00:00Z", "2023-07-03T09:05:00Z", "2023-07-03T09:10:00Z", "2023-07-03T09:15:00Z", "2023-07-03T09:20:00Z", "2023-07-03T09:25:00Z", "2023-07-03T09:30:00Z", "2023-07-03T09:35:00Z", "2023-07-03T09:40:00Z", "2023-07-03T09:45:00Z", "2023-07-03T09:50:00Z", "2023-07-03T09:55:00Z", "2023-07-03T10:00:00Z", "2023-07-03T10:05:00Z", "2023-07-03T10:10:00Z", "2023-07-03T10:15:00Z", "2023-07-03T10:20:00Z", "2023-07-03T10:25:00Z", "2023-07-03T10:30:00Z", "2023-07-03T10:35:00Z", "2023-07-03T10:40:00Z", "2023-07-03T10:45:00Z", "2023-07-03T10:50:00Z", "2023-07-03T10:55:00Z", "2023-07-03T11:00:00Z", "2023-07-03T11:05:00Z", "2023-07-03T11:10:00Z", "2023-07-03T11:15:00Z", "2023-07-03T11:20:00Z", "2023-07-03T11:25:00Z", "2023-07-03T11:30:00Z", "2023-07-03T11:35:00Z", "2023-07-03T11:40:00Z", "2023-07-03T11:45:00Z", "2023-07-03T11:50:00Z", "2023-07-03T11:55:00Z", "2023-07-03T12:00:00Z", "2023-07-03T12:05:00Z", "2023-07-03T12:10:00Z", "2023-07-03T12:15:00Z", "2023-07-03T12:20:00Z", "2023-07-03T12:25:00Z", "2023-07-03T12:30:00Z", "2023-07-03T12:35:00Z", "2023-07-03T12:40:00Z", "2023-07-03T12:45:00Z", "2023-07-03T12:50:00Z", "2023-07-03T12:55:00Z", "2023-07-03T13:00:00Z", "2023-07-03T13:05:00Z", "2023-07-03T13:10:00Z", "2023-07-03T13:15:00Z", "2023-07-03T13:20:00Z", "2023-07-03T13:25:00Z", "2023-07-03T13:30:00Z", "2023-07-03T13:35:00Z", "2023-07-03T13:40:00Z", "2023-07-03T13:45:00Z", "2023-07-03T13:50:00Z", "2023-07-03T13:55:00Z", "2023-07-03T14:00:00Z", "2023-07-03T14:05:00Z", "2023-07-03T14:10:00Z", "2023-07-03T14:15:00Z", "2023-07-03T14:20:00Z", "2023-07-03T14:25:00Z", "2023-07-03T14:30:00Z", "2023-07-03T14:35:00Z", "2023-07-03T14:40:00Z", "2023-07-03T14:45:00Z", "2023-07-03T14:50:00Z", "2023-07-03T14:55:00Z", "2023-07-03T15:00:00Z", "2023-07-03T15:05:00Z", "2023-07-03T15:10:00Z", "2023-07-03T15:15:00Z", "2023-07-03T15:20:00Z", "2023-07-03T15:25:00Z", "2023-07-03T15:30:00Z", "2023-07-03T15:35:00Z", "2023-07-03T15:40:00Z", "2023-07-03T15:45:00Z", "2023-07-03T15:50:00Z", "2023-07-03T15:55:00Z", "2023-07-03T16:00:00Z", "2023-07-03T16:05:00Z", "2023-07-03T16:10:00Z", "2023-07-03T16:15:00Z", "2023-07-03T16:20:00Z", "2023-07-03T16:25:00Z", "2023-07-03T16:30:00Z", "2023-07-03T16:35:00Z", "2023-07-03T16:40:00Z", "2023-07-03T16:45:00Z", "2023-07-03T16:50:00Z", "2023-07-03T16:55:00Z", "2023-07-03T17:00:00Z", "2023-07-03T17:05:00Z", "2023-07-03T17:10:00Z", "2023-07-03T17:15:00Z", "2023-07-03T17:20:00Z", "2023-07-03T17:25:00Z", "2023-07-03T17:30:00Z", "2023-07-03T17:35:00Z", "2023-07-03T17:40:00Z", "2023-07-03T17:45:00Z", "2023-07-03T17:50:00Z", "2023-07-03T17:55:00Z", "2023-07-03T18:00:00Z", "2023-07-03T18:05:00Z", "2023-07-03T18:10:00Z", "2023-07-03T18:15:00Z", "2023-07-03T18:20:00Z", "2023-07-03T18:25:00Z", "2023-07-03T18:30:00Z", "2023-07-03T18:35:00Z", "2023-07-03T18:40:00Z", "2023-07-03T18:45:00Z", "2023-07-03T18:50:00Z", "2023-07-03T18:55:00Z", "2023-07-03T19:00:00Z", "2023-07-03T19:05:00Z", "2023-07-03T19:10:00Z", "2023-07-03T19:15:00Z", "2023-07-03T19:20:00Z", "2023-07-03T19:25:00Z", "2023-07-03T19:30:00Z", "2023-07-03T19:35:00Z", "2023-07-03T19:40:00Z", "2023-07-03T19:45:00Z", "2023-07-03T19:50:00Z", "2023-07-03T19:55:00Z", "2023-07-03T20:00:00Z", "2023-07-03T20:05:00Z", "2023-07-03T20:10:00Z", "2023-07-03T20:15:00Z", "2023-07-03T20:20:00Z", "2023-07-03T20:25:00Z", "2023-07-03T20:30:00Z", "2023-07-03T20:35:00Z", "2023-07-03T20:40:00Z", "2023-07-03T20:45:00Z", "2023-07-03T20:50:00Z", "2023-07-03T20:55:00Z", "2023-07-03T21:00:00Z", "2023-07-03T21:05:00Z", "2023-07-03T21:10:00Z", "2023-07-03T21:15:00Z", "2023-07-03T21:20:00Z", "2023-07-03T21:25:00Z", "2023-07-03T21:30:00Z", "2023-07-03T21:35:00Z", "2023-07-03T21:40:00Z", "2023-07-03T21:45:00Z", "2023-07-03T21:50:00Z", "2023-07-03T21:55:00Z"], }), @@ -47,9 +47,9 @@ export namespace History { }), dataChannelWithValues: new QueryHistoricTimeseriesDataResponse("0", { data: { - '_sum/ConsumptionActivePower': [663.9876181166504, 937.5188284518829, 761.5839462743844, 599.7653758542141, 989.6435035552682, 666.2890016920473, 1054.177495462795, 1042.9070871481858, 661.1515631183221, 734.2340980187696, 845.5174603174603, 969.5830886670582, 591.8473777253978, 1960.0339449541284, 919.7469512195122, 1232.6632911392405, 562.9648946840522, 786.2627471383975, 931.422932330827, 837.381753312946, 1112.3010184835912, 902.5108194395176, 807.5094273743017, 988.311229946524, 614.0189035916824, 868.6555377207062, 906.9389035667107, 673.3970826580227, 827.6491228070175, 851.9108776685869, 852.9105374823197, 867.4681647940075, 1303.01722614841, 950.6813929313929, 1124.7157794676807, 908.7814790139906, 1554.5020215633424, 4743.944086021505, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], - 'evcs0/ChargePower': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4586.923076923077, 4846.2192982456145, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], - 'meter0/ActivePower': [27.956773446545736, 27.93238434163701, 28.003065134099618, 27.952205882352942, 27.998854961832063, 28.116988416988416, 27.987117552334944, 28.404306220095695, 22.10508757297748, 24.58289572393098, 25.521831735889243, 33.94027565084227, 66.40016920473774, 74.85995085995086, 56.30216802168022, 40.562390158172235, 42.72727272727273, 41.85823488533704, 29.56647864625302, 26.93582887700535, 29.227223427331886, 31.081920903954803, 29.50079575596817, 29.29895178197065, 27.74064837905237, 27.340638930163447, 27.272103350827614, 27.199391171993913, 26.97577592732778, 26.88116057233704, 27.04352806414662, 26.709154929577466, 24.765209940017137, 20.726594301221166, 24.283930058284763, 27.086363636363636, 47.70666666666666, 53.07067510548523, 52.73466476462197, 54.75776892430279, 50.23135033050047, 41.280141843971634, 31.509341199606688, 26.471978392977718, 31.050412465627865, 29.384710234278668, 27.95327604726101, 28.357904496986556, 25.56408588158751, null, 26.944094488188977, 27.036082474226806, 26.367164179104478, 25.185562632696392, 26.994444444444444, 25.911782850092536, 13.431970713849909, 24.309846431797652, 25.234712230215827, 26.126705653021443, 60.64339781328848, 39.96433289299868, 37.667578659370726, 50.66542750929368, 41.89218523878437, 29.88109495295124, 26.93968253968254, 25.741935483870968, 28.64, 31.331460674157302, 30.017262638717632, 28.636402753872634, 28.408956692913385, 28.14567233384853, 28.25509028044564, 28.12612966601179, 28.175675675675677, 27.409126063418405, 27.54943984413054, 27.246363209760677, 22.96663244353183, 21.65732959850607, 22.306306306306308, 25.892307692307693, 51.8, 52.903225806451616, 59.02597402597402, 39.35110294117647, 33.87375113533152, 29.98160073597056, 26.481973434535103, 29.473684210526315, 28.432854465958776, 29.162214983713355, 28.663861386138613, 28.23558082859464, 28.460033305578683, 29.076231430805315, 28.803389830508475, 28.62062404870624, 28.578023655093475, 28.370570107858242, 27.46546431312356, 27.873293515358363, 25.733505154639175, 26.357802874743328, 27.692853246044734, 24.205128205128204, null, 26.746031746031747, 23.178571428571427, 26.16861826697892, 28.333646616541355, 26.758232235701907, 23.993934142114384, 24.71902131018153, 28.23051948051948, 28.74572127139364, 28.485825458588103, 28.22232263895165, 28.392755392755394, 28.338354151359294, 27.164207340143776, 26.949324324324323, 26.942610652663166, 27.8092203898051, 27.980593607305938, 28.26596758817922, 29.656794425087107, 25.145056246299585, 25.203214100570243, 28.82728749323227, 32.22576966932725, 31.200444197667963, 30.594259988745076, 43.34990059642147, 46.15876288659794, 33.40802469135802, 27.489320388349515, 25.818808777429467, 27.95967741935484, 28.96995139195758, 27.5499557913351, 28.341370558375633, 28.25076053889613, 27.812838360402164, 28.10333080999243, 27.840314136125656, 27.800384615384615, 27.97958397534669, 27.235769230769233, 26.924960505529224, 29.03847980997625, 27.93128390596745, 34.10349373764008, 32.7387339055794, 29.509929906542055, 37.00855745721272, 32.240085744908896, 27.701363636363638, 30.787037037037038, 25.786028602860284, 29.997148966500358, 32.89406099518459, 35.328729281767956, 25.65564738292011, 27.46238030095759, 28.27226647356988], + "_sum/ConsumptionActivePower": [663.9876181166504, 937.5188284518829, 761.5839462743844, 599.7653758542141, 989.6435035552682, 666.2890016920473, 1054.177495462795, 1042.9070871481858, 661.1515631183221, 734.2340980187696, 845.5174603174603, 969.5830886670582, 591.8473777253978, 1960.0339449541284, 919.7469512195122, 1232.6632911392405, 562.9648946840522, 786.2627471383975, 931.422932330827, 837.381753312946, 1112.3010184835912, 902.5108194395176, 807.5094273743017, 988.311229946524, 614.0189035916824, 868.6555377207062, 906.9389035667107, 673.3970826580227, 827.6491228070175, 851.9108776685869, 852.9105374823197, 867.4681647940075, 1303.01722614841, 950.6813929313929, 1124.7157794676807, 908.7814790139906, 1554.5020215633424, 4743.944086021505, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "evcs0/ChargePower": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4586.923076923077, 4846.2192982456145, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "meter0/ActivePower": [27.956773446545736, 27.93238434163701, 28.003065134099618, 27.952205882352942, 27.998854961832063, 28.116988416988416, 27.987117552334944, 28.404306220095695, 22.10508757297748, 24.58289572393098, 25.521831735889243, 33.94027565084227, 66.40016920473774, 74.85995085995086, 56.30216802168022, 40.562390158172235, 42.72727272727273, 41.85823488533704, 29.56647864625302, 26.93582887700535, 29.227223427331886, 31.081920903954803, 29.50079575596817, 29.29895178197065, 27.74064837905237, 27.340638930163447, 27.272103350827614, 27.199391171993913, 26.97577592732778, 26.88116057233704, 27.04352806414662, 26.709154929577466, 24.765209940017137, 20.726594301221166, 24.283930058284763, 27.086363636363636, 47.70666666666666, 53.07067510548523, 52.73466476462197, 54.75776892430279, 50.23135033050047, 41.280141843971634, 31.509341199606688, 26.471978392977718, 31.050412465627865, 29.384710234278668, 27.95327604726101, 28.357904496986556, 25.56408588158751, null, 26.944094488188977, 27.036082474226806, 26.367164179104478, 25.185562632696392, 26.994444444444444, 25.911782850092536, 13.431970713849909, 24.309846431797652, 25.234712230215827, 26.126705653021443, 60.64339781328848, 39.96433289299868, 37.667578659370726, 50.66542750929368, 41.89218523878437, 29.88109495295124, 26.93968253968254, 25.741935483870968, 28.64, 31.331460674157302, 30.017262638717632, 28.636402753872634, 28.408956692913385, 28.14567233384853, 28.25509028044564, 28.12612966601179, 28.175675675675677, 27.409126063418405, 27.54943984413054, 27.246363209760677, 22.96663244353183, 21.65732959850607, 22.306306306306308, 25.892307692307693, 51.8, 52.903225806451616, 59.02597402597402, 39.35110294117647, 33.87375113533152, 29.98160073597056, 26.481973434535103, 29.473684210526315, 28.432854465958776, 29.162214983713355, 28.663861386138613, 28.23558082859464, 28.460033305578683, 29.076231430805315, 28.803389830508475, 28.62062404870624, 28.578023655093475, 28.370570107858242, 27.46546431312356, 27.873293515358363, 25.733505154639175, 26.357802874743328, 27.692853246044734, 24.205128205128204, null, 26.746031746031747, 23.178571428571427, 26.16861826697892, 28.333646616541355, 26.758232235701907, 23.993934142114384, 24.71902131018153, 28.23051948051948, 28.74572127139364, 28.485825458588103, 28.22232263895165, 28.392755392755394, 28.338354151359294, 27.164207340143776, 26.949324324324323, 26.942610652663166, 27.8092203898051, 27.980593607305938, 28.26596758817922, 29.656794425087107, 25.145056246299585, 25.203214100570243, 28.82728749323227, 32.22576966932725, 31.200444197667963, 30.594259988745076, 43.34990059642147, 46.15876288659794, 33.40802469135802, 27.489320388349515, 25.818808777429467, 27.95967741935484, 28.96995139195758, 27.5499557913351, 28.341370558375633, 28.25076053889613, 27.812838360402164, 28.10333080999243, 27.840314136125656, 27.800384615384615, 27.97958397534669, 27.235769230769233, 26.924960505529224, 29.03847980997625, 27.93128390596745, 34.10349373764008, 32.7387339055794, 29.509929906542055, 37.00855745721272, 32.240085744908896, 27.701363636363638, 30.787037037037038, 25.786028602860284, 29.997148966500358, 32.89406099518459, 35.328729281767956, 25.65564738292011, 27.46238030095759, 28.27226647356988], }, timestamps: ["2023-06-25T22:00:00Z", "2023-06-25T23:00:00Z", "2023-06-26T00:00:00Z", "2023-06-26T01:00:00Z", "2023-06-26T02:00:00Z", "2023-06-26T03:00:00Z", "2023-06-26T04:00:00Z", "2023-06-26T05:00:00Z", "2023-06-26T06:00:00Z", "2023-06-26T07:00:00Z", "2023-06-26T08:00:00Z", "2023-06-26T09:00:00Z", "2023-06-26T10:00:00Z", "2023-06-26T11:00:00Z", "2023-06-26T12:00:00Z", "2023-06-26T13:00:00Z", "2023-06-26T14:00:00Z", "2023-06-26T15:00:00Z", "2023-06-26T16:00:00Z", "2023-06-26T17:00:00Z", "2023-06-26T18:00:00Z", "2023-06-26T19:00:00Z", "2023-06-26T20:00:00Z", "2023-06-26T21:00:00Z", "2023-06-26T22:00:00Z", "2023-06-26T23:00:00Z", "2023-06-27T00:00:00Z", "2023-06-27T01:00:00Z", "2023-06-27T02:00:00Z", "2023-06-27T03:00:00Z", "2023-06-27T04:00:00Z", "2023-06-27T05:00:00Z", "2023-06-27T06:00:00Z", "2023-06-27T07:00:00Z", "2023-06-27T08:00:00Z", "2023-06-27T09:00:00Z", "2023-06-27T10:00:00Z", "2023-06-27T11:00:00Z", "2023-06-27T12:00:00Z", "2023-06-27T13:00:00Z", "2023-06-27T14:00:00Z", "2023-06-27T15:00:00Z", "2023-06-27T16:00:00Z", "2023-06-27T17:00:00Z", "2023-06-27T18:00:00Z", "2023-06-27T19:00:00Z", "2023-06-27T20:00:00Z", "2023-06-27T21:00:00Z", "2023-06-27T22:00:00Z", "2023-06-27T23:00:00Z", "2023-06-28T00:00:00Z", "2023-06-28T01:00:00Z", "2023-06-28T02:00:00Z", "2023-06-28T03:00:00Z", "2023-06-28T04:00:00Z", "2023-06-28T05:00:00Z", "2023-06-28T06:00:00Z", "2023-06-28T07:00:00Z", "2023-06-28T08:00:00Z", "2023-06-28T09:00:00Z", "2023-06-28T10:00:00Z", "2023-06-28T11:00:00Z", "2023-06-28T12:00:00Z", "2023-06-28T13:00:00Z", "2023-06-28T14:00:00Z", "2023-06-28T15:00:00Z", "2023-06-28T16:00:00Z", "2023-06-28T17:00:00Z", "2023-06-28T18:00:00Z", "2023-06-28T19:00:00Z", "2023-06-28T20:00:00Z", "2023-06-28T21:00:00Z", "2023-06-28T22:00:00Z", "2023-06-28T23:00:00Z", "2023-06-29T00:00:00Z", "2023-06-29T01:00:00Z", "2023-06-29T02:00:00Z", "2023-06-29T03:00:00Z", "2023-06-29T04:00:00Z", "2023-06-29T05:00:00Z", "2023-06-29T06:00:00Z", "2023-06-29T07:00:00Z", "2023-06-29T08:00:00Z", "2023-06-29T09:00:00Z", "2023-06-29T10:00:00Z", "2023-06-29T11:00:00Z", "2023-06-29T12:00:00Z", "2023-06-29T13:00:00Z", "2023-06-29T14:00:00Z", "2023-06-29T15:00:00Z", "2023-06-29T16:00:00Z", "2023-06-29T17:00:00Z", "2023-06-29T18:00:00Z", "2023-06-29T19:00:00Z", "2023-06-29T20:00:00Z", "2023-06-29T21:00:00Z", "2023-06-29T22:00:00Z", "2023-06-29T23:00:00Z", "2023-06-30T00:00:00Z", "2023-06-30T01:00:00Z", "2023-06-30T02:00:00Z", "2023-06-30T03:00:00Z", "2023-06-30T04:00:00Z", "2023-06-30T05:00:00Z", "2023-06-30T06:00:00Z", "2023-06-30T07:00:00Z", "2023-06-30T08:00:00Z", "2023-06-30T09:00:00Z", "2023-06-30T10:00:00Z", "2023-06-30T11:00:00Z", "2023-06-30T12:00:00Z", "2023-06-30T13:00:00Z", "2023-06-30T14:00:00Z", "2023-06-30T15:00:00Z", "2023-06-30T16:00:00Z", "2023-06-30T17:00:00Z", "2023-06-30T18:00:00Z", "2023-06-30T19:00:00Z", "2023-06-30T20:00:00Z", "2023-06-30T21:00:00Z", "2023-06-30T22:00:00Z", "2023-06-30T23:00:00Z", "2023-07-01T00:00:00Z", "2023-07-01T01:00:00Z", "2023-07-01T02:00:00Z", "2023-07-01T03:00:00Z", "2023-07-01T04:00:00Z", "2023-07-01T05:00:00Z", "2023-07-01T06:00:00Z", "2023-07-01T07:00:00Z", "2023-07-01T08:00:00Z", "2023-07-01T09:00:00Z", "2023-07-01T10:00:00Z", "2023-07-01T11:00:00Z", "2023-07-01T12:00:00Z", "2023-07-01T13:00:00Z", "2023-07-01T14:00:00Z", "2023-07-01T15:00:00Z", "2023-07-01T16:00:00Z", "2023-07-01T17:00:00Z", "2023-07-01T18:00:00Z", "2023-07-01T19:00:00Z", "2023-07-01T20:00:00Z", "2023-07-01T21:00:00Z", "2023-07-01T22:00:00Z", "2023-07-01T23:00:00Z", "2023-07-02T00:00:00Z", "2023-07-02T01:00:00Z", "2023-07-02T02:00:00Z", "2023-07-02T03:00:00Z", "2023-07-02T04:00:00Z", "2023-07-02T05:00:00Z", "2023-07-02T06:00:00Z", "2023-07-02T07:00:00Z", "2023-07-02T08:00:00Z", "2023-07-02T09:00:00Z", "2023-07-02T10:00:00Z", "2023-07-02T11:00:00Z", "2023-07-02T12:00:00Z", "2023-07-02T13:00:00Z", "2023-07-02T14:00:00Z", "2023-07-02T15:00:00Z", "2023-07-02T16:00:00Z", "2023-07-02T17:00:00Z", "2023-07-02T18:00:00Z", "2023-07-02T19:00:00Z", "2023-07-02T20:00:00Z", "2023-07-02T21:00:00Z"], }), @@ -60,7 +60,7 @@ export namespace History { export const MONTH: OeTester.Types.Channels = { energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { data: { - '_sum/ConsumptionActiveEnergy': 1033427, + "_sum/ConsumptionActiveEnergy": 1033427, "evcs0/ActiveConsumptionEnergy": 328451, "meter0/ActiveProductionEnergy": 21649, }, @@ -68,7 +68,7 @@ export namespace History { energyPerPeriodChannelWithValues: new QueryHistoricTimeseriesEnergyPerPeriodResponse("0", { data: { - '_sum/ConsumptionActiveEnergy': [1784.3478512581187, 955.1978135997077, 1604.9176251387696, 1821.5474663613152, 1204.011627189301, 1037.408900359932, 1287.891020875591, 1183.057735422114, 1027.8784377276404, 1412.783196754379, 737.2379614126091, 730.6143394985477, 1727.4568452231197, 2045.4827463867603, 1289.9867373938441, 1866.5731598778827, 896.448259060122, 1271.0485678635469, 1489.7323302960576, 1367.9696489029907, 2375.6092366846033, 2368.729102836224, 2686.60326649514, 1597.0390753045413, 972.6650191463931, 1774.233690168573, 2953.838257099637, 917.3087792235759, 1172.9800154902882, null, null], + "_sum/ConsumptionActiveEnergy": [1784.3478512581187, 955.1978135997077, 1604.9176251387696, 1821.5474663613152, 1204.011627189301, 1037.408900359932, 1287.891020875591, 1183.057735422114, 1027.8784377276404, 1412.783196754379, 737.2379614126091, 730.6143394985477, 1727.4568452231197, 2045.4827463867603, 1289.9867373938441, 1866.5731598778827, 896.448259060122, 1271.0485678635469, 1489.7323302960576, 1367.9696489029907, 2375.6092366846033, 2368.729102836224, 2686.60326649514, 1597.0390753045413, 972.6650191463931, 1774.233690168573, 2953.838257099637, 917.3087792235759, 1172.9800154902882, null, null], "evcs0/ActiveConsumptionEnergy": [598.058461158158, 0, 607.3861225965935, 891.3491768679577, 269.6236843407865, 0, 306.41009901340226, 220.51407209843148, 50.15525733301707, 356.42246970726825, 0, 0, 880.0942036863182, 977.4033026217928, 210.23831546417276, 787.0712558876392, 0, 165.50743075023163, 513.2605942604259, 149.06825174512016, 883.6100586172083, 1203.117101530366, 1467.2314708234808, 553.6230686820822, 0, 714.8486366912176, 1836.7765179313803, 0, 300.374916784946, null, null], "meter0/ActiveProductionEnergy": [15.53700680772126, 13.97856617670663, 16.22420643945345, 15.425155003970989, 16.41557086346929, 15.280936198647838, 15.028196655704793, 15.146427851947054, 15.567356482244767, 17.404197969735606, 17.635152684968116, 14.140394156739468, 16.107488806188936, 16.75001277671301, 15.512752420609466, 14.951999780788457, 13.733457057782298, 16.868671206682027, 14.770978996449593, 16.47697124898351, 16.772182319685665, 16.288562161254703, 15.417362341926745, 15.892028990939403, 13.811584043067414, 14.81782772305683, 14.165639305307824, 16.223347257543285, 14.495672387672808, null, null], }, @@ -81,23 +81,23 @@ export namespace History { export const YEAR: OeTester.Types.Channels = { energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { data: { - '_sum/ConsumptionActiveEnergy': 14863655, + "_sum/ConsumptionActiveEnergy": 14863655, "_sum/ConsumptionActiveEnergyL1": 4954551, "_sum/ConsumptionActiveEnergyL2": 4954551, "_sum/ConsumptionActiveEnergyL3": 4954551, - 'evcs0/ActiveConsumptionEnergy': 2071139, - 'meter0/ActiveProductionEnergy': 1908650, + "evcs0/ActiveConsumptionEnergy": 2071139, + "meter0/ActiveProductionEnergy": 1908650, }, }), energyPerPeriodChannelWithValues: new QueryHistoricTimeseriesEnergyPerPeriodResponse("0", { data: { - '_sum/ConsumptionActiveEnergy': [1682941, 1834729, 1805222, 1934144, 1757577, 1511352, 2306988, 2029933, 0, 0, 0, 0], - '_sum/ConsumptionActiveEnergyL1': [560980.3333333334, 611576.3333333334, 601740.6666666666, 644714.6666666666, 585859, 503784, 768996, 676644.3333333334, 0, 0, 0, 0], - '_sum/ConsumptionActiveEnergyL2': [560980.3333333334, 611576.3333333334, 601740.6666666666, 644714.6666666666, 585859, 503784, 768996, 676644.3333333334, 0, 0, 0, 0], - '_sum/ConsumptionActiveEnergyL3': [560980.3333333334, 611576.3333333334, 601740.6666666666, 644714.6666666666, 585859, 503784, 768996, 676644.3333333334, 0, 0, 0, 0], - 'evcs0/ActiveConsumptionEnergy': [69104, 131703, 25773, 51085, 169943, 332522, 748189, 540740, 0, 0, 0, 0], - 'meter0/ActiveProductionEnergy': [338070, 312380, 298930, 317700, 200210, 151160, 145880, 144280, 0, 0, 0, 0], + "_sum/ConsumptionActiveEnergy": [1682941, 1834729, 1805222, 1934144, 1757577, 1511352, 2306988, 2029933, 0, 0, 0, 0], + "_sum/ConsumptionActiveEnergyL1": [560980.3333333334, 611576.3333333334, 601740.6666666666, 644714.6666666666, 585859, 503784, 768996, 676644.3333333334, 0, 0, 0, 0], + "_sum/ConsumptionActiveEnergyL2": [560980.3333333334, 611576.3333333334, 601740.6666666666, 644714.6666666666, 585859, 503784, 768996, 676644.3333333334, 0, 0, 0, 0], + "_sum/ConsumptionActiveEnergyL3": [560980.3333333334, 611576.3333333334, 601740.6666666666, 644714.6666666666, 585859, 503784, 768996, 676644.3333333334, 0, 0, 0, 0], + "evcs0/ActiveConsumptionEnergy": [69104, 131703, 25773, 51085, 169943, 332522, 748189, 540740, 0, 0, 0, 0], + "meter0/ActiveProductionEnergy": [338070, 312380, 298930, 317700, 200210, 151160, 145880, 144280, 0, 0, 0, 0], }, timestamps: ["2022-12-31T23:00:00Z", "2023-01-31T23:00:00Z", "2023-02-28T23:00:00Z", "2023-03-31T22:00:00Z", "2023-04-30T22:00:00Z", "2023-05-31T22:00:00Z", "2023-06-30T22:00:00Z", "2023-07-31T22:00:00Z", "2023-08-31T22:00:00Z", "2023-09-30T22:00:00Z", "2023-10-31T23:00:00Z", "2023-11-30T23:00:00Z"], }), diff --git a/ui/src/app/edge/history/common/consumption/chart/chart.constants.spec.ts b/ui/src/app/edge/history/common/consumption/chart/chart.constants.spec.ts index ef1030814ca..c9bc81b39a5 100644 --- a/ui/src/app/edge/history/common/consumption/chart/chart.constants.spec.ts +++ b/ui/src/app/edge/history/common/consumption/chart/chart.constants.spec.ts @@ -1,12 +1,11 @@ import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; import { OeTester } from "src/app/shared/components/shared/testing/common"; import { OeChartTester } from "src/app/shared/components/shared/testing/tester"; -import { EdgeConfig } from "src/app/shared/shared"; import { removeFunctions, TestContext } from "src/app/shared/components/shared/testing/utils.spec"; - +import { EdgeConfig } from "src/app/shared/shared"; import { ChartComponent } from "./chart"; -export function expectView(config: EdgeConfig, testContext: TestContext, chartType: 'line' | 'bar', channels: OeTester.Types.Channels, view: OeChartTester.View): void { +export function expectView(config: EdgeConfig, testContext: TestContext, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View): void { expect(removeFunctions(OeChartTester .apply(ChartComponent diff --git a/ui/src/app/edge/history/common/consumption/chart/chart.spec.ts b/ui/src/app/edge/history/common/consumption/chart/chart.spec.ts index 2ff4b493fe0..66697d1c191 100644 --- a/ui/src/app/edge/history/common/consumption/chart/chart.spec.ts +++ b/ui/src/app/edge/history/common/consumption/chart/chart.spec.ts @@ -7,7 +7,7 @@ import { DATA, LABELS } from "../../energy/chart/chart.constants.spec"; import { History } from "./channels.spec"; import { expectView } from "./chart.constants.spec"; -describe('History Consumption', () => { +describe("History Consumption", () => { const defaultEMS = DummyConfig.from( DummyConfig.Component.SOCOMEC_CONSUMPTION_METER("meter0", "Whirlpool"), DummyConfig.Component.EVCS_HARDY_BARTH("evcs0", "Charging Station"), @@ -18,21 +18,21 @@ describe('History Consumption', () => { TEST_CONTEXT = await sharedSetup(), ); - it('#getChartData()', () => { + it("#getChartData()", () => { { // Line-Chart, phases - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, { datasets: { data: [ - DATA('Gesamt: 93 kWh', [null, null, null, 0.5658045977011494, 0.5605148514851485, 0.561425925925926, 0.5732169811320755, 0.5658080808080809, 0.5879803921568627, 0.5842389380530973, 0.6074818181818182, 0.6050275229357799, 0.5956407766990292, 0.6025294117647059, 0.5781684210526317, 0.5816813186813187, 0.6495166666666666, 0.5602999999999999, 0.56703738317757, 0.6297672413793104, 0.5688613861386138, 0.5896039603960396, 0.6345090909090909, 0.6226633663366337, 0.6177196261682243, 0.608122641509434, 0.60278, 0.6508155339805825, 0.6058877551020408, 0.5943904761904762, 0.57636, 0.5650660377358491, 0.587495145631068, 0.626375, 0.6819428571428572, 0.6504629629629629, 0.6313738317757009, 0.68725, 0.5602452830188679, 0.5278952380952382, 0.6202222222222221, 0.5466355140186916, 0.5878130841121496, 0.604, 0.616295918367347, 0.5789405940594059, 0.5943396226415094, 0.6481078431372549, null, null, null, 0.5652183908045977, 0.5736481481481481, 0.5365462962962964, 0.558081081081081, 0.5747543859649124, 0.5743557692307693, 0.5969047619047619, 0.6540720720720721, 0.61521, 0.6128045977011494, 0.6361100000000001, 0.6137948717948718, 0.5388857142857142, 0.5371157894736842, 0.5511634615384615, 0.5588809523809524, 0.5591222222222223, 0.6185576923076923, 0.6543287671232877, 0.6160574712643678, 0.5889056603773585, 0.5787096774193549, 0.583036036036036, 0.572570093457944, 0.5952631578947368, 0.7450888888888888, 0.8207323943661972, 2.6511923076923076, 8.063131147540984, 6.952055555555556, 7.41341052631579, 6.695175, 6.688301075268817, 7.135544444444445, 6.9356125, 6.768398148148147, 6.962593220338983, 3.44951968503937, 0.6774427860696518, 0.9827305699481865, 0.8582012987012987, 0.7678924050632912, 0.761950495049505, 0.6821319796954315, 0.7254198473282443, 0.7021286549707602, 0.7309484536082475, 0.739, 0.730572864321608, 0.7547467532467532, 0.657373417721519, 0.6409480519480519, 0.6698156424581005, 0.7876280991735537, 2.931229357798165, 1.9542808988764044, 0.7775346534653466, 1.098538860103627, 1.2441524390243903, 2.9194913793103447, 2.9874188034188034, 3.4140294117647056, 1.3552, 2.7142824427480914, 2.6578703703703703, 2.8738923076923077, 6.140337078651685, 3.966560606060606, 3.0215789473684214, 1.7741875, 1.07646, 1.4268691588785047, 1.2610386740331492, 1.0193491124260354, 1.194960199004975, 1.2412878787878787, 3.323, 3.96845625, 1.4680961538461539, 3.6304166666666666, 2.2695301204819276, 2.554391025641026, 1.8457888888888887, 1.7289767441860464, 2.8620799999999997, 2.3241241379310345, 1.9640169491525423, 1.8084, 3.4660503597122303, 2.2974397590361444, 2.5300493827160495, 2.439358490566038, 2.0079060773480664, 1.7515, 1.4163181818181818, 1.4292298850574712, 1.4520298507462688, 1.4897204301075269, 1.6330952380952382, 1.8262928571428572, 1.6101904761904762, 1.680929292929293, 2.881743119266055, 3.5851634615384613, 3.6891666666666665, 3.6573402777777777, 3.6435348837209305, 3.7148645833333336, 3.731375, 3.74479, 3.6362363636363635, 4.273113924050633, 3.4461999999999997, 3.5387142857142857, 3.7906065573770493, 3.5276750000000003, 3.4676712328767123, 3.5595, 3.7982, 5.460666666666667, 1.3094406779661016, 1.5357454545454545, 3.4238260869565216, 3.3823636363636367, 3.4006315789473684, 2.95075, 3.386731707317073, 2.506, 1.4471666666666667, 1.4425999999999999, 0.946, 0.9425789473684211, 0.9507142857142856, 0.947, 0.9762857142857143, 1.7862857142857143, 1.5135777777777777, 1.4995625, 1.338, 1.3278125, 1.2739175257731958, 1.4387457627118645, 1.2484186046511627, 1.2866693548387098, 1.2848934911242604, 1.2237952755905512, 0.74809375, 0.8717684210526315, 0.8445338983050847, 0.7916749999999999, 0.8041932773109244, 0.7303737373737375, 0.7055024390243902, 0.6872407407407407, 0.6909939759036144, 0.751, 0.765139344262295, 0.686871794871795, 0.6697434210526315, 1.7678091603053436, 0.7246764705882353, 0.7482772277227723, 0.9401142857142858, 0.750368, 1.3660232558139536, 0.7274137931034482, 0.710719512195122, 0.6898555555555557, 0.739453488372093, 0.817875, 0.7304303797468354, 0.7355890410958904, 0.738225806451613, 1.906921739130435, 2.290785714285714, 1.2075072463768115, 1.1675890410958905, 1.2290208333333332, 1.1923777777777778, 1.2088717948717949, 1.367715909090909, 1.284223300970874, 1.1631739130434782, 1.15253, 1.1614545454545455, 1.2195681818181818, 1.183752808988764, 1.197778947368421, 1.2338888888888888, 1.275070588235294, 1.235554054054054, 1.20783908045977, 1.2416184210526318, 1.159042735042735, 1.1382948717948718, 1.1069915966386554, 1.1714504504504506, 1.223822429906542, 1.1221696428571428, 1.018892857142857, 0.9818285714285714, 0.9988363636363636, 6.056572916666667, 7.225528846153845, 7.193834782608696, 7.507321100917431, 7.588695238095238, 7.678689189189189, 9.469633027522935, 10.236186046511628, 10.106608695652174, 9.989125, 9.948229357798166, 9.796030927835051, 9.704217391304349, 8.454028571428571, 6.813476190476191, 6.706782608695652, 6.523452173913043, 6.661553571428572, 5.620777777777778, 0.8123142857142857, 0.8095892857142857, 0.8664786324786324, 0.8778319327731092, 0.8108141592920354, 0.8157121212121212, 0.7706470588235294, 0.7633157894736842, 0.7815151515151515, 0.8075833333333333, 0.824743119266055, 0.8762151898734176, 0.882424, 0.7502213114754098, 0.675954954954955, 0.6371222222222223]), - DATA('Charging Station: 13,7 kWh', [null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, null, 0, 4.104142857142857, 5.829969696969697, 5.806212121212121, 6.195333333333333, 5.777333333333333, 5.78625, 5.789727272727273, 5.789571428571429, 5.783052631578948, 5.772657142857144, 4.864842105263158, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, 0, null, null, 0, 0, null, 0, 0, null, 0, 0, null, 0, 0, 0, 0, 0, 0, null, 0, null, null, 0, 0, null, null, 0, 0, 0, null, 0, null, null, 0, 0, null, 0, null, null, null, null, 0, null, 0, 0, null, null, null, null, null, 0, null, null, null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 0, null, 0, null, 0, 0, 0, 0, 0, 0, null, null, 0, 0, null, 0, 0, 0, null, null, 0, 0, null, 0, 0, null, null, null, 0, null, null, null, null, null, null, 0, 0, 0, null, 0, 0, 0, 0, null, 0, null, 0, null, 0, 0, 0, null, 0, 0, 0, 0, 0, 5.213095238095239, 5.787580645161291, 5.7894848484848485, 5.790818181818182, 5.80734375, 5.820136363636364, 5.7988620689655175, 5.809041666666667, 5.8055625, 5.7943461538461545, 5.798, 5.740214285714285, 5.727242424242424, 5.742542857142857, 5.753424242424242, 5.7524, 5.731966666666667, 5.734323529411765, 5.335586206896552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null]), - DATA('Whirlpool: 15,9 kWh', [0.12428571428571429, 0, null, 0, 0.17333333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.11333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.11333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.11333333333333333, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.126875, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.17625, 0.17583333333333334, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Sonstiger: 63,3 kWh', [null, null, null, 0.5658045977011494, 0.3871815181518151, 0.561425925925926, 0.5732169811320755, 0.5658080808080809, 0.5879803921568627, 0.5842389380530973, 0.6074818181818182, 0.6050275229357799, 0.5956407766990292, 0.6025294117647059, 0.5781684210526317, 0.5816813186813187, 0.6495166666666666, 0.5602999999999999, 0.56703738317757, 0.6297672413793104, 0.5688613861386138, 0.5896039603960396, 0.5245090909090909, 0.5093300330033004, 0.6177196261682243, 0.608122641509434, 0.60278, 0.6508155339805825, 0.6058877551020408, 0.5943904761904762, 0.57636, 0.5650660377358491, 0.587495145631068, 0.626375, 0.6819428571428572, 0.6504629629629629, 0.6313738317757009, 0.68725, 0.5602452830188679, 0.5278952380952382, 0.6202222222222221, 0.4016355140186916, 0.5878130841121496, 0.604, 0.616295918367347, 0.5789405940594059, 0.5943396226415094, 0.6481078431372549, null, null, null, 0.5652183908045977, 0.5736481481481481, 0.5365462962962964, 0.558081081081081, 0.5747543859649124, 0.5743557692307693, 0.5969047619047619, 0.6540720720720721, 0.5018766666666667, 0.6128045977011494, 0.6361100000000001, 0.6137948717948718, 0.5388857142857142, 0.5371157894736842, 0.5511634615384615, 0.5588809523809524, 0.5591222222222223, 0.6185576923076923, 0.6543287671232877, 0.6160574712643678, 0.5889056603773585, 0.5787096774193549, 0.583036036036036, 0.572570093457944, 0.5952631578947368, 0.7450888888888888, 0.7073990610328639, -1.452950549450549, 2.233161450571287, 1.1458434343434352, 1.2180771929824568, 0.9178416666666669, 0.9020510752688171, 1.3458171717171723, 1.1460410714285718, 0.9853455165691996, 1.189936077481839, -1.4153224202237875, 0.6774427860696518, 0.9827305699481865, 0.8582012987012987, 0.7678924050632912, 0.761950495049505, 0.6821319796954315, 0.5954198473282443, 0.7021286549707602, 0.7309484536082475, 0.739, 0.730572864321608, 0.7547467532467532, 0.657373417721519, 0.6409480519480519, 0.6698156424581005, 0.7876280991735537, 2.931229357798165, 1.9542808988764044, 0.7775346534653466, 1.098538860103627, 1.2441524390243903, 2.9194913793103447, 2.9874188034188034, 3.4140294117647056, 1.2151999999999998, 2.7142824427480914, 2.6578703703703703, 2.8738923076923077, 4.013462078651685, 3.791560606060606, 2.845578947368421, 1.7741875, 0.89646, 1.2468691588785048, 1.0760386740331491, 0.8393491124260355, 1.194960199004975, 1.0562878787878787, 3.133, 3.78845625, 1.288096153846154, 3.4541666666666666, 2.0936967871485943, 2.384391025641026, 1.6707888888888887, 1.5589767441860465, 2.8620799999999997, 2.3241241379310345, 1.9640169491525423, 1.8084, 3.4660503597122303, 2.2974397590361444, 2.5300493827160495, 2.439358490566038, 2.0079060773480664, 1.7515, 1.4163181818181818, 1.4292298850574712, 1.4520298507462688, 1.4897204301075269, 1.6330952380952382, 1.8262928571428572, 1.6101904761904762, 1.680929292929293, 2.881743119266055, 3.5851634615384613, 3.6891666666666665, 3.6573402777777777, 3.6435348837209305, 3.7148645833333336, 3.731375, 3.74479, 3.6362363636363635, 4.273113924050633, 3.4461999999999997, 3.5387142857142857, 3.7906065573770493, 3.5276750000000003, 3.4676712328767123, 3.5595, 3.7982, 5.460666666666667, 1.3094406779661016, 1.5357454545454545, 3.4238260869565216, 3.3823636363636367, 3.4006315789473684, 2.95075, 3.386731707317073, 2.506, 1.4471666666666667, 1.4425999999999999, 0.946, 0.9425789473684211, 0.9507142857142856, 0.947, 0.9762857142857143, 1.7862857142857143, 1.5135777777777777, 1.4995625, 1.338, 1.3278125, 1.2739175257731958, 1.4387457627118645, 1.2484186046511627, 1.2866693548387098, 1.2848934911242604, 1.2237952755905512, 0.74809375, 0.8717684210526315, 0.8445338983050847, 0.7916749999999999, 0.8041932773109244, 0.7303737373737375, 0.7055024390243902, 0.6872407407407407, 0.6909939759036144, 0.751, 0.765139344262295, 0.686871794871795, 0.6697434210526315, 1.7678091603053436, 0.7246764705882353, 0.7482772277227723, 0.9401142857142858, 0.750368, 1.3660232558139536, 0.7274137931034482, 0.710719512195122, 0.6898555555555557, 0.739453488372093, 0.817875, 0.7304303797468354, 0.7355890410958904, 0.738225806451613, 1.906921739130435, 2.290785714285714, 1.2075072463768115, 1.1675890410958905, 1.2290208333333332, 1.1923777777777778, 1.2088717948717949, 1.367715909090909, 1.284223300970874, 1.1631739130434782, 1.15253, 1.1614545454545455, 1.2195681818181818, 1.183752808988764, 1.197778947368421, 1.2338888888888888, 1.275070588235294, 1.235554054054054, 1.20783908045977, 1.2416184210526318, 1.159042735042735, 1.1382948717948718, 1.1069915966386554, 1.1714504504504506, 1.223822429906542, 1.1221696428571428, 1.018892857142857, 0.9818285714285714, 0.9988363636363636, 0.8434776785714284, 1.4379482009925546, 1.4043499341238475, 1.7165029190992493, 1.781351488095238, 1.8585528255528247, 3.6707709585574175, 4.427144379844961, 4.301046195652174, 4.194778846153845, 4.150229357798166, 4.055816642120766, 3.976974967061925, 2.711485714285714, 1.0600519480519486, 0.954382608695652, 0.7914855072463762, 0.9272300420168067, 0.28519157088122604, 0.8123142857142857, 0.8095892857142857, 0.8664786324786324, 0.8778319327731092, 0.8108141592920354, 0.8157121212121212, 0.7706470588235294, 0.7633157894736842, 0.7815151515151515, 0.8075833333333333, 0.824743119266055, 0.8762151898734176, 0.882424, 0.7502213114754098, 0.675954954954955, 0.6371222222222223]), + DATA("Gesamt: 93 kWh", [null, null, null, 0.5658045977011494, 0.5605148514851485, 0.561425925925926, 0.5732169811320755, 0.5658080808080809, 0.5879803921568627, 0.5842389380530973, 0.6074818181818182, 0.6050275229357799, 0.5956407766990292, 0.6025294117647059, 0.5781684210526317, 0.5816813186813187, 0.6495166666666666, 0.5602999999999999, 0.56703738317757, 0.6297672413793104, 0.5688613861386138, 0.5896039603960396, 0.6345090909090909, 0.6226633663366337, 0.6177196261682243, 0.608122641509434, 0.60278, 0.6508155339805825, 0.6058877551020408, 0.5943904761904762, 0.57636, 0.5650660377358491, 0.587495145631068, 0.626375, 0.6819428571428572, 0.6504629629629629, 0.6313738317757009, 0.68725, 0.5602452830188679, 0.5278952380952382, 0.6202222222222221, 0.5466355140186916, 0.5878130841121496, 0.604, 0.616295918367347, 0.5789405940594059, 0.5943396226415094, 0.6481078431372549, null, null, null, 0.5652183908045977, 0.5736481481481481, 0.5365462962962964, 0.558081081081081, 0.5747543859649124, 0.5743557692307693, 0.5969047619047619, 0.6540720720720721, 0.61521, 0.6128045977011494, 0.6361100000000001, 0.6137948717948718, 0.5388857142857142, 0.5371157894736842, 0.5511634615384615, 0.5588809523809524, 0.5591222222222223, 0.6185576923076923, 0.6543287671232877, 0.6160574712643678, 0.5889056603773585, 0.5787096774193549, 0.583036036036036, 0.572570093457944, 0.5952631578947368, 0.7450888888888888, 0.8207323943661972, 2.6511923076923076, 8.063131147540984, 6.952055555555556, 7.41341052631579, 6.695175, 6.688301075268817, 7.135544444444445, 6.9356125, 6.768398148148147, 6.962593220338983, 3.44951968503937, 0.6774427860696518, 0.9827305699481865, 0.8582012987012987, 0.7678924050632912, 0.761950495049505, 0.6821319796954315, 0.7254198473282443, 0.7021286549707602, 0.7309484536082475, 0.739, 0.730572864321608, 0.7547467532467532, 0.657373417721519, 0.6409480519480519, 0.6698156424581005, 0.7876280991735537, 2.931229357798165, 1.9542808988764044, 0.7775346534653466, 1.098538860103627, 1.2441524390243903, 2.9194913793103447, 2.9874188034188034, 3.4140294117647056, 1.3552, 2.7142824427480914, 2.6578703703703703, 2.8738923076923077, 6.140337078651685, 3.966560606060606, 3.0215789473684214, 1.7741875, 1.07646, 1.4268691588785047, 1.2610386740331492, 1.0193491124260354, 1.194960199004975, 1.2412878787878787, 3.323, 3.96845625, 1.4680961538461539, 3.6304166666666666, 2.2695301204819276, 2.554391025641026, 1.8457888888888887, 1.7289767441860464, 2.8620799999999997, 2.3241241379310345, 1.9640169491525423, 1.8084, 3.4660503597122303, 2.2974397590361444, 2.5300493827160495, 2.439358490566038, 2.0079060773480664, 1.7515, 1.4163181818181818, 1.4292298850574712, 1.4520298507462688, 1.4897204301075269, 1.6330952380952382, 1.8262928571428572, 1.6101904761904762, 1.680929292929293, 2.881743119266055, 3.5851634615384613, 3.6891666666666665, 3.6573402777777777, 3.6435348837209305, 3.7148645833333336, 3.731375, 3.74479, 3.6362363636363635, 4.273113924050633, 3.4461999999999997, 3.5387142857142857, 3.7906065573770493, 3.5276750000000003, 3.4676712328767123, 3.5595, 3.7982, 5.460666666666667, 1.3094406779661016, 1.5357454545454545, 3.4238260869565216, 3.3823636363636367, 3.4006315789473684, 2.95075, 3.386731707317073, 2.506, 1.4471666666666667, 1.4425999999999999, 0.946, 0.9425789473684211, 0.9507142857142856, 0.947, 0.9762857142857143, 1.7862857142857143, 1.5135777777777777, 1.4995625, 1.338, 1.3278125, 1.2739175257731958, 1.4387457627118645, 1.2484186046511627, 1.2866693548387098, 1.2848934911242604, 1.2237952755905512, 0.74809375, 0.8717684210526315, 0.8445338983050847, 0.7916749999999999, 0.8041932773109244, 0.7303737373737375, 0.7055024390243902, 0.6872407407407407, 0.6909939759036144, 0.751, 0.765139344262295, 0.686871794871795, 0.6697434210526315, 1.7678091603053436, 0.7246764705882353, 0.7482772277227723, 0.9401142857142858, 0.750368, 1.3660232558139536, 0.7274137931034482, 0.710719512195122, 0.6898555555555557, 0.739453488372093, 0.817875, 0.7304303797468354, 0.7355890410958904, 0.738225806451613, 1.906921739130435, 2.290785714285714, 1.2075072463768115, 1.1675890410958905, 1.2290208333333332, 1.1923777777777778, 1.2088717948717949, 1.367715909090909, 1.284223300970874, 1.1631739130434782, 1.15253, 1.1614545454545455, 1.2195681818181818, 1.183752808988764, 1.197778947368421, 1.2338888888888888, 1.275070588235294, 1.235554054054054, 1.20783908045977, 1.2416184210526318, 1.159042735042735, 1.1382948717948718, 1.1069915966386554, 1.1714504504504506, 1.223822429906542, 1.1221696428571428, 1.018892857142857, 0.9818285714285714, 0.9988363636363636, 6.056572916666667, 7.225528846153845, 7.193834782608696, 7.507321100917431, 7.588695238095238, 7.678689189189189, 9.469633027522935, 10.236186046511628, 10.106608695652174, 9.989125, 9.948229357798166, 9.796030927835051, 9.704217391304349, 8.454028571428571, 6.813476190476191, 6.706782608695652, 6.523452173913043, 6.661553571428572, 5.620777777777778, 0.8123142857142857, 0.8095892857142857, 0.8664786324786324, 0.8778319327731092, 0.8108141592920354, 0.8157121212121212, 0.7706470588235294, 0.7633157894736842, 0.7815151515151515, 0.8075833333333333, 0.824743119266055, 0.8762151898734176, 0.882424, 0.7502213114754098, 0.675954954954955, 0.6371222222222223]), + DATA("Charging Station: 13,7 kWh", [null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, null, 0, 4.104142857142857, 5.829969696969697, 5.806212121212121, 6.195333333333333, 5.777333333333333, 5.78625, 5.789727272727273, 5.789571428571429, 5.783052631578948, 5.772657142857144, 4.864842105263158, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, 0, null, null, 0, 0, null, 0, 0, null, 0, 0, null, 0, 0, 0, 0, 0, 0, null, 0, null, null, 0, 0, null, null, 0, 0, 0, null, 0, null, null, 0, 0, null, 0, null, null, null, null, 0, null, 0, 0, null, null, null, null, null, 0, null, null, null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 0, null, 0, null, 0, 0, 0, 0, 0, 0, null, null, 0, 0, null, 0, 0, 0, null, null, 0, 0, null, 0, 0, null, null, null, 0, null, null, null, null, null, null, 0, 0, 0, null, 0, 0, 0, 0, null, 0, null, 0, null, 0, 0, 0, null, 0, 0, 0, 0, 0, 5.213095238095239, 5.787580645161291, 5.7894848484848485, 5.790818181818182, 5.80734375, 5.820136363636364, 5.7988620689655175, 5.809041666666667, 5.8055625, 5.7943461538461545, 5.798, 5.740214285714285, 5.727242424242424, 5.742542857142857, 5.753424242424242, 5.7524, 5.731966666666667, 5.734323529411765, 5.335586206896552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null]), + DATA("Whirlpool: 15,9 kWh", [0.12428571428571429, 0, null, 0, 0.17333333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.11333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.11333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.11333333333333333, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.126875, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.17625, 0.17583333333333334, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Sonstiger: 63,3 kWh", [null, null, null, 0.5658045977011494, 0.3871815181518151, 0.561425925925926, 0.5732169811320755, 0.5658080808080809, 0.5879803921568627, 0.5842389380530973, 0.6074818181818182, 0.6050275229357799, 0.5956407766990292, 0.6025294117647059, 0.5781684210526317, 0.5816813186813187, 0.6495166666666666, 0.5602999999999999, 0.56703738317757, 0.6297672413793104, 0.5688613861386138, 0.5896039603960396, 0.5245090909090909, 0.5093300330033004, 0.6177196261682243, 0.608122641509434, 0.60278, 0.6508155339805825, 0.6058877551020408, 0.5943904761904762, 0.57636, 0.5650660377358491, 0.587495145631068, 0.626375, 0.6819428571428572, 0.6504629629629629, 0.6313738317757009, 0.68725, 0.5602452830188679, 0.5278952380952382, 0.6202222222222221, 0.4016355140186916, 0.5878130841121496, 0.604, 0.616295918367347, 0.5789405940594059, 0.5943396226415094, 0.6481078431372549, null, null, null, 0.5652183908045977, 0.5736481481481481, 0.5365462962962964, 0.558081081081081, 0.5747543859649124, 0.5743557692307693, 0.5969047619047619, 0.6540720720720721, 0.5018766666666667, 0.6128045977011494, 0.6361100000000001, 0.6137948717948718, 0.5388857142857142, 0.5371157894736842, 0.5511634615384615, 0.5588809523809524, 0.5591222222222223, 0.6185576923076923, 0.6543287671232877, 0.6160574712643678, 0.5889056603773585, 0.5787096774193549, 0.583036036036036, 0.572570093457944, 0.5952631578947368, 0.7450888888888888, 0.7073990610328639, -1.452950549450549, 2.233161450571287, 1.1458434343434352, 1.2180771929824568, 0.9178416666666669, 0.9020510752688171, 1.3458171717171723, 1.1460410714285718, 0.9853455165691996, 1.189936077481839, -1.4153224202237875, 0.6774427860696518, 0.9827305699481865, 0.8582012987012987, 0.7678924050632912, 0.761950495049505, 0.6821319796954315, 0.5954198473282443, 0.7021286549707602, 0.7309484536082475, 0.739, 0.730572864321608, 0.7547467532467532, 0.657373417721519, 0.6409480519480519, 0.6698156424581005, 0.7876280991735537, 2.931229357798165, 1.9542808988764044, 0.7775346534653466, 1.098538860103627, 1.2441524390243903, 2.9194913793103447, 2.9874188034188034, 3.4140294117647056, 1.2151999999999998, 2.7142824427480914, 2.6578703703703703, 2.8738923076923077, 4.013462078651685, 3.791560606060606, 2.845578947368421, 1.7741875, 0.89646, 1.2468691588785048, 1.0760386740331491, 0.8393491124260355, 1.194960199004975, 1.0562878787878787, 3.133, 3.78845625, 1.288096153846154, 3.4541666666666666, 2.0936967871485943, 2.384391025641026, 1.6707888888888887, 1.5589767441860465, 2.8620799999999997, 2.3241241379310345, 1.9640169491525423, 1.8084, 3.4660503597122303, 2.2974397590361444, 2.5300493827160495, 2.439358490566038, 2.0079060773480664, 1.7515, 1.4163181818181818, 1.4292298850574712, 1.4520298507462688, 1.4897204301075269, 1.6330952380952382, 1.8262928571428572, 1.6101904761904762, 1.680929292929293, 2.881743119266055, 3.5851634615384613, 3.6891666666666665, 3.6573402777777777, 3.6435348837209305, 3.7148645833333336, 3.731375, 3.74479, 3.6362363636363635, 4.273113924050633, 3.4461999999999997, 3.5387142857142857, 3.7906065573770493, 3.5276750000000003, 3.4676712328767123, 3.5595, 3.7982, 5.460666666666667, 1.3094406779661016, 1.5357454545454545, 3.4238260869565216, 3.3823636363636367, 3.4006315789473684, 2.95075, 3.386731707317073, 2.506, 1.4471666666666667, 1.4425999999999999, 0.946, 0.9425789473684211, 0.9507142857142856, 0.947, 0.9762857142857143, 1.7862857142857143, 1.5135777777777777, 1.4995625, 1.338, 1.3278125, 1.2739175257731958, 1.4387457627118645, 1.2484186046511627, 1.2866693548387098, 1.2848934911242604, 1.2237952755905512, 0.74809375, 0.8717684210526315, 0.8445338983050847, 0.7916749999999999, 0.8041932773109244, 0.7303737373737375, 0.7055024390243902, 0.6872407407407407, 0.6909939759036144, 0.751, 0.765139344262295, 0.686871794871795, 0.6697434210526315, 1.7678091603053436, 0.7246764705882353, 0.7482772277227723, 0.9401142857142858, 0.750368, 1.3660232558139536, 0.7274137931034482, 0.710719512195122, 0.6898555555555557, 0.739453488372093, 0.817875, 0.7304303797468354, 0.7355890410958904, 0.738225806451613, 1.906921739130435, 2.290785714285714, 1.2075072463768115, 1.1675890410958905, 1.2290208333333332, 1.1923777777777778, 1.2088717948717949, 1.367715909090909, 1.284223300970874, 1.1631739130434782, 1.15253, 1.1614545454545455, 1.2195681818181818, 1.183752808988764, 1.197778947368421, 1.2338888888888888, 1.275070588235294, 1.235554054054054, 1.20783908045977, 1.2416184210526318, 1.159042735042735, 1.1382948717948718, 1.1069915966386554, 1.1714504504504506, 1.223822429906542, 1.1221696428571428, 1.018892857142857, 0.9818285714285714, 0.9988363636363636, 0.8434776785714284, 1.4379482009925546, 1.4043499341238475, 1.7165029190992493, 1.781351488095238, 1.8585528255528247, 3.6707709585574175, 4.427144379844961, 4.301046195652174, 4.194778846153845, 4.150229357798166, 4.055816642120766, 3.976974967061925, 2.711485714285714, 1.0600519480519486, 0.954382608695652, 0.7914855072463762, 0.9272300420168067, 0.28519157088122604, 0.8123142857142857, 0.8095892857142857, 0.8664786324786324, 0.8778319327731092, 0.8108141592920354, 0.8157121212121212, 0.7706470588235294, 0.7633157894736842, 0.7815151515151515, 0.8075833333333333, 0.824743119266055, 0.8762151898734176, 0.882424, 0.7502213114754098, 0.675954954954955, 0.6371222222222223]), ], labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.LINE_CHART_OPTIONS('hour', 'line', {}, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", {}, ), }, }); @@ -40,51 +40,51 @@ describe('History Consumption', () => { { // Line-Chart, no phases, no phasecolors - expectView(defaultEMS, TEST_CONTEXT, 'line', History.WEEK, + expectView(defaultEMS, TEST_CONTEXT, "line", History.WEEK, { datasets: { data: [ - DATA('Gesamt: 354,1 kWh', [0.6639876181166504, 0.9375188284518828, 0.7615839462743844, 0.5997653758542141, 0.9896435035552682, 0.6662890016920473, 1.054177495462795, 1.0429070871481858, 0.6611515631183221, 0.7342340980187696, 0.8455174603174603, 0.9695830886670582, 0.5918473777253977, 1.9600339449541284, 0.9197469512195122, 1.2326632911392406, 0.5629648946840522, 0.7862627471383975, 0.9314229323308271, 0.837381753312946, 1.112301018483591, 0.9025108194395176, 0.8075094273743018, 0.988311229946524, 0.6140189035916823, 0.8686555377207063, 0.9069389035667107, 0.6733970826580227, 0.8276491228070175, 0.8519108776685869, 0.8529105374823197, 0.8674681647940076, 1.3030172261484099, 0.9506813929313929, 1.1247157794676808, 0.9087814790139906, 1.5545020215633425, 4.743944086021505, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Charging Station: 157 kWh', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.586923076923077, 4.8462192982456145, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Whirlpool: 100 kWh', [0.027956773446545735, 0.02793238434163701, 0.028003065134099617, 0.02795220588235294, 0.027998854961832062, 0.028116988416988415, 0.027987117552334944, 0.028404306220095696, 0.02210508757297748, 0.02458289572393098, 0.025521831735889244, 0.03394027565084227, 0.06640016920473774, 0.07485995085995086, 0.05630216802168022, 0.040562390158172236, 0.042727272727272725, 0.04185823488533704, 0.02956647864625302, 0.02693582887700535, 0.029227223427331885, 0.031081920903954802, 0.02950079575596817, 0.02929895178197065, 0.02774064837905237, 0.027340638930163447, 0.027272103350827612, 0.027199391171993912, 0.02697577592732778, 0.02688116057233704, 0.02704352806414662, 0.026709154929577466, 0.024765209940017137, 0.020726594301221167, 0.024283930058284765, 0.027086363636363638, 0.04770666666666666, 0.05307067510548523, 0.05273466476462197, 0.054757768924302785, 0.05023135033050047, 0.041280141843971635, 0.03150934119960669, 0.026471978392977717, 0.031050412465627866, 0.029384710234278667, 0.02795327604726101, 0.028357904496986556, 0.025564085881587508, null, 0.026944094488188977, 0.027036082474226807, 0.026367164179104476, 0.025185562632696393, 0.026994444444444442, 0.025911782850092536, 0.01343197071384991, 0.024309846431797653, 0.02523471223021583, 0.026126705653021443, 0.06064339781328848, 0.03996433289299867, 0.037667578659370725, 0.050665427509293676, 0.04189218523878437, 0.02988109495295124, 0.02693968253968254, 0.025741935483870968, 0.028640000000000002, 0.031331460674157305, 0.030017262638717634, 0.028636402753872633, 0.028408956692913385, 0.02814567233384853, 0.02825509028044564, 0.028126129666011787, 0.028175675675675676, 0.027409126063418405, 0.027549439844130538, 0.027246363209760677, 0.02296663244353183, 0.02165732959850607, 0.022306306306306308, 0.025892307692307694, 0.0518, 0.05290322580645162, 0.05902597402597402, 0.03935110294117647, 0.03387375113533152, 0.02998160073597056, 0.0264819734345351, 0.029473684210526315, 0.028432854465958775, 0.029162214983713356, 0.028663861386138613, 0.02823558082859464, 0.028460033305578683, 0.029076231430805316, 0.028803389830508477, 0.02862062404870624, 0.028578023655093474, 0.02837057010785824, 0.02746546431312356, 0.027873293515358364, 0.025733505154639177, 0.02635780287474333, 0.027692853246044733, 0.024205128205128205, null, 0.026746031746031747, 0.023178571428571427, 0.026168618266978923, 0.028333646616541353, 0.026758232235701906, 0.023993934142114384, 0.02471902131018153, 0.02823051948051948, 0.028745721271393642, 0.028485825458588104, 0.02822232263895165, 0.028392755392755393, 0.028338354151359293, 0.027164207340143777, 0.02694932432432432, 0.026942610652663165, 0.027809220389805097, 0.027980593607305936, 0.02826596758817922, 0.029656794425087108, 0.025145056246299584, 0.02520321410057024, 0.02882728749323227, 0.03222576966932725, 0.031200444197667963, 0.030594259988745078, 0.04334990059642147, 0.04615876288659794, 0.03340802469135802, 0.027489320388349517, 0.025818808777429467, 0.02795967741935484, 0.028969951391957578, 0.027549955791335103, 0.02834137055837563, 0.028250760538896132, 0.027812838360402166, 0.02810333080999243, 0.027840314136125657, 0.027800384615384616, 0.027979583975346688, 0.027235769230769234, 0.026924960505529224, 0.029038479809976248, 0.02793128390596745, 0.03410349373764008, 0.0327387339055794, 0.029509929906542054, 0.03700855745721272, 0.03224008574490889, 0.02770136363636364, 0.030787037037037036, 0.025786028602860285, 0.029997148966500357, 0.03289406099518459, 0.03532872928176795, 0.025655647382920112, 0.02746238030095759, 0.02827226647356988]), - DATA('Sonstiger: 97,1 kWh', [0.6360308446701046, 0.9095864441102458, 0.7335808811402847, 0.5718131699718612, 0.9616446485934361, 0.6381720132750589, 1.02619037791046, 1.0145027809280902, 0.6390464755453447, 0.7096512022948386, 0.819995628581571, 0.935642813016216, 0.5254472085206601, 1.8851739940941776, 0.863444783197832, 1.1921009009810684, 0.5202376219567795, 0.7444045122530605, 0.901856453684574, 0.8104459244359407, 1.0830737950562592, 0.8714288985355628, 0.7780086316183336, 0.9590122781645534, 0.58627825521263, 0.8413148987905428, 0.8796668002158831, 0.6461976914860288, 0.8006733468796897, 0.8250297170962498, 0.825867009418173, 0.8407590098644301, 1.2782520162083928, 0.9299547986301717, 1.100431849409396, 0.881695115377627, -3.0801277220264014, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Gesamt: 354,1 kWh", [0.6639876181166504, 0.9375188284518828, 0.7615839462743844, 0.5997653758542141, 0.9896435035552682, 0.6662890016920473, 1.054177495462795, 1.0429070871481858, 0.6611515631183221, 0.7342340980187696, 0.8455174603174603, 0.9695830886670582, 0.5918473777253977, 1.9600339449541284, 0.9197469512195122, 1.2326632911392406, 0.5629648946840522, 0.7862627471383975, 0.9314229323308271, 0.837381753312946, 1.112301018483591, 0.9025108194395176, 0.8075094273743018, 0.988311229946524, 0.6140189035916823, 0.8686555377207063, 0.9069389035667107, 0.6733970826580227, 0.8276491228070175, 0.8519108776685869, 0.8529105374823197, 0.8674681647940076, 1.3030172261484099, 0.9506813929313929, 1.1247157794676808, 0.9087814790139906, 1.5545020215633425, 4.743944086021505, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Charging Station: 157 kWh", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.586923076923077, 4.8462192982456145, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Whirlpool: 100 kWh", [0.027956773446545735, 0.02793238434163701, 0.028003065134099617, 0.02795220588235294, 0.027998854961832062, 0.028116988416988415, 0.027987117552334944, 0.028404306220095696, 0.02210508757297748, 0.02458289572393098, 0.025521831735889244, 0.03394027565084227, 0.06640016920473774, 0.07485995085995086, 0.05630216802168022, 0.040562390158172236, 0.042727272727272725, 0.04185823488533704, 0.02956647864625302, 0.02693582887700535, 0.029227223427331885, 0.031081920903954802, 0.02950079575596817, 0.02929895178197065, 0.02774064837905237, 0.027340638930163447, 0.027272103350827612, 0.027199391171993912, 0.02697577592732778, 0.02688116057233704, 0.02704352806414662, 0.026709154929577466, 0.024765209940017137, 0.020726594301221167, 0.024283930058284765, 0.027086363636363638, 0.04770666666666666, 0.05307067510548523, 0.05273466476462197, 0.054757768924302785, 0.05023135033050047, 0.041280141843971635, 0.03150934119960669, 0.026471978392977717, 0.031050412465627866, 0.029384710234278667, 0.02795327604726101, 0.028357904496986556, 0.025564085881587508, null, 0.026944094488188977, 0.027036082474226807, 0.026367164179104476, 0.025185562632696393, 0.026994444444444442, 0.025911782850092536, 0.01343197071384991, 0.024309846431797653, 0.02523471223021583, 0.026126705653021443, 0.06064339781328848, 0.03996433289299867, 0.037667578659370725, 0.050665427509293676, 0.04189218523878437, 0.02988109495295124, 0.02693968253968254, 0.025741935483870968, 0.028640000000000002, 0.031331460674157305, 0.030017262638717634, 0.028636402753872633, 0.028408956692913385, 0.02814567233384853, 0.02825509028044564, 0.028126129666011787, 0.028175675675675676, 0.027409126063418405, 0.027549439844130538, 0.027246363209760677, 0.02296663244353183, 0.02165732959850607, 0.022306306306306308, 0.025892307692307694, 0.0518, 0.05290322580645162, 0.05902597402597402, 0.03935110294117647, 0.03387375113533152, 0.02998160073597056, 0.0264819734345351, 0.029473684210526315, 0.028432854465958775, 0.029162214983713356, 0.028663861386138613, 0.02823558082859464, 0.028460033305578683, 0.029076231430805316, 0.028803389830508477, 0.02862062404870624, 0.028578023655093474, 0.02837057010785824, 0.02746546431312356, 0.027873293515358364, 0.025733505154639177, 0.02635780287474333, 0.027692853246044733, 0.024205128205128205, null, 0.026746031746031747, 0.023178571428571427, 0.026168618266978923, 0.028333646616541353, 0.026758232235701906, 0.023993934142114384, 0.02471902131018153, 0.02823051948051948, 0.028745721271393642, 0.028485825458588104, 0.02822232263895165, 0.028392755392755393, 0.028338354151359293, 0.027164207340143777, 0.02694932432432432, 0.026942610652663165, 0.027809220389805097, 0.027980593607305936, 0.02826596758817922, 0.029656794425087108, 0.025145056246299584, 0.02520321410057024, 0.02882728749323227, 0.03222576966932725, 0.031200444197667963, 0.030594259988745078, 0.04334990059642147, 0.04615876288659794, 0.03340802469135802, 0.027489320388349517, 0.025818808777429467, 0.02795967741935484, 0.028969951391957578, 0.027549955791335103, 0.02834137055837563, 0.028250760538896132, 0.027812838360402166, 0.02810333080999243, 0.027840314136125657, 0.027800384615384616, 0.027979583975346688, 0.027235769230769234, 0.026924960505529224, 0.029038479809976248, 0.02793128390596745, 0.03410349373764008, 0.0327387339055794, 0.029509929906542054, 0.03700855745721272, 0.03224008574490889, 0.02770136363636364, 0.030787037037037036, 0.025786028602860285, 0.029997148966500357, 0.03289406099518459, 0.03532872928176795, 0.025655647382920112, 0.02746238030095759, 0.02827226647356988]), + DATA("Sonstiger: 97,1 kWh", [0.6360308446701046, 0.9095864441102458, 0.7335808811402847, 0.5718131699718612, 0.9616446485934361, 0.6381720132750589, 1.02619037791046, 1.0145027809280902, 0.6390464755453447, 0.7096512022948386, 0.819995628581571, 0.935642813016216, 0.5254472085206601, 1.8851739940941776, 0.863444783197832, 1.1921009009810684, 0.5202376219567795, 0.7444045122530605, 0.901856453684574, 0.8104459244359407, 1.0830737950562592, 0.8714288985355628, 0.7780086316183336, 0.9590122781645534, 0.58627825521263, 0.8413148987905428, 0.8796668002158831, 0.6461976914860288, 0.8006733468796897, 0.8250297170962498, 0.825867009418173, 0.8407590098644301, 1.2782520162083928, 0.9299547986301717, 1.100431849409396, 0.881695115377627, -3.0801277220264014, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), ], labels: LABELS(History.WEEK.dataChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.LINE_CHART_OPTIONS('day', 'line', {}), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("day", "line", {}), }, }); } { // Bar-Chart, no phases, no phasecolors - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, { datasets: { data: [ - DATA('Gesamt: 1.033,4 kWh', [1.7843478512581188, 0.9551978135997077, 1.6049176251387696, 1.8215474663613151, 1.2040116271893009, 1.037408900359932, 1.287891020875591, 1.1830577354221141, 1.0278784377276404, 1.4127831967543791, 0.7372379614126091, 0.7306143394985477, 1.7274568452231196, 2.04548274638676, 1.289986737393844, 1.8665731598778827, 0.896448259060122, 1.2710485678635468, 1.4897323302960577, 1.3679696489029907, 2.3756092366846033, 2.3687291028362236, 2.68660326649514, 1.5970390753045414, 0.9726650191463931, 1.7742336901685731, 2.953838257099637, 0.9173087792235759, 1.1729800154902883, null, null]), - DATA('Charging Station: 328,5 kWh', [0.598058461158158, 0, 0.6073861225965935, 0.8913491768679577, 0.2696236843407865, 0, 0.30641009901340227, 0.2205140720984315, 0.05015525733301707, 0.35642246970726826, 0, 0, 0.8800942036863182, 0.9774033026217929, 0.21023831546417276, 0.7870712558876392, 0, 0.16550743075023164, 0.5132605942604259, 0.14906825174512017, 0.8836100586172083, 1.2031171015303659, 1.4672314708234808, 0.5536230686820822, 0, 0.7148486366912177, 1.8367765179313804, 0, 0.300374916784946, null, null]), - DATA('Whirlpool: 21,6 kWh', [0.01553700680772126, 0.01397856617670663, 0.01622420643945345, 0.01542515500397099, 0.01641557086346929, 0.015280936198647838, 0.015028196655704793, 0.015146427851947055, 0.015567356482244768, 0.017404197969735604, 0.017635152684968115, 0.014140394156739467, 0.016107488806188935, 0.01675001277671301, 0.015512752420609467, 0.014951999780788457, 0.013733457057782297, 0.016868671206682027, 0.014770978996449592, 0.01647697124898351, 0.016772182319685667, 0.016288562161254704, 0.015417362341926746, 0.015892028990939402, 0.013811584043067414, 0.01481782772305683, 0.014165639305307825, 0.016223347257543284, 0.014495672387672808, null, null]), - DATA('Sonstiger: 683,3 kWh', [1.1707523832922395, 0.941219247423001, 0.9813072961027226, 0.9147731344893865, 0.9179723719850451, 1.0221279641612842, 0.9664527252064838, 0.9473972354717356, 0.9621558239123786, 1.0389565290773752, 0.719602808727641, 0.7164739453418082, 0.8312551527306125, 1.0513294309882544, 1.0642356695090618, 1.0645499042094553, 0.8827148020023398, 1.0886724659066331, 0.9617007570391821, 1.202424425908887, 1.4752269957477093, 1.149323439144603, 1.2039544333297325, 1.0275239776315197, 0.9588534351033258, 1.0445672257542986, 1.1028960998629487, 0.9010854319660326, 0.8581094263176695, null, null]), + DATA("Gesamt: 1.033,4 kWh", [1.7843478512581188, 0.9551978135997077, 1.6049176251387696, 1.8215474663613151, 1.2040116271893009, 1.037408900359932, 1.287891020875591, 1.1830577354221141, 1.0278784377276404, 1.4127831967543791, 0.7372379614126091, 0.7306143394985477, 1.7274568452231196, 2.04548274638676, 1.289986737393844, 1.8665731598778827, 0.896448259060122, 1.2710485678635468, 1.4897323302960577, 1.3679696489029907, 2.3756092366846033, 2.3687291028362236, 2.68660326649514, 1.5970390753045414, 0.9726650191463931, 1.7742336901685731, 2.953838257099637, 0.9173087792235759, 1.1729800154902883, null, null]), + DATA("Charging Station: 328,5 kWh", [0.598058461158158, 0, 0.6073861225965935, 0.8913491768679577, 0.2696236843407865, 0, 0.30641009901340227, 0.2205140720984315, 0.05015525733301707, 0.35642246970726826, 0, 0, 0.8800942036863182, 0.9774033026217929, 0.21023831546417276, 0.7870712558876392, 0, 0.16550743075023164, 0.5132605942604259, 0.14906825174512017, 0.8836100586172083, 1.2031171015303659, 1.4672314708234808, 0.5536230686820822, 0, 0.7148486366912177, 1.8367765179313804, 0, 0.300374916784946, null, null]), + DATA("Whirlpool: 21,6 kWh", [0.01553700680772126, 0.01397856617670663, 0.01622420643945345, 0.01542515500397099, 0.01641557086346929, 0.015280936198647838, 0.015028196655704793, 0.015146427851947055, 0.015567356482244768, 0.017404197969735604, 0.017635152684968115, 0.014140394156739467, 0.016107488806188935, 0.01675001277671301, 0.015512752420609467, 0.014951999780788457, 0.013733457057782297, 0.016868671206682027, 0.014770978996449592, 0.01647697124898351, 0.016772182319685667, 0.016288562161254704, 0.015417362341926746, 0.015892028990939402, 0.013811584043067414, 0.01481782772305683, 0.014165639305307825, 0.016223347257543284, 0.014495672387672808, null, null]), + DATA("Sonstiger: 683,3 kWh", [1.1707523832922395, 0.941219247423001, 0.9813072961027226, 0.9147731344893865, 0.9179723719850451, 1.0221279641612842, 0.9664527252064838, 0.9473972354717356, 0.9621558239123786, 1.0389565290773752, 0.719602808727641, 0.7164739453418082, 0.8312551527306125, 1.0513294309882544, 1.0642356695090618, 1.0645499042094553, 0.8827148020023398, 1.0886724659066331, 0.9617007570391821, 1.202424425908887, 1.4752269957477093, 1.149323439144603, 1.2039544333297325, 1.0275239776315197, 0.9588534351033258, 1.0445672257542986, 1.1028960998629487, 0.9010854319660326, 0.8581094263176695, null, null]), ], labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.BAR_CHART_OPTIONS('day', 'bar', {}), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), }, }); } { // Bar-Chart, phases - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.YEAR, + expectView(defaultEMS, TEST_CONTEXT, "bar", History.YEAR, { datasets: { data: [ - DATA('Gesamt: 14.863,7 kWh', [1682.941, 1834.729, 1805.222, 1934.144, 1757.577, 1511.352, 2306.988, 2029.933, 0, 0, 0, 0]), - DATA('Charging Station: 2.071,1 kWh', [69.104, 131.703, 25.773, 51.085, 169.943, 332.522, 748.189, 540.74, 0, 0, 0, 0]), - DATA('Whirlpool: 1.908,7 kWh', [338.07, 312.38, 298.93, 317.7, 200.21, 151.16, 145.88, 144.28, 0, 0, 0, 0]), - DATA('Sonstiger: 10.883,9 kWh', [1275.767, 1390.6460000000002, 1480.519, 1565.359, 1387.424, 1027.67, 1412.9189999999999, 1344.913, 0, 0, 0, 0]), + DATA("Gesamt: 14.863,7 kWh", [1682.941, 1834.729, 1805.222, 1934.144, 1757.577, 1511.352, 2306.988, 2029.933, 0, 0, 0, 0]), + DATA("Charging Station: 2.071,1 kWh", [69.104, 131.703, 25.773, 51.085, 169.943, 332.522, 748.189, 540.74, 0, 0, 0, 0]), + DATA("Whirlpool: 1.908,7 kWh", [338.07, 312.38, 298.93, 317.7, 200.21, 151.16, 145.88, 144.28, 0, 0, 0, 0]), + DATA("Sonstiger: 10.883,9 kWh", [1275.767, 1390.6460000000002, 1480.519, 1565.359, 1387.424, 1027.67, 1412.9189999999999, 1344.913, 0, 0, 0, 0]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.BAR_CHART_OPTIONS('month', 'bar', {}), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("month", "bar", {}), }, }); } diff --git a/ui/src/app/edge/history/common/consumption/chart/chart.ts b/ui/src/app/edge/history/common/consumption/chart/chart.ts index 2c5f3b436bb..bc5474bde75 100644 --- a/ui/src/app/edge/history/common/consumption/chart/chart.ts +++ b/ui/src/app/edge/history/common/consumption/chart/chart.ts @@ -1,47 +1,47 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig, Utils } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig, Utils } from "src/app/shared/shared"; @Component({ - selector: 'consumptionchart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', + selector: "consumptionchart", + templateUrl: "../../../../../shared/components/chart/abstracthistorychart.html", }) export class ChartComponent extends AbstractHistoryChart { public static getChartData(config: EdgeConfig, translate: TranslateService): HistoryUtils.ChartData { const inputChannel: HistoryUtils.InputChannel[] = [{ - name: 'ConsumptionActivePower', - powerChannel: ChannelAddress.fromString('_sum/ConsumptionActivePower'), - energyChannel: ChannelAddress.fromString('_sum/ConsumptionActiveEnergy'), + name: "ConsumptionActivePower", + powerChannel: ChannelAddress.fromString("_sum/ConsumptionActivePower"), + energyChannel: ChannelAddress.fromString("_sum/ConsumptionActiveEnergy"), }]; const evcsComponents: EdgeConfig.Component[] = config.getComponentsImplementingNature("io.openems.edge.evcs.api.Evcs") .filter(component => !( - component.factoryId == 'Evcs.Cluster' || - component.factoryId == 'Evcs.Cluster.PeakShaving' || - component.factoryId == 'Evcs.Cluster.SelfConsumption')); + component.factoryId == "Evcs.Cluster" || + component.factoryId == "Evcs.Cluster.PeakShaving" || + component.factoryId == "Evcs.Cluster.SelfConsumption")); const consumptionMeters: EdgeConfig.Component[] = config.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && config.isTypeConsumptionMetered(component)); evcsComponents.forEach(component => { inputChannel.push({ - name: component.id + '/ChargePower', - powerChannel: ChannelAddress.fromString(component.id + '/ChargePower'), - energyChannel: ChannelAddress.fromString(component.id + '/ActiveConsumptionEnergy'), + name: component.id + "/ChargePower", + powerChannel: ChannelAddress.fromString(component.id + "/ChargePower"), + energyChannel: ChannelAddress.fromString(component.id + "/ActiveConsumptionEnergy"), }); }); consumptionMeters.forEach(meter => { inputChannel.push({ - name: meter.id + '/ActivePower', - powerChannel: ChannelAddress.fromString(meter.id + '/ActivePower'), - energyChannel: ChannelAddress.fromString(meter.id + '/ActiveProductionEnergy'), + name: meter.id + "/ActivePower", + powerChannel: ChannelAddress.fromString(meter.id + "/ActivePower"), + energyChannel: ChannelAddress.fromString(meter.id + "/ActiveProductionEnergy"), }); }); @@ -53,41 +53,41 @@ export class ChartComponent extends AbstractHistoryChart { output: (data: HistoryUtils.ChannelData) => { const datasets: HistoryUtils.DisplayValue[] = []; datasets.push({ - name: translate.instant('General.TOTAL'), + name: translate.instant("General.TOTAL"), nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues?.result.data['_sum/ConsumptionActiveEnergy']; + return energyValues?.result.data["_sum/ConsumptionActiveEnergy"]; }, converter: () => { - return data['ConsumptionActivePower'] ?? null; + return data["ConsumptionActivePower"] ?? null; }, - color: 'rgb(253,197,7)', + color: "rgb(253,197,7)", stack: 0, }); - const evcsComponentColors: string[] = ['rgb(0,223,0)', 'rgb(0,178,0)', 'rgb(0,201,0)', 'rgb(0,134,0)', 'rgb(0,156,0)']; + const evcsComponentColors: string[] = ["rgb(0,223,0)", "rgb(0,178,0)", "rgb(0,201,0)", "rgb(0,134,0)", "rgb(0,156,0)"]; evcsComponents.forEach((component, index) => { datasets.push({ name: component.alias, nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues?.result.data[component.id + '/ActiveConsumptionEnergy']; + return energyValues?.result.data[component.id + "/ActiveConsumptionEnergy"]; }, converter: () => { - return data[component.id + '/ChargePower'] ?? null; + return data[component.id + "/ChargePower"] ?? null; }, color: evcsComponentColors[Math.min(index, (evcsComponentColors.length - 1))], stack: 1, }); }); - const consumptionMeterColors: string[] = ['rgb(220,20,60)', 'rgb(202, 158, 6', 'rgb(228, 177, 6)', 'rgb(177, 138, 5)', 'rgb(152, 118, 4)']; + const consumptionMeterColors: string[] = ["rgb(220,20,60)", "rgb(202, 158, 6", "rgb(228, 177, 6)", "rgb(177, 138, 5)", "rgb(152, 118, 4)"]; consumptionMeters.forEach((meter, index) => { datasets.push({ name: meter.alias, nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues?.result.data[meter.id + '/ActiveProductionEnergy']; + return energyValues?.result.data[meter.id + "/ActiveProductionEnergy"]; }, converter: () => { - return data[meter.id + '/ActivePower'] ?? null; + return data[meter.id + "/ActivePower"] ?? null; }, color: consumptionMeterColors[Math.min(index, (consumptionMeterColors.length - 1))], stack: 1, @@ -97,14 +97,14 @@ export class ChartComponent extends AbstractHistoryChart { // other consumption if (consumptionMeters.length > 0 || evcsComponents.length > 0) { datasets.push({ - name: translate.instant('General.otherConsumption'), + name: translate.instant("General.otherConsumption"), nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { return Utils.calculateOtherConsumptionTotal(energyValues, evcsComponents, consumptionMeters); }, converter: () => { return Utils.calculateOtherConsumption(data, evcsComponents, consumptionMeters); }, - color: 'rgb(0,0,0)', + color: "rgb(0,0,0)", stack: 1, }); } @@ -112,12 +112,12 @@ export class ChartComponent extends AbstractHistoryChart { return datasets; }, tooltip: { - formatNumber: '1.0-2', + formatNumber: "1.0-2", }, yAxes: [ { - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }], }; diff --git a/ui/src/app/edge/history/common/consumption/details/chart/channels.spec.ts b/ui/src/app/edge/history/common/consumption/details/chart/channels.spec.ts new file mode 100644 index 00000000000..3f907efebad --- /dev/null +++ b/ui/src/app/edge/history/common/consumption/details/chart/channels.spec.ts @@ -0,0 +1,62 @@ +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; +import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; + + +export namespace History { + + /** + * up to 288 datapoints (5 min aggregated values) from a + * + * {@link Day.energyPerPeriodChannelWithValues} and {@link Day.dataChannelWithValues} + * */ + export const DAY: OeTester.Types.Channels = ({ + energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { + data: { + "evcs0/ActiveConsumptionEnergy": 15930, + "_sum/ConsumptionActiveEnergy": 15930, + "meter0/ActiveProductionEnergy": 15930, + }, + }), + dataChannelWithValues: new QueryHistoricTimeseriesDataResponse("0", { + data: { + "evcs0/ChargePower": [124, 0, null, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2127, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176, 176, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "meter0/ActivePower": [124, 0, null, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2127, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176, 176, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "meter0/ActivePowerL1": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "meter0/ActivePowerL2": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "meter0/ActivePowerL3": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ConsumptionActivePower": [124, 0, null, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2127, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176, 176, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ConsumptionActivePowerL1": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ConsumptionActivePowerL2": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ConsumptionActivePowerL3": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + + }, + timestamps: ["2023-07-02T22:00:00Z", "2023-07-02T22:05:00Z", "2023-07-02T22:10:00Z", "2023-07-02T22:15:00Z", "2023-07-02T22:20:00Z", "2023-07-02T22:25:00Z", "2023-07-02T22:30:00Z", "2023-07-02T22:35:00Z", "2023-07-02T22:40:00Z", "2023-07-02T22:45:00Z", "2023-07-02T22:50:00Z", "2023-07-02T22:55:00Z", "2023-07-02T23:00:00Z", "2023-07-02T23:05:00Z", "2023-07-02T23:10:00Z", "2023-07-02T23:15:00Z", "2023-07-02T23:20:00Z", "2023-07-02T23:25:00Z", "2023-07-02T23:30:00Z", "2023-07-02T23:35:00Z", "2023-07-02T23:40:00Z", "2023-07-02T23:45:00Z", "2023-07-02T23:50:00Z", "2023-07-02T23:55:00Z", "2023-07-03T00:00:00Z", "2023-07-03T00:05:00Z", "2023-07-03T00:10:00Z", "2023-07-03T00:15:00Z", "2023-07-03T00:20:00Z", "2023-07-03T00:25:00Z", "2023-07-03T00:30:00Z", "2023-07-03T00:35:00Z", "2023-07-03T00:40:00Z", "2023-07-03T00:45:00Z", "2023-07-03T00:50:00Z", "2023-07-03T00:55:00Z", "2023-07-03T01:00:00Z", "2023-07-03T01:05:00Z", "2023-07-03T01:10:00Z", "2023-07-03T01:15:00Z", "2023-07-03T01:20:00Z", "2023-07-03T01:25:00Z", "2023-07-03T01:30:00Z", "2023-07-03T01:35:00Z", "2023-07-03T01:40:00Z", "2023-07-03T01:45:00Z", "2023-07-03T01:50:00Z", "2023-07-03T01:55:00Z", "2023-07-03T02:00:00Z", "2023-07-03T02:05:00Z", "2023-07-03T02:10:00Z", "2023-07-03T02:15:00Z", "2023-07-03T02:20:00Z", "2023-07-03T02:25:00Z", "2023-07-03T02:30:00Z", "2023-07-03T02:35:00Z", "2023-07-03T02:40:00Z", "2023-07-03T02:45:00Z", "2023-07-03T02:50:00Z", "2023-07-03T02:55:00Z", "2023-07-03T03:00:00Z", "2023-07-03T03:05:00Z", "2023-07-03T03:10:00Z", "2023-07-03T03:15:00Z", "2023-07-03T03:20:00Z", "2023-07-03T03:25:00Z", "2023-07-03T03:30:00Z", "2023-07-03T03:35:00Z", "2023-07-03T03:40:00Z", "2023-07-03T03:45:00Z", "2023-07-03T03:50:00Z", "2023-07-03T03:55:00Z", "2023-07-03T04:00:00Z", "2023-07-03T04:05:00Z", "2023-07-03T04:10:00Z", "2023-07-03T04:15:00Z", "2023-07-03T04:20:00Z", "2023-07-03T04:25:00Z", "2023-07-03T04:30:00Z", "2023-07-03T04:35:00Z", "2023-07-03T04:40:00Z", "2023-07-03T04:45:00Z", "2023-07-03T04:50:00Z", "2023-07-03T04:55:00Z", "2023-07-03T05:00:00Z", "2023-07-03T05:05:00Z", "2023-07-03T05:10:00Z", "2023-07-03T05:15:00Z", "2023-07-03T05:20:00Z", "2023-07-03T05:25:00Z", "2023-07-03T05:30:00Z", "2023-07-03T05:35:00Z", "2023-07-03T05:40:00Z", "2023-07-03T05:45:00Z", "2023-07-03T05:50:00Z", "2023-07-03T05:55:00Z", "2023-07-03T06:00:00Z", "2023-07-03T06:05:00Z", "2023-07-03T06:10:00Z", "2023-07-03T06:15:00Z", "2023-07-03T06:20:00Z", "2023-07-03T06:25:00Z", "2023-07-03T06:30:00Z", "2023-07-03T06:35:00Z", "2023-07-03T06:40:00Z", "2023-07-03T06:45:00Z", "2023-07-03T06:50:00Z", "2023-07-03T06:55:00Z", "2023-07-03T07:00:00Z", "2023-07-03T07:05:00Z", "2023-07-03T07:10:00Z", "2023-07-03T07:15:00Z", "2023-07-03T07:20:00Z", "2023-07-03T07:25:00Z", "2023-07-03T07:30:00Z", "2023-07-03T07:35:00Z", "2023-07-03T07:40:00Z", "2023-07-03T07:45:00Z", "2023-07-03T07:50:00Z", "2023-07-03T07:55:00Z", "2023-07-03T08:00:00Z", "2023-07-03T08:05:00Z", "2023-07-03T08:10:00Z", "2023-07-03T08:15:00Z", "2023-07-03T08:20:00Z", "2023-07-03T08:25:00Z", "2023-07-03T08:30:00Z", "2023-07-03T08:35:00Z", "2023-07-03T08:40:00Z", "2023-07-03T08:45:00Z", "2023-07-03T08:50:00Z", "2023-07-03T08:55:00Z", "2023-07-03T09:00:00Z", "2023-07-03T09:05:00Z", "2023-07-03T09:10:00Z", "2023-07-03T09:15:00Z", "2023-07-03T09:20:00Z", "2023-07-03T09:25:00Z", "2023-07-03T09:30:00Z", "2023-07-03T09:35:00Z", "2023-07-03T09:40:00Z", "2023-07-03T09:45:00Z", "2023-07-03T09:50:00Z", "2023-07-03T09:55:00Z", "2023-07-03T10:00:00Z", "2023-07-03T10:05:00Z", "2023-07-03T10:10:00Z", "2023-07-03T10:15:00Z", "2023-07-03T10:20:00Z", "2023-07-03T10:25:00Z", "2023-07-03T10:30:00Z", "2023-07-03T10:35:00Z", "2023-07-03T10:40:00Z", "2023-07-03T10:45:00Z", "2023-07-03T10:50:00Z", "2023-07-03T10:55:00Z", "2023-07-03T11:00:00Z", "2023-07-03T11:05:00Z", "2023-07-03T11:10:00Z", "2023-07-03T11:15:00Z", "2023-07-03T11:20:00Z", "2023-07-03T11:25:00Z", "2023-07-03T11:30:00Z", "2023-07-03T11:35:00Z", "2023-07-03T11:40:00Z", "2023-07-03T11:45:00Z", "2023-07-03T11:50:00Z", "2023-07-03T11:55:00Z", "2023-07-03T12:00:00Z", "2023-07-03T12:05:00Z", "2023-07-03T12:10:00Z", "2023-07-03T12:15:00Z", "2023-07-03T12:20:00Z", "2023-07-03T12:25:00Z", "2023-07-03T12:30:00Z", "2023-07-03T12:35:00Z", "2023-07-03T12:40:00Z", "2023-07-03T12:45:00Z", "2023-07-03T12:50:00Z", "2023-07-03T12:55:00Z", "2023-07-03T13:00:00Z", "2023-07-03T13:05:00Z", "2023-07-03T13:10:00Z", "2023-07-03T13:15:00Z", "2023-07-03T13:20:00Z", "2023-07-03T13:25:00Z", "2023-07-03T13:30:00Z", "2023-07-03T13:35:00Z", "2023-07-03T13:40:00Z", "2023-07-03T13:45:00Z", "2023-07-03T13:50:00Z", "2023-07-03T13:55:00Z", "2023-07-03T14:00:00Z", "2023-07-03T14:05:00Z", "2023-07-03T14:10:00Z", "2023-07-03T14:15:00Z", "2023-07-03T14:20:00Z", "2023-07-03T14:25:00Z", "2023-07-03T14:30:00Z", "2023-07-03T14:35:00Z", "2023-07-03T14:40:00Z", "2023-07-03T14:45:00Z", "2023-07-03T14:50:00Z", "2023-07-03T14:55:00Z", "2023-07-03T15:00:00Z", "2023-07-03T15:05:00Z", "2023-07-03T15:10:00Z", "2023-07-03T15:15:00Z", "2023-07-03T15:20:00Z", "2023-07-03T15:25:00Z", "2023-07-03T15:30:00Z", "2023-07-03T15:35:00Z", "2023-07-03T15:40:00Z", "2023-07-03T15:45:00Z", "2023-07-03T15:50:00Z", "2023-07-03T15:55:00Z", "2023-07-03T16:00:00Z", "2023-07-03T16:05:00Z", "2023-07-03T16:10:00Z", "2023-07-03T16:15:00Z", "2023-07-03T16:20:00Z", "2023-07-03T16:25:00Z", "2023-07-03T16:30:00Z", "2023-07-03T16:35:00Z", "2023-07-03T16:40:00Z", "2023-07-03T16:45:00Z", "2023-07-03T16:50:00Z", "2023-07-03T16:55:00Z", "2023-07-03T17:00:00Z", "2023-07-03T17:05:00Z", "2023-07-03T17:10:00Z", "2023-07-03T17:15:00Z", "2023-07-03T17:20:00Z", "2023-07-03T17:25:00Z", "2023-07-03T17:30:00Z", "2023-07-03T17:35:00Z", "2023-07-03T17:40:00Z", "2023-07-03T17:45:00Z", "2023-07-03T17:50:00Z", "2023-07-03T17:55:00Z", "2023-07-03T18:00:00Z", "2023-07-03T18:05:00Z", "2023-07-03T18:10:00Z", "2023-07-03T18:15:00Z", "2023-07-03T18:20:00Z", "2023-07-03T18:25:00Z", "2023-07-03T18:30:00Z", "2023-07-03T18:35:00Z", "2023-07-03T18:40:00Z", "2023-07-03T18:45:00Z", "2023-07-03T18:50:00Z", "2023-07-03T18:55:00Z", "2023-07-03T19:00:00Z", "2023-07-03T19:05:00Z", "2023-07-03T19:10:00Z", "2023-07-03T19:15:00Z", "2023-07-03T19:20:00Z", "2023-07-03T19:25:00Z", "2023-07-03T19:30:00Z", "2023-07-03T19:35:00Z", "2023-07-03T19:40:00Z", "2023-07-03T19:45:00Z", "2023-07-03T19:50:00Z", "2023-07-03T19:55:00Z", "2023-07-03T20:00:00Z", "2023-07-03T20:05:00Z", "2023-07-03T20:10:00Z", "2023-07-03T20:15:00Z", "2023-07-03T20:20:00Z", "2023-07-03T20:25:00Z", "2023-07-03T20:30:00Z", "2023-07-03T20:35:00Z", "2023-07-03T20:40:00Z", "2023-07-03T20:45:00Z", "2023-07-03T20:50:00Z", "2023-07-03T20:55:00Z", "2023-07-03T21:00:00Z", "2023-07-03T21:05:00Z", "2023-07-03T21:10:00Z", "2023-07-03T21:15:00Z", "2023-07-03T21:20:00Z", "2023-07-03T21:25:00Z", "2023-07-03T21:30:00Z", "2023-07-03T21:35:00Z", "2023-07-03T21:40:00Z", "2023-07-03T21:45:00Z", "2023-07-03T21:50:00Z", "2023-07-03T21:55:00Z"], + }), + }); + + /** + * up to 31 datapoints(1 day values) from a {@link Day.energyPerPeriodChannelWithValues} and {@link Day.dataChannelWithValues}*/ + export const MONTH: OeTester.Types.Channels = { + energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { + data: { + "evcs0/ActiveConsumptionEnergy": 21649, + "_sum/ConsumptionActiveEnergy": 21649, + "meter0/ActiveProductionEnergy": 21649, + }, + }), + energyPerPeriodChannelWithValues: + new QueryHistoricTimeseriesEnergyPerPeriodResponse("0", { + data: { + "evcs0/ActiveConsumptionEnergy": [16, 14, 16, 15, 16, 15, 15, 15, 16, 17, 18, 14, 16, 17, 16, 15, 14, 17, 15, 16, 17, 16, 15, 16, 14, 15, 14, 16, 14, null, null], + "_sum/ConsumptionActiveEnergy": [16, 14, 16, 15, 16, 15, 15, 15, 16, 17, 18, 14, 16, 17, 16, 15, 14, 17, 15, 16, 17, 16, 15, 16, 14, 15, 14, 16, 14, null, null], + "meter0/ActiveProductionEnergy": [16, 14, 16, 15, 16, 15, 15, 15, 16, 17, 18, 14, 16, 17, 16, 15, 14, 17, 15, 16, 17, 16, 15, 16, 14, 15, 14, 16, 14, null, null], + "meter0/ActiveProductionEnergyL1": [5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, null, null], + "meter0/ActiveProductionEnergyL2": [5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, null, null], + "meter0/ActiveProductionEnergyL3": [5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, null, null], + }, + timestamps: ["2023-05-31T22:00:00Z", "2023-06-01T22:00:00Z", "2023-06-02T22:00:00Z", "2023-06-03T22:00:00Z", "2023-06-04T22:00:00Z", "2023-06-05T22:00:00Z", "2023-06-06T22:00:00Z", "2023-06-07T22:00:00Z", "2023-06-08T22:00:00Z", "2023-06-09T22:00:00Z", "2023-06-10T22:00:00Z", "2023-06-11T22:00:00Z", "2023-06-12T22:00:00Z", "2023-06-13T22:00:00Z", "2023-06-14T22:00:00Z", "2023-06-15T22:00:00Z", "2023-06-16T22:00:00Z", "2023-06-17T22:00:00Z", "2023-06-18T22:00:00Z", "2023-06-19T22:00:00Z", "2023-06-20T22:00:00Z", "2023-06-21T22:00:00Z", "2023-06-22T22:00:00Z", "2023-06-23T22:00:00Z", "2023-06-24T22:00:00Z", "2023-06-25T22:00:00Z", "2023-06-26T22:00:00Z", "2023-06-27T22:00:00Z", "2023-06-28T22:00:00Z", "2023-06-29T22:00:00Z"], + }), + }; +} diff --git a/ui/src/app/edge/history/common/consumption/details/chart/chart.ts b/ui/src/app/edge/history/common/consumption/details/chart/chart.ts deleted file mode 100644 index 56430b4557c..00000000000 --- a/ui/src/app/edge/history/common/consumption/details/chart/chart.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { Phase } from 'src/app/shared/components/shared/phase'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress } from 'src/app/shared/shared'; - -@Component({ - selector: 'consumptionMeterChart', - templateUrl: '../../../../../../shared/components/chart/abstracthistorychart.html', -}) -export class ChartComponent extends AbstractHistoryChart { - - protected override getChartData(): HistoryUtils.ChartData { - - const component = this.config?.getComponent(this.route.snapshot.params.componentId); - - const isConsumptionMetered: boolean = this.config?.hasComponentNature("io.openems.edge.meter.api.ElectricityMeter", component?.id) - && this.config?.isTypeConsumptionMetered(component); - const isEvcs: boolean = this.config?.hasComponentNature("io.openems.edge.evcs.api.Evcs", component?.id) - && (component?.factoryId !== 'Evcs.Cluster.SelfConsumption') - && component?.factoryId !== 'Evcs.Cluster.PeakShaving' - && component?.isEnabled !== false; - const channels: HistoryUtils.InputChannel[] = []; - - if (isEvcs) { - channels.push({ - name: component.id, - powerChannel: ChannelAddress.fromString(component.id + '/ChargePower'), - energyChannel: ChannelAddress.fromString(component.id + '/ActiveConsumptionEnergy'), - }); - } - - if (isConsumptionMetered) { - channels.push({ - name: component.id, - powerChannel: ChannelAddress.fromString(component.id + '/ActivePower'), - energyChannel: ChannelAddress.fromString(component.id + '/ActiveProductionEnergy'), - }); - - channels.push(...Phase.THREE_PHASE.map(phase => ({ - name: 'ConsumptionActivePower' + phase, - powerChannel: ChannelAddress.fromString(component.id + '/ActivePower' + phase), - energyChannel: ChannelAddress.fromString(component.id + '/ActiveProductionEnergy' + phase), - }))); - } - - const chartObject: HistoryUtils.ChartData = { - input: channels, - output: (data: HistoryUtils.ChannelData) => { - const datasets: HistoryUtils.DisplayValue[] = []; - datasets.push({ - name: component.alias, - nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyQueryResponse.result.data[isEvcs ? component.id + '/ActiveConsumptionEnergy' : component.id + '/ActiveProductionEnergy']; - }, - converter: () => { - return data[component.id]; - }, - color: 'rgb(0,152,204)', - hiddenOnInit: false, - stack: 2, - }); - - if (!isConsumptionMetered) { - return datasets; - } - - datasets.push(...Phase.THREE_PHASE.map((phase, i) => ({ - name: "Phase " + phase, - nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data[component.id + '/ActiveProductionEnergy' + phase], - converter: () => - data['ConsumptionActivePower' + phase], - color: 'rgb(' + AbstractHistoryChart.phaseColors[i] + ')', - stack: 3, - }))); - - return datasets; - }, - tooltip: { - formatNumber: '1.1-2', - afterTitle: this.translate.instant('General.TOTAL'), - }, - yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', - yAxisId: ChartAxis.LEFT, - }], - }; - - return chartObject; - } -} diff --git a/ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.spec.ts b/ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.spec.ts new file mode 100644 index 00000000000..c73384cbce2 --- /dev/null +++ b/ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.spec.ts @@ -0,0 +1,64 @@ +// @ts-strict-ignore +import { ActivatedRoute } from "@angular/router"; +import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { OeChartTester } from "src/app/shared/components/shared/testing/tester"; +import { removeFunctions, sharedSetupWithComponentIdRoute, TestContext } from "src/app/shared/components/shared/testing/utils.spec"; +import { EdgeConfig } from "src/app/shared/shared"; +import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; +import { History } from "./channels.spec"; +import { ConsumptionMeterChartDetailsComponent } from "./consumptionMeter"; + +describe("History Consumption Details - consumptionMeters", () => { + const defaultEMS = DummyConfig.from( + DummyConfig.Component.SOCOMEC_CONSUMPTION_METER("meter0"), + ); + + let TEST_CONTEXT: TestContext & { route: ActivatedRoute }; + beforeEach(async () => { + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("meter0"); + }); + + it("#getChartData()", () => { + { + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, + { + datasets: { + data: [ + DATA("meter0: 15,9 kWh", [0.124, 0, null, 0, 0.173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.127, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.176, 0.176, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L1", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L2", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L3", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + ], + labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, + ), + }, + }); + } + { + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, + { + datasets: { + data: [ + DATA("meter0: 21,6 kWh", [0.016, 0.014, 0.016, 0.015, 0.016, 0.015, 0.015, 0.015, 0.016, 0.017, 0.018, 0.014, 0.016, 0.017, 0.016, 0.015, 0.014, 0.017, 0.015, 0.016, 0.017, 0.016, 0.015, 0.016, 0.014, 0.015, 0.014, 0.016, 0.014, null, null]), + DATA("Phase L1", [0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.006, 0.006, 0.005, 0.005, 0.006, 0.005, 0.005, 0.005, 0.006, 0.005, 0.005, 0.006, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, null, null]), + DATA("Phase L2", [0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.006, 0.006, 0.005, 0.005, 0.006, 0.005, 0.005, 0.005, 0.006, 0.005, 0.005, 0.006, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, null, null]), + DATA("Phase L3", [0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.006, 0.006, 0.005, 0.005, 0.006, 0.005, 0.005, 0.005, 0.006, 0.005, 0.005, 0.006, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005, null, null]), + ], + labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), + }, + }); + } + }); +}); + +export function expectView(config: EdgeConfig, testContext: TestContext & { route: ActivatedRoute }, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View): void { + expect(removeFunctions(OeChartTester + .apply(ConsumptionMeterChartDetailsComponent + .getChartData( + DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), testContext.route, + testContext.translate), chartType, channels, testContext, config))) + .toEqual(removeFunctions(view)); +} diff --git a/ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.ts b/ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.ts new file mode 100644 index 00000000000..7fd59547f17 --- /dev/null +++ b/ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.ts @@ -0,0 +1,63 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { Phase } from "src/app/shared/components/shared/phase"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; + +@Component({ + selector: "consumptionMeterChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", +}) +export class ConsumptionMeterChartDetailsComponent extends AbstractHistoryChart { + + public static getChartData(config: EdgeConfig, route: ActivatedRoute, translate: TranslateService): HistoryUtils.ChartData { + const component = config?.getComponent(route.snapshot.params.componentId); + return { + input: [{ + name: component.id, + powerChannel: ChannelAddress.fromString(component.id + "/ActivePower"), + energyChannel: ChannelAddress.fromString(component.id + "/ActiveProductionEnergy"), + }, + ...Phase.THREE_PHASE.map(phase => ({ + name: "ConsumptionActivePower" + phase, + powerChannel: ChannelAddress.fromString(component.id + "/ActivePower" + phase), + energyChannel: ChannelAddress.fromString(component.id + "/ActiveProductionEnergy" + phase), + }))], + output: (data: HistoryUtils.ChannelData) => [ + { + name: component.alias, + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data[component.id + "/ActiveProductionEnergy"], + converter: () => data[component.id], + color: "rgb(0,152,204)", + hiddenOnInit: false, + stack: 2, + }, + + ...Phase.THREE_PHASE.map((phase, i) => ({ + name: "Phase " + phase, + converter: () => + data["ConsumptionActivePower" + phase], + color: "rgb(" + AbstractHistoryChart.phaseColors[i] + ")", + stack: 3, + })), + ], + tooltip: { + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), + }, + yAxes: [{ + unit: YAxisType.ENERGY, + position: "left", + yAxisId: ChartAxis.LEFT, + }], + }; + } + + protected override getChartData(): HistoryUtils.ChartData { + return ConsumptionMeterChartDetailsComponent.getChartData(this.config, this.route, this.translate); + } + +} diff --git a/ui/src/app/edge/history/common/consumption/details/chart/evcs.spec.ts b/ui/src/app/edge/history/common/consumption/details/chart/evcs.spec.ts new file mode 100644 index 00000000000..75a40f7b0ba --- /dev/null +++ b/ui/src/app/edge/history/common/consumption/details/chart/evcs.spec.ts @@ -0,0 +1,58 @@ +// @ts-strict-ignore +import { ActivatedRoute } from "@angular/router"; +import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { OeChartTester } from "src/app/shared/components/shared/testing/tester"; +import { removeFunctions, sharedSetupWithComponentIdRoute, TestContext } from "src/app/shared/components/shared/testing/utils.spec"; +import { EdgeConfig } from "src/app/shared/shared"; +import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; +import { History } from "./channels.spec"; +import { EvcsChartDetailsComponent } from "./evcs"; + +describe("History Consumption Details - evcs", () => { + const defaultEMS = DummyConfig.from( + DummyConfig.Component.EVCS_KEBA_KECONTACT("evcs0", "Charging Station"), + ); + + let TEST_CONTEXT: TestContext & { route: ActivatedRoute }; + beforeEach(async () => { + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("evcs0"); + }); + + it("#getChartData() - evcs", () => { + { + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, + { + datasets: { + data: [ + DATA("Charging Station: 15,9 kWh", [0.124, 0, null, 0, 0.173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.127, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.176, 0.176, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + ], + labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, + ), + }, + }); + } + { + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, + { + datasets: { + data: [ + DATA("Charging Station: 21,6 kWh", [0.016, 0.014, 0.016, 0.015, 0.016, 0.015, 0.015, 0.015, 0.016, 0.017, 0.018, 0.014, 0.016, 0.017, 0.016, 0.015, 0.014, 0.017, 0.015, 0.016, 0.017, 0.016, 0.015, 0.016, 0.014, 0.015, 0.014, 0.016, 0.014, null, null]), + ], + labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), + }, + }); + } + }); +}); + +export function expectView(config: EdgeConfig, testContext: TestContext & { route: ActivatedRoute }, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View): void { + expect(removeFunctions(OeChartTester + .apply(EvcsChartDetailsComponent + .getChartData( + DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), testContext.route, + testContext.translate), chartType, channels, testContext, config))) + .toEqual(removeFunctions(view)); +} diff --git a/ui/src/app/edge/history/common/consumption/details/chart/evcs.ts b/ui/src/app/edge/history/common/consumption/details/chart/evcs.ts new file mode 100644 index 00000000000..62e58482cfe --- /dev/null +++ b/ui/src/app/edge/history/common/consumption/details/chart/evcs.ts @@ -0,0 +1,47 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; + +@Component({ + selector: "evcsChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", +}) +export class EvcsChartDetailsComponent extends AbstractHistoryChart { + + public static getChartData(config: EdgeConfig, route: ActivatedRoute, translate: TranslateService): HistoryUtils.ChartData { + + const component = config?.getComponent(route.snapshot.params.componentId); + return { + input: [{ + name: component.id, + powerChannel: ChannelAddress.fromString(component.id + "/ChargePower"), + energyChannel: ChannelAddress.fromString(component.id + "/ActiveConsumptionEnergy"), + }], + output: (data: HistoryUtils.ChannelData) => [{ + name: component.alias, + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data[component.id + "/ActiveConsumptionEnergy"], + converter: () => data[component.id], + color: "rgb(0,152,204)", + hiddenOnInit: false, + stack: 2, + }], + tooltip: { + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), + }, + yAxes: [{ + unit: YAxisType.ENERGY, + position: "left", + yAxisId: ChartAxis.LEFT, + }], + }; + } + + protected override getChartData(): HistoryUtils.ChartData { + return EvcsChartDetailsComponent.getChartData(this.config, this.route, this.translate); + } +} diff --git a/ui/src/app/edge/history/common/consumption/details/chart/sum.spec.ts b/ui/src/app/edge/history/common/consumption/details/chart/sum.spec.ts new file mode 100644 index 00000000000..0192ff39015 --- /dev/null +++ b/ui/src/app/edge/history/common/consumption/details/chart/sum.spec.ts @@ -0,0 +1,61 @@ +// @ts-strict-ignore +import { ActivatedRoute } from "@angular/router"; +import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { OeChartTester } from "src/app/shared/components/shared/testing/tester"; +import { removeFunctions, sharedSetupWithComponentIdRoute, TestContext } from "src/app/shared/components/shared/testing/utils.spec"; +import { EdgeConfig } from "src/app/shared/shared"; +import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; +import { History } from "./channels.spec"; +import { SumChartDetailsComponent } from "./sum"; + +describe("History Production Details - _sum", () => { + const defaultEMS = DummyConfig.from( + DummyConfig.Component.SUM("_sum", "Gesamt"), + ); + + let TEST_CONTEXT: TestContext & { route: ActivatedRoute }; + beforeEach(async () => { + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("_sum"); + }); + + it("#getChartData()", () => { + { + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, + { + datasets: { + data: [ + DATA("Gesamt: 15,9 kWh", [0.124, 0, null, 0, 0.173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.127, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.176, 0.176, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L1", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L2", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L3", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + ], + labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, + ), + }, + }); + } + { + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, + { + datasets: { + data: [ + DATA("Gesamt: 21,6 kWh", [0.016, 0.014, 0.016, 0.015, 0.016, 0.015, 0.015, 0.015, 0.016, 0.017, 0.018, 0.014, 0.016, 0.017, 0.016, 0.015, 0.014, 0.017, 0.015, 0.016, 0.017, 0.016, 0.015, 0.016, 0.014, 0.015, 0.014, 0.016, 0.014, null, null]), + ], + labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), + }, + }); + } + }); +}); + +export function expectView(config: EdgeConfig, testContext: TestContext & { route: ActivatedRoute }, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View): void { + expect(removeFunctions(OeChartTester + .apply(SumChartDetailsComponent + .getChartData( + DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), testContext.route, + testContext.translate), chartType, channels, testContext, config))) + .toEqual(removeFunctions(view)); +} diff --git a/ui/src/app/edge/history/common/consumption/details/chart/sum.ts b/ui/src/app/edge/history/common/consumption/details/chart/sum.ts new file mode 100644 index 00000000000..cf25ef1a843 --- /dev/null +++ b/ui/src/app/edge/history/common/consumption/details/chart/sum.ts @@ -0,0 +1,62 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { Phase } from "src/app/shared/components/shared/phase"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; + +@Component({ + selector: "sumChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", +}) +export class SumChartDetailsComponent extends AbstractHistoryChart { + + public static getChartData(config: EdgeConfig, route: ActivatedRoute, translate: TranslateService): HistoryUtils.ChartData { + + const component = config?.getComponent(route.snapshot.params.componentId); + return { + input: [{ + name: component.id, + powerChannel: ChannelAddress.fromString(component.id + "/ConsumptionActivePower"), + energyChannel: ChannelAddress.fromString(component.id + "/ConsumptionActiveEnergy"), + }, + + ...Phase.THREE_PHASE.map(phase => ({ + name: "ConsumptionActivePower" + phase, + powerChannel: ChannelAddress.fromString(component.id + "/ConsumptionActivePower" + phase), + }))], + + output: (data: HistoryUtils.ChannelData) => [{ + name: component.alias, + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data[component.id + "/ConsumptionActiveEnergy"], + converter: () => data[component.id], + color: "rgb(0,152,204)", + hiddenOnInit: false, + stack: 2, + }, + + ...Phase.THREE_PHASE.map((phase, i) => ({ + name: "Phase " + phase, + converter: () => + data["ConsumptionActivePower" + phase], + color: "rgb(" + AbstractHistoryChart.phaseColors[i] + ")", + stack: 3, + }))], + tooltip: { + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), + }, + yAxes: [{ + unit: YAxisType.ENERGY, + position: "left", + yAxisId: ChartAxis.LEFT, + }], + }; + } + + protected override getChartData(): HistoryUtils.ChartData { + return SumChartDetailsComponent.getChartData(this.config, this.route, this.translate); + } +} diff --git a/ui/src/app/edge/history/common/consumption/details/details.overview.html b/ui/src/app/edge/history/common/consumption/details/details.overview.html index ee10f2f639c..31819efc6fb 100644 --- a/ui/src/app/edge/history/common/consumption/details/details.overview.html +++ b/ui/src/app/edge/history/common/consumption/details/details.overview.html @@ -1,7 +1,9 @@ - - + + + + + + diff --git a/ui/src/app/edge/history/common/consumption/details/details.overview.ts b/ui/src/app/edge/history/common/consumption/details/details.overview.ts index 10c26d168f3..645fd4194dd 100644 --- a/ui/src/app/edge/history/common/consumption/details/details.overview.ts +++ b/ui/src/app/edge/history/common/consumption/details/details.overview.ts @@ -1,17 +1,18 @@ -import { Component } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/abstractHistoryChartOverview'; -import { NavigationOption } from 'src/app/shared/components/footer/subnavigation/footerNavigation'; -import { Service } from 'src/app/shared/shared'; -import { Role } from 'src/app/shared/type/role'; +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; +import { NavigationOption } from "src/app/shared/components/footer/subnavigation/footerNavigation"; +import { Service } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; @Component({ - templateUrl: './details.overview.html', + templateUrl: "./details.overview.html", }) export class DetailsOverviewComponent extends AbstractHistoryChartOverview { protected navigationButtons: NavigationOption[] = []; + protected componentType: "sum" | "consumptionMeter" | "evcs" | null = null; constructor( public override service: Service, @@ -24,14 +25,48 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { } protected override afterIsInitialized() { + this.componentType = this.getComponentType(); this.service.getCurrentEdge().then(edge => { - if (this.component && this.config?.hasComponentNature("io.openems.edge.evcs.api.Evcs", this.component.id)) { + if (!this.component) { + return; + } + + if (this.config?.hasComponentNature("io.openems.edge.evcs.api.Evcs", this.component.id)) { + return; + } + + if (this.component.factoryId === "Core.Sum") { + this.component.alias = this.translate.instant("General.TOTAL"); return; } this.navigationButtons = [ - { id: 'currentVoltage', isEnabled: edge.roleIsAtLeast(Role.INSTALLER), alias: this.translate.instant("Edge.History.CURRENT_AND_VOLTAGE"), callback: () => { this.router.navigate(['./currentVoltage'], { relativeTo: this.route }); } }]; + { id: "currentVoltage", isEnabled: edge.roleIsAtLeast(Role.INSTALLER), alias: this.translate.instant("Edge.History.CURRENT_AND_VOLTAGE"), callback: () => { this.router.navigate(["./currentVoltage"], { relativeTo: this.route }); } }]; }); } + + private getComponentType(): typeof this.componentType { + if (!this.component) { + return null; + } + + if (this.config?.hasComponentNature("io.openems.edge.evcs.api.Evcs", this.component.id) + && (this.component.factoryId !== "Evcs.Cluster.SelfConsumption") + && this.component.factoryId !== "Evcs.Cluster.PeakShaving" + && this.component.isEnabled !== false) { + return "evcs"; + } + + if (this.config?.hasComponentNature("io.openems.edge.meter.api.ElectricityMeter", this.component.id) + && this.config.isTypeConsumptionMetered(this.component) && this.component.isEnabled) { + return "consumptionMeter"; + } + + if (this.component.factoryId === "Core.Sum") { + return "sum"; + } + + return null; + } } diff --git a/ui/src/app/edge/history/common/consumption/flat/flat.html b/ui/src/app/edge/history/common/consumption/flat/flat.html index 05eab4f6128..ac93f31a491 100644 --- a/ui/src/app/edge/history/common/consumption/flat/flat.html +++ b/ui/src/app/edge/history/common/consumption/flat/flat.html @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/common/consumption/flat/flat.ts b/ui/src/app/edge/history/common/consumption/flat/flat.ts index 7431f592845..149521db911 100644 --- a/ui/src/app/edge/history/common/consumption/flat/flat.ts +++ b/ui/src/app/edge/history/common/consumption/flat/flat.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, EdgeConfig } from '../../../../../shared/shared'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, EdgeConfig } from "../../../../../shared/shared"; @Component({ - selector: 'consumptionWidget', - templateUrl: './flat.html', + selector: "consumptionWidget", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -17,21 +17,21 @@ export class FlatComponent extends AbstractFlatWidget { this.evcsComponents = this.config?.getComponentsImplementingNature("io.openems.edge.evcs.api.Evcs") .filter(component => - !(component.factoryId === 'Evcs.Cluster.SelfConsumption') && - !(component.factoryId === 'Evcs.Cluster.PeakShaving') && + !(component.factoryId === "Evcs.Cluster.SelfConsumption") && + !(component.factoryId === "Evcs.Cluster.PeakShaving") && !component.isEnabled === false); this.consumptionMeterComponents = this.config?.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && this.config.isTypeConsumptionMetered(component)); - const channels: ChannelAddress[] = [new ChannelAddress('_sum', 'ConsumptionActiveEnergy')]; + const channels: ChannelAddress[] = [new ChannelAddress("_sum", "ConsumptionActiveEnergy")]; this.evcsComponents.forEach((component) => { - channels.push(new ChannelAddress(component.id, 'ActiveConsumptionEnergy')); + channels.push(new ChannelAddress(component.id, "ActiveConsumptionEnergy")); }); this.consumptionMeterComponents.forEach((component) => { - channels.push(new ChannelAddress(component.id, 'ActiveProductionEnergy')); + channels.push(new ChannelAddress(component.id, "ActiveProductionEnergy")); }); @@ -51,10 +51,10 @@ export class FlatComponent extends AbstractFlatWidget { private getTotalOtherEnergy(currentData: CurrentData): number { let otherEnergy: number = 0; this.evcsComponents.forEach(component => { - otherEnergy += currentData.allComponents[component.id + '/ActiveConsumptionEnergy'] ?? 0; + otherEnergy += currentData.allComponents[component.id + "/ActiveConsumptionEnergy"] ?? 0; }); this.consumptionMeterComponents.forEach(component => { - otherEnergy += currentData.allComponents[component.id + '/ActiveProductionEnergy'] ?? 0; + otherEnergy += currentData.allComponents[component.id + "/ActiveProductionEnergy"] ?? 0; }); return currentData.allComponents["_sum/ConsumptionActiveEnergy"] - otherEnergy; } diff --git a/ui/src/app/edge/history/common/consumption/overview/overview.html b/ui/src/app/edge/history/common/consumption/overview/overview.html index c7036474b77..02f12138d2e 100644 --- a/ui/src/app/edge/history/common/consumption/overview/overview.html +++ b/ui/src/app/edge/history/common/consumption/overview/overview.html @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/common/consumption/overview/overview.ts b/ui/src/app/edge/history/common/consumption/overview/overview.ts index 87fab1299e0..cf75130de35 100644 --- a/ui/src/app/edge/history/common/consumption/overview/overview.ts +++ b/ui/src/app/edge/history/common/consumption/overview/overview.ts @@ -1,12 +1,13 @@ -import { Component } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/abstractHistoryChartOverview'; -import { NavigationOption } from 'src/app/shared/components/footer/subnavigation/footerNavigation'; -import { ChannelAddress, EdgeConfig, Service } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; +import { NavigationOption } from "src/app/shared/components/footer/subnavigation/footerNavigation"; +import { ChannelAddress, EdgeConfig, Service } from "src/app/shared/shared"; @Component({ - templateUrl: './overview.html', + templateUrl: "./overview.html", }) export class OverviewComponent extends AbstractHistoryChartOverview { @@ -19,6 +20,7 @@ export class OverviewComponent extends AbstractHistoryChartOverview { protected override route: ActivatedRoute, public override modalCtrl: ModalController, private router: Router, + private translate: TranslateService, ) { super(service, route, modalCtrl); } @@ -27,15 +29,18 @@ export class OverviewComponent extends AbstractHistoryChartOverview { this.evcsComponents = this.config?.getComponentsImplementingNature("io.openems.edge.evcs.api.Evcs") .filter(component => - !(component.factoryId === 'Evcs.Cluster.SelfConsumption') && - !(component.factoryId === 'Evcs.Cluster.PeakShaving') && + !(component.factoryId === "Evcs.Cluster.SelfConsumption") && + !(component.factoryId === "Evcs.Cluster.PeakShaving") && !component.isEnabled === false); this.consumptionMeterComponents = this.config?.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && this.config.isTypeConsumptionMetered(component)); - this.navigationButtons = [...this.evcsComponents, ...this.consumptionMeterComponents].map(el => ( - { id: el.id, alias: el.alias, callback: () => { this.router.navigate(['./' + el.id], { relativeTo: this.route }); } } + const sum: EdgeConfig.Component = this.config.getComponent("_sum"); + sum.alias = this.translate.instant("General.TOTAL"); + + this.navigationButtons = [sum, ...this.evcsComponents, ...this.consumptionMeterComponents].map(el => ( + { id: el.id, alias: el.alias, callback: () => { this.router.navigate(["./" + el.id], { relativeTo: this.route }); } } )); return []; diff --git a/ui/src/app/edge/history/common/energy/chart/channels.spec.ts b/ui/src/app/edge/history/common/energy/chart/channels.spec.ts index 55694cda21b..2abfaee9aed 100644 --- a/ui/src/app/edge/history/common/energy/chart/channels.spec.ts +++ b/ui/src/app/edge/history/common/energy/chart/channels.spec.ts @@ -8,20 +8,36 @@ import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/re export namespace History { - export const LINE_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min: number, max: number; } | null, ticks: { stepSize: number }; }; }): OeChartTester.Dataset.Option => ({ - type: 'option', + export const LINE_CHART_OPTIONS = (period: string, chartType: "line" | "bar", options: { [key: string]: { scale: { min: number, max: number; } | null, ticks: { stepSize: number }; }; }): OeChartTester.Dataset.Option => ({ + type: "option", options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} }, "annotation": { annotations: {} } }, "scales": { + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, + "plugins": { + "colors": { + "enabled": false, + }, + "legend": { + "display": true, "position": "bottom", "labels": { "color": "" }, + }, "tooltip": { + "intersect": false, "mode": "index", "callbacks": {}, + }, + "annotation": { + annotations: {}, + }, + "datalabels": { + display: false, + }, + }, "scales": { "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { - ...options["left"]?.scale, ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "kW", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, - "ticks": { ...options["left"]?.ticks, "color": '', "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS }, + ...options["left"]?.scale, ...(chartType === "line" ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "kW", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, + "ticks": { ...options["left"]?.ticks, "color": "", "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS }, }, "right": { - ...options["right"]?.scale, ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": true, "max": 100, "min": 0, "type": "linear", "title": { "text": "%", "display": true, "font": { "size": 11 }, "padding": 5 }, "position": "right", "grid": { "display": false }, + ...options["right"]?.scale, ...(chartType === "line" ? { stacked: false } : {}), "beginAtZero": true, "max": 100, "min": 0, "type": "linear", "title": { "text": "%", "display": true, "font": { "size": 11 }, "padding": 5 }, "position": "right", "grid": { "display": false }, "ticks": { ...options["right"]?.ticks, - "color": '', + "color": "", "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, }, @@ -29,16 +45,32 @@ export namespace History { }, }, }); - export const BAR_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min?: number, max?: number; }, ticks: { stepSize?: number; }; }; }): OeChartTester.Dataset.Option => ({ - type: 'option', + export const BAR_CHART_OPTIONS = (period: string, chartType: "line" | "bar", options: { [key: string]: { scale: { min?: number, max?: number; }, ticks: { stepSize?: number; }; }; }): OeChartTester.Dataset.Option => ({ + type: "option", options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} }, "annotation": { annotations: {} } }, "scales": { + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, + "plugins": { + "colors": { + "enabled": false, + }, + "legend": { + "display": true, "position": "bottom", "labels": { "color": "" }, + }, "tooltip": { + "intersect": false, "mode": "x", "callbacks": {}, + }, + "annotation": { + annotations: {}, + }, + "datalabels": { + display: false, + }, + }, "scales": { "x": { "stacked": true, "offset": true, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { - ...options["left"]?.scale, ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "kWh", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, + ...options["left"]?.scale, ...(chartType === "line" ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "kWh", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": { ...options["left"]?.ticks, - "color": '', + "color": "", "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, }, @@ -55,17 +87,17 @@ export namespace History { export const DAY: OeTester.Types.Channels = ({ energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { data: { - '_sum/GridBuyActiveEnergy': 938, - '_sum/ConsumptionActiveEnergy': 24364, - '_sum/EssDcChargeEnergy': 15766, - '_sum/EssDcDischargeEnergy': 7209, - '_sum/GridSellActiveEnergy': 15615, - '_sum/ProductionActiveEnergy': 47597, + "_sum/GridBuyActiveEnergy": 938, + "_sum/ConsumptionActiveEnergy": 24364, + "_sum/EssDcChargeEnergy": 15766, + "_sum/EssDcDischargeEnergy": 7209, + "_sum/GridSellActiveEnergy": 15615, + "_sum/ProductionActiveEnergy": 47597, }, }), dataChannelWithValues: new QueryHistoricTimeseriesDataResponse("0", { data: { - '_sum/ConsumptionActivePower': [null, + "_sum/ConsumptionActivePower": [null, null, null, 112, @@ -353,9 +385,9 @@ export namespace History { null, null, null], - '_sum/GridActivePower': [null, null, null, 31, 18, -6, 20, 16, 15, 14, 9, 20, 25, 25, 25, 21, 12, 9, 10, 11, 5, 3, -4, 15, 18, 23, -4, 0, 0, 2, 2, 3, 15, 8, 22, 27, 16, 3, 2, -5, 28, 27, 17, 1, 0, -1, -2, null, null, null, null, 11, 10, 4, 6, 7, 18, 8, 12, 9, 4, 13, 15, 12, 0, -1, -4, 2, -4, 5, 1, 30, 62, -5, -13, -6, -4, -17, -15, -17, -11, 15, 5, 4, 7, -29, -15, -13, -19, -14, -7, -16, 5, -18, -22, 0, -12, -11, -7, 21, -33, -7, -3, -4, -11, 3, -38, 4, 0, -19, 32, -16, -14, -18, 0, -1119, -3453, -3608, -3941, -4392, -3786, -4805, -4688, -3095, -2320, -2851, -3058, -4044, -5011, -2789, -6530, -5029, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/GridActivePower": [null, null, null, 31, 18, -6, 20, 16, 15, 14, 9, 20, 25, 25, 25, 21, 12, 9, 10, 11, 5, 3, -4, 15, 18, 23, -4, 0, 0, 2, 2, 3, 15, 8, 22, 27, 16, 3, 2, -5, 28, 27, 17, 1, 0, -1, -2, null, null, null, null, 11, 10, 4, 6, 7, 18, 8, 12, 9, 4, 13, 15, 12, 0, -1, -4, 2, -4, 5, 1, 30, 62, -5, -13, -6, -4, -17, -15, -17, -11, 15, 5, 4, 7, -29, -15, -13, -19, -14, -7, -16, 5, -18, -22, 0, -12, -11, -7, 21, -33, -7, -3, -4, -11, 3, -38, 4, 0, -19, 32, -16, -14, -18, 0, -1119, -3453, -3608, -3941, -4392, -3786, -4805, -4688, -3095, -2320, -2851, -3058, -4044, -5011, -2789, -6530, -5029, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], // 'GridSell': [6476, 6488, -1000, 0], - '_sum/EssSoc': [null, + "_sum/EssSoc": [null, null, null, 80, @@ -643,7 +675,7 @@ export namespace History { null, null, null], - '_sum/EssActivePower': [null, + "_sum/EssActivePower": [null, null, null, 81, @@ -931,7 +963,7 @@ export namespace History { null, null, null], - '_sum/ProductionActivePower': [null, + "_sum/ProductionActivePower": [null, null, null, 0, @@ -1219,7 +1251,7 @@ export namespace History { null, null, null], - '_sum/ProductionDcActualPower': [null, + "_sum/ProductionDcActualPower": [null, null, null, 0, @@ -1807,17 +1839,17 @@ export namespace History { export const WEEK: OeTester.Types.Channels = { energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { data: { - '_sum/GridBuyActiveEnergy': 2368, - '_sum/ConsumptionActiveEnergy': 76690, - '_sum/EssDcChargeEnergy': 38671, - '_sum/EssDcDischargeEnergy': 31809, - '_sum/GridSellActiveEnergy': 119692, - '_sum/ProductionActiveEnergy': 200875, + "_sum/GridBuyActiveEnergy": 2368, + "_sum/ConsumptionActiveEnergy": 76690, + "_sum/EssDcChargeEnergy": 38671, + "_sum/EssDcDischargeEnergy": 31809, + "_sum/GridSellActiveEnergy": 119692, + "_sum/ProductionActiveEnergy": 200875, }, }), dataChannelWithValues: new QueryHistoricTimeseriesDataResponse("0", { data: { - '_sum/ConsumptionActivePower': [160.22222222222223, + "_sum/ConsumptionActivePower": [160.22222222222223, 165.16666666666666, 149.91666666666666, 242.45454545454547, @@ -1985,7 +2017,7 @@ export namespace History { 444.625, 569.6, 131.5], - '_sum/GridActivePower': [-2.3333333333333335, + "_sum/GridActivePower": [-2.3333333333333335, 11.916666666666666, 16.333333333333332, 6.090909090909091, @@ -2154,7 +2186,7 @@ export namespace History { -9, -18.875], // 'GridSell': [6476, 6488, -1000, 0], - '_sum/EssSoc': [76.11111111111111, + "_sum/EssSoc": [76.11111111111111, 74.83333333333333, 73.75, 72.54545454545455, @@ -2322,7 +2354,7 @@ export namespace History { 85.875, 83.7, 80.5], - '_sum/EssActivePower': [162.55555555555554, + "_sum/EssActivePower": [162.55555555555554, 153.08333333333334, 133.58333333333334, 236.45454545454547, @@ -2490,7 +2522,7 @@ export namespace History { 439.375, 578.7, 150.375], - '_sum/ProductionActivePower': [0, + "_sum/ProductionActivePower": [0, 0, 0, 0, @@ -2658,7 +2690,7 @@ export namespace History { 61.5, 0.6, 0], - '_sum/ProductionDcActualPower': [0, + "_sum/ProductionDcActualPower": [0, 0, 0, 0, @@ -3005,18 +3037,18 @@ export namespace History { export const MONTH: OeTester.Types.Channels = { energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { data: { - '_sum/GridBuyActiveEnergy': 773000, - '_sum/ConsumptionActiveEnergy': 9976102, - '_sum/EssDcChargeEnergy': 3944328, - '_sum/EssDcDischargeEnergy': 3394430, - '_sum/GridSellActiveEnergy': 12738000, - '_sum/ProductionActiveEnergy': 22491000, + "_sum/GridBuyActiveEnergy": 773000, + "_sum/ConsumptionActiveEnergy": 9976102, + "_sum/EssDcChargeEnergy": 3944328, + "_sum/EssDcDischargeEnergy": 3394430, + "_sum/GridSellActiveEnergy": 12738000, + "_sum/ProductionActiveEnergy": 22491000, }, }), energyPerPeriodChannelWithValues: new QueryHistoricTimeseriesEnergyPerPeriodResponse("0", { data: { - '_sum/ConsumptionActiveEnergy': [320342, + "_sum/ConsumptionActiveEnergy": [320342, 346615, 341433, 333054, @@ -3247,18 +3279,18 @@ export namespace History { export const YEAR: OeTester.Types.Channels = { energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { data: { - '_sum/GridBuyActiveEnergy': 23209000, - '_sum/ConsumptionActiveEnergy': 58573394, - '_sum/EssDcChargeEnergy': 15296815, - '_sum/EssDcDischargeEnergy': 12898209, - '_sum/GridSellActiveEnergy': 30703000, - '_sum/ProductionActiveEnergy': 68466000, + "_sum/GridBuyActiveEnergy": 23209000, + "_sum/ConsumptionActiveEnergy": 58573394, + "_sum/EssDcChargeEnergy": 15296815, + "_sum/EssDcDischargeEnergy": 12898209, + "_sum/GridSellActiveEnergy": 30703000, + "_sum/ProductionActiveEnergy": 68466000, }, }), energyPerPeriodChannelWithValues: new QueryHistoricTimeseriesEnergyPerPeriodResponse("0", { data: { - '_sum/ConsumptionActiveEnergy': [11634885, + "_sum/ConsumptionActiveEnergy": [11634885, 8207927, 8976354, 8311835, diff --git a/ui/src/app/edge/history/common/energy/chart/chart.constants.spec.ts b/ui/src/app/edge/history/common/energy/chart/chart.constants.spec.ts index b5d7a8fdae7..0b7d24e89a5 100644 --- a/ui/src/app/edge/history/common/energy/chart/chart.constants.spec.ts +++ b/ui/src/app/edge/history/common/energy/chart/chart.constants.spec.ts @@ -1,12 +1,11 @@ import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; import { OeTester } from "src/app/shared/components/shared/testing/common"; -import { EdgeConfig } from "src/app/shared/shared"; import { removeFunctions, TestContext } from "src/app/shared/components/shared/testing/utils.spec"; - +import { EdgeConfig } from "src/app/shared/shared"; import { OeChartTester } from "../../../../../shared/components/shared/testing/tester"; import { ChartComponent } from "./chart"; -export function expectView(config: EdgeConfig, testContext: TestContext, chartType: 'line' | 'bar', channels: OeTester.Types.Channels, view: OeChartTester.View): void { +export function expectView(config: EdgeConfig, testContext: TestContext, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View): void { expect(removeFunctions(OeChartTester .apply(ChartComponent .getChartData(DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), chartType, testContext.translate), chartType, channels, testContext, config))) diff --git a/ui/src/app/edge/history/common/energy/chart/chart.spec.ts b/ui/src/app/edge/history/common/energy/chart/chart.spec.ts index 312baba765b..cd1695a6c81 100644 --- a/ui/src/app/edge/history/common/energy/chart/chart.spec.ts +++ b/ui/src/app/edge/history/common/energy/chart/chart.spec.ts @@ -5,7 +5,7 @@ import { sharedSetup, TestContext } from "src/app/shared/components/shared/testi import { DATA, expectView, LABELS } from "./chart.constants.spec"; -describe('History EnergyMonitor', () => { +describe("History EnergyMonitor", () => { const defaultEMS = DummyConfig.from( DummyConfig.Component.SOCOMEC_GRID_METER("meter0", "Netzzähler"), DummyConfig.Component.ESS_GENERIC_MANAGEDSYMMETRIC("ess0"), @@ -17,24 +17,24 @@ describe('History EnergyMonitor', () => { TEST_CONTEXT = await sharedSetup(), ); - it('getChartData()', () => { + it("getChartData()", () => { { // Line - Chart - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, { datasets: { data: [ - DATA('Erzeugung: 47,6 kWh', [null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, 0.002, 0.03, 0.027, 0.03, 0.039, 0.074, 0.093, 0.12, 0.12, 0.116, 0.106, 0.099, 0.101, 0.113, 0.131, 0.141, 0.131, 0.132, 0.105, 0.139, 0.165, 0.195, 0.255, 0.385, 0.458, 0.402, 0.428, 0.56, 0.615, 0.715, 0.7, 0.807, 0.796, 0.79, 0.813, 0.854, 0.832, 1.052, 1.427, 1.481, 1.765, 1.291, 1.625, 2.138, 1.686, 1.367, 1.562, 1.271, 1.176, 2.542, 2.91, 2.616, 2.193, 2.039, 2.376, 2.919, 3.862, 3.793, 4.309, 3.932, 4.126, 4.406, 4.757, 4.728, 5.231, 4.4, 4.169, 5.232, 5.77, 5.3, 6.327, 6.636, 4.573, 3.678, 3.422, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Beladung: 15,8 kWh', [null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.065, 0.063, 0.185, 0.262, 0.09500000000000003, 0.265, 0.48300000000000004, 0.537, 0.639, 0, 0, 0, 0, 0.18799999999999994, 0.701, 0.586, 0.881, 1.204, 1.282, 1.547, 0.988, 1.353, 1.94, 1.564, 1.2469999999999999, 1.4140000000000001, 1.0479999999999998, 0.2499999999999999, 1.9089999999999998, 2.7, 2.3810000000000002, 1.861, 1.729, 1.859, 1.6680000000000001, 3.225, 2.763, 3.847, 3.59, 2.3530000000000006, 4.143, 4.478999999999999, 4.382, 2.2329999999999997, 0.7170000000000005, 0.07699999999999996, 0.03200000000000003, 0.06099999999999994, 0.027000000000000135, 0.07099999999999973, 0.057000000000000384, 0.012000000000000455, 0.0259999999999998, 0.04800000000000004, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Entladung: 7,2 kWh', [null, null, null, 0.081, 0.244, 0.398, 0.221, 0.214, 0.214, 0.214, 0.308, 0.204, 0.108, 0.109, 0.108, 0.171, 0.197, 0.081, 0.084, 0.085, 0.16, 0.295, 0.188, 0.167, 0.165, 0.175, 0.337, 0.183, 0.093, 0.095, 0.095, 0.194, 0.251, 0.169, 0.122, 0.113, 0.156, 0.301, 0.303, 0.242, 0.204, 0.2, 0.266, 0.343, 0.135, 0.097, 0.096, null, null, null, null, 0.089, 0.089, 0.10900000000000001, 0.265, 0.20199999999999999, 0.175, 0.218, 0.178, 0.324, 0.331, 0.16100000000000003, 0.119, 0.11299999999999999, 0.136, 0.26, 0.10500000000000001, 0.066, 0.05099999999999999, 0.05600000000000001, 0.14100000000000001, 0.043999999999999984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.17200000000000004, 0.30799999999999994, 0.27, 0.2589999999999999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Einspeisung: 15,6 kWh', [null, null, null, 0, 0, 0.006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.004, 0, 0, 0, 0.004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0.001, 0.002, null, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0.004, 0, 0.004, 0, 0, 0, 0, 0.005, 0.013, 0.006, 0.004, 0.017, 0.015, 0.017, 0.011, 0, 0, 0, 0, 0.029, 0.015, 0.013, 0.019, 0.014, 0.007, 0.016, 0, 0.018, 0.022, 0, 0.012, 0.011, 0.007, 0, 0.033, 0.007, 0.003, 0.004, 0.011, 0, 0.038, 0, 0, 0.019, 0, 0.016, 0.014, 0.018, 0, 1.119, 3.453, 3.608, 3.941, 4.392, 3.786, 4.805, 4.688, 3.095, 2.32, 2.851, 3.058, 4.044, 5.011, 2.789, 6.53, 5.029, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Bezug: 0,9 kWh', [null, null, null, 0.031, 0.018, 0, 0.02, 0.016, 0.015, 0.014, 0.009, 0.02, 0.025, 0.025, 0.025, 0.021, 0.012, 0.009, 0.01, 0.011, 0.005, 0.003, 0, 0.015, 0.018, 0.023, 0, 0, 0, 0.002, 0.002, 0.003, 0.015, 0.008, 0.022, 0.027, 0.016, 0.003, 0.002, 0, 0.028, 0.027, 0.017, 0.001, 0, 0, 0, null, null, null, null, 0.011, 0.01, 0.004, 0.006, 0.007, 0.018, 0.008, 0.012, 0.009, 0.004, 0.013, 0.015, 0.012, 0, 0, 0, 0.002, 0, 0.005, 0.001, 0.03, 0.062, 0, 0, 0, 0, 0, 0, 0, 0, 0.015, 0.005, 0.004, 0.007, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0, 0.021, 0, 0, 0, 0, 0, 0.003, 0, 0.004, 0, 0, 0.032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Verbrauch: 24,4 kWh', [null, null, null, 0.112, 0.262, 0.392, 0.24, 0.23, 0.229, 0.227, 0.317, 0.224, 0.133, 0.135, 0.133, 0.192, 0.209, 0.09, 0.095, 0.096, 0.164, 0.297, 0.184, 0.182, 0.183, 0.198, 0.333, 0.183, 0.093, 0.097, 0.098, 0.197, 0.266, 0.177, 0.144, 0.14, 0.173, 0.304, 0.305, 0.237, 0.232, 0.227, 0.283, 0.344, 0.135, 0.096, 0.095, null, null, null, null, 0.102, 0.129, 0.14, 0.301, 0.248, 0.267, 0.319, 0.31, 0.452, 0.451, 0.28, 0.234, 0.226, 0.249, 0.39, 0.242, 0.199, 0.179, 0.166, 0.28, 0.239, 0.192, 0.187, 0.187, 0.19, 0.303, 0.146, 0.062, 0.062, 0.064, 0.887, 1.119, 1.07, 1.057, 0.596, 0.138, 0.233, 0.152, 0.209, 0.192, 0.202, 0.308, 0.254, 0.175, 0.122, 0.108, 0.137, 0.216, 0.947, 0.599, 0.203, 0.232, 0.328, 0.299, 0.52, 1.213, 0.641, 1.03, 0.442, 0.374, 1.758, 0.249, 0.26, 0.346, 1.879, 0.23, 0.484, 1.26, 1.317, 1.488, 1.451, 1.892, 1.466, 1.332, 0.523, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Ladezustand', History.DAY.dataChannelWithValues.result.data['_sum/EssSoc']), + DATA("Erzeugung: 47,6 kWh", [null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, 0.002, 0.03, 0.027, 0.03, 0.039, 0.074, 0.093, 0.12, 0.12, 0.116, 0.106, 0.099, 0.101, 0.113, 0.131, 0.141, 0.131, 0.132, 0.105, 0.139, 0.165, 0.195, 0.255, 0.385, 0.458, 0.402, 0.428, 0.56, 0.615, 0.715, 0.7, 0.807, 0.796, 0.79, 0.813, 0.854, 0.832, 1.052, 1.427, 1.481, 1.765, 1.291, 1.625, 2.138, 1.686, 1.367, 1.562, 1.271, 1.176, 2.542, 2.91, 2.616, 2.193, 2.039, 2.376, 2.919, 3.862, 3.793, 4.309, 3.932, 4.126, 4.406, 4.757, 4.728, 5.231, 4.4, 4.169, 5.232, 5.77, 5.3, 6.327, 6.636, 4.573, 3.678, 3.422, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Beladung: 15,8 kWh", [null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.065, 0.063, 0.185, 0.262, 0.09500000000000003, 0.265, 0.48300000000000004, 0.537, 0.639, 0, 0, 0, 0, 0.18799999999999994, 0.701, 0.586, 0.881, 1.204, 1.282, 1.547, 0.988, 1.353, 1.94, 1.564, 1.2469999999999999, 1.4140000000000001, 1.0479999999999998, 0.2499999999999999, 1.9089999999999998, 2.7, 2.3810000000000002, 1.861, 1.729, 1.859, 1.6680000000000001, 3.225, 2.763, 3.847, 3.59, 2.3530000000000006, 4.143, 4.478999999999999, 4.382, 2.2329999999999997, 0.7170000000000005, 0.07699999999999996, 0.03200000000000003, 0.06099999999999994, 0.027000000000000135, 0.07099999999999973, 0.057000000000000384, 0.012000000000000455, 0.0259999999999998, 0.04800000000000004, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Entladung: 7,2 kWh", [null, null, null, 0.081, 0.244, 0.398, 0.221, 0.214, 0.214, 0.214, 0.308, 0.204, 0.108, 0.109, 0.108, 0.171, 0.197, 0.081, 0.084, 0.085, 0.16, 0.295, 0.188, 0.167, 0.165, 0.175, 0.337, 0.183, 0.093, 0.095, 0.095, 0.194, 0.251, 0.169, 0.122, 0.113, 0.156, 0.301, 0.303, 0.242, 0.204, 0.2, 0.266, 0.343, 0.135, 0.097, 0.096, null, null, null, null, 0.089, 0.089, 0.10900000000000001, 0.265, 0.20199999999999999, 0.175, 0.218, 0.178, 0.324, 0.331, 0.16100000000000003, 0.119, 0.11299999999999999, 0.136, 0.26, 0.10500000000000001, 0.066, 0.05099999999999999, 0.05600000000000001, 0.14100000000000001, 0.043999999999999984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.17200000000000004, 0.30799999999999994, 0.27, 0.2589999999999999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Einspeisung: 15,6 kWh", [null, null, null, 0, 0, 0.006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.004, 0, 0, 0, 0.004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0.001, 0.002, null, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0.004, 0, 0.004, 0, 0, 0, 0, 0.005, 0.013, 0.006, 0.004, 0.017, 0.015, 0.017, 0.011, 0, 0, 0, 0, 0.029, 0.015, 0.013, 0.019, 0.014, 0.007, 0.016, 0, 0.018, 0.022, 0, 0.012, 0.011, 0.007, 0, 0.033, 0.007, 0.003, 0.004, 0.011, 0, 0.038, 0, 0, 0.019, 0, 0.016, 0.014, 0.018, 0, 1.119, 3.453, 3.608, 3.941, 4.392, 3.786, 4.805, 4.688, 3.095, 2.32, 2.851, 3.058, 4.044, 5.011, 2.789, 6.53, 5.029, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Bezug: 0,9 kWh", [null, null, null, 0.031, 0.018, 0, 0.02, 0.016, 0.015, 0.014, 0.009, 0.02, 0.025, 0.025, 0.025, 0.021, 0.012, 0.009, 0.01, 0.011, 0.005, 0.003, 0, 0.015, 0.018, 0.023, 0, 0, 0, 0.002, 0.002, 0.003, 0.015, 0.008, 0.022, 0.027, 0.016, 0.003, 0.002, 0, 0.028, 0.027, 0.017, 0.001, 0, 0, 0, null, null, null, null, 0.011, 0.01, 0.004, 0.006, 0.007, 0.018, 0.008, 0.012, 0.009, 0.004, 0.013, 0.015, 0.012, 0, 0, 0, 0.002, 0, 0.005, 0.001, 0.03, 0.062, 0, 0, 0, 0, 0, 0, 0, 0, 0.015, 0.005, 0.004, 0.007, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0, 0.021, 0, 0, 0, 0, 0, 0.003, 0, 0.004, 0, 0, 0.032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Verbrauch: 24,4 kWh", [null, null, null, 0.112, 0.262, 0.392, 0.24, 0.23, 0.229, 0.227, 0.317, 0.224, 0.133, 0.135, 0.133, 0.192, 0.209, 0.09, 0.095, 0.096, 0.164, 0.297, 0.184, 0.182, 0.183, 0.198, 0.333, 0.183, 0.093, 0.097, 0.098, 0.197, 0.266, 0.177, 0.144, 0.14, 0.173, 0.304, 0.305, 0.237, 0.232, 0.227, 0.283, 0.344, 0.135, 0.096, 0.095, null, null, null, null, 0.102, 0.129, 0.14, 0.301, 0.248, 0.267, 0.319, 0.31, 0.452, 0.451, 0.28, 0.234, 0.226, 0.249, 0.39, 0.242, 0.199, 0.179, 0.166, 0.28, 0.239, 0.192, 0.187, 0.187, 0.19, 0.303, 0.146, 0.062, 0.062, 0.064, 0.887, 1.119, 1.07, 1.057, 0.596, 0.138, 0.233, 0.152, 0.209, 0.192, 0.202, 0.308, 0.254, 0.175, 0.122, 0.108, 0.137, 0.216, 0.947, 0.599, 0.203, 0.232, 0.328, 0.299, 0.52, 1.213, 0.641, 1.03, 0.442, 0.374, 1.758, 0.249, 0.26, 0.346, 1.879, 0.23, 0.484, 1.26, 1.317, 1.488, 1.451, 1.892, 1.466, 1.332, 0.523, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Ladezustand", History.DAY.dataChannelWithValues.result.data["_sum/EssSoc"]), ], labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), - options: History.LINE_CHART_OPTIONS('hour', 'line', { - ['right']: { ticks: { stepSize: 20 }, scale: null }, + options: History.LINE_CHART_OPTIONS("hour", "line", { + ["right"]: { ticks: { stepSize: 20 }, scale: null }, }), }, }); @@ -42,78 +42,78 @@ describe('History EnergyMonitor', () => { { // Line-Chart - expectView(defaultEMS, TEST_CONTEXT, 'line', History.WEEK, + expectView(defaultEMS, TEST_CONTEXT, "line", History.WEEK, { datasets: { data: [ - DATA('Erzeugung: 200,9 kWh', [0, 0, 0, 0, 0.06877777777777777, 0.10641666666666667, 0.24808333333333335, 0.9343333333333333, 2.7069166666666664, 4.60225, 6.1075, 7.152166666666667, 7.8105, 7.919833333333333, 7.5575, 5.898916666666667, 3.4225, 1.20825, 0.6315833333333334, 0.4348333333333333, 0.11625, 0.0555, 0, 0, 0, 0, 0, 0, 0.05566666666666666, 0.11616666666666667, 0.41533333333333333, 0.80975, 1.3233333333333333, 1.5246666666666668, 4.180416666666667, 2.5433333333333334, 2.1981666666666664, 4.257916666666667, 5.337583333333333, 3.255, 2.7370833333333335, 1.9298333333333333, 1.0460833333333333, 0.5075, 0.12633333333333333, 0.0575, 0, 0, 0, 0, 0, 0, 0.03266666666666666, 0.08233333333333333, 0.3933333333333333, 1.09875, 1.88925, 4.037166666666667, 6.144166666666667, 7.2335, 7.912333333333333, 7.1735, 7.83025, 6.541166666666667, 3.7155, 1.372, 0.4713333333333333, 0.29875, 0.12891666666666665, 0.0605, 0.0014166666666666668, 0, 0, 0, 0, 0, 0.07055555555555555, 0.126, 0.22975, 0.9369166666666666, 2.7914166666666667, 4.741666666666667, 6.264666666666667, 7.398416666666667, 7.854166666666667, 8.1385, 7.7740833333333335, 6.136583333333333, 3.59375, 0.9946666666666666, 0.39208333333333334, 0.3069090909090909, 0.12022222222222223, 0.0585, 0.00008333333333333333, 0, 0, 0, 0, 0, 0.04644444444444444, 0.123, 0.47733333333333333, 1.2674166666666666, 2.0323333333333333, 2.60675, 2.39825, 1.2404166666666667, 0.7430833333333333, 0.72275, 0.706, 2.8409166666666663, 3.1284166666666664, 1.23975, 0.7388333333333333, 0.3690833333333333, 0.11475, 0.05725, 0, 0, 0, 0, 0, 0, 0.03622222222222222, 0.11033333333333332, 0.41425, 1.2955833333333333, 2.0244166666666668, 1.6163333333333332, 1.624, 5.705, 4.2615, 2.9964166666666667, 4.293333333333333, 4.474083333333333, 2.6373333333333333, 0.5760833333333334, 0.7170833333333334, 0.3575, 0.16566666666666666, 0.061, 0, 0, 0, 0, 0, 0, 0.04122222222222222, 0.09633333333333333, 0.18325, 0.4275, 1.8598181818181818, 3.429, 1.2262857142857142, 2.923, 4.695, 4.4568, 5.333916666666667, 4.859545454545455, 2.6625, 2.284, 0.7131666666666666, 0.4491, 0.1561, 0.0615, 0.0006, 0]), - DATA('Beladung: 38,7 kWh', [0, 0, 0, 0, 0, 0, 0.053916666666666696, 0.7623333333333333, 2.138083333333333, 2.88375, 0.040750000000000064, 0.05616666666666692, 0.06824999999999992, 0.05333333333333279, 0.052833333333333066, 0.06191666666666684, 0.05941666666666645, 0.06133333333333324, 0.041166666666666796, 0.27449999999999997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.03533333333333333, 0.07091666666666663, 0.9209166666666666, 0.1278333333333337, 3.353, 0.12391666666666712, 0.05908333333333271, 0.05958333333333332, 0.039833333333333165, 0.0448333333333335, 0.05183333333333362, 0.06066666666666665, 0, 0.08024999999999993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.05283333333333329, 0.24774999999999991, 1.4625000000000001, 2.159, 0.05708333333333382, 0.05458333333333343, 0.052666666666666195, 0.06583333333333297, 0.053749999999999964, 0.057000000000000384, 0.2017500000000001, 0, 0.23058333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.041166666666667, 3.0615000000000006, 0.07808333333333373, 0.0442499999999999, 0.06674999999999986, 0.051916666666667055, 0.04716666666666658, 0.054250000000000576, 0.049249999999999794, 0.051416666666666555, 0.0595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.32333333333333336, 0.589, 1.2433333333333332, 2.029166666666667, 0.4844166666666667, 0, 0, 0, 0.03066666666666662, 2.34975, 0.07308333333333294, 0.06908333333333316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2748333333333334, 1.13575, 0, 0.8175833333333332, 0.6326666666666667, 5.248833333333334, 1.257083333333333, 0, 0.8414166666666665, 0, 0.27624999999999966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2515, 0.5249090909090908, 2.5081666666666664, 0.6641428571428571, 2.0005, 2.226888888888889, 1.0726000000000004, 0.020500000000000185, 0.12281818181818238, 0.04666666666666641, 0.04499999999999993, 0, 0.2635, 0, 0, 0, 0]), - DATA('Entladung: 31,8 kWh', [0.16255555555555554, 0.15308333333333335, 0.13358333333333333, 0.23645454545454547, 0.16444444444444445, 0.15000000000000002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.8418333333333334, 0.40008333333333335, 0.3143333333333333, 0.87825, 0.15983333333333336, 0.15433333333333335, 0.12808333333333335, 0.13336363636363638, 0.12544444444444444, 0.10674999999999998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.011833333333333584, 0, 0.6314166666666667, 0.3428333333333333, 0.1775, 0.24691666666666665, 0.32225, 0.20191666666666666, 0.17116666666666666, 0.15227272727272728, 0.13366666666666666, 0.1650833333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.17574999999999985, 0, 0.307, 0.30425, 0.8374166666666666, 0.5858333333333334, 0.233, 0.12245454545454545, 0.19341666666666665, 0.16675, 0.16018181818181818, 0.1677777777777778, 0.07708333333333334, 0.2829166666666666, 0.3085000000000002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3293636363636363, 0.3361111111111111, 0.9013333333333333, 0.21000000000000002, 0.6339166666666667, 0.11658333333333333, 0.17658333333333334, 0.13425, 0.19072727272727272, 0.1686666666666667, 0.10341666666666666, 0, 0, 0, 0, 0, 0.13316666666666643, 1.2479166666666668, 0.5, 0, 0, 0, 0, 0.2433333333333333, 2.1755833333333334, 1.2095833333333335, 2.0555000000000003, 0.67025, 0.17266666666666666, 0.16391666666666665, 0.13858333333333334, 0.07441666666666667, 0.20381818181818182, 0.18944444444444444, 0.3955, 0, 0, 0.049249999999999794, 0, 0, 0, 0, 0.6410833333333334, 0, 0.3483333333333345, 0, 1.5750000000000002, 0.34658333333333335, 0.8439166666666669, 0.42374999999999996, 1.0724166666666668, 0.33325, 0.3395, 0.6474166666666666, 0.4916666666666667, 0.18208333333333335, 0.13436363636363638, 0.15433333333333332, 0.12583333333333332, 0.019250000000000017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3953333333333334, 0, 0.5301, 0.377875, 0.5781, 0.150375]), - DATA('Einspeisung: 119,7 kWh', [0.0023333333333333335, 0, 0, 0, 0, 0, 0, 0.014166666666666666, 0.02808333333333333, 0.9546666666666667, 4.150583333333333, 6.431333333333333, 5.737583333333333, 5.6714166666666666, 5.873333333333333, 5.049083333333333, 3.122, 1.0374166666666667, 0.22808333333333333, 0.02, 0, 0, 0, 0.008333333333333333, 0.0030833333333333333, 0.008333333333333333, 0, 0.007727272727272728, 0, 0, 0.00275, 0.013833333333333335, 0.017416666666666667, 0.006083333333333333, 0.5646666666666667, 2.2251666666666665, 2.03375, 3.99725, 4.990083333333333, 3.0128333333333335, 2.4844166666666667, 1.378, 0.65975, 0, 0.001, 0.006916666666666667, 0.008166666666666666, 0, 0, 0, 0, 0, 0, 0, 0.004083333333333333, 0.010583333333333333, 0.011166666666666667, 1.261, 5.308833333333333, 6.604, 6.321166666666667, 6.488333333333333, 6.78425, 6.052083333333333, 2.5839166666666666, 0.529, 0.01616666666666667, 0.0055, 0, 0.0006666666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0024166666666666664, 0.0125, 0.7065, 5.835416666666667, 4.77025, 6.03925, 6.8445833333333335, 5.370333333333333, 4.490166666666667, 2.3506666666666667, 0.7650833333333333, 0.08583333333333333, 0.011454545454545455, 0, 0, 0.005666666666666667, 0, 0, 0, 0, 0, 0, 0, 0.0033333333333333335, 0.004083333333333333, 0.02033333333333333, 0.02316666666666667, 1.4106666666666667, 0.8588333333333333, 0.0015833333333333333, 0.006583333333333333, 0.010083333333333335, 0.3410833333333333, 2.9290833333333337, 1.1175833333333332, 0.48583333333333334, 0, 0, 0, 0.0006666666666666666, 0.017916666666666668, 0.004, 0, 0, 0.001, 0, 0, 0, 0.02358333333333333, 0.006416666666666667, 0.008166666666666666, 0.0031666666666666666, 0.009916666666666666, 2.7254166666666664, 1.83725, 2.63225, 2.2170833333333335, 0.529, 0, 0, 0, 0, 0, 0.0003333333333333333, 0, 0, 0.011416666666666665, 0.011083333333333334, 0, 0, 0, 0, 0.008333333333333333, 0.008818181818181819, 0.015333333333333334, 0.018857142857142857, 0.024833333333333332, 0.010888888888888889, 2.2174, 3.9214166666666666, 1.6248181818181817, 1.937, 1.789, 0.0195, 0.0143, 0, 0, 0.009, 0.018875]), - DATA('Bezug: 2,4 kWh', [0, 0.011916666666666666, 0.01633333333333333, 0.00609090909090909, 0.015333333333333334, 0.011666666666666665, 0.0024166666666666664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.02425, 0.004416666666666667, 0.0035833333333333333, 0, 0, 0, 0.04441666666666667, 0, 0.013111111111111112, 0.001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0011666666666666668, 0, 0, 0, 0.0015833333333333333, 0.013333333333333334, 0.020416666666666666, 0.01125, 0.019727272727272725, 0.012444444444444445, 0.009583333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.007666666666666667, 0, 0.0023333333333333335, 0.0125, 0.01609090909090909, 0.02016666666666667, 0.014083333333333333, 0.006363636363636363, 0.01955555555555556, 0.04841666666666666, 0.011166666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.014222222222222221, 0.00225, 0, 0.0036666666666666666, 0.032916666666666664, 0.014666666666666666, 0.0135, 0.017363636363636362, 0.013333333333333334, 0.022083333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0009166666666666666, 0, 0.0021666666666666666, 0, 0, 0, 0.0005, 0.04841666666666666, 0, 0.005555555555555556, 0.02716666666666667, 0.017333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0023333333333333335, 0.008333333333333333, 0.003, 0.015916666666666666, 0.00325, 0, 0.004333333333333333, 0.001, 0, 0, 0.019545454545454546, 0.0017777777777777776, 0.006416666666666667, 0.017666666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0058, 0.005625, 0, 0]), - DATA('Verbrauch: 76,7 kWh', [0.16022222222222224, 0.16516666666666666, 0.14991666666666667, 0.24245454545454548, 0.24866666666666665, 0.2679166666666667, 0.19658333333333333, 0.15775, 0.5408333333333334, 0.7640833333333333, 1.9163333333333332, 0.6645833333333334, 2.0044166666666667, 2.1950833333333333, 1.63125, 0.7880833333333334, 0.24116666666666667, 0.1095, 0.3621666666666667, 0.14041666666666666, 0.9824166666666666, 0.4598333333333333, 0.31808333333333333, 0.8699166666666667, 0.157, 0.14616666666666667, 0.17258333333333334, 0.12590909090909091, 0.19444444444444445, 0.22383333333333336, 0.37725, 0.7250833333333334, 0.385, 1.39075, 0.26275, 0.19433333333333333, 0.10516666666666667, 0.201, 0.30775, 0.19716666666666666, 0.20083333333333334, 0.4910833333333333, 0.398, 0.42825, 0.75675, 0.3935, 0.16933333333333334, 0.24841666666666665, 0.3354166666666667, 0.22233333333333336, 0.1825, 0.1720909090909091, 0.179, 0.2568333333333333, 0.3364166666666667, 0.8403333333333334, 0.4155, 0.6171666666666666, 0.7785, 0.5746666666666667, 1.53875, 0.6193333333333334, 0.99225, 0.43191666666666667, 0.92975, 1.0189166666666667, 0.22433333333333333, 0.6004166666666666, 0.4410833333333333, 0.8973333333333333, 0.5895, 0.24541666666666664, 0.13836363636363638, 0.21366666666666664, 0.18075, 0.16654545454545452, 0.2578888888888889, 0.2514166666666667, 0.5236666666666666, 1.2431666666666668, 0.7379166666666667, 0.9735833333333334, 0.35125, 2.5838333333333336, 1.7480833333333332, 1.2421666666666666, 2.35675, 1.5921666666666667, 1.19375, 0.17808333333333334, 0.24683333333333335, 0.6248181818181818, 0.47044444444444444, 0.9619166666666666, 0.20433333333333334, 0.6376666666666666, 0.14958333333333335, 0.19125, 0.14783333333333334, 0.208, 0.22866666666666666, 0.24891666666666665, 0.1505, 0.6745, 0.7685, 0.5545833333333333, 0.50325, 0.5148333333333334, 1.9893333333333332, 1.2161666666666668, 0.6651666666666667, 0.15025, 0.12625, 0.05316666666666667, 0.4963333333333333, 2.54575, 1.3246666666666667, 2.115, 0.6698333333333334, 0.15458333333333335, 0.15975, 0.13916666666666666, 0.12266666666666667, 0.2029090909090909, 0.23122222222222222, 0.533, 0.15675, 0.13625, 2.067, 0.7903333333333333, 0.9883333333333334, 0.44608333333333333, 0.2790833333333333, 1.8005, 0.8198333333333334, 2.60525, 1.83225, 2.1533333333333333, 1.072, 1.2043333333333333, 0.6051666666666666, 1.13675, 0.3330833333333333, 0.3438333333333333, 0.6486666666666666, 0.48025, 0.17116666666666666, 0.15381818181818183, 0.19722222222222222, 0.22858333333333333, 0.22016666666666665, 0.16758333333333333, 1.3263636363636362, 0.9056666666666666, 0.5432857142857144, 0.8975, 2.457222222222222, 1.1668, 1.3920833333333333, 3.111909090909091, 0.6785, 0.451, 1.089, 0.1713, 0.6919, 0.444625, 0.5696, 0.1315]), - DATA('Ladezustand', History.WEEK.dataChannelWithValues.result.data['_sum/EssSoc']), + DATA("Erzeugung: 200,9 kWh", [0, 0, 0, 0, 0.06877777777777777, 0.10641666666666667, 0.24808333333333335, 0.9343333333333333, 2.7069166666666664, 4.60225, 6.1075, 7.152166666666667, 7.8105, 7.919833333333333, 7.5575, 5.898916666666667, 3.4225, 1.20825, 0.6315833333333334, 0.4348333333333333, 0.11625, 0.0555, 0, 0, 0, 0, 0, 0, 0.05566666666666666, 0.11616666666666667, 0.41533333333333333, 0.80975, 1.3233333333333333, 1.5246666666666668, 4.180416666666667, 2.5433333333333334, 2.1981666666666664, 4.257916666666667, 5.337583333333333, 3.255, 2.7370833333333335, 1.9298333333333333, 1.0460833333333333, 0.5075, 0.12633333333333333, 0.0575, 0, 0, 0, 0, 0, 0, 0.03266666666666666, 0.08233333333333333, 0.3933333333333333, 1.09875, 1.88925, 4.037166666666667, 6.144166666666667, 7.2335, 7.912333333333333, 7.1735, 7.83025, 6.541166666666667, 3.7155, 1.372, 0.4713333333333333, 0.29875, 0.12891666666666665, 0.0605, 0.0014166666666666668, 0, 0, 0, 0, 0, 0.07055555555555555, 0.126, 0.22975, 0.9369166666666666, 2.7914166666666667, 4.741666666666667, 6.264666666666667, 7.398416666666667, 7.854166666666667, 8.1385, 7.7740833333333335, 6.136583333333333, 3.59375, 0.9946666666666666, 0.39208333333333334, 0.3069090909090909, 0.12022222222222223, 0.0585, 0.00008333333333333333, 0, 0, 0, 0, 0, 0.04644444444444444, 0.123, 0.47733333333333333, 1.2674166666666666, 2.0323333333333333, 2.60675, 2.39825, 1.2404166666666667, 0.7430833333333333, 0.72275, 0.706, 2.8409166666666663, 3.1284166666666664, 1.23975, 0.7388333333333333, 0.3690833333333333, 0.11475, 0.05725, 0, 0, 0, 0, 0, 0, 0.03622222222222222, 0.11033333333333332, 0.41425, 1.2955833333333333, 2.0244166666666668, 1.6163333333333332, 1.624, 5.705, 4.2615, 2.9964166666666667, 4.293333333333333, 4.474083333333333, 2.6373333333333333, 0.5760833333333334, 0.7170833333333334, 0.3575, 0.16566666666666666, 0.061, 0, 0, 0, 0, 0, 0, 0.04122222222222222, 0.09633333333333333, 0.18325, 0.4275, 1.8598181818181818, 3.429, 1.2262857142857142, 2.923, 4.695, 4.4568, 5.333916666666667, 4.859545454545455, 2.6625, 2.284, 0.7131666666666666, 0.4491, 0.1561, 0.0615, 0.0006, 0]), + DATA("Beladung: 38,7 kWh", [0, 0, 0, 0, 0, 0, 0.053916666666666696, 0.7623333333333333, 2.138083333333333, 2.88375, 0.040750000000000064, 0.05616666666666692, 0.06824999999999992, 0.05333333333333279, 0.052833333333333066, 0.06191666666666684, 0.05941666666666645, 0.06133333333333324, 0.041166666666666796, 0.27449999999999997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.03533333333333333, 0.07091666666666663, 0.9209166666666666, 0.1278333333333337, 3.353, 0.12391666666666712, 0.05908333333333271, 0.05958333333333332, 0.039833333333333165, 0.0448333333333335, 0.05183333333333362, 0.06066666666666665, 0, 0.08024999999999993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.05283333333333329, 0.24774999999999991, 1.4625000000000001, 2.159, 0.05708333333333382, 0.05458333333333343, 0.052666666666666195, 0.06583333333333297, 0.053749999999999964, 0.057000000000000384, 0.2017500000000001, 0, 0.23058333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.041166666666667, 3.0615000000000006, 0.07808333333333373, 0.0442499999999999, 0.06674999999999986, 0.051916666666667055, 0.04716666666666658, 0.054250000000000576, 0.049249999999999794, 0.051416666666666555, 0.0595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.32333333333333336, 0.589, 1.2433333333333332, 2.029166666666667, 0.4844166666666667, 0, 0, 0, 0.03066666666666662, 2.34975, 0.07308333333333294, 0.06908333333333316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2748333333333334, 1.13575, 0, 0.8175833333333332, 0.6326666666666667, 5.248833333333334, 1.257083333333333, 0, 0.8414166666666665, 0, 0.27624999999999966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2515, 0.5249090909090908, 2.5081666666666664, 0.6641428571428571, 2.0005, 2.226888888888889, 1.0726000000000004, 0.020500000000000185, 0.12281818181818238, 0.04666666666666641, 0.04499999999999993, 0, 0.2635, 0, 0, 0, 0]), + DATA("Entladung: 31,8 kWh", [0.16255555555555554, 0.15308333333333335, 0.13358333333333333, 0.23645454545454547, 0.16444444444444445, 0.15000000000000002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.8418333333333334, 0.40008333333333335, 0.3143333333333333, 0.87825, 0.15983333333333336, 0.15433333333333335, 0.12808333333333335, 0.13336363636363638, 0.12544444444444444, 0.10674999999999998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.011833333333333584, 0, 0.6314166666666667, 0.3428333333333333, 0.1775, 0.24691666666666665, 0.32225, 0.20191666666666666, 0.17116666666666666, 0.15227272727272728, 0.13366666666666666, 0.1650833333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.17574999999999985, 0, 0.307, 0.30425, 0.8374166666666666, 0.5858333333333334, 0.233, 0.12245454545454545, 0.19341666666666665, 0.16675, 0.16018181818181818, 0.1677777777777778, 0.07708333333333334, 0.2829166666666666, 0.3085000000000002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3293636363636363, 0.3361111111111111, 0.9013333333333333, 0.21000000000000002, 0.6339166666666667, 0.11658333333333333, 0.17658333333333334, 0.13425, 0.19072727272727272, 0.1686666666666667, 0.10341666666666666, 0, 0, 0, 0, 0, 0.13316666666666643, 1.2479166666666668, 0.5, 0, 0, 0, 0, 0.2433333333333333, 2.1755833333333334, 1.2095833333333335, 2.0555000000000003, 0.67025, 0.17266666666666666, 0.16391666666666665, 0.13858333333333334, 0.07441666666666667, 0.20381818181818182, 0.18944444444444444, 0.3955, 0, 0, 0.049249999999999794, 0, 0, 0, 0, 0.6410833333333334, 0, 0.3483333333333345, 0, 1.5750000000000002, 0.34658333333333335, 0.8439166666666669, 0.42374999999999996, 1.0724166666666668, 0.33325, 0.3395, 0.6474166666666666, 0.4916666666666667, 0.18208333333333335, 0.13436363636363638, 0.15433333333333332, 0.12583333333333332, 0.019250000000000017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3953333333333334, 0, 0.5301, 0.377875, 0.5781, 0.150375]), + DATA("Einspeisung: 119,7 kWh", [0.0023333333333333335, 0, 0, 0, 0, 0, 0, 0.014166666666666666, 0.02808333333333333, 0.9546666666666667, 4.150583333333333, 6.431333333333333, 5.737583333333333, 5.6714166666666666, 5.873333333333333, 5.049083333333333, 3.122, 1.0374166666666667, 0.22808333333333333, 0.02, 0, 0, 0, 0.008333333333333333, 0.0030833333333333333, 0.008333333333333333, 0, 0.007727272727272728, 0, 0, 0.00275, 0.013833333333333335, 0.017416666666666667, 0.006083333333333333, 0.5646666666666667, 2.2251666666666665, 2.03375, 3.99725, 4.990083333333333, 3.0128333333333335, 2.4844166666666667, 1.378, 0.65975, 0, 0.001, 0.006916666666666667, 0.008166666666666666, 0, 0, 0, 0, 0, 0, 0, 0.004083333333333333, 0.010583333333333333, 0.011166666666666667, 1.261, 5.308833333333333, 6.604, 6.321166666666667, 6.488333333333333, 6.78425, 6.052083333333333, 2.5839166666666666, 0.529, 0.01616666666666667, 0.0055, 0, 0.0006666666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0024166666666666664, 0.0125, 0.7065, 5.835416666666667, 4.77025, 6.03925, 6.8445833333333335, 5.370333333333333, 4.490166666666667, 2.3506666666666667, 0.7650833333333333, 0.08583333333333333, 0.011454545454545455, 0, 0, 0.005666666666666667, 0, 0, 0, 0, 0, 0, 0, 0.0033333333333333335, 0.004083333333333333, 0.02033333333333333, 0.02316666666666667, 1.4106666666666667, 0.8588333333333333, 0.0015833333333333333, 0.006583333333333333, 0.010083333333333335, 0.3410833333333333, 2.9290833333333337, 1.1175833333333332, 0.48583333333333334, 0, 0, 0, 0.0006666666666666666, 0.017916666666666668, 0.004, 0, 0, 0.001, 0, 0, 0, 0.02358333333333333, 0.006416666666666667, 0.008166666666666666, 0.0031666666666666666, 0.009916666666666666, 2.7254166666666664, 1.83725, 2.63225, 2.2170833333333335, 0.529, 0, 0, 0, 0, 0, 0.0003333333333333333, 0, 0, 0.011416666666666665, 0.011083333333333334, 0, 0, 0, 0, 0.008333333333333333, 0.008818181818181819, 0.015333333333333334, 0.018857142857142857, 0.024833333333333332, 0.010888888888888889, 2.2174, 3.9214166666666666, 1.6248181818181817, 1.937, 1.789, 0.0195, 0.0143, 0, 0, 0.009, 0.018875]), + DATA("Bezug: 2,4 kWh", [0, 0.011916666666666666, 0.01633333333333333, 0.00609090909090909, 0.015333333333333334, 0.011666666666666665, 0.0024166666666666664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.02425, 0.004416666666666667, 0.0035833333333333333, 0, 0, 0, 0.04441666666666667, 0, 0.013111111111111112, 0.001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0011666666666666668, 0, 0, 0, 0.0015833333333333333, 0.013333333333333334, 0.020416666666666666, 0.01125, 0.019727272727272725, 0.012444444444444445, 0.009583333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.007666666666666667, 0, 0.0023333333333333335, 0.0125, 0.01609090909090909, 0.02016666666666667, 0.014083333333333333, 0.006363636363636363, 0.01955555555555556, 0.04841666666666666, 0.011166666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.014222222222222221, 0.00225, 0, 0.0036666666666666666, 0.032916666666666664, 0.014666666666666666, 0.0135, 0.017363636363636362, 0.013333333333333334, 0.022083333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0009166666666666666, 0, 0.0021666666666666666, 0, 0, 0, 0.0005, 0.04841666666666666, 0, 0.005555555555555556, 0.02716666666666667, 0.017333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0023333333333333335, 0.008333333333333333, 0.003, 0.015916666666666666, 0.00325, 0, 0.004333333333333333, 0.001, 0, 0, 0.019545454545454546, 0.0017777777777777776, 0.006416666666666667, 0.017666666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0058, 0.005625, 0, 0]), + DATA("Verbrauch: 76,7 kWh", [0.16022222222222224, 0.16516666666666666, 0.14991666666666667, 0.24245454545454548, 0.24866666666666665, 0.2679166666666667, 0.19658333333333333, 0.15775, 0.5408333333333334, 0.7640833333333333, 1.9163333333333332, 0.6645833333333334, 2.0044166666666667, 2.1950833333333333, 1.63125, 0.7880833333333334, 0.24116666666666667, 0.1095, 0.3621666666666667, 0.14041666666666666, 0.9824166666666666, 0.4598333333333333, 0.31808333333333333, 0.8699166666666667, 0.157, 0.14616666666666667, 0.17258333333333334, 0.12590909090909091, 0.19444444444444445, 0.22383333333333336, 0.37725, 0.7250833333333334, 0.385, 1.39075, 0.26275, 0.19433333333333333, 0.10516666666666667, 0.201, 0.30775, 0.19716666666666666, 0.20083333333333334, 0.4910833333333333, 0.398, 0.42825, 0.75675, 0.3935, 0.16933333333333334, 0.24841666666666665, 0.3354166666666667, 0.22233333333333336, 0.1825, 0.1720909090909091, 0.179, 0.2568333333333333, 0.3364166666666667, 0.8403333333333334, 0.4155, 0.6171666666666666, 0.7785, 0.5746666666666667, 1.53875, 0.6193333333333334, 0.99225, 0.43191666666666667, 0.92975, 1.0189166666666667, 0.22433333333333333, 0.6004166666666666, 0.4410833333333333, 0.8973333333333333, 0.5895, 0.24541666666666664, 0.13836363636363638, 0.21366666666666664, 0.18075, 0.16654545454545452, 0.2578888888888889, 0.2514166666666667, 0.5236666666666666, 1.2431666666666668, 0.7379166666666667, 0.9735833333333334, 0.35125, 2.5838333333333336, 1.7480833333333332, 1.2421666666666666, 2.35675, 1.5921666666666667, 1.19375, 0.17808333333333334, 0.24683333333333335, 0.6248181818181818, 0.47044444444444444, 0.9619166666666666, 0.20433333333333334, 0.6376666666666666, 0.14958333333333335, 0.19125, 0.14783333333333334, 0.208, 0.22866666666666666, 0.24891666666666665, 0.1505, 0.6745, 0.7685, 0.5545833333333333, 0.50325, 0.5148333333333334, 1.9893333333333332, 1.2161666666666668, 0.6651666666666667, 0.15025, 0.12625, 0.05316666666666667, 0.4963333333333333, 2.54575, 1.3246666666666667, 2.115, 0.6698333333333334, 0.15458333333333335, 0.15975, 0.13916666666666666, 0.12266666666666667, 0.2029090909090909, 0.23122222222222222, 0.533, 0.15675, 0.13625, 2.067, 0.7903333333333333, 0.9883333333333334, 0.44608333333333333, 0.2790833333333333, 1.8005, 0.8198333333333334, 2.60525, 1.83225, 2.1533333333333333, 1.072, 1.2043333333333333, 0.6051666666666666, 1.13675, 0.3330833333333333, 0.3438333333333333, 0.6486666666666666, 0.48025, 0.17116666666666666, 0.15381818181818183, 0.19722222222222222, 0.22858333333333333, 0.22016666666666665, 0.16758333333333333, 1.3263636363636362, 0.9056666666666666, 0.5432857142857144, 0.8975, 2.457222222222222, 1.1668, 1.3920833333333333, 3.111909090909091, 0.6785, 0.451, 1.089, 0.1713, 0.6919, 0.444625, 0.5696, 0.1315]), + DATA("Ladezustand", History.WEEK.dataChannelWithValues.result.data["_sum/EssSoc"]), ], labels: LABELS(History.WEEK.dataChannelWithValues.result.timestamps), - options: History.LINE_CHART_OPTIONS('day', 'line', { ['right']: { ticks: { stepSize: 20 }, scale: null } }), + options: History.LINE_CHART_OPTIONS("day", "line", { ["right"]: { ticks: { stepSize: 20 }, scale: null } }), }, }); } { // Bar-Chart Year - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, { datasets: { data: [ - DATA('Erzeugung: 22.491 kWh', [908, 967, 900, 926, 403, 597, 957, null, 1579, 556, 852, 976, 1026, 724, 839, 749, 709, 978, 607, 790, 652, null, 1011, 697, 908, null, 1466, 808, 906, null]), + DATA("Erzeugung: 22.491 kWh", [908, 967, 900, 926, 403, 597, 957, null, 1579, 556, 852, 976, 1026, 724, 839, 749, 709, 978, 607, 790, 652, null, 1011, 697, 908, null, 1466, 808, 906, null]), // Only one of the two following datasets is shown in legend - DATA('Direktverbrauch: 5.808,7 kWh', [191.524, 214.083, 198.811, 196.842, 184.218, 201.167, 175.916, null, 347.243, 166.862, 176.461, 218.586, 229.496, 228.661, 211.608, 217.075, 177.422, 179.495, 200.029, 229.434, 229.765, null, 360.727, 171.324, 206.255, null, 442.327, 225.59, 227.751, null]), - DATA('Direktverbrauch: 5.808,7 kWh', [191.524, 214.083, 198.811, 196.842, 184.218, 201.167, 175.916, null, 347.243, 166.862, 176.461, 218.586, 229.496, 228.661, 211.608, 217.075, 177.422, 179.495, 200.029, 229.434, 229.765, null, 360.727, 171.324, 206.255, null, 442.327, 225.59, 227.751, null]), - DATA('Beladung: 3.944,3 kWh', [113.476, 162.917, 150.189, 157.158, 149.782, 159.833, 155.084, null, 228.757, 128.138, 157.539, 59.414, 156.504, 107.339, 156.392, 158.925, 158.578, 121.505, 120.971, 154.566, 173.235, null, 204.273, 156.676, 143.745, null, 247.673, 157.41, 104.249, null]), - DATA('Entladung: 3.394,4 kWh', [112.818, 126.532, 139.622, 133.212, 169.24, 98.705, 109.367, null, 204.267, 118.504, 121.261, 74.97, 144.175, 89.897, 141.582, 111.261, 122.274, 106.232, 139.405, 132.225, 143.86, null, 235.044, 63.914, 123.844, null, 242.102, 130.546, 59.571, null]), - DATA('Einspeisung: 12.738 kWh', [603, 590, 551, 572, 69, 236, 626, null, 1003, 261, 518, 698, 640, 388, 471, 373, 373, 677, 286, 406, 249, null, 446, 369, 558, null, 776, 425, 574, null]), - DATA('Bezug: 773 kWh', [16, 6, 3, 3, 5, 48, 4, null, 5, 26, 17, 62, 8, 66, 13, 21, 4, 3, 18, 27, 29, null, 118, 85, 2, null, 72, 28, 84, null]), - DATA('Verbrauch: 9.976,1 kWh', [320.342, 346.615, 341.433, 333.054, 358.458, 347.872, 289.283, null, 556.51, 311.366, 314.722, 355.556, 381.671, 384.558, 366.19, 349.336, 303.696, 288.727, 357.434, 388.659, 402.625, null, 713.771, 320.238, 332.099, null, 756.429, 384.136, 371.322, null]), + DATA("Direktverbrauch: 5.808,7 kWh", [191.524, 214.083, 198.811, 196.842, 184.218, 201.167, 175.916, null, 347.243, 166.862, 176.461, 218.586, 229.496, 228.661, 211.608, 217.075, 177.422, 179.495, 200.029, 229.434, 229.765, null, 360.727, 171.324, 206.255, null, 442.327, 225.59, 227.751, null]), + DATA("Direktverbrauch: 5.808,7 kWh", [191.524, 214.083, 198.811, 196.842, 184.218, 201.167, 175.916, null, 347.243, 166.862, 176.461, 218.586, 229.496, 228.661, 211.608, 217.075, 177.422, 179.495, 200.029, 229.434, 229.765, null, 360.727, 171.324, 206.255, null, 442.327, 225.59, 227.751, null]), + DATA("Beladung: 3.944,3 kWh", [113.476, 162.917, 150.189, 157.158, 149.782, 159.833, 155.084, null, 228.757, 128.138, 157.539, 59.414, 156.504, 107.339, 156.392, 158.925, 158.578, 121.505, 120.971, 154.566, 173.235, null, 204.273, 156.676, 143.745, null, 247.673, 157.41, 104.249, null]), + DATA("Entladung: 3.394,4 kWh", [112.818, 126.532, 139.622, 133.212, 169.24, 98.705, 109.367, null, 204.267, 118.504, 121.261, 74.97, 144.175, 89.897, 141.582, 111.261, 122.274, 106.232, 139.405, 132.225, 143.86, null, 235.044, 63.914, 123.844, null, 242.102, 130.546, 59.571, null]), + DATA("Einspeisung: 12.738 kWh", [603, 590, 551, 572, 69, 236, 626, null, 1003, 261, 518, 698, 640, 388, 471, 373, 373, 677, 286, 406, 249, null, 446, 369, 558, null, 776, 425, 574, null]), + DATA("Bezug: 773 kWh", [16, 6, 3, 3, 5, 48, 4, null, 5, 26, 17, 62, 8, 66, 13, 21, 4, 3, 18, 27, 29, null, 118, 85, 2, null, 72, 28, 84, null]), + DATA("Verbrauch: 9.976,1 kWh", [320.342, 346.615, 341.433, 333.054, 358.458, 347.872, 289.283, null, 556.51, 311.366, 314.722, 355.556, 381.671, 384.558, 366.19, 349.336, 303.696, 288.727, 357.434, 388.659, 402.625, null, 713.771, 320.238, 332.099, null, 756.429, 384.136, 371.322, null]), ], labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('day', 'bar', {}), + options: History.BAR_CHART_OPTIONS("day", "bar", {}), }, }); } { // Bar-Chart - Year - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.YEAR, + expectView(defaultEMS, TEST_CONTEXT, "bar", History.YEAR, { datasets: { data: [ - DATA('Erzeugung: 68.466 kWh', [1912, 3816, 7165, 10452, 20841, 22491, 1546, null, null, null, null, null]), + DATA("Erzeugung: 68.466 kWh", [1912, 3816, 7165, 10452, 20841, 22491, 1546, null, null, null, null, null]), // Only one of the two following datasets is shown in legend - DATA('Direktverbrauch: 22.466,2 kWh', [1597.394, 2056.891, 3150.228, 3720.697, 5506.053, 5808.6720000000005, 546.405, null, null, null, null, null]), - DATA('Direktverbrauch: 22.466,2 kWh', [1597.394, 2056.891, 3150.228, 3720.697, 5506.053, 5808.6720000000005, 546.405, null, null, null, null, null]), - DATA('Beladung: 15.296,8 kWh', [294.606, 1673.109, 3337.772, 3074.303, 2495.947, 3944.328, 372.595, null, null, null, null, null]), - DATA('Entladung: 12.898,2 kWh', [208.491, 1339.036, 2911.126, 2555.138, 2123.751, 3394.43, 335.402, null, null, null, null, null]), - DATA('Einspeisung: 30.703 kWh', [20, 86, 677, 3657, 12839, 12738, 627, null, null, null, null, null]), - DATA('Bezug: 23.209 kWh', [9829, 4812, 2915, 2036, 2712, 773, 94, null, null, null, null, null]), - DATA('Verbrauch: 58.573,4 kWh', [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), + DATA("Direktverbrauch: 22.466,2 kWh", [1597.394, 2056.891, 3150.228, 3720.697, 5506.053, 5808.6720000000005, 546.405, null, null, null, null, null]), + DATA("Direktverbrauch: 22.466,2 kWh", [1597.394, 2056.891, 3150.228, 3720.697, 5506.053, 5808.6720000000005, 546.405, null, null, null, null, null]), + DATA("Beladung: 15.296,8 kWh", [294.606, 1673.109, 3337.772, 3074.303, 2495.947, 3944.328, 372.595, null, null, null, null, null]), + DATA("Entladung: 12.898,2 kWh", [208.491, 1339.036, 2911.126, 2555.138, 2123.751, 3394.43, 335.402, null, null, null, null, null]), + DATA("Einspeisung: 30.703 kWh", [20, 86, 677, 3657, 12839, 12738, 627, null, null, null, null, null]), + DATA("Bezug: 23.209 kWh", [9829, 4812, 2915, 2036, 2712, 773, 94, null, null, null, null, null]), + DATA("Verbrauch: 58.573,4 kWh", [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar', {}), + options: History.BAR_CHART_OPTIONS("month", "bar", {}), }, }); } { // Bar-Chart: no config const EMS = DummyConfig.from(); - expectView(EMS, TEST_CONTEXT, 'bar', History.YEAR, + expectView(EMS, TEST_CONTEXT, "bar", History.YEAR, { datasets: { data: [], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar', { + options: History.BAR_CHART_OPTIONS("month", "bar", { }), }, }); @@ -125,19 +125,19 @@ describe('History EnergyMonitor', () => { DummyConfig.Component.ESS_GENERIC_MANAGEDSYMMETRIC("ess0"), ); - expectView(EMS, TEST_CONTEXT, 'bar', History.YEAR, + expectView(EMS, TEST_CONTEXT, "bar", History.YEAR, { datasets: { data: [ - DATA('Beladung: 15.296,8 kWh', [294.606, 1673.109, 3337.772, 3074.303, 2495.947, 3944.328, 372.595, null, null, null, null, null]), - DATA('Entladung: 12.898,2 kWh', [208.491, 1339.036, 2911.126, 2555.138, 2123.751, 3394.43, 335.402, null, null, null, null, null]), - DATA('Einspeisung: 30.703 kWh', [20, 86, 677, 3657, 12839, 12738, 627, null, null, null, null, null]), - DATA('Bezug: 23.209 kWh', [9829, 4812, 2915, 2036, 2712, 773, 94, null, null, null, null, null]), - DATA('Verbrauch: 58.573,4 kWh', [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), + DATA("Beladung: 15.296,8 kWh", [294.606, 1673.109, 3337.772, 3074.303, 2495.947, 3944.328, 372.595, null, null, null, null, null]), + DATA("Entladung: 12.898,2 kWh", [208.491, 1339.036, 2911.126, 2555.138, 2123.751, 3394.43, 335.402, null, null, null, null, null]), + DATA("Einspeisung: 30.703 kWh", [20, 86, 677, 3657, 12839, 12738, 627, null, null, null, null, null]), + DATA("Bezug: 23.209 kWh", [9829, 4812, 2915, 2036, 2712, 773, 94, null, null, null, null, null]), + DATA("Verbrauch: 58.573,4 kWh", [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar', {}), + options: History.BAR_CHART_OPTIONS("month", "bar", {}), }, }); } @@ -148,16 +148,16 @@ describe('History EnergyMonitor', () => { DummyConfig.Component.SOCOMEC_GRID_METER("meter0", "Netzzähler"), ); - expectView(EMS, TEST_CONTEXT, 'bar', History.YEAR, + expectView(EMS, TEST_CONTEXT, "bar", History.YEAR, { datasets: { data: [ - DATA('Einspeisung: 30.703 kWh', [20, 86, 677, 3657, 12839, 12738, 627, null, null, null, null, null]), - DATA('Bezug: 23.209 kWh', [9829, 4812, 2915, 2036, 2712, 773, 94, null, null, null, null, null]), - DATA('Verbrauch: 58.573,4 kWh', [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), + DATA("Einspeisung: 30.703 kWh", [20, 86, 677, 3657, 12839, 12738, 627, null, null, null, null, null]), + DATA("Bezug: 23.209 kWh", [9829, 4812, 2915, 2036, 2712, 773, 94, null, null, null, null, null]), + DATA("Verbrauch: 58.573,4 kWh", [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar', {}), + options: History.BAR_CHART_OPTIONS("month", "bar", {}), }, }); } @@ -168,16 +168,16 @@ describe('History EnergyMonitor', () => { DummyConfig.Component.ESS_GENERIC_MANAGEDSYMMETRIC("ess0"), ); - expectView(EMS, TEST_CONTEXT, 'bar', History.YEAR, + expectView(EMS, TEST_CONTEXT, "bar", History.YEAR, { datasets: { data: [ - DATA('Beladung: 15.296,8 kWh', [294.606, 1673.109, 3337.772, 3074.303, 2495.947, 3944.328, 372.595, null, null, null, null, null]), - DATA('Entladung: 12.898,2 kWh', [208.491, 1339.036, 2911.126, 2555.138, 2123.751, 3394.43, 335.402, null, null, null, null, null]), - DATA('Verbrauch: 58.573,4 kWh', [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), + DATA("Beladung: 15.296,8 kWh", [294.606, 1673.109, 3337.772, 3074.303, 2495.947, 3944.328, 372.595, null, null, null, null, null]), + DATA("Entladung: 12.898,2 kWh", [208.491, 1339.036, 2911.126, 2555.138, 2123.751, 3394.43, 335.402, null, null, null, null, null]), + DATA("Verbrauch: 58.573,4 kWh", [11634.885, 8207.927, 8976.354, 8311.835, 10341.804, 9976.102, 975.807, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: History.BAR_CHART_OPTIONS('month', 'bar', {}), + options: History.BAR_CHART_OPTIONS("month", "bar", {}), }, }); } diff --git a/ui/src/app/edge/history/common/energy/chart/chart.ts b/ui/src/app/edge/history/common/energy/chart/chart.ts index 1fb80029716..dff22346d79 100644 --- a/ui/src/app/edge/history/common/energy/chart/chart.ts +++ b/ui/src/app/edge/history/common/energy/chart/chart.ts @@ -1,68 +1,68 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig, Utils } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig, Utils } from "src/app/shared/shared"; @Component({ - selector: 'energychart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', + selector: "energychart", + templateUrl: "../../../../../shared/components/chart/abstracthistorychart.html", }) export class ChartComponent extends AbstractHistoryChart { - public static getChartData(config: EdgeConfig | null, chartType: 'line' | 'bar', translate: TranslateService): HistoryUtils.ChartData { + public static getChartData(config: EdgeConfig | null, chartType: "line" | "bar", translate: TranslateService): HistoryUtils.ChartData { const input: HistoryUtils.InputChannel[] = config?.widgets.classes.reduce((arr: HistoryUtils.InputChannel[], key) => { const newObj = []; switch (key) { - case 'Energymonitor': - case 'Consumption': + case "Energymonitor": + case "Consumption": newObj.push({ - name: 'Consumption', - powerChannel: new ChannelAddress('_sum', 'ConsumptionActivePower'), - energyChannel: new ChannelAddress('_sum', 'ConsumptionActiveEnergy'), + name: "Consumption", + powerChannel: new ChannelAddress("_sum", "ConsumptionActivePower"), + energyChannel: new ChannelAddress("_sum", "ConsumptionActiveEnergy"), }); break; - case 'Common_Autarchy': - case 'Grid': + case "Common_Autarchy": + case "Grid": newObj.push({ - name: 'GridBuy', - powerChannel: new ChannelAddress('_sum', 'GridActivePower'), - energyChannel: new ChannelAddress('_sum', 'GridBuyActiveEnergy'), - ...(chartType === 'line' && { converter: HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO }), + name: "GridBuy", + powerChannel: new ChannelAddress("_sum", "GridActivePower"), + energyChannel: new ChannelAddress("_sum", "GridBuyActiveEnergy"), + ...(chartType === "line" && { converter: HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO }), }, { - name: 'GridSell', - powerChannel: new ChannelAddress('_sum', 'GridActivePower'), - energyChannel: new ChannelAddress('_sum', 'GridSellActiveEnergy'), - ...(chartType === 'line' && { converter: HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE }), + name: "GridSell", + powerChannel: new ChannelAddress("_sum", "GridActivePower"), + energyChannel: new ChannelAddress("_sum", "GridSellActiveEnergy"), + ...(chartType === "line" && { converter: HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE }), }); break; - case 'Storage': + case "Storage": newObj.push({ - name: 'EssSoc', - powerChannel: new ChannelAddress('_sum', 'EssSoc'), + name: "EssSoc", + powerChannel: new ChannelAddress("_sum", "EssSoc"), }, { - name: 'EssCharge', - powerChannel: new ChannelAddress('_sum', 'EssActivePower'), - energyChannel: new ChannelAddress('_sum', 'EssDcChargeEnergy'), + name: "EssCharge", + powerChannel: new ChannelAddress("_sum", "EssActivePower"), + energyChannel: new ChannelAddress("_sum", "EssDcChargeEnergy"), }, { - name: 'EssDischarge', - powerChannel: new ChannelAddress('_sum', 'EssActivePower'), - energyChannel: new ChannelAddress('_sum', 'EssDcDischargeEnergy'), + name: "EssDischarge", + powerChannel: new ChannelAddress("_sum", "EssActivePower"), + energyChannel: new ChannelAddress("_sum", "EssDcDischargeEnergy"), }); break; - case 'Common_Selfconsumption': - case 'Common_Production': + case "Common_Selfconsumption": + case "Common_Production": newObj.push({ - name: 'ProductionActivePower', - powerChannel: new ChannelAddress('_sum', 'ProductionActivePower'), - energyChannel: new ChannelAddress('_sum', 'ProductionActiveEnergy'), + name: "ProductionActivePower", + powerChannel: new ChannelAddress("_sum", "ProductionActivePower"), + energyChannel: new ChannelAddress("_sum", "ProductionActiveEnergy"), }, { - name: 'ProductionDcActual', - powerChannel: new ChannelAddress('_sum', 'ProductionDcActualPower'), - energyChannel: new ChannelAddress('_sum', 'ProductionActiveEnergy'), + name: "ProductionDcActual", + powerChannel: new ChannelAddress("_sum", "ProductionDcActualPower"), + energyChannel: new ChannelAddress("_sum", "ProductionActiveEnergy"), }); break; } @@ -76,92 +76,92 @@ export class ChartComponent extends AbstractHistoryChart { output: (data: HistoryUtils.ChannelData) => { return [ { - name: translate.instant('General.production'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/ProductionActiveEnergy'], - converter: () => data['ProductionActivePower'], - color: 'rgb(45,143,171)', + name: translate.instant("General.production"), + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data["_sum/ProductionActiveEnergy"], + converter: () => data["ProductionActivePower"], + color: "rgb(45,143,171)", stack: 0, - hiddenOnInit: chartType == 'line' ? false : true, + hiddenOnInit: chartType == "line" ? false : true, order: 1, }, // DirectConsumption, displayed in stack 1 & 2, only one legenItem - ...[chartType === 'bar' && { - name: translate.instant('General.directConsumption'), + ...[chartType === "bar" && { + name: translate.instant("General.directConsumption"), nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return Utils.subtractSafely(energyValues.result.data['_sum/ProductionActiveEnergy'], energyValues.result.data['_sum/GridSellActiveEnergy'], energyValues.result.data['_sum/EssDcChargeEnergy']); + return Utils.subtractSafely(energyValues.result.data["_sum/ProductionActiveEnergy"], energyValues.result.data["_sum/GridSellActiveEnergy"], energyValues.result.data["_sum/EssDcChargeEnergy"]); }, converter: () => - data['ProductionActivePower']?.map((value, index) => Utils.subtractSafely(value, data['GridSell'][index], data['EssCharge'][index])) + data["ProductionActivePower"]?.map((value, index) => Utils.subtractSafely(value, data["GridSell"][index], data["EssCharge"][index])) ?.map(value => HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO(value)), - color: 'rgb(244,164,96)', + color: "rgb(244,164,96)", stack: [1, 2], order: 2, }], // Charge Power { - name: translate.instant('General.chargePower'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/EssDcChargeEnergy'], - converter: () => chartType === 'line' // - ? data['EssCharge']?.map((value, index) => { - return HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(Utils.subtractSafely(value, data['ProductionDcActual']?.[index])); - }) : data['EssCharge'], - color: 'rgb(0,223,0)', + name: translate.instant("General.chargePower"), + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data["_sum/EssDcChargeEnergy"], + converter: () => chartType === "line" // + ? data["EssCharge"]?.map((value, index) => { + return HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE(Utils.subtractSafely(value, data["ProductionDcActual"]?.[index])); + }) : data["EssCharge"], + color: "rgb(0,223,0)", stack: 1, - ...(chartType === 'line' && { order: 6 }), + ...(chartType === "line" && { order: 6 }), }, // Discharge Power { - name: translate.instant('General.dischargePower'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/EssDcDischargeEnergy'], + name: translate.instant("General.dischargePower"), + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data["_sum/EssDcDischargeEnergy"], converter: () => { - return chartType === 'line' ? - data['EssDischarge']?.map((value, index) => { - return HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO(Utils.subtractSafely(value, data['ProductionDcActual']?.[index])); - }) : data['EssDischarge']; + return chartType === "line" ? + data["EssDischarge"]?.map((value, index) => { + return HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO(Utils.subtractSafely(value, data["ProductionDcActual"]?.[index])); + }) : data["EssDischarge"]; }, - color: 'rgb(200,0,0)', + color: "rgb(200,0,0)", stack: 2, - ...(chartType === 'line' && { order: 5 }), + ...(chartType === "line" && { order: 5 }), }, // Sell to grid { - name: translate.instant('General.gridSellAdvanced'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/GridSellActiveEnergy'], - converter: () => data['GridSell'], - color: 'rgb(0,0,200)', + name: translate.instant("General.gridSellAdvanced"), + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data["_sum/GridSellActiveEnergy"], + converter: () => data["GridSell"], + color: "rgb(0,0,200)", stack: 1, - ...(chartType === 'line' && { order: 4 }), + ...(chartType === "line" && { order: 4 }), }, // Buy from Grid { - name: translate.instant('General.gridBuyAdvanced'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/GridBuyActiveEnergy'], - converter: () => data['GridBuy'], - color: 'rgb(0,0,0)', + name: translate.instant("General.gridBuyAdvanced"), + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data["_sum/GridBuyActiveEnergy"], + converter: () => data["GridBuy"], + color: "rgb(0,0,0)", stack: 2, - ...(chartType === 'line' && { order: 2 }), + ...(chartType === "line" && { order: 2 }), }, // Consumption { - name: translate.instant('General.consumption'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data['_sum/ConsumptionActiveEnergy'], - converter: () => data['Consumption'], - color: 'rgb(253,197,7)', + name: translate.instant("General.consumption"), + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues.result.data["_sum/ConsumptionActiveEnergy"], + converter: () => data["Consumption"], + color: "rgb(253,197,7)", stack: 3, - hiddenOnInit: chartType == 'line' ? false : true, - ...(chartType === 'line' && { order: 0 }), + hiddenOnInit: chartType == "line" ? false : true, + ...(chartType === "line" && { order: 0 }), }, - ...[chartType === 'line' && + ...[chartType === "line" && { - name: translate.instant('General.soc'), - converter: () => data['EssSoc']?.map(value => Utils.multiplySafely(value, 1000)), - color: 'rgb(189, 195, 199)', + name: translate.instant("General.soc"), + converter: () => data["EssSoc"]?.map(value => Utils.multiplySafely(value, 1000)), + color: "rgb(189, 195, 199)", borderDash: [10, 10], yAxisId: ChartAxis.RIGHT, stack: 1, @@ -169,12 +169,15 @@ export class ChartComponent extends AbstractHistoryChart { ]; }, tooltip: { - formatNumber: '1.0-2', + formatNumber: "1.0-2", afterTitle: (stack: string) => { - if (stack === "1") { - return translate.instant('General.production'); - } else if (stack === "2") { - return translate.instant('General.consumption'); + + if (chartType === "bar") { + if (stack === "1") { + return translate.instant("General.production"); + } else if (stack === "2") { + return translate.instant("General.consumption"); + } } return null; }, @@ -183,16 +186,16 @@ export class ChartComponent extends AbstractHistoryChart { // Left YAxis { - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }, // Right Yaxis, only shown for line-chart - (chartType === 'line' && { - unit: YAxisTitle.PERCENTAGE, - customTitle: '%', - position: 'right', + (chartType === "line" && { + unit: YAxisType.PERCENTAGE, + customTitle: "%", + position: "right", yAxisId: ChartAxis.RIGHT, displayGrid: false, }), diff --git a/ui/src/app/edge/history/common/energy/energy.ts b/ui/src/app/edge/history/common/energy/energy.ts index fe07c430784..95ac46ccad6 100644 --- a/ui/src/app/edge/history/common/energy/energy.ts +++ b/ui/src/app/edge/history/common/energy/energy.ts @@ -1,9 +1,9 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; -import { ChartComponent } from './chart/chart'; -import { FlatComponent } from './flat/flat'; +import { ChartComponent } from "./chart/chart"; +import { FlatComponent } from "./flat/flat"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/history/common/energy/flat/flat.html b/ui/src/app/edge/history/common/energy/flat/flat.html index 94a5b9ea5be..9dd2bd9c078 100644 --- a/ui/src/app/edge/history/common/energy/flat/flat.html +++ b/ui/src/app/edge/history/common/energy/flat/flat.html @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/common/energy/flat/flat.ts b/ui/src/app/edge/history/common/energy/flat/flat.ts index 54cc70482c4..49db6041eb6 100644 --- a/ui/src/app/edge/history/common/energy/flat/flat.ts +++ b/ui/src/app/edge/history/common/energy/flat/flat.ts @@ -1,24 +1,24 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, Utils } from '../../../../../shared/shared'; -import { Base64PayloadResponse } from 'src/app/shared/jsonrpc/response/base64PayloadResponse'; -import { QueryHistoricTimeseriesExportXlxsRequest } from 'src/app/shared/jsonrpc/request/queryHistoricTimeseriesExportXlxs'; -import { isSameDay, format, isSameMonth, isSameYear } from 'date-fns'; -import { saveAs } from 'file-saver-es'; -import { AppService } from 'src/app/app.service'; +import { Component } from "@angular/core"; +import { format, isSameDay, isSameMonth, isSameYear } from "date-fns"; +import { saveAs } from "file-saver-es"; +import { AppService } from "src/app/app.service"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { QueryHistoricTimeseriesExportXlxsRequest } from "src/app/shared/jsonrpc/request/queryHistoricTimeseriesExportXlxs"; +import { Base64PayloadResponse } from "src/app/shared/jsonrpc/response/base64PayloadResponse"; +import { ChannelAddress, CurrentData, Utils } from "../../../../../shared/shared"; @Component({ - selector: 'energy', - templateUrl: './flat.html', + selector: "energy", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { - private static readonly EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'; - private static readonly EXCEL_EXTENSION = '.xlsx'; + private static readonly EXCEL_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"; + private static readonly EXCEL_EXTENSION = ".xlsx"; protected autarchyValue: number | null; protected readonly isSmartphoneResolution = this.service.isSmartphoneResolution; - protected readonly isApp: boolean = AppService.platform !== 'web'; + protected readonly isApp: boolean = AppService.platform !== "web"; public getChartHeight(): number { return this.service.deviceHeight / 2; @@ -27,14 +27,14 @@ export class FlatComponent extends AbstractFlatWidget { protected override onCurrentData(currentData: CurrentData) { this.autarchyValue = Utils.calculateAutarchy( - currentData.allComponents['_sum/GridBuyActiveEnergy'] / 1000, - currentData.allComponents['_sum/ConsumptionActiveEnergy'] / 1000); + currentData.allComponents["_sum/GridBuyActiveEnergy"] / 1000, + currentData.allComponents["_sum/ConsumptionActiveEnergy"] / 1000); } protected override getChannelAddresses(): ChannelAddress[] { return [ - new ChannelAddress('_sum', 'GridBuyActiveEnergy'), - new ChannelAddress('_sum', 'ConsumptionActiveEnergy'), + new ChannelAddress("_sum", "GridBuyActiveEnergy"), + new ChannelAddress("_sum", "ConsumptionActiveEnergy"), ]; } @@ -44,14 +44,14 @@ export class FlatComponent extends AbstractFlatWidget { protected exportToXlxs() { if (this.isApp) { - this.service.toast(this.translate.instant('APP.FUNCTIONALITY_TEMPORARILY_NOT_AVAILABLE'), "warning"); + this.service.toast(this.translate.instant("APP.FUNCTIONALITY_TEMPORARILY_NOT_AVAILABLE"), "warning"); return; } this.service.getCurrentEdge().then(edge => { edge.sendRequest(this.websocket, new QueryHistoricTimeseriesExportXlxsRequest(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to)).then(response => { const r = response as Base64PayloadResponse; - const binary = atob(r.result.payload.replace(/\s/g, '')); + const binary = atob(r.result.payload.replace(/\s/g, "")); const len = binary.length; const buffer = new ArrayBuffer(len); const view = new Uint8Array(buffer); diff --git a/ui/src/app/edge/history/common/grid/chart/chart.constants.spec.ts b/ui/src/app/edge/history/common/grid/chart/chart.constants.spec.ts index 1c3156cb6e5..bba5418804d 100644 --- a/ui/src/app/edge/history/common/grid/chart/chart.constants.spec.ts +++ b/ui/src/app/edge/history/common/grid/chart/chart.constants.spec.ts @@ -6,7 +6,7 @@ import { EdgeConfig } from "src/app/shared/shared"; import { ChartComponent } from "./chart"; -export function expectView(config: EdgeConfig, testContext: TestContext, chartType: 'line' | 'bar', channels: OeTester.Types.Channels, view: OeChartTester.View, showPhases: boolean): void { +export function expectView(config: EdgeConfig, testContext: TestContext, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View, showPhases: boolean): void { expect(removeFunctions(OeChartTester .apply(ChartComponent .getChartData(DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), chartType, testContext.translate, showPhases), chartType, channels, testContext, config))) diff --git a/ui/src/app/edge/history/common/grid/chart/chart.spec.ts b/ui/src/app/edge/history/common/grid/chart/chart.spec.ts index 9510e70e64b..64c0455cdf2 100644 --- a/ui/src/app/edge/history/common/grid/chart/chart.spec.ts +++ b/ui/src/app/edge/history/common/grid/chart/chart.spec.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore import { History } from "src/app/edge/history/common/energy/chart/channels.spec"; -import { DATA, LABELS } from "../../energy/chart/chart.constants.spec"; -import { expectView } from "./chart.constants.spec"; import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; import { OeTester } from "src/app/shared/components/shared/testing/common"; import { TestContext, sharedSetup } from "src/app/shared/components/shared/testing/utils.spec"; import { ChartAxis } from "src/app/shared/service/utils"; +import { DATA, LABELS } from "../../energy/chart/chart.constants.spec"; +import { expectView } from "./chart.constants.spec"; -describe('History Grid', () => { +describe("History Grid", () => { const edgeConfigWithOutController14a = DummyConfig.from( DummyConfig.Component.SOCOMEC_GRID_METER("meter0", "Netzzähler"), @@ -24,18 +24,18 @@ describe('History Grid', () => { TEST_CONTEXT = await sharedSetup(), ); - it('#getChartData()', () => { + it("#getChartData()", () => { { // Line - Chart - without Controller 14a - expectView(edgeConfigWithOutController14a, TEST_CONTEXT, 'line', History.DAY, + expectView(edgeConfigWithOutController14a, TEST_CONTEXT, "line", History.DAY, { datasets: { data: [ - DATA('Einspeisung: 15,6 kWh', [null, null, null, 0, 0, 0.006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.004, 0, 0, 0, 0.004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0.001, 0.002, null, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0.004, 0, 0.004, 0, 0, 0, 0, 0.005, 0.013, 0.006, 0.004, 0.017, 0.015, 0.017, 0.011, 0, 0, 0, 0, 0.029, 0.015, 0.013, 0.019, 0.014, 0.007, 0.016, 0, 0.018, 0.022, 0, 0.012, 0.011, 0.007, 0, 0.033, 0.007, 0.003, 0.004, 0.011, 0, 0.038, 0, 0, 0.019, 0, 0.016, 0.014, 0.018, 0, 1.119, 3.453, 3.608, 3.941, 4.392, 3.786, 4.805, 4.688, 3.095, 2.32, 2.851, 3.058, 4.044, 5.011, 2.789, 6.53, 5.029, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Bezug: 0,9 kWh', [null, null, null, 0.031, 0.018, 0, 0.02, 0.016, 0.015, 0.014, 0.009, 0.02, 0.025, 0.025, 0.025, 0.021, 0.012, 0.009, 0.01, 0.011, 0.005, 0.003, 0, 0.015, 0.018, 0.023, 0, 0, 0, 0.002, 0.002, 0.003, 0.015, 0.008, 0.022, 0.027, 0.016, 0.003, 0.002, 0, 0.028, 0.027, 0.017, 0.001, 0, 0, 0, null, null, null, null, 0.011, 0.01, 0.004, 0.006, 0.007, 0.018, 0.008, 0.012, 0.009, 0.004, 0.013, 0.015, 0.012, 0, 0, 0, 0.002, 0, 0.005, 0.001, 0.03, 0.062, 0, 0, 0, 0, 0, 0, 0, 0, 0.015, 0.005, 0.004, 0.007, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0, 0.021, 0, 0, 0, 0, 0, 0.003, 0, 0.004, 0, 0, 0.032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Einspeisung: 15,6 kWh", [null, null, null, 0, 0, 0.006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.004, 0, 0, 0, 0.004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0.001, 0.002, null, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0.004, 0, 0.004, 0, 0, 0, 0, 0.005, 0.013, 0.006, 0.004, 0.017, 0.015, 0.017, 0.011, 0, 0, 0, 0, 0.029, 0.015, 0.013, 0.019, 0.014, 0.007, 0.016, 0, 0.018, 0.022, 0, 0.012, 0.011, 0.007, 0, 0.033, 0.007, 0.003, 0.004, 0.011, 0, 0.038, 0, 0, 0.019, 0, 0.016, 0.014, 0.018, 0, 1.119, 3.453, 3.608, 3.941, 4.392, 3.786, 4.805, 4.688, 3.095, 2.32, 2.851, 3.058, 4.044, 5.011, 2.789, 6.53, 5.029, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Bezug: 0,9 kWh", [null, null, null, 0.031, 0.018, 0, 0.02, 0.016, 0.015, 0.014, 0.009, 0.02, 0.025, 0.025, 0.025, 0.021, 0.012, 0.009, 0.01, 0.011, 0.005, 0.003, 0, 0.015, 0.018, 0.023, 0, 0, 0, 0.002, 0.002, 0.003, 0.015, 0.008, 0.022, 0.027, 0.016, 0.003, 0.002, 0, 0.028, 0.027, 0.017, 0.001, 0, 0, 0, null, null, null, null, 0.011, 0.01, 0.004, 0.006, 0.007, 0.018, 0.008, 0.012, 0.009, 0.004, 0.013, 0.015, 0.012, 0, 0, 0, 0.002, 0, 0.005, 0.001, 0.03, 0.062, 0, 0, 0, 0, 0, 0, 0, 0, 0.015, 0.005, 0.004, 0.007, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0, 0.021, 0, 0, 0, 0, 0, 0.003, 0, 0.004, 0, 0, 0.032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), ], labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.LINE_CHART_OPTIONS('hour', 'line', { + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { [ChartAxis.LEFT]: { scale: { beginAtZero: true } }, }), }, @@ -43,48 +43,48 @@ describe('History Grid', () => { } { // Line - Chart - expectView(edgeConfig, TEST_CONTEXT, 'line', History.DAY, + expectView(edgeConfig, TEST_CONTEXT, "line", History.DAY, { datasets: { data: [ - DATA('Einspeisung: 15,6 kWh', [null, null, null, 0, 0, 0.006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.004, 0, 0, 0, 0.004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0.001, 0.002, null, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0.004, 0, 0.004, 0, 0, 0, 0, 0.005, 0.013, 0.006, 0.004, 0.017, 0.015, 0.017, 0.011, 0, 0, 0, 0, 0.029, 0.015, 0.013, 0.019, 0.014, 0.007, 0.016, 0, 0.018, 0.022, 0, 0.012, 0.011, 0.007, 0, 0.033, 0.007, 0.003, 0.004, 0.011, 0, 0.038, 0, 0, 0.019, 0, 0.016, 0.014, 0.018, 0, 1.119, 3.453, 3.608, 3.941, 4.392, 3.786, 4.805, 4.688, 3.095, 2.32, 2.851, 3.058, 4.044, 5.011, 2.789, 6.53, 5.029, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), - DATA('Bezug: 0,9 kWh', [null, null, null, 0.031, 0.018, 0, 0.02, 0.016, 0.015, 0.014, 0.009, 0.02, 0.025, 0.025, 0.025, 0.021, 0.012, 0.009, 0.01, 0.011, 0.005, 0.003, 0, 0.015, 0.018, 0.023, 0, 0, 0, 0.002, 0.002, 0.003, 0.015, 0.008, 0.022, 0.027, 0.016, 0.003, 0.002, 0, 0.028, 0.027, 0.017, 0.001, 0, 0, 0, null, null, null, null, 0.011, 0.01, 0.004, 0.006, 0.007, 0.018, 0.008, 0.012, 0.009, 0.004, 0.013, 0.015, 0.012, 0, 0, 0, 0.002, 0, 0.005, 0.001, 0.03, 0.062, 0, 0, 0, 0, 0, 0, 0, 0, 0.015, 0.005, 0.004, 0.007, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0, 0.021, 0, 0, 0, 0, 0, 0.003, 0, 0.004, 0, 0, 0.032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Einspeisung: 15,6 kWh", [null, null, null, 0, 0, 0.006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.004, 0, 0, 0, 0.004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0.001, 0.002, null, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.001, 0.004, 0, 0.004, 0, 0, 0, 0, 0.005, 0.013, 0.006, 0.004, 0.017, 0.015, 0.017, 0.011, 0, 0, 0, 0, 0.029, 0.015, 0.013, 0.019, 0.014, 0.007, 0.016, 0, 0.018, 0.022, 0, 0.012, 0.011, 0.007, 0, 0.033, 0.007, 0.003, 0.004, 0.011, 0, 0.038, 0, 0, 0.019, 0, 0.016, 0.014, 0.018, 0, 1.119, 3.453, 3.608, 3.941, 4.392, 3.786, 4.805, 4.688, 3.095, 2.32, 2.851, 3.058, 4.044, 5.011, 2.789, 6.53, 5.029, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Bezug: 0,9 kWh", [null, null, null, 0.031, 0.018, 0, 0.02, 0.016, 0.015, 0.014, 0.009, 0.02, 0.025, 0.025, 0.025, 0.021, 0.012, 0.009, 0.01, 0.011, 0.005, 0.003, 0, 0.015, 0.018, 0.023, 0, 0, 0, 0.002, 0.002, 0.003, 0.015, 0.008, 0.022, 0.027, 0.016, 0.003, 0.002, 0, 0.028, 0.027, 0.017, 0.001, 0, 0, 0, null, null, null, null, 0.011, 0.01, 0.004, 0.006, 0.007, 0.018, 0.008, 0.012, 0.009, 0.004, 0.013, 0.015, 0.012, 0, 0, 0, 0.002, 0, 0.005, 0.001, 0.03, 0.062, 0, 0, 0, 0, 0, 0, 0, 0, 0.015, 0.005, 0.004, 0.007, 0, 0, 0, 0, 0, 0, 0, 0.005, 0, 0, 0, 0, 0, 0, 0.021, 0, 0, 0, 0, 0, 0.003, 0, 0.004, 0, 0, 0.032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), ], labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.MULTI_LINE_OPTIONS('hour', 'line', { - ['right']: { scale: { max: 1, min: 0 }, ticks: { stepSize: 1 } }, + options: OeTester.ChartOptions.MULTI_LINE_OPTIONS("hour", "line", { + ["right"]: { scale: { max: 1, min: 0 }, ticks: { stepSize: 1 } }, }), }, }, false); } { // Line - Chart - expectView(edgeConfig, TEST_CONTEXT, 'line', History.WEEK, + expectView(edgeConfig, TEST_CONTEXT, "line", History.WEEK, { datasets: { data: [ - DATA('Einspeisung: 119,7 kWh', [0.0023333333333333335, 0, 0, 0, 0, 0, 0, 0.014166666666666666, 0.02808333333333333, 0.9546666666666667, 4.150583333333333, 6.431333333333333, 5.737583333333333, 5.6714166666666666, 5.873333333333333, 5.049083333333333, 3.122, 1.0374166666666667, 0.22808333333333333, 0.02, 0, 0, 0, 0.008333333333333333, 0.0030833333333333333, 0.008333333333333333, 0, 0.007727272727272728, 0, 0, 0.00275, 0.013833333333333335, 0.017416666666666667, 0.006083333333333333, 0.5646666666666667, 2.2251666666666665, 2.03375, 3.99725, 4.990083333333333, 3.0128333333333335, 2.4844166666666667, 1.378, 0.65975, 0, 0.001, 0.006916666666666667, 0.008166666666666666, 0, 0, 0, 0, 0, 0, 0, 0.004083333333333333, 0.010583333333333333, 0.011166666666666667, 1.261, 5.308833333333333, 6.604, 6.321166666666667, 6.488333333333333, 6.78425, 6.052083333333333, 2.5839166666666666, 0.529, 0.01616666666666667, 0.0055, 0, 0.0006666666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0024166666666666664, 0.0125, 0.7065, 5.835416666666667, 4.77025, 6.03925, 6.8445833333333335, 5.370333333333333, 4.490166666666667, 2.3506666666666667, 0.7650833333333333, 0.08583333333333333, 0.011454545454545455, 0, 0, 0.005666666666666667, 0, 0, 0, 0, 0, 0, 0, 0.0033333333333333335, 0.004083333333333333, 0.02033333333333333, 0.02316666666666667, 1.4106666666666667, 0.8588333333333333, 0.0015833333333333333, 0.006583333333333333, 0.010083333333333335, 0.3410833333333333, 2.9290833333333337, 1.1175833333333332, 0.48583333333333334, 0, 0, 0, 0.0006666666666666666, 0.017916666666666668, 0.004, 0, 0, 0.001, 0, 0, 0, 0.02358333333333333, 0.006416666666666667, 0.008166666666666666, 0.0031666666666666666, 0.009916666666666666, 2.7254166666666664, 1.83725, 2.63225, 2.2170833333333335, 0.529, 0, 0, 0, 0, 0, 0.0003333333333333333, 0, 0, 0.011416666666666665, 0.011083333333333334, 0, 0, 0, 0, 0.008333333333333333, 0.008818181818181819, 0.015333333333333334, 0.018857142857142857, 0.024833333333333332, 0.010888888888888889, 2.2174, 3.9214166666666666, 1.6248181818181817, 1.937, 1.789, 0.0195, 0.0143, 0, 0, 0.009, 0.018875]), - DATA('Bezug: 2,4 kWh', [0, 0.011916666666666666, 0.01633333333333333, 0.00609090909090909, 0.015333333333333334, 0.011666666666666665, 0.0024166666666666664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.02425, 0.004416666666666667, 0.0035833333333333333, 0, 0, 0, 0.04441666666666667, 0, 0.013111111111111112, 0.001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0011666666666666668, 0, 0, 0, 0.0015833333333333333, 0.013333333333333334, 0.020416666666666666, 0.01125, 0.019727272727272725, 0.012444444444444445, 0.009583333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.007666666666666667, 0, 0.0023333333333333335, 0.0125, 0.01609090909090909, 0.02016666666666667, 0.014083333333333333, 0.006363636363636363, 0.01955555555555556, 0.04841666666666666, 0.011166666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.014222222222222221, 0.00225, 0, 0.0036666666666666666, 0.032916666666666664, 0.014666666666666666, 0.0135, 0.017363636363636362, 0.013333333333333334, 0.022083333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0009166666666666666, 0, 0.0021666666666666666, 0, 0, 0, 0.0005, 0.04841666666666666, 0, 0.005555555555555556, 0.02716666666666667, 0.017333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0023333333333333335, 0.008333333333333333, 0.003, 0.015916666666666666, 0.00325, 0, 0.004333333333333333, 0.001, 0, 0, 0.019545454545454546, 0.0017777777777777776, 0.006416666666666667, 0.017666666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0058, 0.005625, 0, 0]), + DATA("Einspeisung: 119,7 kWh", [0.0023333333333333335, 0, 0, 0, 0, 0, 0, 0.014166666666666666, 0.02808333333333333, 0.9546666666666667, 4.150583333333333, 6.431333333333333, 5.737583333333333, 5.6714166666666666, 5.873333333333333, 5.049083333333333, 3.122, 1.0374166666666667, 0.22808333333333333, 0.02, 0, 0, 0, 0.008333333333333333, 0.0030833333333333333, 0.008333333333333333, 0, 0.007727272727272728, 0, 0, 0.00275, 0.013833333333333335, 0.017416666666666667, 0.006083333333333333, 0.5646666666666667, 2.2251666666666665, 2.03375, 3.99725, 4.990083333333333, 3.0128333333333335, 2.4844166666666667, 1.378, 0.65975, 0, 0.001, 0.006916666666666667, 0.008166666666666666, 0, 0, 0, 0, 0, 0, 0, 0.004083333333333333, 0.010583333333333333, 0.011166666666666667, 1.261, 5.308833333333333, 6.604, 6.321166666666667, 6.488333333333333, 6.78425, 6.052083333333333, 2.5839166666666666, 0.529, 0.01616666666666667, 0.0055, 0, 0.0006666666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0024166666666666664, 0.0125, 0.7065, 5.835416666666667, 4.77025, 6.03925, 6.8445833333333335, 5.370333333333333, 4.490166666666667, 2.3506666666666667, 0.7650833333333333, 0.08583333333333333, 0.011454545454545455, 0, 0, 0.005666666666666667, 0, 0, 0, 0, 0, 0, 0, 0.0033333333333333335, 0.004083333333333333, 0.02033333333333333, 0.02316666666666667, 1.4106666666666667, 0.8588333333333333, 0.0015833333333333333, 0.006583333333333333, 0.010083333333333335, 0.3410833333333333, 2.9290833333333337, 1.1175833333333332, 0.48583333333333334, 0, 0, 0, 0.0006666666666666666, 0.017916666666666668, 0.004, 0, 0, 0.001, 0, 0, 0, 0.02358333333333333, 0.006416666666666667, 0.008166666666666666, 0.0031666666666666666, 0.009916666666666666, 2.7254166666666664, 1.83725, 2.63225, 2.2170833333333335, 0.529, 0, 0, 0, 0, 0, 0.0003333333333333333, 0, 0, 0.011416666666666665, 0.011083333333333334, 0, 0, 0, 0, 0.008333333333333333, 0.008818181818181819, 0.015333333333333334, 0.018857142857142857, 0.024833333333333332, 0.010888888888888889, 2.2174, 3.9214166666666666, 1.6248181818181817, 1.937, 1.789, 0.0195, 0.0143, 0, 0, 0.009, 0.018875]), + DATA("Bezug: 2,4 kWh", [0, 0.011916666666666666, 0.01633333333333333, 0.00609090909090909, 0.015333333333333334, 0.011666666666666665, 0.0024166666666666664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.02425, 0.004416666666666667, 0.0035833333333333333, 0, 0, 0, 0.04441666666666667, 0, 0.013111111111111112, 0.001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0011666666666666668, 0, 0, 0, 0.0015833333333333333, 0.013333333333333334, 0.020416666666666666, 0.01125, 0.019727272727272725, 0.012444444444444445, 0.009583333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.007666666666666667, 0, 0.0023333333333333335, 0.0125, 0.01609090909090909, 0.02016666666666667, 0.014083333333333333, 0.006363636363636363, 0.01955555555555556, 0.04841666666666666, 0.011166666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.014222222222222221, 0.00225, 0, 0.0036666666666666666, 0.032916666666666664, 0.014666666666666666, 0.0135, 0.017363636363636362, 0.013333333333333334, 0.022083333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0009166666666666666, 0, 0.0021666666666666666, 0, 0, 0, 0.0005, 0.04841666666666666, 0, 0.005555555555555556, 0.02716666666666667, 0.017333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0023333333333333335, 0.008333333333333333, 0.003, 0.015916666666666666, 0.00325, 0, 0.004333333333333333, 0.001, 0, 0, 0.019545454545454546, 0.0017777777777777776, 0.006416666666666667, 0.017666666666666667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0058, 0.005625, 0, 0]), ], labels: LABELS(History.WEEK.dataChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.MULTI_LINE_OPTIONS('day', 'line', { - ['right']: { scale: { max: 1, min: 0 }, ticks: { stepSize: 1 } }, + options: OeTester.ChartOptions.MULTI_LINE_OPTIONS("day", "line", { + ["right"]: { scale: { max: 1, min: 0 }, ticks: { stepSize: 1 } }, }), }, }, false); } { // Line - Chart - expectView(edgeConfig, TEST_CONTEXT, 'bar', History.MONTH, + expectView(edgeConfig, TEST_CONTEXT, "bar", History.MONTH, { datasets: { data: [ - DATA('Einspeisung: 12.738 kWh', [603, 590, 551, 572, 69, 236, 626, null, 1003, 261, 518, 698, 640, 388, 471, 373, 373, 677, 286, 406, 249, null, 446, 369, 558, null, 776, 425, 574, null]), - DATA('Bezug: 773 kWh', [16, 6, 3, 3, 5, 48, 4, null, 5, 26, 17, 62, 8, 66, 13, 21, 4, 3, 18, 27, 29, null, 118, 85, 2, null, 72, 28, 84, null]), + DATA("Einspeisung: 12.738 kWh", [603, 590, 551, 572, 69, 236, 626, null, 1003, 261, 518, 698, 640, 388, 471, 373, 373, 677, 286, 406, 249, null, 446, 369, 558, null, 776, 425, 574, null]), + DATA("Bezug: 773 kWh", [16, 6, 3, 3, 5, 48, 4, null, 5, 26, 17, 62, 8, 66, 13, 21, 4, 3, 18, 27, 29, null, 118, 85, 2, null, 72, 28, 84, null]), ], labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.MULTI_BAR_OPTIONS('day', 'bar', { - ['right']: { scale: {}, ticks: { stepSize: 1 } }, + options: OeTester.ChartOptions.MULTI_BAR_OPTIONS("day", "bar", { + ["right"]: { scale: {}, ticks: { stepSize: 1 } }, }), }, @@ -92,16 +92,16 @@ describe('History Grid', () => { } { // BAR - Chart - expectView(edgeConfig, TEST_CONTEXT, 'bar', History.YEAR, + expectView(edgeConfig, TEST_CONTEXT, "bar", History.YEAR, { datasets: { data: [ - DATA('Einspeisung: 30.703 kWh', [20, 86, 677, 3657, 12839, 12738, 627, null, null, null, null, null]), - DATA('Bezug: 23.209 kWh', [9829, 4812, 2915, 2036, 2712, 773, 94, null, null, null, null, null]), + DATA("Einspeisung: 30.703 kWh", [20, 86, 677, 3657, 12839, 12738, 627, null, null, null, null, null]), + DATA("Bezug: 23.209 kWh", [9829, 4812, 2915, 2036, 2712, 773, 94, null, null, null, null, null]), ], labels: LABELS(History.YEAR.energyPerPeriodChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.MULTI_BAR_OPTIONS('month', 'bar', { - ['right']: { scale: {}, ticks: { stepSize: 1 } }, + options: OeTester.ChartOptions.MULTI_BAR_OPTIONS("month", "bar", { + ["right"]: { scale: {}, ticks: { stepSize: 1 } }, }), }, }, false); diff --git a/ui/src/app/edge/history/common/grid/chart/chart.ts b/ui/src/app/edge/history/common/grid/chart/chart.ts index 3198760bcb3..f195179022c 100644 --- a/ui/src/app/edge/history/common/grid/chart/chart.ts +++ b/ui/src/app/edge/history/common/grid/chart/chart.ts @@ -1,77 +1,77 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { BoxAnnotationOptions } from 'chartjs-plugin-annotation'; -import { GridSectionComponent } from 'src/app/edge/live/energymonitor/chart/section/grid.component'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; -import { ChartAnnotationState } from 'src/app/shared/type/general'; +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { BoxAnnotationOptions } from "chartjs-plugin-annotation"; +import { GridSectionComponent } from "src/app/edge/live/energymonitor/chart/section/grid.component"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; +import { ChartAnnotationState } from "src/app/shared/type/general"; @Component({ - selector: 'gridchart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', + selector: "gridchart", + templateUrl: "../../../../../shared/components/chart/abstracthistorychart.html", }) export class ChartComponent extends AbstractHistoryChart { - public static getChartData(config: EdgeConfig, chartType: 'line' | 'bar', translate: TranslateService, showPhases: boolean): HistoryUtils.ChartData { + public static getChartData(config: EdgeConfig, chartType: "line" | "bar", translate: TranslateService, showPhases: boolean): HistoryUtils.ChartData { const input: HistoryUtils.InputChannel[] = [ { - name: 'GridSell', - powerChannel: ChannelAddress.fromString('_sum/GridActivePower'), - energyChannel: ChannelAddress.fromString('_sum/GridSellActiveEnergy'), - ...(chartType === 'line' && { converter: HistoryUtils.ValueConverter.ONLY_NEGATIVE_AND_NEGATIVE_AS_POSITIVE }), + name: "GridSell", + powerChannel: ChannelAddress.fromString("_sum/GridActivePower"), + energyChannel: ChannelAddress.fromString("_sum/GridSellActiveEnergy"), + ...(chartType === "line" && { converter: HistoryUtils.ValueConverter.ONLY_NEGATIVE_AND_NEGATIVE_AS_POSITIVE }), }, { - name: 'GridBuy', - powerChannel: ChannelAddress.fromString('_sum/GridActivePower'), - energyChannel: ChannelAddress.fromString('_sum/GridBuyActiveEnergy'), + name: "GridBuy", + powerChannel: ChannelAddress.fromString("_sum/GridActivePower"), + energyChannel: ChannelAddress.fromString("_sum/GridBuyActiveEnergy"), converter: HistoryUtils.ValueConverter.NEGATIVE_AS_ZERO, }, ]; if (GridSectionComponent.isControllerEnabled(config, "Controller.Ess.Limiter14a")) { input.push({ - name: 'Restriction', - powerChannel: ChannelAddress.fromString('ctrlEssLimiter14a0/RestrictionMode'), - energyChannel: ChannelAddress.fromString('ctrlEssLimiter14a0/CumulatedRestrictionTime'), + name: "Restriction", + powerChannel: ChannelAddress.fromString("ctrlEssLimiter14a0/RestrictionMode"), + energyChannel: ChannelAddress.fromString("ctrlEssLimiter14a0/CumulatedRestrictionTime"), }); input.push({ - name: 'OffGrid', - powerChannel: ChannelAddress.fromString('_sum/GridMode'), - energyChannel: ChannelAddress.fromString('_sum/GridModeOffGridTime'), + name: "OffGrid", + powerChannel: ChannelAddress.fromString("_sum/GridMode"), + energyChannel: ChannelAddress.fromString("_sum/GridModeOffGridTime"), }); } if (showPhases) { - ['L1', 'L2', 'L3'].forEach(phase => { + ["L1", "L2", "L3"].forEach(phase => { input.push({ - name: 'GridActivePower' + phase, - powerChannel: ChannelAddress.fromString('_sum/GridActivePower' + phase), + name: "GridActivePower" + phase, + powerChannel: ChannelAddress.fromString("_sum/GridActivePower" + phase), }); }); } const yAxes: HistoryUtils.yAxes[] = [{ - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }]; if (GridSectionComponent.isControllerEnabled(config, "Controller.Ess.Limiter14a")) { - yAxes.push((chartType === 'bar' ? + yAxes.push((chartType === "bar" ? { - unit: YAxisTitle.TIME, - position: 'right', + unit: YAxisType.TIME, + position: "right", yAxisId: ChartAxis.RIGHT, displayGrid: false, } : { - unit: YAxisTitle.RELAY, - position: 'right', + unit: YAxisType.RELAY, + position: "right", yAxisId: ChartAxis.RIGHT, - customTitle: translate.instant('General.state'), + customTitle: translate.instant("General.state"), displayGrid: false, } )); @@ -84,46 +84,46 @@ export class ChartComponent extends AbstractHistoryChart { let restrictionData; let offGridData; - if (chartType === 'line') { + if (chartType === "line") { // Convert values > 0 to 1 (=on) - restrictionData = data['Restriction']?.map((value) => (value > 0 ? ChartAnnotationState.ON : ChartAnnotationState.OFF_HIDDEN)); + restrictionData = data["Restriction"]?.map((value) => (value > 0 ? ChartAnnotationState.ON : ChartAnnotationState.OFF_HIDDEN)); // Off-Grid (=2) to on (=1) - offGridData = data['OffGrid']?.map((value) => (value * 1000 > 1 ? ChartAnnotationState.ON : ChartAnnotationState.OFF_HIDDEN)); + offGridData = data["OffGrid"]?.map((value) => (value * 1000 > 1 ? ChartAnnotationState.ON : ChartAnnotationState.OFF_HIDDEN)); } else { - restrictionData = data['Restriction']?.map((value) => value * 1000); - offGridData = data['OffGrid']?.map((value) => value * 1000); + restrictionData = data["Restriction"]?.map((value) => value * 1000); + offGridData = data["OffGrid"]?.map((value) => value * 1000); } const datasets: HistoryUtils.DisplayValue[] = [ { - name: translate.instant('General.gridSellAdvanced'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues?.result.data['_sum/GridSellActiveEnergy'] ?? null, - converter: () => data['GridSell'], - color: 'rgba(0,0,200)', + name: translate.instant("General.gridSellAdvanced"), + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues?.result.data["_sum/GridSellActiveEnergy"] ?? null, + converter: () => data["GridSell"], + color: "rgba(0,0,200)", stack: 1, }, { - name: translate.instant('General.gridBuyAdvanced'), + name: translate.instant("General.gridBuyAdvanced"), nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues?.result.data['_sum/GridBuyActiveEnergy'] ?? null; + return energyValues?.result.data["_sum/GridBuyActiveEnergy"] ?? null; }, - converter: () => data['GridBuy'], - color: 'rgb(0,0,0)', + converter: () => data["GridBuy"], + color: "rgb(0,0,0)", stack: 0, }, offGridData ? ({ - name: translate.instant('GRID_STATES.OFF_GRID'), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues?.result.data['_sum/GridModeOffGridTime'], + name: translate.instant("GRID_STATES.OFF_GRID"), + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues?.result.data["_sum/GridModeOffGridTime"], converter: () => offGridData, - color: 'rgb(139,0,0)', + color: "rgb(139,0,0)", stack: 2, custom: ( - chartType === 'line' ? { - unit: YAxisTitle.RELAY, - pluginType: 'box', + chartType === "line" ? { + unit: YAxisType.RELAY, + pluginType: "box", annotations: getAnnotations(offGridData, labels), } : { - unit: YAxisTitle.TIME, + unit: YAxisType.TIME, } ), yAxisId: ChartAxis.RIGHT, @@ -133,17 +133,17 @@ export class ChartComponent extends AbstractHistoryChart { // Show the controller data only if the controller is enabled and there was at least one limitation set(=1) on the current day. GridSectionComponent.isControllerEnabled(config, "Controller.Ess.Limiter14a") ? ({ name: translate.instant("GRID_STATES.RESTRICTION"), - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues?.result.data['ctrlEssLimiter14a0/CumulatedRestrictionTime'], + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues?.result.data["ctrlEssLimiter14a0/CumulatedRestrictionTime"], converter: () => restrictionData, - color: 'rgb(255, 165, 0)', + color: "rgb(255, 165, 0)", stack: 2, custom: ( - chartType === 'line' ? { - unit: YAxisTitle.RELAY, - pluginType: 'box', + chartType === "line" ? { + unit: YAxisType.RELAY, + pluginType: "box", annotations: getAnnotations(restrictionData, labels), } : { - unit: YAxisTitle.TIME, + unit: YAxisType.TIME, } ), yAxisId: ChartAxis.RIGHT, @@ -155,11 +155,11 @@ export class ChartComponent extends AbstractHistoryChart { return datasets; } - ['L1', 'L2', 'L3'].forEach((phase, index) => { + ["L1", "L2", "L3"].forEach((phase, index) => { datasets.push({ - name: 'Phase ' + phase, - nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues?.result.data['_sum/GridActivePower' + phase], - converter: () => data['GridActivePower' + phase] ?? null, + name: "Phase " + phase, + nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => energyValues?.result.data["_sum/GridActivePower" + phase], + converter: () => data["GridActivePower" + phase] ?? null, color: AbstractHistoryChart.phaseColors[index], stack: 3, }); @@ -168,7 +168,7 @@ export class ChartComponent extends AbstractHistoryChart { return datasets; }, tooltip: { - formatNumber: '1.0-2', + formatNumber: "1.0-2", }, yAxes: yAxes, }; @@ -183,9 +183,9 @@ export class ChartComponent extends AbstractHistoryChart { if (data) { const limitationEpochs = getLimitationEpochs(data); const restrictionAnnotations = limitationEpochs.map(e => ({ - type: 'box', + type: "box", borderWidth: 1, - xScaleID: 'x', + xScaleID: "x", yMin: null, yMax: null, xMin: labels[e.start].toISOString(), diff --git a/ui/src/app/edge/history/common/grid/details/chart/channels.spec.ts b/ui/src/app/edge/history/common/grid/details/chart/channels.spec.ts new file mode 100644 index 00000000000..dda556efe21 --- /dev/null +++ b/ui/src/app/edge/history/common/grid/details/chart/channels.spec.ts @@ -0,0 +1,41 @@ +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; +import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; + + +export namespace History { + + /** + * up to 288 datapoints (5 min aggregated values) from a + * + * {@link Day.energyPerPeriodChannelWithValues} and {@link Day.dataChannelWithValues} + * */ + export const DAY: OeTester.Types.Channels = ({ + energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { + data: {}, + }), + dataChannelWithValues: new QueryHistoricTimeseriesDataResponse("0", { + data: { + "_sum/GridActivePower": [124, 0, null, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2127, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176, 176, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/GridActivePowerL1": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/GridActivePowerL2": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/GridActivePowerL3": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + }, + timestamps: ["2023-07-02T22:00:00Z", "2023-07-02T22:05:00Z", "2023-07-02T22:10:00Z", "2023-07-02T22:15:00Z", "2023-07-02T22:20:00Z", "2023-07-02T22:25:00Z", "2023-07-02T22:30:00Z", "2023-07-02T22:35:00Z", "2023-07-02T22:40:00Z", "2023-07-02T22:45:00Z", "2023-07-02T22:50:00Z", "2023-07-02T22:55:00Z", "2023-07-02T23:00:00Z", "2023-07-02T23:05:00Z", "2023-07-02T23:10:00Z", "2023-07-02T23:15:00Z", "2023-07-02T23:20:00Z", "2023-07-02T23:25:00Z", "2023-07-02T23:30:00Z", "2023-07-02T23:35:00Z", "2023-07-02T23:40:00Z", "2023-07-02T23:45:00Z", "2023-07-02T23:50:00Z", "2023-07-02T23:55:00Z", "2023-07-03T00:00:00Z", "2023-07-03T00:05:00Z", "2023-07-03T00:10:00Z", "2023-07-03T00:15:00Z", "2023-07-03T00:20:00Z", "2023-07-03T00:25:00Z", "2023-07-03T00:30:00Z", "2023-07-03T00:35:00Z", "2023-07-03T00:40:00Z", "2023-07-03T00:45:00Z", "2023-07-03T00:50:00Z", "2023-07-03T00:55:00Z", "2023-07-03T01:00:00Z", "2023-07-03T01:05:00Z", "2023-07-03T01:10:00Z", "2023-07-03T01:15:00Z", "2023-07-03T01:20:00Z", "2023-07-03T01:25:00Z", "2023-07-03T01:30:00Z", "2023-07-03T01:35:00Z", "2023-07-03T01:40:00Z", "2023-07-03T01:45:00Z", "2023-07-03T01:50:00Z", "2023-07-03T01:55:00Z", "2023-07-03T02:00:00Z", "2023-07-03T02:05:00Z", "2023-07-03T02:10:00Z", "2023-07-03T02:15:00Z", "2023-07-03T02:20:00Z", "2023-07-03T02:25:00Z", "2023-07-03T02:30:00Z", "2023-07-03T02:35:00Z", "2023-07-03T02:40:00Z", "2023-07-03T02:45:00Z", "2023-07-03T02:50:00Z", "2023-07-03T02:55:00Z", "2023-07-03T03:00:00Z", "2023-07-03T03:05:00Z", "2023-07-03T03:10:00Z", "2023-07-03T03:15:00Z", "2023-07-03T03:20:00Z", "2023-07-03T03:25:00Z", "2023-07-03T03:30:00Z", "2023-07-03T03:35:00Z", "2023-07-03T03:40:00Z", "2023-07-03T03:45:00Z", "2023-07-03T03:50:00Z", "2023-07-03T03:55:00Z", "2023-07-03T04:00:00Z", "2023-07-03T04:05:00Z", "2023-07-03T04:10:00Z", "2023-07-03T04:15:00Z", "2023-07-03T04:20:00Z", "2023-07-03T04:25:00Z", "2023-07-03T04:30:00Z", "2023-07-03T04:35:00Z", "2023-07-03T04:40:00Z", "2023-07-03T04:45:00Z", "2023-07-03T04:50:00Z", "2023-07-03T04:55:00Z", "2023-07-03T05:00:00Z", "2023-07-03T05:05:00Z", "2023-07-03T05:10:00Z", "2023-07-03T05:15:00Z", "2023-07-03T05:20:00Z", "2023-07-03T05:25:00Z", "2023-07-03T05:30:00Z", "2023-07-03T05:35:00Z", "2023-07-03T05:40:00Z", "2023-07-03T05:45:00Z", "2023-07-03T05:50:00Z", "2023-07-03T05:55:00Z", "2023-07-03T06:00:00Z", "2023-07-03T06:05:00Z", "2023-07-03T06:10:00Z", "2023-07-03T06:15:00Z", "2023-07-03T06:20:00Z", "2023-07-03T06:25:00Z", "2023-07-03T06:30:00Z", "2023-07-03T06:35:00Z", "2023-07-03T06:40:00Z", "2023-07-03T06:45:00Z", "2023-07-03T06:50:00Z", "2023-07-03T06:55:00Z", "2023-07-03T07:00:00Z", "2023-07-03T07:05:00Z", "2023-07-03T07:10:00Z", "2023-07-03T07:15:00Z", "2023-07-03T07:20:00Z", "2023-07-03T07:25:00Z", "2023-07-03T07:30:00Z", "2023-07-03T07:35:00Z", "2023-07-03T07:40:00Z", "2023-07-03T07:45:00Z", "2023-07-03T07:50:00Z", "2023-07-03T07:55:00Z", "2023-07-03T08:00:00Z", "2023-07-03T08:05:00Z", "2023-07-03T08:10:00Z", "2023-07-03T08:15:00Z", "2023-07-03T08:20:00Z", "2023-07-03T08:25:00Z", "2023-07-03T08:30:00Z", "2023-07-03T08:35:00Z", "2023-07-03T08:40:00Z", "2023-07-03T08:45:00Z", "2023-07-03T08:50:00Z", "2023-07-03T08:55:00Z", "2023-07-03T09:00:00Z", "2023-07-03T09:05:00Z", "2023-07-03T09:10:00Z", "2023-07-03T09:15:00Z", "2023-07-03T09:20:00Z", "2023-07-03T09:25:00Z", "2023-07-03T09:30:00Z", "2023-07-03T09:35:00Z", "2023-07-03T09:40:00Z", "2023-07-03T09:45:00Z", "2023-07-03T09:50:00Z", "2023-07-03T09:55:00Z", "2023-07-03T10:00:00Z", "2023-07-03T10:05:00Z", "2023-07-03T10:10:00Z", "2023-07-03T10:15:00Z", "2023-07-03T10:20:00Z", "2023-07-03T10:25:00Z", "2023-07-03T10:30:00Z", "2023-07-03T10:35:00Z", "2023-07-03T10:40:00Z", "2023-07-03T10:45:00Z", "2023-07-03T10:50:00Z", "2023-07-03T10:55:00Z", "2023-07-03T11:00:00Z", "2023-07-03T11:05:00Z", "2023-07-03T11:10:00Z", "2023-07-03T11:15:00Z", "2023-07-03T11:20:00Z", "2023-07-03T11:25:00Z", "2023-07-03T11:30:00Z", "2023-07-03T11:35:00Z", "2023-07-03T11:40:00Z", "2023-07-03T11:45:00Z", "2023-07-03T11:50:00Z", "2023-07-03T11:55:00Z", "2023-07-03T12:00:00Z", "2023-07-03T12:05:00Z", "2023-07-03T12:10:00Z", "2023-07-03T12:15:00Z", "2023-07-03T12:20:00Z", "2023-07-03T12:25:00Z", "2023-07-03T12:30:00Z", "2023-07-03T12:35:00Z", "2023-07-03T12:40:00Z", "2023-07-03T12:45:00Z", "2023-07-03T12:50:00Z", "2023-07-03T12:55:00Z", "2023-07-03T13:00:00Z", "2023-07-03T13:05:00Z", "2023-07-03T13:10:00Z", "2023-07-03T13:15:00Z", "2023-07-03T13:20:00Z", "2023-07-03T13:25:00Z", "2023-07-03T13:30:00Z", "2023-07-03T13:35:00Z", "2023-07-03T13:40:00Z", "2023-07-03T13:45:00Z", "2023-07-03T13:50:00Z", "2023-07-03T13:55:00Z", "2023-07-03T14:00:00Z", "2023-07-03T14:05:00Z", "2023-07-03T14:10:00Z", "2023-07-03T14:15:00Z", "2023-07-03T14:20:00Z", "2023-07-03T14:25:00Z", "2023-07-03T14:30:00Z", "2023-07-03T14:35:00Z", "2023-07-03T14:40:00Z", "2023-07-03T14:45:00Z", "2023-07-03T14:50:00Z", "2023-07-03T14:55:00Z", "2023-07-03T15:00:00Z", "2023-07-03T15:05:00Z", "2023-07-03T15:10:00Z", "2023-07-03T15:15:00Z", "2023-07-03T15:20:00Z", "2023-07-03T15:25:00Z", "2023-07-03T15:30:00Z", "2023-07-03T15:35:00Z", "2023-07-03T15:40:00Z", "2023-07-03T15:45:00Z", "2023-07-03T15:50:00Z", "2023-07-03T15:55:00Z", "2023-07-03T16:00:00Z", "2023-07-03T16:05:00Z", "2023-07-03T16:10:00Z", "2023-07-03T16:15:00Z", "2023-07-03T16:20:00Z", "2023-07-03T16:25:00Z", "2023-07-03T16:30:00Z", "2023-07-03T16:35:00Z", "2023-07-03T16:40:00Z", "2023-07-03T16:45:00Z", "2023-07-03T16:50:00Z", "2023-07-03T16:55:00Z", "2023-07-03T17:00:00Z", "2023-07-03T17:05:00Z", "2023-07-03T17:10:00Z", "2023-07-03T17:15:00Z", "2023-07-03T17:20:00Z", "2023-07-03T17:25:00Z", "2023-07-03T17:30:00Z", "2023-07-03T17:35:00Z", "2023-07-03T17:40:00Z", "2023-07-03T17:45:00Z", "2023-07-03T17:50:00Z", "2023-07-03T17:55:00Z", "2023-07-03T18:00:00Z", "2023-07-03T18:05:00Z", "2023-07-03T18:10:00Z", "2023-07-03T18:15:00Z", "2023-07-03T18:20:00Z", "2023-07-03T18:25:00Z", "2023-07-03T18:30:00Z", "2023-07-03T18:35:00Z", "2023-07-03T18:40:00Z", "2023-07-03T18:45:00Z", "2023-07-03T18:50:00Z", "2023-07-03T18:55:00Z", "2023-07-03T19:00:00Z", "2023-07-03T19:05:00Z", "2023-07-03T19:10:00Z", "2023-07-03T19:15:00Z", "2023-07-03T19:20:00Z", "2023-07-03T19:25:00Z", "2023-07-03T19:30:00Z", "2023-07-03T19:35:00Z", "2023-07-03T19:40:00Z", "2023-07-03T19:45:00Z", "2023-07-03T19:50:00Z", "2023-07-03T19:55:00Z", "2023-07-03T20:00:00Z", "2023-07-03T20:05:00Z", "2023-07-03T20:10:00Z", "2023-07-03T20:15:00Z", "2023-07-03T20:20:00Z", "2023-07-03T20:25:00Z", "2023-07-03T20:30:00Z", "2023-07-03T20:35:00Z", "2023-07-03T20:40:00Z", "2023-07-03T20:45:00Z", "2023-07-03T20:50:00Z", "2023-07-03T20:55:00Z", "2023-07-03T21:00:00Z", "2023-07-03T21:05:00Z", "2023-07-03T21:10:00Z", "2023-07-03T21:15:00Z", "2023-07-03T21:20:00Z", "2023-07-03T21:25:00Z", "2023-07-03T21:30:00Z", "2023-07-03T21:35:00Z", "2023-07-03T21:40:00Z", "2023-07-03T21:45:00Z", "2023-07-03T21:50:00Z", "2023-07-03T21:55:00Z"], + }), + }); + + /** + * up to 31 datapoints(1 day values) from a {@link Day.energyPerPeriodChannelWithValues} and {@link Day.dataChannelWithValues}*/ + export const MONTH: OeTester.Types.Channels = { + energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { + data: {}, + }), + energyPerPeriodChannelWithValues: + new QueryHistoricTimeseriesEnergyPerPeriodResponse("0", { + data: {}, + timestamps: [], + }), + }; +} diff --git a/ui/src/app/edge/history/common/grid/details/chart/chart.spec.ts b/ui/src/app/edge/history/common/grid/details/chart/chart.spec.ts new file mode 100644 index 00000000000..286718266cf --- /dev/null +++ b/ui/src/app/edge/history/common/grid/details/chart/chart.spec.ts @@ -0,0 +1,58 @@ +// @ts-strict-ignore +import { ActivatedRoute } from "@angular/router"; +import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { OeChartTester } from "src/app/shared/components/shared/testing/tester"; +import { removeFunctions, sharedSetupWithComponentIdRoute, TestContext } from "src/app/shared/components/shared/testing/utils.spec"; +import { EdgeConfig } from "src/app/shared/shared"; +import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; +import { History } from "./channels.spec"; +import { ChartComponent } from "./chart"; + +describe("History Grid Details - _sum", () => { + const defaultEMS = DummyConfig.from( + DummyConfig.Component.SUM("_sum"), + ); + + let TEST_CONTEXT: TestContext & { route: ActivatedRoute }; + beforeEach(async () => { + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("_sum"); + }); + + it("#getChartData()", () => { + { + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, + { + datasets: { + data: [ + DATA("Gesamt", [0.124, 0, null, 0, 0.173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.127, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.176, 0.176, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L1", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L2", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L3", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + ], + labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, + ), + }, + }); + } + { + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, + { + datasets: { + data: [], + labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("hour", "bar", {}), + }, + }); + } + }); +}); + +export function expectView(config: EdgeConfig, testContext: TestContext & { route: ActivatedRoute }, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View): void { + expect(removeFunctions(OeChartTester + .apply(ChartComponent + .getChartData( + testContext.translate), chartType, channels, testContext, config))) + .toEqual(removeFunctions(view)); +} diff --git a/ui/src/app/edge/history/common/grid/details/chart/chart.ts b/ui/src/app/edge/history/common/grid/details/chart/chart.ts new file mode 100644 index 00000000000..c941630eb8a --- /dev/null +++ b/ui/src/app/edge/history/common/grid/details/chart/chart.ts @@ -0,0 +1,65 @@ +// @ts-strict-ignore +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { Phase } from "src/app/shared/components/shared/phase"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress } from "src/app/shared/shared"; + +@Component({ + selector: "gridDetailsChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", +}) +export class ChartComponent extends AbstractHistoryChart { + + public static getChartData(translate: TranslateService): HistoryUtils.ChartData { + return { + input: [ + { + name: "GridActivePower", + powerChannel: ChannelAddress.fromString("_sum/GridActivePower"), + }, + ...Phase.THREE_PHASE.map((phase, index) => ({ + name: "Phase" + phase, + powerChannel: ChannelAddress.fromString("_sum/GridActivePower" + phase), + })), + ], + output: (data: DefaultTypes.History.ChannelData) => { + + const datasets: DefaultTypes.History.DisplayValues[] = + [ + { + name: translate.instant("General.TOTAL"), + converter: () => { + return data["GridActivePower"]; + }, + color: "rgba(0,0,200)", + stack: 1, + }, + ...Phase.THREE_PHASE.map((phase, index) => ({ + name: "Phase " + phase, + converter: () => { + return data["Phase" + phase]; + }, + color: AbstractHistoryChart.phaseColors[index], + })), + ]; + + return datasets; + }, + tooltip: { + formatNumber: "1.0-2", + }, + yAxes: [{ + unit: YAxisType.ENERGY, + position: "left", + yAxisId: ChartAxis.LEFT, + }], + }; + } + + public override getChartData() { + return ChartComponent.getChartData(this.translate); + } +} diff --git a/ui/src/app/edge/history/common/grid/details/details.overview.html b/ui/src/app/edge/history/common/grid/details/details.overview.html new file mode 100644 index 00000000000..1bba13ab767 --- /dev/null +++ b/ui/src/app/edge/history/common/grid/details/details.overview.html @@ -0,0 +1,7 @@ + + + + diff --git a/ui/src/app/edge/history/common/grid/details/details.overview.ts b/ui/src/app/edge/history/common/grid/details/details.overview.ts new file mode 100644 index 00000000000..179c6ca5ce5 --- /dev/null +++ b/ui/src/app/edge/history/common/grid/details/details.overview.ts @@ -0,0 +1,40 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; +import { NavigationOption } from "src/app/shared/components/footer/subnavigation/footerNavigation"; +import { Service } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; + +@Component({ + templateUrl: "./details.overview.html", +}) +export class DetailsOverviewComponent extends AbstractHistoryChartOverview { + protected navigationButtons: NavigationOption[] = []; + + constructor( + public override service: Service, + protected override route: ActivatedRoute, + public override modalCtrl: ModalController, + private router: Router, + private translate: TranslateService, + ) { + super(service, route, modalCtrl); + } + + protected override afterIsInitialized() { + this.service.getCurrentEdge().then(edge => { + + const gridMeter = Object.values(this.config.components) + .find((component) => component.isEnabled && this.config.isTypeGrid(component)) ?? null; + + if (!gridMeter) { + return; + } + + this.navigationButtons = [ + { id: "currentVoltage", isEnabled: edge.roleIsAtLeast(Role.INSTALLER), alias: this.translate.instant("Edge.History.CURRENT_AND_VOLTAGE"), callback: () => { this.router.navigate([`../${gridMeter.id}/currentVoltage`], { relativeTo: this.route }); } }]; + }); + } +} diff --git a/ui/src/app/edge/history/common/grid/flat/flat.html b/ui/src/app/edge/history/common/grid/flat/flat.html index b3b81f12c25..8a23fd9c1b3 100644 --- a/ui/src/app/edge/history/common/grid/flat/flat.html +++ b/ui/src/app/edge/history/common/grid/flat/flat.html @@ -1,16 +1,16 @@ - - - - - + [title]="'General.grid' | translate" *ngIf="isInitialized"> + + + + + - \ No newline at end of file + diff --git a/ui/src/app/edge/history/common/grid/flat/flat.ts b/ui/src/app/edge/history/common/grid/flat/flat.ts index 4d622e9ab7b..bb7d272b6cf 100644 --- a/ui/src/app/edge/history/common/grid/flat/flat.ts +++ b/ui/src/app/edge/history/common/grid/flat/flat.ts @@ -1,18 +1,18 @@ -import { Component } from '@angular/core'; -import { GridSectionComponent } from 'src/app/edge/live/energymonitor/chart/section/grid.component'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData } from 'src/app/shared/shared'; -import { TimeUtils } from 'src/app/shared/utils/time/timeutils'; +import { Component } from "@angular/core"; +import { GridSectionComponent } from "src/app/edge/live/energymonitor/chart/section/grid.component"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData } from "src/app/shared/shared"; +import { TimeUtils } from "src/app/shared/utils/time/timeutils"; @Component({ - selector: 'gridWidget', - templateUrl: './flat.html', + selector: "gridWidget", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { - private static readonly RESTRICTION_MODE: ChannelAddress = new ChannelAddress('ctrlEssLimiter14a0', 'RestrictionMode'); - private static readonly RESTRICTION_TIME: ChannelAddress = new ChannelAddress('ctrlEssLimiter14a0', 'CumulatedRestrictionTime'); - private static readonly OFF_GRID_TIME: ChannelAddress = new ChannelAddress('_sum', 'GridModeOffGridTime'); + private static readonly RESTRICTION_MODE: ChannelAddress = new ChannelAddress("ctrlEssLimiter14a0", "RestrictionMode"); + private static readonly RESTRICTION_TIME: ChannelAddress = new ChannelAddress("ctrlEssLimiter14a0", "CumulatedRestrictionTime"); + private static readonly OFF_GRID_TIME: ChannelAddress = new ChannelAddress("_sum", "GridModeOffGridTime"); protected restrictionTime: number | null = null; protected offGridTime: number | null = null; diff --git a/ui/src/app/edge/history/common/grid/grid.ts b/ui/src/app/edge/history/common/grid/grid.ts index 85814e76c9f..2957572d7f9 100644 --- a/ui/src/app/edge/history/common/grid/grid.ts +++ b/ui/src/app/edge/history/common/grid/grid.ts @@ -1,25 +1,34 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; - -import { ChartComponent } from './chart/chart'; -import { FlatComponent } from './flat/flat'; -import { OverviewComponent } from './overview/overview'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { FooterNavigationModule } from "src/app/shared/components/footer/subnavigation/footerNavigation.module"; +import { SharedModule } from "src/app/shared/shared.module"; +import { ChartComponent } from "./chart/chart"; +import { ChartComponent as DetailsChartComponent } from "./details/chart/chart"; +import { DetailsOverviewComponent } from "./details/details.overview"; +import { FlatComponent } from "./flat/flat"; +import { OverviewComponent } from "./overview/overview"; @NgModule({ imports: [ BrowserModule, + FooterNavigationModule, SharedModule, ], declarations: [ FlatComponent, ChartComponent, OverviewComponent, + + DetailsChartComponent, + DetailsOverviewComponent, ], exports: [ FlatComponent, ChartComponent, OverviewComponent, + + DetailsChartComponent, + DetailsOverviewComponent, ], }) export class Common_Grid { } diff --git a/ui/src/app/edge/history/common/grid/overview/overview.html b/ui/src/app/edge/history/common/grid/overview/overview.html index 73ac2d72a13..71e464fef64 100644 --- a/ui/src/app/edge/history/common/grid/overview/overview.html +++ b/ui/src/app/edge/history/common/grid/overview/overview.html @@ -2,4 +2,5 @@ *ngIf="isInitialized" [period]="service.historyPeriod"> - \ No newline at end of file + + diff --git a/ui/src/app/edge/history/common/grid/overview/overview.ts b/ui/src/app/edge/history/common/grid/overview/overview.ts index a3f812c1a88..b99f248ebf5 100644 --- a/ui/src/app/edge/history/common/grid/overview/overview.ts +++ b/ui/src/app/edge/history/common/grid/overview/overview.ts @@ -1,7 +1,47 @@ -import { Component } from '@angular/core'; -import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/abstractHistoryChartOverview'; +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; +import { NavigationOption } from "src/app/shared/components/footer/subnavigation/footerNavigation"; +import { EdgeConfig, Service } from "src/app/shared/shared"; @Component({ - templateUrl: './overview.html', + templateUrl: "./overview.html", }) -export class OverviewComponent extends AbstractHistoryChartOverview { } +export class OverviewComponent extends AbstractHistoryChartOverview { + protected navigationButtons: NavigationOption[] = []; + + constructor( + public override service: Service, + protected override route: ActivatedRoute, + public override modalCtrl: ModalController, + private router: Router, + private translate: TranslateService, + ) { + super(service, route, modalCtrl); + } + + protected override afterIsInitialized() { + + const sum: EdgeConfig.Component = this.config.getComponent("_sum"); + sum.alias = this.translate.instant("General.TOTAL"); + const navigationButtons: EdgeConfig.Component[] = []; + const gridMeters = Object.values(this.config.components) + .filter((component) => component.isEnabled && this.config.isTypeGrid(component)); + + if (!gridMeters) { + navigationButtons.push(sum); + } + + if (gridMeters?.length <= 1) { + navigationButtons.push(sum); + } else { + navigationButtons.push(...gridMeters); + } + + this.navigationButtons = navigationButtons.map(el => ( + { id: el.id, alias: el.alias, callback: () => { this.router.navigate(["./" + el.id], { relativeTo: this.route }); } } + )); + } +} diff --git a/ui/src/app/edge/history/common/production/chart/chargerChart.ts b/ui/src/app/edge/history/common/production/chart/chargerChart.ts deleted file mode 100644 index 9ce42c52677..00000000000 --- a/ui/src/app/edge/history/common/production/chart/chargerChart.ts +++ /dev/null @@ -1,45 +0,0 @@ -// @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; - -import { ChannelAddress } from '../../../../../shared/shared'; - -@Component({ - selector: 'productionChargerChart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', -}) -export class ChargerChartComponent extends AbstractHistoryChart { - - protected override getChartData(): HistoryUtils.ChartData { - return { - input: [{ - name: 'ActualPower', - powerChannel: ChannelAddress.fromString(this.component.id + '/ActualPower'), - energyChannel: ChannelAddress.fromString(this.component.id + '/ActualEnergy'), - converter: (data) => data != null ? data : null, - }], - output: (data: HistoryUtils.ChannelData) => { - return [ - { - name: this.translate.instant('General.production'), - converter: () => { return data['ActualPower']; }, - nameSuffix: (energyResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyResponse.result.data[this.component.id + '/ActualEnergy']; - }, - color: 'rgb(0,152,204)', - }, - ]; - }, - tooltip: { - formatNumber: '1.1-2', - }, - yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', - yAxisId: ChartAxis.LEFT, - }], - }; - } -} diff --git a/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts b/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts index b083189112a..3d65f4a0ce3 100644 --- a/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts +++ b/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts @@ -1,23 +1,23 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; +import { Component } from "@angular/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; -import { ChannelAddress } from '../../../../../shared/shared'; +import { ChannelAddress } from "../../../../../shared/shared"; /** Will be used in the Future again */ @Component({ - selector: 'productionMeterchart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', + selector: "productionMeterchart", + templateUrl: "../../../../../shared/components/chart/abstracthistorychart.html", }) export class ProductionMeterChartComponent extends AbstractHistoryChart { protected override getChartData(): HistoryUtils.ChartData { const channels: HistoryUtils.InputChannel[] = [{ - name: 'ActivePower', - powerChannel: ChannelAddress.fromString(this.component.id + '/ActivePower'), - energyChannel: ChannelAddress.fromString(this.component.id + '/ActiveProductionEnergy'), + name: "ActivePower", + powerChannel: ChannelAddress.fromString(this.component.id + "/ActivePower"), + energyChannel: ChannelAddress.fromString(this.component.id + "/ActiveProductionEnergy"), converter: (data) => data != null ? data : null, }, ]; @@ -25,9 +25,9 @@ export class ProductionMeterChartComponent extends AbstractHistoryChart { // Phase 1 to 3 for (let i = 1; i < 4; i++) { channels.push({ - name: 'ActivePowerL' + i, - powerChannel: ChannelAddress.fromString(this.component.id + '/ActivePowerL' + i), - energyChannel: ChannelAddress.fromString(this.component.id + '/ActiveProductionEnergyL' + i), + name: "ActivePowerL" + i, + powerChannel: ChannelAddress.fromString(this.component.id + "/ActivePowerL" + i), + energyChannel: ChannelAddress.fromString(this.component.id + "/ActiveProductionEnergyL" + i), }); } return { @@ -35,14 +35,14 @@ export class ProductionMeterChartComponent extends AbstractHistoryChart { output: (data: HistoryUtils.ChannelData) => { const datasets: HistoryUtils.DisplayValue[] = []; datasets.push({ - name: this.translate.instant('General.production'), + name: this.translate.instant("General.production"), nameSuffix: (energyPeriodResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyPeriodResponse?.result.data[this.component.id + '/ActiveProductionEnergy'] ?? null; + return energyPeriodResponse?.result.data[this.component.id + "/ActiveProductionEnergy"] ?? null; }, converter: () => { - return data['ActivePower']; + return data["ActivePower"]; }, - color: 'rgb(0,152,204)', + color: "rgb(0,152,204)", }); if (this.showPhases) { @@ -51,7 +51,7 @@ export class ProductionMeterChartComponent extends AbstractHistoryChart { datasets.push({ name: "Erzeugung Phase L" + i, converter: () => { - return data['ActivePowerL' + i] ?? null; + return data["ActivePowerL" + i] ?? null; }, color: AbstractHistoryChart.phaseColors[i - 1], }); @@ -60,13 +60,14 @@ export class ProductionMeterChartComponent extends AbstractHistoryChart { return datasets; }, tooltip: { - formatNumber: '1.1-2', + formatNumber: "1.1-2", }, yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }], }; } } + diff --git a/ui/src/app/edge/history/common/production/chart/totalAcChart.ts b/ui/src/app/edge/history/common/production/chart/totalAcChart.ts deleted file mode 100644 index 78311cd0bfb..00000000000 --- a/ui/src/app/edge/history/common/production/chart/totalAcChart.ts +++ /dev/null @@ -1,77 +0,0 @@ -// @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; - -import { ChannelAddress } from '../../../../../shared/shared'; - -@Component({ - selector: 'productionTotalAcChart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', -}) -export class TotalAcChartComponent extends AbstractHistoryChart { - - protected override getChartData(): HistoryUtils.ChartData { - return { - input: - [ - { - name: 'ProductionAcActivePower', - powerChannel: ChannelAddress.fromString('_sum/ProductionAcActivePower'), - energyChannel: ChannelAddress.fromString('_sum/ProductionAcActiveEnergy'), - }, - { - name: 'ProductionAcActivePowerL1', - powerChannel: ChannelAddress.fromString('_sum/ProductionAcActivePowerL1'), - }, - { - name: 'ProductionAcActivePowerL2', - powerChannel: ChannelAddress.fromString('_sum/ProductionAcActivePowerL2'), - }, - { - name: 'ProductionAcActivePowerL3', - powerChannel: ChannelAddress.fromString('_sum/ProductionAcActivePowerL3'), - }, - ], - output: (data: HistoryUtils.ChannelData) => { - const datasets: HistoryUtils.DisplayValue[] = []; - - datasets.push({ - name: this.translate.instant("General.TOTAL"), - nameSuffix: (energyPeriodResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyPeriodResponse.result.data['_sum/ProductionAcActiveEnergy'] ?? null; - }, - converter: () => { - return data['ProductionAcActivePower']; - }, - color: "rgb(0,152,204)", - stack: 0, - }); - - for (let i = 1; i < 4; i++) { - datasets.push({ - name: "Phase L" + i, - converter: () => { - if (!this.showPhases) { - return null; - } - return data['ProductionAcActivePowerL' + i] ?? null; - }, - color: 'rgb(' + AbstractHistoryChart.phaseColors[i - 1] + ')', - }); - } - - return datasets; - }, - tooltip: { - formatNumber: '1.1-2', - }, - yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', - yAxisId: ChartAxis.LEFT, - }], - }; - } -} diff --git a/ui/src/app/edge/history/common/production/chart/totalChart.ts b/ui/src/app/edge/history/common/production/chart/totalChart.ts index 1e0c6110d3d..9c54d688961 100644 --- a/ui/src/app/edge/history/common/production/chart/totalChart.ts +++ b/ui/src/app/edge/history/common/production/chart/totalChart.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; +import { Component } from "@angular/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; -import { ChartAxis, HistoryUtils, Utils, YAxisTitle } from '../../../../../shared/service/utils'; -import { ChannelAddress } from '../../../../../shared/shared'; +import { ChartAxis, HistoryUtils, Utils, YAxisType } from "../../../../../shared/service/utils"; +import { ChannelAddress } from "../../../../../shared/shared"; @Component({ - selector: 'productionTotalChart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', + selector: "productionTotalChart", + templateUrl: "../../../../../shared/components/chart/abstracthistorychart.html", }) export class TotalChartComponent extends AbstractHistoryChart { @@ -26,17 +26,17 @@ export class TotalChartComponent extends AbstractHistoryChart { const chargerComponents = this.config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger"); const channels: HistoryUtils.InputChannel[] = [{ - name: 'ProductionActivePower', - powerChannel: ChannelAddress.fromString('_sum/ProductionActivePower'), - energyChannel: ChannelAddress.fromString('_sum/ProductionActiveEnergy'), + name: "ProductionActivePower", + powerChannel: ChannelAddress.fromString("_sum/ProductionActivePower"), + energyChannel: ChannelAddress.fromString("_sum/ProductionActiveEnergy"), }]; // If at least one charger if (chargerComponents.length > 0) { channels.push({ - name: 'ProductionDcActualPower', - powerChannel: ChannelAddress.fromString('_sum/ProductionDcActualPower'), - energyChannel: ChannelAddress.fromString('_sum/ProductionDcActiveEnergy'), + name: "ProductionDcActualPower", + powerChannel: ChannelAddress.fromString("_sum/ProductionDcActualPower"), + energyChannel: ChannelAddress.fromString("_sum/ProductionDcActiveEnergy"), }); } @@ -44,32 +44,32 @@ export class TotalChartComponent extends AbstractHistoryChart { if (this.showPhases) { channels.push( { - name: 'ProductionAcActivePowerL1', - powerChannel: ChannelAddress.fromString('_sum/ProductionAcActivePowerL1'), + name: "ProductionAcActivePowerL1", + powerChannel: ChannelAddress.fromString("_sum/ProductionAcActivePowerL1"), }, { - name: 'ProductionAcActivePowerL2', - powerChannel: ChannelAddress.fromString('_sum/ProductionAcActivePowerL2'), + name: "ProductionAcActivePowerL2", + powerChannel: ChannelAddress.fromString("_sum/ProductionAcActivePowerL2"), }, { - name: 'ProductionAcActivePowerL3', - powerChannel: ChannelAddress.fromString('_sum/ProductionAcActivePowerL3'), + name: "ProductionAcActivePowerL3", + powerChannel: ChannelAddress.fromString("_sum/ProductionAcActivePowerL3"), }); } for (const component of productionMeterComponents) { channels.push({ name: component.id, - powerChannel: ChannelAddress.fromString(component.id + '/ActivePower'), - energyChannel: ChannelAddress.fromString(component.id + '/ActiveProductionEnergy'), + powerChannel: ChannelAddress.fromString(component.id + "/ActivePower"), + energyChannel: ChannelAddress.fromString(component.id + "/ActiveProductionEnergy"), }); } for (const component of chargerComponents) { channels.push({ name: component.id, - powerChannel: ChannelAddress.fromString(component.id + '/ActualPower'), - energyChannel: ChannelAddress.fromString(component.id + '/ActualEnergy'), + powerChannel: ChannelAddress.fromString(component.id + "/ActualPower"), + energyChannel: ChannelAddress.fromString(component.id + "/ActualEnergy"), }); } @@ -78,14 +78,14 @@ export class TotalChartComponent extends AbstractHistoryChart { output: (data: HistoryUtils.ChannelData) => { const datasets: HistoryUtils.DisplayValue[] = []; datasets.push({ - name: this.showTotal == false ? this.translate.instant('General.production') : this.translate.instant('General.TOTAL'), + name: this.showTotal == false ? this.translate.instant("General.production") : this.translate.instant("General.TOTAL"), nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyQueryResponse?.result.data['_sum/ProductionActiveEnergy'] ?? null; + return energyQueryResponse?.result.data["_sum/ProductionActiveEnergy"] ?? null; }, converter: () => { - return data['ProductionActivePower']; + return data["ProductionActivePower"]; }, - color: 'rgb(0,152,204)', + color: "rgb(0,152,204)", hiddenOnInit: true, stack: 2, }); @@ -98,7 +98,7 @@ export class TotalChartComponent extends AbstractHistoryChart { datasets.push({ name: "Phase L" + i, nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues.result.data['_sum/ProductionAcActiveEnergyL' + i]; + return energyValues.result.data["_sum/ProductionAcActiveEnergyL" + i]; }, converter: () => { if (!this.showPhases) { @@ -108,27 +108,27 @@ export class TotalChartComponent extends AbstractHistoryChart { let effectiveProduction = []; if (this.config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger").length > 0) { - data['ProductionDcActualPower'].forEach((value, index) => { - effectiveProduction[index] = Utils.addSafely(data['ProductionAcActivePowerL' + i][index], value / 3); + data["ProductionDcActualPower"].forEach((value, index) => { + effectiveProduction[index] = Utils.addSafely(data["ProductionAcActivePowerL" + i][index], value / 3); }); } else if (this.config.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter").length > 0) { - effectiveProduction = data['ProductionAcActivePowerL' + i]; + effectiveProduction = data["ProductionAcActivePowerL" + i]; } return effectiveProduction; }, - color: 'rgb(' + AbstractHistoryChart.phaseColors[i - 1] + ')', + color: "rgb(" + AbstractHistoryChart.phaseColors[i - 1] + ")", stack: 3, }); } // ProductionMeters - const productionMeterColors: string[] = ['rgb(253,197,7)', 'rgb(202, 158, 6', 'rgb(228, 177, 6)', 'rgb(177, 138, 5)', 'rgb(152, 118, 4)']; + const productionMeterColors: string[] = ["rgb(253,197,7)", "rgb(202, 158, 6", "rgb(228, 177, 6)", "rgb(177, 138, 5)", "rgb(152, 118, 4)"]; for (let i = 0; i < productionMeterComponents.length; i++) { const component = productionMeterComponents[i]; datasets.push({ name: component.alias ?? component.id, nameSuffix: (energyResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyResponse.result.data[component.id + '/ActiveProductionEnergy'] ?? null; + return energyResponse.result.data[component.id + "/ActiveProductionEnergy"] ?? null; }, converter: () => { return data[component.id] ?? null; @@ -138,14 +138,14 @@ export class TotalChartComponent extends AbstractHistoryChart { }); } - const chargerColors: string[] = ['rgb(0,223,0)', 'rgb(0,178,0)', 'rgb(0,201,0)', 'rgb(0,134,0)', 'rgb(0,156,0)']; + const chargerColors: string[] = ["rgb(0,223,0)", "rgb(0,178,0)", "rgb(0,201,0)", "rgb(0,134,0)", "rgb(0,156,0)"]; // ChargerComponents for (let i = 0; i < chargerComponents.length; i++) { const component = chargerComponents[i]; datasets.push({ name: component.alias ?? component.id, nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return energyValues.result.data[new ChannelAddress(component.id, 'ActualEnergy').toString()]; + return energyValues.result.data[new ChannelAddress(component.id, "ActualEnergy").toString()]; }, converter: () => { return data[component.id] ?? null; @@ -157,17 +157,16 @@ export class TotalChartComponent extends AbstractHistoryChart { return datasets; }, tooltip: { - formatNumber: '1.1-2', - afterTitle: this.translate.instant('General.TOTAL'), + formatNumber: "1.1-2", + afterTitle: this.translate.instant("General.TOTAL"), }, yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }], }; return chartObject; } - } diff --git a/ui/src/app/edge/history/common/production/chart/totalDcChart.ts b/ui/src/app/edge/history/common/production/chart/totalDcChart.ts deleted file mode 100644 index 3f2c9769794..00000000000 --- a/ui/src/app/edge/history/common/production/chart/totalDcChart.ts +++ /dev/null @@ -1,49 +0,0 @@ -// @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; - -import { ChannelAddress } from '../../../../../shared/shared'; - -@Component({ - selector: 'totalDcChart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', -}) -export class TotalDcChartComponent extends AbstractHistoryChart { - - protected override getChartData(): HistoryUtils.ChartData { - return { - input: - [ - { - name: 'ProductionDcActual', - powerChannel: ChannelAddress.fromString('_sum/ProductionDcActualPower'), - energyChannel: ChannelAddress.fromString('_sum/ProductionDcActiveEnergy'), - converter: (data) => data != null ? data : null, - }, - ], - output: (data: HistoryUtils.ChannelData) => { - return [{ - name: this.translate.instant('General.production'), - nameSuffix: (energyResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyResponse.result.data['_sum/ProductionDcActiveEnergy']; - }, - converter: () => { - return data['ProductionDcActual'] ?? null; - }, - strokeThroughHiddingStyle: false, - color: 'rgb(0,152,204)', - }]; - }, - tooltip: { - formatNumber: '1.1-2', - }, - yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', - yAxisId: ChartAxis.LEFT, - }], - }; - } -} diff --git a/ui/src/app/edge/history/common/production/details/chart/channels.spec.ts b/ui/src/app/edge/history/common/production/details/chart/channels.spec.ts new file mode 100644 index 00000000000..ec95a07e629 --- /dev/null +++ b/ui/src/app/edge/history/common/production/details/chart/channels.spec.ts @@ -0,0 +1,59 @@ +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; +import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; + + +export namespace History { + + /** + * up to 288 datapoints (5 min aggregated values) from a + * + * {@link Day.energyPerPeriodChannelWithValues} and {@link Day.dataChannelWithValues} + * */ + export const DAY: OeTester.Types.Channels = ({ + energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { + data: { + "meter0/ActiveProductionEnergy": 15930, + "charger0/ActualEnergy": 15930, + "_sum/ProductionActiveEnergy": 15930, + }, + }), + dataChannelWithValues: new QueryHistoricTimeseriesDataResponse("0", { + data: { + "meter0/ActivePower": [124, 0, null, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2127, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176, 176, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "meter0/ActivePowerL1": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "meter0/ActivePowerL2": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "meter0/ActivePowerL3": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "charger0/ActualPower": [124, 0, null, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2127, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176, 176, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ProductionActivePower": [124, 0, null, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2127, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176, 176, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ProductionAcActivePowerL1": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ProductionAcActivePowerL2": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ProductionAcActivePowerL3": [41, 0, null, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 38, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 47, null, null, null, 709, 58, 59, null, 60, 60, 62, 60, null, 62, 63, 60, 60, 59, 59, 57, 58, 57, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + "_sum/ProductionDcActualPower": [24, 0, null, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 110, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 140, null, null, null, 2127, 175, 176, null, 180, 180, 185, 180, null, 185, 190, 180, 180, 176, 176, 170, 175, 170, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null], + }, + timestamps: ["2023-07-02T22:00:00Z", "2023-07-02T22:05:00Z", "2023-07-02T22:10:00Z", "2023-07-02T22:15:00Z", "2023-07-02T22:20:00Z", "2023-07-02T22:25:00Z", "2023-07-02T22:30:00Z", "2023-07-02T22:35:00Z", "2023-07-02T22:40:00Z", "2023-07-02T22:45:00Z", "2023-07-02T22:50:00Z", "2023-07-02T22:55:00Z", "2023-07-02T23:00:00Z", "2023-07-02T23:05:00Z", "2023-07-02T23:10:00Z", "2023-07-02T23:15:00Z", "2023-07-02T23:20:00Z", "2023-07-02T23:25:00Z", "2023-07-02T23:30:00Z", "2023-07-02T23:35:00Z", "2023-07-02T23:40:00Z", "2023-07-02T23:45:00Z", "2023-07-02T23:50:00Z", "2023-07-02T23:55:00Z", "2023-07-03T00:00:00Z", "2023-07-03T00:05:00Z", "2023-07-03T00:10:00Z", "2023-07-03T00:15:00Z", "2023-07-03T00:20:00Z", "2023-07-03T00:25:00Z", "2023-07-03T00:30:00Z", "2023-07-03T00:35:00Z", "2023-07-03T00:40:00Z", "2023-07-03T00:45:00Z", "2023-07-03T00:50:00Z", "2023-07-03T00:55:00Z", "2023-07-03T01:00:00Z", "2023-07-03T01:05:00Z", "2023-07-03T01:10:00Z", "2023-07-03T01:15:00Z", "2023-07-03T01:20:00Z", "2023-07-03T01:25:00Z", "2023-07-03T01:30:00Z", "2023-07-03T01:35:00Z", "2023-07-03T01:40:00Z", "2023-07-03T01:45:00Z", "2023-07-03T01:50:00Z", "2023-07-03T01:55:00Z", "2023-07-03T02:00:00Z", "2023-07-03T02:05:00Z", "2023-07-03T02:10:00Z", "2023-07-03T02:15:00Z", "2023-07-03T02:20:00Z", "2023-07-03T02:25:00Z", "2023-07-03T02:30:00Z", "2023-07-03T02:35:00Z", "2023-07-03T02:40:00Z", "2023-07-03T02:45:00Z", "2023-07-03T02:50:00Z", "2023-07-03T02:55:00Z", "2023-07-03T03:00:00Z", "2023-07-03T03:05:00Z", "2023-07-03T03:10:00Z", "2023-07-03T03:15:00Z", "2023-07-03T03:20:00Z", "2023-07-03T03:25:00Z", "2023-07-03T03:30:00Z", "2023-07-03T03:35:00Z", "2023-07-03T03:40:00Z", "2023-07-03T03:45:00Z", "2023-07-03T03:50:00Z", "2023-07-03T03:55:00Z", "2023-07-03T04:00:00Z", "2023-07-03T04:05:00Z", "2023-07-03T04:10:00Z", "2023-07-03T04:15:00Z", "2023-07-03T04:20:00Z", "2023-07-03T04:25:00Z", "2023-07-03T04:30:00Z", "2023-07-03T04:35:00Z", "2023-07-03T04:40:00Z", "2023-07-03T04:45:00Z", "2023-07-03T04:50:00Z", "2023-07-03T04:55:00Z", "2023-07-03T05:00:00Z", "2023-07-03T05:05:00Z", "2023-07-03T05:10:00Z", "2023-07-03T05:15:00Z", "2023-07-03T05:20:00Z", "2023-07-03T05:25:00Z", "2023-07-03T05:30:00Z", "2023-07-03T05:35:00Z", "2023-07-03T05:40:00Z", "2023-07-03T05:45:00Z", "2023-07-03T05:50:00Z", "2023-07-03T05:55:00Z", "2023-07-03T06:00:00Z", "2023-07-03T06:05:00Z", "2023-07-03T06:10:00Z", "2023-07-03T06:15:00Z", "2023-07-03T06:20:00Z", "2023-07-03T06:25:00Z", "2023-07-03T06:30:00Z", "2023-07-03T06:35:00Z", "2023-07-03T06:40:00Z", "2023-07-03T06:45:00Z", "2023-07-03T06:50:00Z", "2023-07-03T06:55:00Z", "2023-07-03T07:00:00Z", "2023-07-03T07:05:00Z", "2023-07-03T07:10:00Z", "2023-07-03T07:15:00Z", "2023-07-03T07:20:00Z", "2023-07-03T07:25:00Z", "2023-07-03T07:30:00Z", "2023-07-03T07:35:00Z", "2023-07-03T07:40:00Z", "2023-07-03T07:45:00Z", "2023-07-03T07:50:00Z", "2023-07-03T07:55:00Z", "2023-07-03T08:00:00Z", "2023-07-03T08:05:00Z", "2023-07-03T08:10:00Z", "2023-07-03T08:15:00Z", "2023-07-03T08:20:00Z", "2023-07-03T08:25:00Z", "2023-07-03T08:30:00Z", "2023-07-03T08:35:00Z", "2023-07-03T08:40:00Z", "2023-07-03T08:45:00Z", "2023-07-03T08:50:00Z", "2023-07-03T08:55:00Z", "2023-07-03T09:00:00Z", "2023-07-03T09:05:00Z", "2023-07-03T09:10:00Z", "2023-07-03T09:15:00Z", "2023-07-03T09:20:00Z", "2023-07-03T09:25:00Z", "2023-07-03T09:30:00Z", "2023-07-03T09:35:00Z", "2023-07-03T09:40:00Z", "2023-07-03T09:45:00Z", "2023-07-03T09:50:00Z", "2023-07-03T09:55:00Z", "2023-07-03T10:00:00Z", "2023-07-03T10:05:00Z", "2023-07-03T10:10:00Z", "2023-07-03T10:15:00Z", "2023-07-03T10:20:00Z", "2023-07-03T10:25:00Z", "2023-07-03T10:30:00Z", "2023-07-03T10:35:00Z", "2023-07-03T10:40:00Z", "2023-07-03T10:45:00Z", "2023-07-03T10:50:00Z", "2023-07-03T10:55:00Z", "2023-07-03T11:00:00Z", "2023-07-03T11:05:00Z", "2023-07-03T11:10:00Z", "2023-07-03T11:15:00Z", "2023-07-03T11:20:00Z", "2023-07-03T11:25:00Z", "2023-07-03T11:30:00Z", "2023-07-03T11:35:00Z", "2023-07-03T11:40:00Z", "2023-07-03T11:45:00Z", "2023-07-03T11:50:00Z", "2023-07-03T11:55:00Z", "2023-07-03T12:00:00Z", "2023-07-03T12:05:00Z", "2023-07-03T12:10:00Z", "2023-07-03T12:15:00Z", "2023-07-03T12:20:00Z", "2023-07-03T12:25:00Z", "2023-07-03T12:30:00Z", "2023-07-03T12:35:00Z", "2023-07-03T12:40:00Z", "2023-07-03T12:45:00Z", "2023-07-03T12:50:00Z", "2023-07-03T12:55:00Z", "2023-07-03T13:00:00Z", "2023-07-03T13:05:00Z", "2023-07-03T13:10:00Z", "2023-07-03T13:15:00Z", "2023-07-03T13:20:00Z", "2023-07-03T13:25:00Z", "2023-07-03T13:30:00Z", "2023-07-03T13:35:00Z", "2023-07-03T13:40:00Z", "2023-07-03T13:45:00Z", "2023-07-03T13:50:00Z", "2023-07-03T13:55:00Z", "2023-07-03T14:00:00Z", "2023-07-03T14:05:00Z", "2023-07-03T14:10:00Z", "2023-07-03T14:15:00Z", "2023-07-03T14:20:00Z", "2023-07-03T14:25:00Z", "2023-07-03T14:30:00Z", "2023-07-03T14:35:00Z", "2023-07-03T14:40:00Z", "2023-07-03T14:45:00Z", "2023-07-03T14:50:00Z", "2023-07-03T14:55:00Z", "2023-07-03T15:00:00Z", "2023-07-03T15:05:00Z", "2023-07-03T15:10:00Z", "2023-07-03T15:15:00Z", "2023-07-03T15:20:00Z", "2023-07-03T15:25:00Z", "2023-07-03T15:30:00Z", "2023-07-03T15:35:00Z", "2023-07-03T15:40:00Z", "2023-07-03T15:45:00Z", "2023-07-03T15:50:00Z", "2023-07-03T15:55:00Z", "2023-07-03T16:00:00Z", "2023-07-03T16:05:00Z", "2023-07-03T16:10:00Z", "2023-07-03T16:15:00Z", "2023-07-03T16:20:00Z", "2023-07-03T16:25:00Z", "2023-07-03T16:30:00Z", "2023-07-03T16:35:00Z", "2023-07-03T16:40:00Z", "2023-07-03T16:45:00Z", "2023-07-03T16:50:00Z", "2023-07-03T16:55:00Z", "2023-07-03T17:00:00Z", "2023-07-03T17:05:00Z", "2023-07-03T17:10:00Z", "2023-07-03T17:15:00Z", "2023-07-03T17:20:00Z", "2023-07-03T17:25:00Z", "2023-07-03T17:30:00Z", "2023-07-03T17:35:00Z", "2023-07-03T17:40:00Z", "2023-07-03T17:45:00Z", "2023-07-03T17:50:00Z", "2023-07-03T17:55:00Z", "2023-07-03T18:00:00Z", "2023-07-03T18:05:00Z", "2023-07-03T18:10:00Z", "2023-07-03T18:15:00Z", "2023-07-03T18:20:00Z", "2023-07-03T18:25:00Z", "2023-07-03T18:30:00Z", "2023-07-03T18:35:00Z", "2023-07-03T18:40:00Z", "2023-07-03T18:45:00Z", "2023-07-03T18:50:00Z", "2023-07-03T18:55:00Z", "2023-07-03T19:00:00Z", "2023-07-03T19:05:00Z", "2023-07-03T19:10:00Z", "2023-07-03T19:15:00Z", "2023-07-03T19:20:00Z", "2023-07-03T19:25:00Z", "2023-07-03T19:30:00Z", "2023-07-03T19:35:00Z", "2023-07-03T19:40:00Z", "2023-07-03T19:45:00Z", "2023-07-03T19:50:00Z", "2023-07-03T19:55:00Z", "2023-07-03T20:00:00Z", "2023-07-03T20:05:00Z", "2023-07-03T20:10:00Z", "2023-07-03T20:15:00Z", "2023-07-03T20:20:00Z", "2023-07-03T20:25:00Z", "2023-07-03T20:30:00Z", "2023-07-03T20:35:00Z", "2023-07-03T20:40:00Z", "2023-07-03T20:45:00Z", "2023-07-03T20:50:00Z", "2023-07-03T20:55:00Z", "2023-07-03T21:00:00Z", "2023-07-03T21:05:00Z", "2023-07-03T21:10:00Z", "2023-07-03T21:15:00Z", "2023-07-03T21:20:00Z", "2023-07-03T21:25:00Z", "2023-07-03T21:30:00Z", "2023-07-03T21:35:00Z", "2023-07-03T21:40:00Z", "2023-07-03T21:45:00Z", "2023-07-03T21:50:00Z", "2023-07-03T21:55:00Z"], + }), + }); + + /** + * up to 31 datapoints(1 day values) from a {@link Day.energyPerPeriodChannelWithValues} and {@link Day.dataChannelWithValues}*/ + export const MONTH: OeTester.Types.Channels = { + energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", { + data: { + "meter0/ActiveProductionEnergy": 21649, + "charger0/ActualEnergy": 21649, + "_sum/ProductionActiveEnergy": 21649, + }, + }), + energyPerPeriodChannelWithValues: + new QueryHistoricTimeseriesEnergyPerPeriodResponse("0", { + data: { + "meter0/ActiveProductionEnergy": [16, 14, 16, 15, 16, 15, 15, 15, 16, 17, 18, 14, 16, 17, 16, 15, 14, 17, 15, 16, 17, 16, 15, 16, 14, 15, 14, 16, 14, null, null], + "charger0/ActualEnergy": [16, 14, 16, 15, 16, 15, 15, 15, 16, 17, 18, 14, 16, 17, 16, 15, 14, 17, 15, 16, 17, 16, 15, 16, 14, 15, 14, 16, 14, null, null], + "_sum/ProductionActiveEnergy": [16, 14, 16, 15, 16, 15, 15, 15, 16, 17, 18, 14, 16, 17, 16, 15, 14, 17, 15, 16, 17, 16, 15, 16, 14, 15, 14, 16, 14, null, null], + }, + timestamps: ["2023-05-31T22:00:00Z", "2023-06-01T22:00:00Z", "2023-06-02T22:00:00Z", "2023-06-03T22:00:00Z", "2023-06-04T22:00:00Z", "2023-06-05T22:00:00Z", "2023-06-06T22:00:00Z", "2023-06-07T22:00:00Z", "2023-06-08T22:00:00Z", "2023-06-09T22:00:00Z", "2023-06-10T22:00:00Z", "2023-06-11T22:00:00Z", "2023-06-12T22:00:00Z", "2023-06-13T22:00:00Z", "2023-06-14T22:00:00Z", "2023-06-15T22:00:00Z", "2023-06-16T22:00:00Z", "2023-06-17T22:00:00Z", "2023-06-18T22:00:00Z", "2023-06-19T22:00:00Z", "2023-06-20T22:00:00Z", "2023-06-21T22:00:00Z", "2023-06-22T22:00:00Z", "2023-06-23T22:00:00Z", "2023-06-24T22:00:00Z", "2023-06-25T22:00:00Z", "2023-06-26T22:00:00Z", "2023-06-27T22:00:00Z", "2023-06-28T22:00:00Z", "2023-06-29T22:00:00Z"], + }), + }; +} diff --git a/ui/src/app/edge/history/common/production/details/chart/charger.spec.ts b/ui/src/app/edge/history/common/production/details/chart/charger.spec.ts new file mode 100644 index 00000000000..08cfeb6e0b9 --- /dev/null +++ b/ui/src/app/edge/history/common/production/details/chart/charger.spec.ts @@ -0,0 +1,58 @@ +// @ts-strict-ignore +import { ActivatedRoute } from "@angular/router"; +import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { OeChartTester } from "src/app/shared/components/shared/testing/tester"; +import { removeFunctions, sharedSetupWithComponentIdRoute, TestContext } from "src/app/shared/components/shared/testing/utils.spec"; +import { EdgeConfig } from "src/app/shared/shared"; +import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; +import { History } from "./channels.spec"; +import { ChargerChartDetailsComponent } from "./charger"; + +describe("History Production Details - chargers", () => { + const defaultEMS = DummyConfig.from( + DummyConfig.Component.GOODWE_CHARGER_MPPT_TWO_STRING("charger0", "MPPT 1"), + ); + + let TEST_CONTEXT: TestContext & { route: ActivatedRoute }; + beforeEach(async () => { + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("charger0"); + }); + + it("#getChartData()", () => { + { + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, + { + datasets: { + data: [ + DATA("MPPT 1: 15,9 kWh", [0.124, 0, null, 0, 0.173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.127, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.176, 0.176, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + ], + labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, + ), + }, + }); + } + { + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, + { + datasets: { + data: [ + DATA("MPPT 1: 21,6 kWh", [0.016, 0.014, 0.016, 0.015, 0.016, 0.015, 0.015, 0.015, 0.016, 0.017, 0.018, 0.014, 0.016, 0.017, 0.016, 0.015, 0.014, 0.017, 0.015, 0.016, 0.017, 0.016, 0.015, 0.016, 0.014, 0.015, 0.014, 0.016, 0.014, null, null]), + ], + labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), + }, + }); + } + }); +}); + +export function expectView(config: EdgeConfig, testContext: TestContext & { route: ActivatedRoute }, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View): void { + expect(removeFunctions(OeChartTester + .apply(ChargerChartDetailsComponent + .getChartData( + DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), testContext.route, + testContext.translate), chartType, channels, testContext, config))) + .toEqual(removeFunctions(view)); +} diff --git a/ui/src/app/edge/history/common/production/details/chart/charger.ts b/ui/src/app/edge/history/common/production/details/chart/charger.ts new file mode 100644 index 00000000000..7673bac3ffd --- /dev/null +++ b/ui/src/app/edge/history/common/production/details/chart/charger.ts @@ -0,0 +1,50 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; + +@Component({ + selector: "chargerChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", +}) +export class ChargerChartDetailsComponent extends AbstractHistoryChart { + + public static getChartData(config: EdgeConfig, route: ActivatedRoute, translate: TranslateService): HistoryUtils.ChartData { + const component = config.getComponent(route.snapshot.params.componentId); + return { + input: [{ + name: component.id, + powerChannel: ChannelAddress.fromString(component.id + "/ActualPower"), + energyChannel: ChannelAddress.fromString(component.id + "/ActualEnergy"), + }], + output: (data: HistoryUtils.ChannelData) => [{ + name: component.alias, + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { + return energyQueryResponse.result.data[component.id + "/ActualEnergy"]; + }, + converter: () => { + return data[component.id]; + }, + color: "rgb(0,152,204)", + hiddenOnInit: false, + stack: 2, + }], + tooltip: { + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), + }, + yAxes: [{ + unit: YAxisType.ENERGY, + position: "left", + yAxisId: ChartAxis.LEFT, + }], + }; + } + + protected override getChartData(): HistoryUtils.ChartData { + return ChargerChartDetailsComponent.getChartData(this.config, this.route, this.translate); + } +} diff --git a/ui/src/app/edge/history/common/production/details/chart/chart.ts b/ui/src/app/edge/history/common/production/details/chart/chart.ts deleted file mode 100644 index a8a11e836b9..00000000000 --- a/ui/src/app/edge/history/common/production/details/chart/chart.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { Phase } from 'src/app/shared/components/shared/phase'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress } from 'src/app/shared/shared'; - -@Component({ - selector: 'meterChart', - templateUrl: '../../../../../../shared/components/chart/abstracthistorychart.html', -}) -export class ChartComponent extends AbstractHistoryChart { - - - protected override getChartData(): HistoryUtils.ChartData { - - const component = this.config.getComponent(this.route.snapshot.params.componentId); - const isProductionMeter = this.config.hasComponentNature("io.openems.edge.meter.api.ElectricityMeter", component.id) && this.config.isProducer(component); - const isCharger = this.config.hasComponentNature("io.openems.edge.ess.dccharger.api.EssDcCharger", component.id); - - const channels: HistoryUtils.InputChannel[] = []; - - if (isCharger) { - channels.push({ - name: component.id, - powerChannel: ChannelAddress.fromString(component.id + '/ActualPower'), - energyChannel: ChannelAddress.fromString(component.id + '/ActualEnergy'), - }); - } - - if (isProductionMeter) { - channels.push({ - name: component.id, - powerChannel: ChannelAddress.fromString(component.id + '/ActivePower'), - energyChannel: ChannelAddress.fromString(component.id + '/ActiveProductionEnergy'), - }); - - channels.push(...Phase.THREE_PHASE.map(phase => ({ - name: 'ProductionAcActivePower' + phase, - powerChannel: ChannelAddress.fromString(component.id + '/ActivePower' + phase), - }))); - } - - const chartObject: HistoryUtils.ChartData = { - input: channels, - output: (data: HistoryUtils.ChannelData) => { - const datasets: HistoryUtils.DisplayValue[] = []; - datasets.push({ - name: component.alias, - nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyQueryResponse.result.data[isCharger ? component.id + '/ActualEnergy' : component.id + '/ActiveProductionEnergy']; - }, - converter: () => { - return data[component.id]; - }, - color: 'rgb(0,152,204)', - hiddenOnInit: false, - stack: 2, - }); - - if (!isProductionMeter) { - return datasets; - } - - datasets.push(...Phase.THREE_PHASE.map((phase, i) => ({ - name: "Phase " + phase, - converter: () => - data['ProductionAcActivePower' + phase], - color: 'rgb(' + AbstractHistoryChart.phaseColors[i] + ')', - stack: 3, - }))); - - return datasets; - }, - tooltip: { - formatNumber: '1.1-2', - afterTitle: this.translate.instant('General.TOTAL'), - }, - yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', - yAxisId: ChartAxis.LEFT, - }], - }; - - return chartObject; - } -} diff --git a/ui/src/app/edge/history/common/production/details/chart/productionMeter.spec.ts b/ui/src/app/edge/history/common/production/details/chart/productionMeter.spec.ts new file mode 100644 index 00000000000..d3cc8490cc1 --- /dev/null +++ b/ui/src/app/edge/history/common/production/details/chart/productionMeter.spec.ts @@ -0,0 +1,68 @@ +// @ts-strict-ignore +import { ActivatedRoute } from "@angular/router"; +import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { OeChartTester } from "src/app/shared/components/shared/testing/tester"; +import { removeFunctions, sharedSetupWithComponentIdRoute, TestContext } from "src/app/shared/components/shared/testing/utils.spec"; +import { EdgeConfig } from "src/app/shared/shared"; +import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; +import { History } from "./channels.spec"; +import { ProductionMeterChartDetailsComponent } from "./productionMeter"; + +describe("History Production Details - productionMeters", () => { + const defaultEMS = DummyConfig.from( + DummyConfig.Component.SOLAR_EDGE_PV_INVERTER("meter0", "Whirlpool"), + ); + + let TEST_CONTEXT: TestContext & { route: ActivatedRoute }; + beforeEach(async () => { + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("meter0"); + }); + + it("#getChartData()", () => { + { + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, + { + datasets: { + data: [ + DATA("Whirlpool: 15,9 kWh", [0.124, 0, null, 0, 0.173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.127, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.176, 0.176, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L1", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L2", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L3", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + ], + labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, + ), + }, + }); + } + { + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, + { + datasets: { + data: [ + DATA("Whirlpool: 21,6 kWh", [0.016, 0.014, 0.016, 0.015, 0.016, 0.015, 0.015, 0.015, 0.016, 0.017, 0.018, 0.014, 0.016, 0.017, 0.016, 0.015, 0.014, 0.017, 0.015, 0.016, 0.017, 0.016, 0.015, 0.016, 0.014, 0.015, 0.014, 0.016, 0.014, null, null]), + ], + labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), + }, + }); + } + }); +}); + +export function expectView(config: EdgeConfig, testContext: TestContext & { route: ActivatedRoute }, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View): void { + sessionStorage.setItem("mapping to int", JSON.stringify(History.MONTH.energyPerPeriodChannelWithValues.result.data["meter0/ActiveProductionEnergy"].map(el => el != null ? Math.round(el) : null))); + sessionStorage.setItem("phase", JSON.stringify(OeChartTester + .apply(ProductionMeterChartDetailsComponent + .getChartData( + DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), testContext.route, + testContext.translate), chartType, channels, testContext, config))); + + expect(removeFunctions(OeChartTester + .apply(ProductionMeterChartDetailsComponent + .getChartData( + DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), testContext.route, + testContext.translate), chartType, channels, testContext, config))) + .toEqual(removeFunctions(view)); +} diff --git a/ui/src/app/edge/history/common/production/details/chart/productionMeter.ts b/ui/src/app/edge/history/common/production/details/chart/productionMeter.ts new file mode 100644 index 00000000000..634398525b7 --- /dev/null +++ b/ui/src/app/edge/history/common/production/details/chart/productionMeter.ts @@ -0,0 +1,69 @@ +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { Phase } from "src/app/shared/components/shared/phase"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; + +@Component({ + selector: "productionMeterChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", +}) +export class ProductionMeterChartDetailsComponent extends AbstractHistoryChart { + + public static getChartData(config: EdgeConfig, route: ActivatedRoute, translate: TranslateService): HistoryUtils.ChartData { + const component = config.getComponent(route.snapshot.params.componentId); + return { + input: [{ + name: component.id, + powerChannel: ChannelAddress.fromString(component.id + "/ActivePower"), + energyChannel: ChannelAddress.fromString(component.id + "/ActiveProductionEnergy"), + }, + ...Phase.THREE_PHASE.map(phase => ({ + name: "ProductionAcActivePower" + phase, + powerChannel: ChannelAddress.fromString(component.id + "/ActivePower" + phase), + }))], + + output: (data: HistoryUtils.ChannelData) => { + const datasets: HistoryUtils.DisplayValue[] = []; + datasets.push({ + name: component.alias, + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { + return energyQueryResponse.result.data[component.id + "/ActiveProductionEnergy"]; + }, + converter: () => { + return data[component.id]; + }, + color: "rgb(0,152,204)", + hiddenOnInit: false, + stack: 2, + }); + + datasets.push(...Phase.THREE_PHASE.map((phase, i) => ({ + name: "Phase " + phase, + converter: () => + data["ProductionAcActivePower" + phase], + color: "rgb(" + AbstractHistoryChart.phaseColors[i] + ")", + stack: 3, + }))); + + return datasets; + }, + tooltip: { + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), + }, + yAxes: [{ + unit: YAxisType.ENERGY, + position: "left", + yAxisId: ChartAxis.LEFT, + }], + }; + } + + protected override getChartData(): HistoryUtils.ChartData { + return ProductionMeterChartDetailsComponent.getChartData(this.config, this.route, this.translate); + } +} diff --git a/ui/src/app/edge/history/common/production/details/chart/sum.spec.ts b/ui/src/app/edge/history/common/production/details/chart/sum.spec.ts new file mode 100644 index 00000000000..286910ff833 --- /dev/null +++ b/ui/src/app/edge/history/common/production/details/chart/sum.spec.ts @@ -0,0 +1,125 @@ +// @ts-strict-ignore +import { ActivatedRoute } from "@angular/router"; +import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; +import { OeTester } from "src/app/shared/components/shared/testing/common"; +import { OeChartTester } from "src/app/shared/components/shared/testing/tester"; +import { removeFunctions, sharedSetupWithComponentIdRoute, TestContext } from "src/app/shared/components/shared/testing/utils.spec"; +import { EdgeConfig } from "src/app/shared/shared"; +import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; +import { History } from "./channels.spec"; +import { SumChartDetailsComponent } from "./sum"; + +describe("History Production Details - _sum", () => { + const defaultEMS = DummyConfig.from( + DummyConfig.Component.SUM("_sum", "Gesamt"), + DummyConfig.Component.SOLAR_EDGE_PV_INVERTER("meter0"), + ); + + let TEST_CONTEXT: TestContext & { route: ActivatedRoute }; + beforeEach(async () => { + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("_sum"); + }); + + it("#getChartData() - asymmetricMeter && no essDcCharger configured", () => { + { + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, + { + datasets: { + data: [ + DATA("Gesamt: 15,9 kWh", [0.124, 0, null, 0, 0.173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.127, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.176, 0.176, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L1", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L2", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L3", [0.041, 0, null, 0, 0.058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.037, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.048, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.038, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.043, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.047, null, null, null, 0.709, 0.058, 0.059, null, 0.06, 0.06, 0.062, 0.06, null, 0.062, 0.063, 0.06, 0.06, 0.059, 0.059, 0.057, 0.058, 0.057, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + ], + labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, + ), + }, + }); + } + { + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, + { + datasets: { + data: [ + DATA("Gesamt: 21,6 kWh", [0.016, 0.014, 0.016, 0.015, 0.016, 0.015, 0.015, 0.015, 0.016, 0.017, 0.018, 0.014, 0.016, 0.017, 0.016, 0.015, 0.014, 0.017, 0.015, 0.016, 0.017, 0.016, 0.015, 0.016, 0.014, 0.015, 0.014, 0.016, 0.014, null, null]), + ], + labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), + }, + }); + } + }); + + it("#getChartData() - essDcCharger configured", () => { + { + const defaultEMS = DummyConfig.from( + DummyConfig.Component.SUM("_sum", "Gesamt"), + DummyConfig.Component.GOODWE_CHARGER_MPPT_TWO_STRING("charger0"), + ); + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, + { + datasets: { + data: [ + DATA("Gesamt: 15,9 kWh", [0.124, 0, null, 0, 0.173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.127, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.176, 0.176, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L1", [0.049, 0, null, 0, 0.08233333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.07366666666666666, 0.07566666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.09633333333333333, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.07566666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.07566666666666666, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.08633333333333333, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.09366666666666668, null, null, null, 1.418, 0.11633333333333333, 0.11766666666666667, null, 0.12, 0.12, 0.12366666666666667, 0.12, null, 0.12366666666666667, 0.12633333333333335, 0.12, 0.12, 0.11766666666666667, 0.11766666666666667, 0.11366666666666667, 0.11633333333333333, 0.11366666666666667, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L2", [0.049, 0, null, 0, 0.08233333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.07366666666666666, 0.07566666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.09633333333333333, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.07566666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.07566666666666666, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.08633333333333333, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.09366666666666668, null, null, null, 1.418, 0.11633333333333333, 0.11766666666666667, null, 0.12, 0.12, 0.12366666666666667, 0.12, null, 0.12366666666666667, 0.12633333333333335, 0.12, 0.12, 0.11766666666666667, 0.11766666666666667, 0.11366666666666667, 0.11633333333333333, 0.11366666666666667, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]), + DATA("Phase L3", [0.049, 0, null, 0, 0.08233333333333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.07366666666666666, 0.07566666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.09633333333333333, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.07566666666666666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.07566666666666666, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.08633333333333333, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.09366666666666668, null, null, null, 1.418, 0.11633333333333333, 0.11766666666666667, null, 0.12, 0.12, 0.12366666666666667, 0.12, null, 0.12366666666666667, 0.12633333333333335, 0.12, 0.12, 0.11766666666666667, 0.11766666666666667, 0.11366666666666667, 0.11633333333333333, 0.11366666666666667, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null])], + labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, + ), + }, + }); + } + { + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, + { + datasets: { + data: [ + DATA("Gesamt: 21,6 kWh", [0.016, 0.014, 0.016, 0.015, 0.016, 0.015, 0.015, 0.015, 0.016, 0.017, 0.018, 0.014, 0.016, 0.017, 0.016, 0.015, 0.014, 0.017, 0.015, 0.016, 0.017, 0.016, 0.015, 0.016, 0.014, 0.015, 0.014, 0.016, 0.014, null, null]), + ], + labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), + }, + }); + } + }); + it("#getChartData() - no essDcCharger & no assymetric meter configured", () => { + { + const defaultEMS = DummyConfig.from( + DummyConfig.Component.SUM("_sum", "Gesamt"), + ); + expectView(defaultEMS, TEST_CONTEXT, "line", History.DAY, + { + datasets: { + data: [ + DATA("Gesamt: 15,9 kWh", [0.124, 0, null, 0, 0.173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0.11, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145, 0, 0, 0, 0, 0, 0, null, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0.113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, null, 0.113, 0, 0, null, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, 0, 0, 0, 0.13, 0, 0, 0, 0, 0, null, null, null, null, 0, 0, 0, 0, 0, null, 0, null, 0.14, null, null, null, 2.127, 0.175, 0.176, null, 0.18, 0.18, 0.185, 0.18, null, 0.185, 0.19, 0.18, 0.18, 0.176, 0.176, 0.17, 0.175, 0.17, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null])], + labels: LABELS(History.DAY.dataChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, + ), + }, + }); + } + { + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, + { + datasets: { + data: [ + DATA("Gesamt: 21,6 kWh", [0.016, 0.014, 0.016, 0.015, 0.016, 0.015, 0.015, 0.015, 0.016, 0.017, 0.018, 0.014, 0.016, 0.017, 0.016, 0.015, 0.014, 0.017, 0.015, 0.016, 0.017, 0.016, 0.015, 0.016, 0.014, 0.015, 0.014, 0.016, 0.014, null, null]), + ], + labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), + }, + }); + } + }); +}); + +export function expectView(config: EdgeConfig, testContext: TestContext & { route: ActivatedRoute }, chartType: "line" | "bar", channels: OeTester.Types.Channels, view: OeChartTester.View): void { + expect(removeFunctions(OeChartTester + .apply(SumChartDetailsComponent + .getChartData( + DummyConfig.convertDummyEdgeConfigToRealEdgeConfig(config), testContext.route, + testContext.translate), chartType, channels, testContext, config))) + .toEqual(removeFunctions(view)); +} diff --git a/ui/src/app/edge/history/common/production/details/chart/sum.ts b/ui/src/app/edge/history/common/production/details/chart/sum.ts new file mode 100644 index 00000000000..6c630946ae0 --- /dev/null +++ b/ui/src/app/edge/history/common/production/details/chart/sum.ts @@ -0,0 +1,93 @@ +// @ts-strict-ignore +import { Component } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { Phase } from "src/app/shared/components/shared/phase"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, EdgeConfig } from "src/app/shared/shared"; + +@Component({ + selector: "sumChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", +}) +export class SumChartDetailsComponent extends AbstractHistoryChart { + + public static getChartData(config: EdgeConfig, route: ActivatedRoute, translate: TranslateService): HistoryUtils.ChartData { + + const component = config.getComponent(route.snapshot.params.componentId); + const hasCharger = config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger").length > 0; + const hasAsymmetricMeters = config.getComponentsImplementingNature("io.openems.edge.meter.api.AsymmetricMeter").length > 0; + + const input: HistoryUtils.InputChannel[] = [ + { + name: component.id, + powerChannel: ChannelAddress.fromString(component.id + "/ProductionActivePower"), + energyChannel: ChannelAddress.fromString(component.id + "/ProductionActiveEnergy"), + }, + ]; + let converter: ((data: HistoryUtils.ChannelData, phase: string) => any) | null = null; + + if (hasCharger) { + input.push({ + name: component.id + "ActualPower", + powerChannel: ChannelAddress.fromString("_sum/ProductionDcActualPower"), + }); + + converter = (data: HistoryUtils.ChannelData, phase: string) => data[component.id + "ActualPower"]?.reduce((arr, el, index) => { + arr.push(Utils.addSafely(Utils.divideSafely(el, 3), data["ProductionAcActivePower" + phase][index])); + return arr; + }, []); + } + + if (hasAsymmetricMeters) { + converter = (data, phase) => data["ProductionAcActivePower" + phase]; + } + + if (hasAsymmetricMeters || hasCharger) { + input.push(...Phase.THREE_PHASE.map(phase => ({ + name: "ProductionAcActivePower" + phase, + powerChannel: ChannelAddress.fromString(component.id + "/ProductionAcActivePower" + phase), + }))); + } + + const phaseOutput: (data: HistoryUtils.ChannelData) => HistoryUtils.DisplayValue[] = + converter ? (data) => Phase.THREE_PHASE.map((phase, i) => ({ + name: "Phase " + phase, + converter: () => converter(data, phase), + color: "rgb(" + AbstractHistoryChart.phaseColors[i] + ")", + stack: 3, + })) : () => []; + + const chartObject: HistoryUtils.ChartData = { + input: input, + output: (data: HistoryUtils.ChannelData) => [ + { + name: translate.instant("General.TOTAL"), + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data["_sum/ProductionActiveEnergy"], + converter: () => data[component.id], + color: "rgb(0,152,204)", + hiddenOnInit: false, + stack: 2, + }, + ...phaseOutput(data), + ], + tooltip: { + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), + }, + yAxes: [{ + unit: YAxisType.ENERGY, + position: "left", + yAxisId: ChartAxis.LEFT, + }], + }; + + return chartObject; + } + + protected override getChartData(): HistoryUtils.ChartData { + return SumChartDetailsComponent.getChartData(this.config, this.route, this.translate); + } +} diff --git a/ui/src/app/edge/history/common/production/details/details.overview.html b/ui/src/app/edge/history/common/production/details/details.overview.html index a6146a1ae05..1884e99ef81 100644 --- a/ui/src/app/edge/history/common/production/details/details.overview.html +++ b/ui/src/app/edge/history/common/production/details/details.overview.html @@ -1,7 +1,11 @@ - - + + + + + + diff --git a/ui/src/app/edge/history/common/production/details/details.overview.ts b/ui/src/app/edge/history/common/production/details/details.overview.ts index 2e385d74067..985d1698b2b 100644 --- a/ui/src/app/edge/history/common/production/details/details.overview.ts +++ b/ui/src/app/edge/history/common/production/details/details.overview.ts @@ -1,18 +1,20 @@ -import { Component } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/abstractHistoryChartOverview'; -import { NavigationOption } from 'src/app/shared/components/footer/subnavigation/footerNavigation'; -import { Service } from 'src/app/shared/shared'; -import { Role } from 'src/app/shared/type/role'; +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; +import { NavigationOption } from "src/app/shared/components/footer/subnavigation/footerNavigation"; +import { Service } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; @Component({ - templateUrl: './details.overview.html', + templateUrl: "./details.overview.html", }) export class DetailsOverviewComponent extends AbstractHistoryChartOverview { protected navigationButtons: NavigationOption[] = []; + protected componentSome: { type: "sum" | "productionMeter" | "charger", displayName: string } | null = null; + constructor( public override service: Service, protected override route: ActivatedRoute, @@ -24,10 +26,37 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { } protected override afterIsInitialized() { + this.componentSome = this.getComponentType(); this.service.getCurrentEdge().then(edge => { + + // Hide current & voltage + if (this.component?.factoryId === "Core.Sum") { + return; + } + this.navigationButtons = [ - { id: 'currentVoltage', isEnabled: edge.roleIsAtLeast(Role.INSTALLER), alias: this.translate.instant("Edge.History.CURRENT_AND_VOLTAGE"), callback: () => { this.router.navigate(['./currentVoltage'], { relativeTo: this.route }); } }]; + { id: "currentVoltage", isEnabled: edge.roleIsAtLeast(Role.INSTALLER), alias: this.translate.instant("Edge.History.CURRENT_AND_VOLTAGE"), callback: () => { this.router.navigate(["./currentVoltage"], { relativeTo: this.route }); } }]; }); } + + private getComponentType(): typeof this.componentSome { + if (!this.component) { + return null; + } + + if (this.config.hasComponentNature("io.openems.edge.ess.dccharger.api.EssDcCharger", this.component.id) && this.component.isEnabled) { + return { type: "charger", displayName: this.component.alias }; + } + + if (this.config.isProducer(this.component) && this.component.isEnabled) { + return { type: "productionMeter", displayName: this.component.alias }; + } + + if (this.component.factoryId === "Core.Sum") { + return { type: "sum", displayName: this.translate.instant("General.TOTAL") }; + } + + return null; + } } diff --git a/ui/src/app/edge/history/common/production/flat/flat.html b/ui/src/app/edge/history/common/production/flat/flat.html index c8c23f77d06..fd0e3e63fc8 100644 --- a/ui/src/app/edge/history/common/production/flat/flat.html +++ b/ui/src/app/edge/history/common/production/flat/flat.html @@ -11,4 +11,4 @@ [converter]="CONVERT_TO_KILO_WATTHOURS"> - \ No newline at end of file + diff --git a/ui/src/app/edge/history/common/production/flat/flat.ts b/ui/src/app/edge/history/common/production/flat/flat.ts index f399e593d02..9b61575701d 100644 --- a/ui/src/app/edge/history/common/production/flat/flat.ts +++ b/ui/src/app/edge/history/common/production/flat/flat.ts @@ -1,11 +1,11 @@ -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; -import { ChannelAddress, EdgeConfig, Utils } from '../../../../../shared/shared'; +import { ChannelAddress, EdgeConfig, Utils } from "../../../../../shared/shared"; @Component({ - selector: 'productionWidget', - templateUrl: './flat.html', + selector: "productionWidget", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { diff --git a/ui/src/app/edge/history/common/production/overview/overview.html b/ui/src/app/edge/history/common/production/overview/overview.html index d02fe0a1f66..d8c1d0c99cb 100644 --- a/ui/src/app/edge/history/common/production/overview/overview.html +++ b/ui/src/app/edge/history/common/production/overview/overview.html @@ -1,37 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/ui/src/app/edge/history/common/production/overview/overview.ts b/ui/src/app/edge/history/common/production/overview/overview.ts index 02b85e97ec2..e75c1e02ea0 100644 --- a/ui/src/app/edge/history/common/production/overview/overview.ts +++ b/ui/src/app/edge/history/common/production/overview/overview.ts @@ -1,13 +1,13 @@ -import { Component } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { NavigationOption } from 'src/app/shared/components/footer/subnavigation/footerNavigation'; - -import { AbstractHistoryChartOverview } from '../../../../../shared/components/chart/abstractHistoryChartOverview'; -import { ChannelAddress, EdgeConfig, Service } from '../../../../../shared/shared'; +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { NavigationOption } from "src/app/shared/components/footer/subnavigation/footerNavigation"; +import { AbstractHistoryChartOverview } from "../../../../../shared/components/chart/abstractHistoryChartOverview"; +import { ChannelAddress, EdgeConfig, Service } from "../../../../../shared/shared"; @Component({ - templateUrl: './overview.html', + templateUrl: "./overview.html", }) export class OverviewComponent extends AbstractHistoryChartOverview { protected chargerComponents: EdgeConfig.Component[] = []; @@ -19,6 +19,7 @@ export class OverviewComponent extends AbstractHistoryChartOverview { protected override route: ActivatedRoute, public override modalCtrl: ModalController, private router: Router, + private translate: TranslateService, ) { super(service, route, modalCtrl); } @@ -34,8 +35,11 @@ export class OverviewComponent extends AbstractHistoryChartOverview { this.config.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && this.config.isProducer(component)); - this.navigationButtons = [...this.chargerComponents, ...this.productionMeterComponents].map(el => ( - { id: el.id, alias: el.alias, callback: () => { this.router.navigate(['./' + el.id], { relativeTo: this.route }); } } + const sum: EdgeConfig.Component = this.config.getComponent("_sum"); + sum.alias = this.translate.instant("General.TOTAL"); + + this.navigationButtons = [sum, ...this.chargerComponents, ...this.productionMeterComponents].map(el => ( + { id: el.id, alias: el.alias, callback: () => { this.router.navigate(["./" + el.id], { relativeTo: this.route }); } } )); return []; } diff --git a/ui/src/app/edge/history/common/production/production.ts b/ui/src/app/edge/history/common/production/production.ts index b9f4d389d6c..d4b7b9ce39c 100644 --- a/ui/src/app/edge/history/common/production/production.ts +++ b/ui/src/app/edge/history/common/production/production.ts @@ -1,18 +1,16 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { FooterNavigationModule } from 'src/app/shared/components/footer/subnavigation/footerNavigation.module'; -import { SharedModule } from 'src/app/shared/shared.module'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { FooterNavigationModule } from "src/app/shared/components/footer/subnavigation/footerNavigation.module"; +import { SharedModule } from "src/app/shared/shared.module"; -import { ChargerChartComponent } from './chart/chargerChart'; -import { ProductionMeterChartComponent } from './chart/productionMeterChart'; -import { TotalAcChartComponent } from './chart/totalAcChart'; -import { TotalChartComponent } from './chart/totalChart'; -import { TotalDcChartComponent } from './chart/totalDcChart'; -import { ChartComponent } from './details/chart/chart'; -import { DetailsOverviewComponent } from './details/details.overview'; -import { FlatComponent } from './flat/flat'; -import { OverviewComponent } from './overview/overview'; -import { CurrentVoltageModule } from 'src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule'; +import { CurrentVoltageModule } from "src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule"; +import { TotalChartComponent } from "./chart/totalChart"; +import { ChargerChartDetailsComponent } from "./details/chart/charger"; +import { ProductionMeterChartDetailsComponent } from "./details/chart/productionMeter"; +import { SumChartDetailsComponent } from "./details/chart/sum"; +import { DetailsOverviewComponent } from "./details/details.overview"; +import { FlatComponent } from "./flat/flat"; +import { OverviewComponent } from "./overview/overview"; @NgModule({ imports: [ @@ -24,22 +22,22 @@ import { CurrentVoltageModule } from 'src/app/shared/components/edge/meter/curre declarations: [ FlatComponent, OverviewComponent, - ProductionMeterChartComponent, - TotalDcChartComponent, - TotalAcChartComponent, TotalChartComponent, - ChargerChartComponent, + + ChargerChartDetailsComponent, DetailsOverviewComponent, - ChartComponent, + ProductionMeterChartDetailsComponent, + SumChartDetailsComponent, ], exports: [ FlatComponent, OverviewComponent, - ProductionMeterChartComponent, - TotalDcChartComponent, - TotalAcChartComponent, TotalChartComponent, - ChargerChartComponent, + + ChargerChartDetailsComponent, + DetailsOverviewComponent, + ProductionMeterChartDetailsComponent, + SumChartDetailsComponent, ], }) export class Common_Production { } diff --git a/ui/src/app/edge/history/common/selfconsumption/SelfConsumption.ts b/ui/src/app/edge/history/common/selfconsumption/SelfConsumption.ts index e67a47ad931..ec139b091f4 100644 --- a/ui/src/app/edge/history/common/selfconsumption/SelfConsumption.ts +++ b/ui/src/app/edge/history/common/selfconsumption/SelfConsumption.ts @@ -1,8 +1,8 @@ +import { NgModule } from "@angular/core"; import { BrowserModule } from "@angular/platform-browser"; import { SharedModule } from "src/app/shared/shared.module"; -import { FlatComponent } from "./flat/flat"; -import { NgModule } from "@angular/core"; import { ChartComponent } from "./chart/chart.component"; +import { FlatComponent } from "./flat/flat"; import { OverviewComponent } from "./overview/overview"; @NgModule({ diff --git a/ui/src/app/edge/history/common/selfconsumption/chart/chart.component.ts b/ui/src/app/edge/history/common/selfconsumption/chart/chart.component.ts index a3854895d42..02c9e4f827f 100644 --- a/ui/src/app/edge/history/common/selfconsumption/chart/chart.component.ts +++ b/ui/src/app/edge/history/common/selfconsumption/chart/chart.component.ts @@ -1,52 +1,52 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { QueryHistoricTimeseriesEnergyResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChartAxis, HistoryUtils, Utils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { QueryHistoricTimeseriesEnergyResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChartAxis, HistoryUtils, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress } from "src/app/shared/shared"; @Component({ - selector: 'selfconsumptionChart', - templateUrl: '../../../../../shared/components/chart/abstracthistorychart.html', + selector: "selfconsumptionChart", + templateUrl: "../../../../../shared/components/chart/abstracthistorychart.html", }) export class ChartComponent extends AbstractHistoryChart { protected override getChartData(): HistoryUtils.ChartData { - this.spinnerId = 'selfconsumption-chart'; + this.spinnerId = "selfconsumption-chart"; return { input: [{ - name: 'GridSell', - powerChannel: ChannelAddress.fromString('_sum/GridActivePower'), - energyChannel: ChannelAddress.fromString('_sum/GridSellActiveEnergy'), - ...(this.chartType === 'line' && { converter: HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE }), + name: "GridSell", + powerChannel: ChannelAddress.fromString("_sum/GridActivePower"), + energyChannel: ChannelAddress.fromString("_sum/GridSellActiveEnergy"), + ...(this.chartType === "line" && { converter: HistoryUtils.ValueConverter.POSITIVE_AS_ZERO_AND_INVERT_NEGATIVE }), }, { - name: 'ProductionActivePower', - powerChannel: ChannelAddress.fromString('_sum/ProductionActivePower'), - energyChannel: ChannelAddress.fromString('_sum/ProductionActiveEnergy'), + name: "ProductionActivePower", + powerChannel: ChannelAddress.fromString("_sum/ProductionActivePower"), + energyChannel: ChannelAddress.fromString("_sum/ProductionActiveEnergy"), }], output: (data: HistoryUtils.ChannelData) => { return [{ - name: this.translate.instant('General.selfConsumption'), + name: this.translate.instant("General.selfConsumption"), nameSuffix: (energyValues: QueryHistoricTimeseriesEnergyResponse) => { - return Utils.calculateSelfConsumption(energyValues?.result.data['_sum/GridSellActiveEnergy'] ?? null, energyValues?.result.data['_sum/ProductionActiveEnergy'] ?? null); + return Utils.calculateSelfConsumption(energyValues?.result.data["_sum/GridSellActiveEnergy"] ?? null, energyValues?.result.data["_sum/ProductionActiveEnergy"] ?? null); }, converter: () => { - return data['GridSell'] + return data["GridSell"] ?.map((value, index) => - Utils.calculateSelfConsumption(value, data['ProductionActivePower'][index]), + Utils.calculateSelfConsumption(value, data["ProductionActivePower"][index]), ); }, - color: 'rgb(253,197,7)', + color: "rgb(253,197,7)", }]; }, tooltip: { - formatNumber: '1.0-0', + formatNumber: "1.0-0", }, yAxes: [{ - unit: YAxisTitle.PERCENTAGE, - position: 'left', + unit: YAxisType.PERCENTAGE, + position: "left", yAxisId: ChartAxis.LEFT, }], }; diff --git a/ui/src/app/edge/history/common/selfconsumption/flat/flat.html b/ui/src/app/edge/history/common/selfconsumption/flat/flat.html index cafbdfaa75d..a3def18d075 100644 --- a/ui/src/app/edge/history/common/selfconsumption/flat/flat.html +++ b/ui/src/app/edge/history/common/selfconsumption/flat/flat.html @@ -2,4 +2,4 @@ button routerLink="/device/{{edge.id}}/history/selfconsumptionchart" *ngIf="isInitialized"> - \ No newline at end of file + diff --git a/ui/src/app/edge/history/common/selfconsumption/flat/flat.ts b/ui/src/app/edge/history/common/selfconsumption/flat/flat.ts index e818fc3005f..4cc5d5fe127 100644 --- a/ui/src/app/edge/history/common/selfconsumption/flat/flat.ts +++ b/ui/src/app/edge/history/common/selfconsumption/flat/flat.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { CurrentData, Utils, ChannelAddress } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, Utils } from "src/app/shared/shared"; @Component({ - selector: 'selfconsumptionWidget', - templateUrl: './flat.html', + selector: "selfconsumptionWidget", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -13,15 +13,15 @@ export class FlatComponent extends AbstractFlatWidget { protected override onCurrentData(currentData: CurrentData) { this.selfconsumptionValue = Utils.calculateSelfConsumption( - currentData.allComponents['_sum/GridSellActiveEnergy'], - currentData.allComponents['_sum/ProductionActiveEnergy'], + currentData.allComponents["_sum/GridSellActiveEnergy"], + currentData.allComponents["_sum/ProductionActiveEnergy"], ); } protected override getChannelAddresses(): ChannelAddress[] { return [ - new ChannelAddress('_sum', 'GridSellActiveEnergy'), - new ChannelAddress('_sum', 'ProductionActiveEnergy'), + new ChannelAddress("_sum", "GridSellActiveEnergy"), + new ChannelAddress("_sum", "ProductionActiveEnergy"), ]; } } diff --git a/ui/src/app/edge/history/common/selfconsumption/overview/overview.html b/ui/src/app/edge/history/common/selfconsumption/overview/overview.html index 8100470a198..161f87a37fc 100644 --- a/ui/src/app/edge/history/common/selfconsumption/overview/overview.html +++ b/ui/src/app/edge/history/common/selfconsumption/overview/overview.html @@ -1,4 +1,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/common/selfconsumption/overview/overview.ts b/ui/src/app/edge/history/common/selfconsumption/overview/overview.ts index a3f812c1a88..51ed8f95a67 100644 --- a/ui/src/app/edge/history/common/selfconsumption/overview/overview.ts +++ b/ui/src/app/edge/history/common/selfconsumption/overview/overview.ts @@ -1,7 +1,7 @@ -import { Component } from '@angular/core'; -import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/abstractHistoryChartOverview'; +import { Component } from "@angular/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; @Component({ - templateUrl: './overview.html', + templateUrl: "./overview.html", }) export class OverviewComponent extends AbstractHistoryChartOverview { } diff --git a/ui/src/app/edge/history/delayedselltogrid/chart.component.ts b/ui/src/app/edge/history/delayedselltogrid/chart.component.ts index 358aef34881..deb3efeec3c 100644 --- a/ui/src/app/edge/history/delayedselltogrid/chart.component.ts +++ b/ui/src/app/edge/history/delayedselltogrid/chart.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { YAxisTitle } from 'src/app/shared/service/utils'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { YAxisType } from "src/app/shared/service/utils"; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; +import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from "../../../shared/shared"; +import { AbstractHistoryChart } from "../abstracthistorychart"; @Component({ - selector: 'delayedselltogridgchart', - templateUrl: '../abstracthistorychart.html', + selector: "delayedselltogridgchart", + templateUrl: "../abstracthistorychart.html", }) export class DelayedSellToGridChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -32,7 +32,6 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -50,9 +49,9 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem this.colors = []; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getConfig().then(config => { - const meterIdActivePower = config.getComponent(this.componentId).properties['meter.id'] + '/ActivePower'; - const sellToGridPowerLimit = this.componentId + '/_PropertySellToGridPowerLimit'; - const continuousSellToGridPower = this.componentId + '/_PropertyContinuousSellToGridPower'; + const meterIdActivePower = config.getComponent(this.componentId).properties["meter.id"] + "/ActivePower"; + const sellToGridPowerLimit = this.componentId + "/_PropertySellToGridPowerLimit"; + const continuousSellToGridPower = this.componentId + "/_PropertyContinuousSellToGridPower"; const result = response.result; // convert labels const labels: Date[] = []; @@ -75,13 +74,13 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem } }); datasets.push({ - label: this.translate.instant('General.gridSell'), + label: this.translate.instant("General.gridSell"), data: data, hidden: false, }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0.05)', - borderColor: 'rgba(0,0,0,1)', + backgroundColor: "rgba(0,0,0,0.05)", + borderColor: "rgba(0,0,0,1)", }); } if (sellToGridPowerLimit in result.data) { @@ -95,14 +94,14 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem } }); datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.DelayedSellToGrid.sellToGridPowerLimit'), + label: this.translate.instant("Edge.Index.Widgets.DelayedSellToGrid.sellToGridPowerLimit"), data: data, hidden: false, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(0,223,0,1)", }); } if (continuousSellToGridPower in result.data) { @@ -116,27 +115,27 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem } }); datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.DelayedSellToGrid.continuousSellToGridPower'), + label: this.translate.instant("Edge.Index.Widgets.DelayedSellToGrid.continuousSellToGridPower"), data: data, hidden: false, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(200,0,0,1)", }); } - if ('_sum/EssActivePower' in result.data) { + if ("_sum/EssActivePower" in result.data) { /* * Storage Charge */ let effectivePower; - if ('_sum/ProductionDcActualPower' in result.data && result.data['_sum/ProductionDcActualPower'].length > 0) { - effectivePower = result.data['_sum/ProductionDcActualPower'].map((value, index) => { - return Utils.subtractSafely(result.data['_sum/EssActivePower'][index], value); + if ("_sum/ProductionDcActualPower" in result.data && result.data["_sum/ProductionDcActualPower"].length > 0) { + effectivePower = result.data["_sum/ProductionDcActualPower"].map((value, index) => { + return Utils.subtractSafely(result.data["_sum/EssActivePower"][index], value); }); } else { - effectivePower = result.data['_sum/EssActivePower']; + effectivePower = result.data["_sum/EssActivePower"]; } const chargeData = effectivePower.map(value => { if (value == null) { @@ -148,13 +147,13 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem } }); datasets.push({ - label: this.translate.instant('General.chargePower'), + label: this.translate.instant("General.chargePower"), data: chargeData, borderDash: [10, 10], }); this.colors.push({ - backgroundColor: 'rgba(0,223,0,0.05)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0.05)", + borderColor: "rgba(0,223,0,1)", }); /* * Storage Discharge @@ -169,13 +168,13 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem } }); datasets.push({ - label: this.translate.instant('General.dischargePower'), + label: this.translate.instant("General.dischargePower"), data: dischargeData, borderDash: [10, 10], }); this.colors.push({ - backgroundColor: 'rgba(200,0,0,0.05)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(200,0,0,0.05)", + borderColor: "rgba(200,0,0,1)", }); } this.datasets = datasets; @@ -193,7 +192,7 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem this.initializeChart(); return; }).finally(() => { - this.unit = YAxisTitle.ENERGY; + this.unit = YAxisType.ENERGY; this.setOptions(this.options); }); } @@ -201,11 +200,11 @@ export class DelayedSellToGridChartComponent extends AbstractHistoryChart implem protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const result: ChannelAddress[] = [ - new ChannelAddress(this.componentId, '_PropertySellToGridPowerLimit'), - new ChannelAddress(this.componentId, '_PropertyContinuousSellToGridPower'), - new ChannelAddress(config.getComponent(this.componentId).properties['meter.id'], 'ActivePower'), - new ChannelAddress('_sum', 'ProductionDcActualPower'), - new ChannelAddress('_sum', 'EssActivePower'), + new ChannelAddress(this.componentId, "_PropertySellToGridPowerLimit"), + new ChannelAddress(this.componentId, "_PropertyContinuousSellToGridPower"), + new ChannelAddress(config.getComponent(this.componentId).properties["meter.id"], "ActivePower"), + new ChannelAddress("_sum", "ProductionDcActualPower"), + new ChannelAddress("_sum", "EssActivePower"), ]; resolve(result); }); diff --git a/ui/src/app/edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component.html b/ui/src/app/edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component.html index cedca95c96d..63997a1e1c5 100644 --- a/ui/src/app/edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component.html +++ b/ui/src/app/edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component.html @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component.ts b/ui/src/app/edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component.ts index c258d3f48df..b7b4f44eed3 100644 --- a/ui/src/app/edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component.ts +++ b/ui/src/app/edge/history/delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component.ts @@ -1,10 +1,10 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Edge, EdgeConfig, Service } from '../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { Edge, EdgeConfig, Service } from "../../../../shared/shared"; @Component({ selector: DelayedSellToGridChartOverviewComponent.SELECTOR, - templateUrl: './delayedselltogridchartoverview.component.html', + templateUrl: "./delayedselltogridchartoverview.component.html", }) export class DelayedSellToGridChartOverviewComponent implements OnInit { @@ -18,7 +18,7 @@ export class DelayedSellToGridChartOverviewComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.edge = edge; this.component = config.getComponent(this.route.snapshot.params.componentId); diff --git a/ui/src/app/edge/history/delayedselltogrid/widget.component.html b/ui/src/app/edge/history/delayedselltogrid/widget.component.html index e23f900e9f0..9850fcb7ddd 100644 --- a/ui/src/app/edge/history/delayedselltogrid/widget.component.html +++ b/ui/src/app/edge/history/delayedselltogrid/widget.component.html @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/delayedselltogrid/widget.component.ts b/ui/src/app/edge/history/delayedselltogrid/widget.component.ts index 5a537af8d69..7d618d15e6e 100644 --- a/ui/src/app/edge/history/delayedselltogrid/widget.component.ts +++ b/ui/src/app/edge/history/delayedselltogrid/widget.component.ts @@ -1,11 +1,11 @@ -import { ActivatedRoute } from '@angular/router'; -import { Component, Input, OnInit } from '@angular/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { Edge, Service, EdgeConfig } from 'src/app/shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { Edge, EdgeConfig, Service } from "src/app/shared/shared"; @Component({ selector: DelayedSellToGridWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', + templateUrl: "./widget.component.html", }) export class DelayedSellToGridWidgetComponent implements OnInit { @@ -22,7 +22,7 @@ export class DelayedSellToGridWidgetComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.service.getConfig().then(config => { this.component = config.getComponent(this.componentId); diff --git a/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.html b/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.html deleted file mode 100644 index 887b62548da..00000000000 --- a/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - {{ component.alias }} - - - - - - - - - - - - - - - - - - - - - - -
General.TOTAL
- - -
-
- - - - - - -
- - -
-
-
-
\ No newline at end of file diff --git a/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.ts b/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.ts deleted file mode 100644 index 59d90f56e80..00000000000 --- a/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.ts +++ /dev/null @@ -1,49 +0,0 @@ -// @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Edge, EdgeConfig, Service, Utils } from '../../../../shared/shared'; - -@Component({ - selector: FixDigitalOutputChartOverviewComponent.SELECTOR, - templateUrl: './fixdigitaloutputchartoverview.component.html', -}) -export class FixDigitalOutputChartOverviewComponent implements OnInit { - - private static readonly SELECTOR = "fixdigitaloutput-chart-overview"; - - public edge: Edge | null = null; - public component: EdgeConfig.Component | null = null; - - public showTotal: boolean = false; - public fixDigitalOutputComponents: string[] = []; - - // reference to the Utils method to access via html - public isLastElement = Utils.isLastElement; - - constructor( - public service: Service, - private route: ActivatedRoute, - ) { } - - ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { - this.service.getConfig().then(config => { - this.edge = edge; - this.component = config.getComponent(this.route.snapshot.params.componentId); - config.getComponentsByFactory('Controller.Io.FixDigitalOutput').forEach(component => { - this.fixDigitalOutputComponents.push(component.id); - }); - if (this.fixDigitalOutputComponents.length > 1) { - this.showTotal = false; - } else if (this.fixDigitalOutputComponents.length == 1) { - this.showTotal = null; - } - }); - }); - - } - - onNotifyTotal(showTotal: boolean): void { - this.showTotal = showTotal; - } -} diff --git a/ui/src/app/edge/history/fixdigitaloutput/singlechart.component.ts b/ui/src/app/edge/history/fixdigitaloutput/singlechart.component.ts deleted file mode 100644 index bc55416a9c8..00000000000 --- a/ui/src/app/edge/history/fixdigitaloutput/singlechart.component.ts +++ /dev/null @@ -1,108 +0,0 @@ -// @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { YAxisTitle } from 'src/app/shared/service/utils'; - -import { QueryHistoricTimeseriesDataResponse } from '../../../shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; - -@Component({ - selector: 'fixDigitalOutputSingleChart', - templateUrl: '../abstracthistorychart.html', -}) -export class FixDigitalOutputSingleChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { - - @Input({ required: true }) public period!: DefaultTypes.HistoryPeriod; - @Input({ required: true }) public componentId!: string; - - - constructor( - protected override service: Service, - protected override translate: TranslateService, - private route: ActivatedRoute, - ) { - super("fixdigitaloutput-single-chart", service, translate); - } - - ngOnChanges() { - this.updateChart(); - } - - ngOnInit() { - this.startSpinner(); - this.service.setCurrentComponent('', this.route); - } - - ngOnDestroy() { - this.unsubscribeChartRefresh(); - } - - public getChartHeight(): number { - return window.innerHeight / 1.3; - } - - protected updateChart() { - this.autoSubscribeChartRefresh(); - this.startSpinner(); - this.colors = []; - this.loading = true; - this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - const result = (response as QueryHistoricTimeseriesDataResponse).result; - // convert labels - const labels: Date[] = []; - for (const timestamp of result.timestamps) { - labels.push(new Date(timestamp)); - } - this.labels = labels; - - // convert datasets - const datasets: Chart.ChartDataset[] = []; - for (const channel in result.data) { - const address = ChannelAddress.fromString(channel); - const data = result.data[channel].map(value => { - if (value == null) { - return null; - } else { - return value * 100; // convert to % [0,100] - } - }); - datasets.push({ - label: address.channelId, - data: data, - }); - this.colors.push({ - backgroundColor: 'rgba(0,191,255,0.05)', - borderColor: 'rgba(0,191,255,1)', - }); - } - this.datasets = datasets; - this.loading = false; - this.stopSpinner(); - }).catch(reason => { - console.error(reason); // TODO error message - this.initializeChart(); - return; - }).finally(async () => { - this.unit = YAxisTitle.PERCENTAGE; - await this.setOptions(this.options); - this.stopSpinner(); - }); - } - - protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { - return new Promise((resolve) => { - const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); - const channeladdresses = [outputChannel]; - resolve(channeladdresses); - }); - } - - protected setLabel() { - this.options = this.createDefaultChartOptions(); - } - -} diff --git a/ui/src/app/edge/history/fixdigitaloutput/totalchart.component.ts b/ui/src/app/edge/history/fixdigitaloutput/totalchart.component.ts deleted file mode 100644 index e675ed613c0..00000000000 --- a/ui/src/app/edge/history/fixdigitaloutput/totalchart.component.ts +++ /dev/null @@ -1,126 +0,0 @@ -// @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { YAxisTitle } from 'src/app/shared/service/utils'; - -import { QueryHistoricTimeseriesDataResponse } from '../../../shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { ChannelAddress, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; - -@Component({ - selector: 'fixDigitalOutputTotalChart', - templateUrl: '../abstracthistorychart.html', -}) -export class FixDigitalOutputTotalChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { - - @Input({ required: true }) public period!: DefaultTypes.HistoryPeriod; - - constructor( - protected override service: Service, - protected override translate: TranslateService, - private route: ActivatedRoute, - ) { - super("fixdigitaloutput-total-chart", service, translate); - } - - ngOnChanges() { - this.updateChart(); - } - - ngOnInit() { - this.startSpinner(); - this.service.setCurrentComponent('', this.route); - } - - ngOnDestroy() { - this.unsubscribeChartRefresh(); - } - - public getChartHeight(): number { - return window.innerHeight / 1.3; - } - protected updateChart() { - this.autoSubscribeChartRefresh(); - this.startSpinner(); - this.colors = []; - this.loading = true; - this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - const result = (response as QueryHistoricTimeseriesDataResponse).result; - // convert labels - const labels: Date[] = []; - for (const timestamp of result.timestamps) { - labels.push(new Date(timestamp)); - } - this.labels = labels; - - - const datasets = []; - // convert datasets - Object.keys(result.data).forEach((channel, index) => { - const address = ChannelAddress.fromString(channel); - const data = result.data[channel]?.map((value) => { - if (value == null) { - return null; - } else { - return value * 100; // convert to % [0,100] - } - }); - switch (index % 2) { - case 0: - datasets.push({ - label: address.channelId, - data: data, - }); - this.colors.push({ - backgroundColor: 'rgba(0,191,255,0.05)', - borderColor: 'rgba(0,191,255,1)', - }); - break; - case 1: - datasets.push({ - label: address.channelId, - data: data, - }); - this.colors.push({ - backgroundColor: 'rgba(0,0,139,0.05)', - borderColor: 'rgba(0,0,139,1)', - }); - break; - } - this.datasets = datasets; - this.loading = false; - this.stopSpinner(); - - }); - }).catch(reason => { - console.error(reason); // TODO error message - this.initializeChart(); - return; - }).finally(async () => { - this.unit = YAxisTitle.PERCENTAGE; - this.formatNumber = '1.0-0'; - await this.setOptions(this.options); - }); - } - - protected getChannelAddresses(): Promise { - return new Promise((resolve, reject) => { - this.service.getConfig().then(config => { - const channeladdresses = []; - // find all FixIoControllers - config.getComponentsByFactory('Controller.Io.FixDigitalOutput').forEach(component => { - const outputChannel = ChannelAddress.fromString(config.getComponentProperties(component.id)['outputChannelAddress']); - channeladdresses.push(outputChannel); - }); - resolve(channeladdresses); - }).catch(reason => reject(reason)); - }); - } - - protected setLabel() { - this.options = this.createDefaultChartOptions(); - } - -} diff --git a/ui/src/app/edge/history/fixdigitaloutput/widget.component.html b/ui/src/app/edge/history/fixdigitaloutput/widget.component.html deleted file mode 100644 index 6a243ca093c..00000000000 --- a/ui/src/app/edge/history/fixdigitaloutput/widget.component.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - {{ component.alias }} - - - - - - - -
- Edge.History.activeDuration - {{ activeSecondsOverPeriod | formatSecondsToDuration }} -
-
-
\ No newline at end of file diff --git a/ui/src/app/edge/history/fixdigitaloutput/widget.component.ts b/ui/src/app/edge/history/fixdigitaloutput/widget.component.ts deleted file mode 100644 index 7ca50fb8bf5..00000000000 --- a/ui/src/app/edge/history/fixdigitaloutput/widget.component.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { QueryHistoricTimeseriesDataResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; - -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryWidget } from '../abstracthistorywidget'; -import { calculateActiveTimeOverPeriod } from '../shared'; - -@Component({ - selector: FixDigitalOutputWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', -}) -export class FixDigitalOutputWidgetComponent extends AbstractHistoryWidget implements OnInit, OnChanges, OnDestroy { - - private static readonly SELECTOR = "fixDigitalOutputWidget"; - @Input({ required: true }) public period!: DefaultTypes.HistoryPeriod; - @Input({ required: true }) public componentId!: string; - - public component: EdgeConfig.Component | null = null; - public activeSecondsOverPeriod: number | null = null; - public edge: Edge | null = null; - private config: EdgeConfig | null = null; - - constructor( - public override service: Service, - private route: ActivatedRoute, - ) { - super(service); - } - - ngOnInit() { - this.service.setCurrentComponent('', this.route).then(response => { - this.service.getConfig().then(config => { - this.edge = response; - this.config = config; - this.component = config.getComponent(this.componentId); - }); - }); - } - - ngOnDestroy() { - this.unsubscribeWidgetRefresh(); - } - - ngOnChanges() { - this.updateValues(); - } - - protected updateValues() { - // Gather result & timestamps to calculate effective active time in % - this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).then(response => { - const result = (response as QueryHistoricTimeseriesDataResponse).result; - this.service.getConfig().then(config => { - const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); - this.activeSecondsOverPeriod = calculateActiveTimeOverPeriod(outputChannel, result); - }); - }); - } - - protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { - return new Promise((resolve) => { - const outputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['outputChannelAddress']); - const channeladdresses = [outputChannel]; - resolve(channeladdresses); - }); - } -} diff --git a/ui/src/app/edge/history/heatingelement/chart.component.ts b/ui/src/app/edge/history/heatingelement/chart.component.ts index 298858a48eb..49dd46bf02c 100644 --- a/ui/src/app/edge/history/heatingelement/chart.component.ts +++ b/ui/src/app/edge/history/heatingelement/chart.component.ts @@ -1,19 +1,19 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; -import type { ChartOptions } from 'chart.js'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChartAxis, YAxisTitle } from 'src/app/shared/service/utils'; +import type { ChartOptions } from "chart.js"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChartAxis, YAxisType } from "src/app/shared/service/utils"; -import { QueryHistoricTimeseriesDataResponse } from '../../../shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; +import { QueryHistoricTimeseriesDataResponse } from "../../../shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; +import { ChannelAddress, Edge, EdgeConfig, Service } from "../../../shared/shared"; +import { AbstractHistoryChart } from "../abstracthistorychart"; @Component({ - selector: 'heatingelementChart', - templateUrl: '../abstracthistorychart.html', + selector: "heatingelementChart", + templateUrl: "../abstracthistorychart.html", }) export class HeatingelementChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -34,7 +34,6 @@ export class HeatingelementChartComponent extends AbstractHistoryChart implement ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); this.setLabel(); } @@ -63,7 +62,7 @@ export class HeatingelementChartComponent extends AbstractHistoryChart implement // convert datasets const datasets = []; - const level = this.component.id + '/Level'; + const level = this.component.id + "/Level"; if (level in result.data) { const levelData = result.data[level].map(value => { @@ -74,12 +73,12 @@ export class HeatingelementChartComponent extends AbstractHistoryChart implement } }); datasets.push({ - label: 'Level', + label: "Level", data: levelData, }); this.colors.push({ - backgroundColor: 'rgba(200,0,0,0.05)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(200,0,0,0.05)", + borderColor: "rgba(200,0,0,1)", }); } this.datasets = datasets; @@ -97,8 +96,8 @@ export class HeatingelementChartComponent extends AbstractHistoryChart implement this.initializeChart(); return; }).finally(async () => { - this.formatNumber = '1.0-1'; - this.unit = YAxisTitle.NONE; + this.formatNumber = "1.0-1"; + this.unit = YAxisType.NONE; await this.setOptions(this.options); this.applyControllerSpecificOptions(this.options); }); @@ -106,17 +105,17 @@ export class HeatingelementChartComponent extends AbstractHistoryChart implement protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { - const levels = new ChannelAddress(this.component.id, 'Level'); + const levels = new ChannelAddress(this.component.id, "Level"); const channeladdresses = [levels]; resolve(channeladdresses); }); } protected applyControllerSpecificOptions(options: ChartOptions) { - options.scales[ChartAxis.LEFT]['title'].text = 'Level'; - options.scales[ChartAxis.LEFT]['beginAtZero'] = true; + options.scales[ChartAxis.LEFT]["title"].text = "Level"; + options.scales[ChartAxis.LEFT]["beginAtZero"] = true; options.scales[ChartAxis.LEFT].max = 3; - options.scales[ChartAxis.LEFT].ticks['stepSize'] = 1; + options.scales[ChartAxis.LEFT].ticks["stepSize"] = 1; this.options = options; } diff --git a/ui/src/app/edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component.html b/ui/src/app/edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component.html index bcfa40fc435..9b116e552fb 100644 --- a/ui/src/app/edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component.html +++ b/ui/src/app/edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component.html @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component.ts b/ui/src/app/edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component.ts index 440eeb2c38b..f615818d7c3 100644 --- a/ui/src/app/edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component.ts +++ b/ui/src/app/edge/history/heatingelement/heatingelementchartoverview/heatingelementchartoverview.component.ts @@ -1,10 +1,10 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Edge, EdgeConfig, Service } from '../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { Edge, EdgeConfig, Service } from "../../../../shared/shared"; @Component({ selector: HeatingelementChartOverviewComponent.SELECTOR, - templateUrl: './heatingelementchartoverview.component.html', + templateUrl: "./heatingelementchartoverview.component.html", }) export class HeatingelementChartOverviewComponent implements OnInit { @@ -18,7 +18,7 @@ export class HeatingelementChartOverviewComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.component = config.getComponent(this.route.snapshot.params.componentId); this.service.getConfig().then(config => { diff --git a/ui/src/app/edge/history/heatingelement/widget.component.html b/ui/src/app/edge/history/heatingelement/widget.component.html index 4af8de75ce2..49b50bff319 100644 --- a/ui/src/app/edge/history/heatingelement/widget.component.html +++ b/ui/src/app/edge/history/heatingelement/widget.component.html @@ -34,4 +34,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/heatingelement/widget.component.ts b/ui/src/app/edge/history/heatingelement/widget.component.ts index 5f39ae03bd0..262c025d23c 100644 --- a/ui/src/app/edge/history/heatingelement/widget.component.ts +++ b/ui/src/app/edge/history/heatingelement/widget.component.ts @@ -1,14 +1,14 @@ -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { QueryHistoricTimeseriesDataResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryWidget } from '../abstracthistorywidget'; +import { ChannelAddress, Edge, EdgeConfig, Service } from "../../../shared/shared"; +import { AbstractHistoryWidget } from "../abstracthistorywidget"; @Component({ selector: HeatingelementWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', + templateUrl: "./widget.component.html", }) export class HeatingelementWidgetComponent extends AbstractHistoryWidget implements OnInit, OnChanges, OnDestroy { @@ -33,7 +33,7 @@ export class HeatingelementWidgetComponent extends AbstractHistoryWidget impleme } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.service.getConfig().then(config => { this.component = config.getComponent(this.componentId); @@ -58,18 +58,18 @@ export class HeatingelementWidgetComponent extends AbstractHistoryWidget impleme protected updateValues() { this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).then(response => { - this.activeTimeOverPeriodLevel1 = this.getCumulativeValue(this.componentId + '/Level1CumulatedTime', response); - this.activeTimeOverPeriodLevel2 = this.getCumulativeValue(this.componentId + '/Level2CumulatedTime', response); - this.activeTimeOverPeriodLevel3 = this.getCumulativeValue(this.componentId + '/Level3CumulatedTime', response); + this.activeTimeOverPeriodLevel1 = this.getCumulativeValue(this.componentId + "/Level1CumulatedTime", response); + this.activeTimeOverPeriodLevel2 = this.getCumulativeValue(this.componentId + "/Level2CumulatedTime", response); + this.activeTimeOverPeriodLevel3 = this.getCumulativeValue(this.componentId + "/Level3CumulatedTime", response); }); } protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const channeladdresses = [ - new ChannelAddress(this.componentId, 'Level1CumulatedTime'), - new ChannelAddress(this.componentId, 'Level2CumulatedTime'), - new ChannelAddress(this.componentId, 'Level3CumulatedTime'), + new ChannelAddress(this.componentId, "Level1CumulatedTime"), + new ChannelAddress(this.componentId, "Level2CumulatedTime"), + new ChannelAddress(this.componentId, "Level3CumulatedTime"), ]; resolve(channeladdresses); }); diff --git a/ui/src/app/edge/history/heatpump/chart.component.ts b/ui/src/app/edge/history/heatpump/chart.component.ts index 3a00779b838..4e39df05a3c 100644 --- a/ui/src/app/edge/history/heatpump/chart.component.ts +++ b/ui/src/app/edge/history/heatpump/chart.component.ts @@ -1,17 +1,17 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChartAxis } from 'src/app/shared/service/utils'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import * as Chart from "chart.js"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChartAxis } from "src/app/shared/service/utils"; -import { ChannelAddress, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; +import { ChannelAddress, EdgeConfig, Service } from "../../../shared/shared"; +import { AbstractHistoryChart } from "../abstracthistorychart"; @Component({ - selector: 'heatpumpchart', - templateUrl: '../abstracthistorychart.html', + selector: "heatpumpchart", + templateUrl: "../abstracthistorychart.html", }) export class HeatPumpChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -33,7 +33,6 @@ export class HeatPumpChartComponent extends AbstractHistoryChart implements OnIn ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -61,9 +60,9 @@ export class HeatPumpChartComponent extends AbstractHistoryChart implements OnIn // convert datasets const datasets = []; - if (this.component.id + '/Status' in result.data) { + if (this.component.id + "/Status" in result.data) { - const stateTimeData = result.data[this.component.id + '/Status'].map(value => { + const stateTimeData = result.data[this.component.id + "/Status"].map(value => { if (value == null) { return null; } else { @@ -72,13 +71,13 @@ export class HeatPumpChartComponent extends AbstractHistoryChart implements OnIn }); datasets.push({ - label: this.translate.instant('General.state'), + label: this.translate.instant("General.state"), data: stateTimeData, hidden: false, }); this.colors.push({ - backgroundColor: 'rgba(200,0,0,0.05)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(200,0,0,0.05)", + borderColor: "rgba(200,0,0,1)", }); } this.datasets = datasets; @@ -97,7 +96,7 @@ export class HeatPumpChartComponent extends AbstractHistoryChart implements OnIn protected getChannelAddresses(): Promise { return new Promise((resolve) => { - resolve([new ChannelAddress(this.component.id, 'Status')]); + resolve([new ChannelAddress(this.component.id, "Status")]); }); } @@ -107,19 +106,19 @@ export class HeatPumpChartComponent extends AbstractHistoryChart implements OnIn private applyControllerSpecificOptions(options: Chart.ChartOptions) { const translate = this.translate; - options.scales[ChartAxis.LEFT]['title'].text = this.translate.instant('General.state'); + options.scales[ChartAxis.LEFT]["title"].text = this.translate.instant("General.state"); options.scales[ChartAxis.LEFT].ticks.callback = function (label, index, labels) { switch (label) { case -1: - return translate.instant('Edge.Index.Widgets.HeatPump.undefined'); + return translate.instant("Edge.Index.Widgets.HeatPump.undefined"); case 0: - return translate.instant('Edge.Index.Widgets.HeatPump.lock'); + return translate.instant("Edge.Index.Widgets.HeatPump.lock"); case 1: - return translate.instant('Edge.Index.Widgets.HeatPump.normalOperationShort'); + return translate.instant("Edge.Index.Widgets.HeatPump.normalOperationShort"); case 2: - return translate.instant('Edge.Index.Widgets.HeatPump.switchOnRecShort'); + return translate.instant("Edge.Index.Widgets.HeatPump.switchOnRecShort"); case 3: - return translate.instant('Edge.Index.Widgets.HeatPump.switchOnComShort'); + return translate.instant("Edge.Index.Widgets.HeatPump.switchOnComShort"); } }; @@ -129,30 +128,30 @@ export class HeatPumpChartComponent extends AbstractHistoryChart implements OnIn let toolTipValue; switch (value) { case -1: - toolTipValue = translate.instant('Edge.Index.Widgets.HeatPump.undefined'); + toolTipValue = translate.instant("Edge.Index.Widgets.HeatPump.undefined"); break; case 0: - toolTipValue = translate.instant('Edge.Index.Widgets.HeatPump.lock'); + toolTipValue = translate.instant("Edge.Index.Widgets.HeatPump.lock"); break; case 1: - toolTipValue = translate.instant('Edge.Index.Widgets.HeatPump.normalOperation'); + toolTipValue = translate.instant("Edge.Index.Widgets.HeatPump.normalOperation"); break; case 2: - toolTipValue = translate.instant('Edge.Index.Widgets.HeatPump.switchOnRec'); + toolTipValue = translate.instant("Edge.Index.Widgets.HeatPump.switchOnRec"); break; case 3: - toolTipValue = translate.instant('Edge.Index.Widgets.HeatPump.switchOnCom'); + toolTipValue = translate.instant("Edge.Index.Widgets.HeatPump.switchOnCom"); break; default: - toolTipValue = ''; + toolTipValue = ""; break; } return label + ": " + toolTipValue; // TODO get locale dynamically }; options.scales[ChartAxis.LEFT].max = 3; - options.scales[ChartAxis.LEFT]['beginAtZero'] = true; + options.scales[ChartAxis.LEFT]["beginAtZero"] = true; this.options = options; } diff --git a/ui/src/app/edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component.html b/ui/src/app/edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component.html index a244ed42441..f8d4c9d4459 100644 --- a/ui/src/app/edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component.html +++ b/ui/src/app/edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component.html @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component.ts b/ui/src/app/edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component.ts index 16b4085313c..e17887c4e55 100644 --- a/ui/src/app/edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component.ts +++ b/ui/src/app/edge/history/heatpump/heatpumpchartoverview/heatpumpchartoverview.component.ts @@ -1,11 +1,11 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { Edge, EdgeConfig, Service } from '../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { Edge, EdgeConfig, Service } from "../../../../shared/shared"; @Component({ selector: HeatPumpChartOverviewComponent.SELECTOR, - templateUrl: './heatpumpchartoverview.component.html', + templateUrl: "./heatpumpchartoverview.component.html", }) export class HeatPumpChartOverviewComponent implements OnInit { @@ -21,7 +21,7 @@ export class HeatPumpChartOverviewComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.component = config.getComponent(this.route.snapshot.params.componentId); this.service.getConfig().then(config => { diff --git a/ui/src/app/edge/history/heatpump/widget.component.html b/ui/src/app/edge/history/heatpump/widget.component.html index b3537ee557c..c664db8d882 100644 --- a/ui/src/app/edge/history/heatpump/widget.component.html +++ b/ui/src/app/edge/history/heatpump/widget.component.html @@ -35,4 +35,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/heatpump/widget.component.ts b/ui/src/app/edge/history/heatpump/widget.component.ts index 30b91ac9062..90fc211cca5 100644 --- a/ui/src/app/edge/history/heatpump/widget.component.ts +++ b/ui/src/app/edge/history/heatpump/widget.component.ts @@ -1,15 +1,15 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryWidget } from '../abstracthistorywidget'; +import { ChannelAddress, Edge, EdgeConfig, Service } from "../../../shared/shared"; +import { AbstractHistoryWidget } from "../abstracthistorywidget"; @Component({ selector: HeatpumpWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', + templateUrl: "./widget.component.html", }) export class HeatpumpWidgetComponent extends AbstractHistoryWidget implements OnInit, OnChanges, OnDestroy { @@ -35,7 +35,7 @@ export class HeatpumpWidgetComponent extends AbstractHistoryWidget implements On } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.service.getConfig().then(config => { this.component = config.getComponent(this.componentId); @@ -56,17 +56,17 @@ export class HeatpumpWidgetComponent extends AbstractHistoryWidget implements On this.getChannelAddresses(this.edge, config).then(channels => { this.service.queryEnergy(this.period.from, this.period.to, channels).then(response => { const result = response.result; - if (this.componentId + '/ForceOnStateTime' in result.data) { - this.activeTimeOverPeriodForceOn = result.data[this.componentId + '/ForceOnStateTime']; + if (this.componentId + "/ForceOnStateTime" in result.data) { + this.activeTimeOverPeriodForceOn = result.data[this.componentId + "/ForceOnStateTime"]; } - if (this.componentId + '/RegularStateTime' in result.data) { - this.activeTimeOverPeriodRegular = result.data[this.componentId + '/RegularStateTime']; + if (this.componentId + "/RegularStateTime" in result.data) { + this.activeTimeOverPeriodRegular = result.data[this.componentId + "/RegularStateTime"]; } - if (this.componentId + '/RecommendationStateTime' in result.data) { - this.activeTimeOverPeriodRecommendation = result.data[this.componentId + '/RecommendationStateTime']; + if (this.componentId + "/RecommendationStateTime" in result.data) { + this.activeTimeOverPeriodRecommendation = result.data[this.componentId + "/RecommendationStateTime"]; } - if (this.componentId + '/LockStateTime' in result.data) { - this.activeTimeOverPeriodLock = result.data[this.componentId + '/LockStateTime']; + if (this.componentId + "/LockStateTime" in result.data) { + this.activeTimeOverPeriodLock = result.data[this.componentId + "/LockStateTime"]; } }); }); @@ -76,10 +76,10 @@ export class HeatpumpWidgetComponent extends AbstractHistoryWidget implements On protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const channels: ChannelAddress[] = [ - new ChannelAddress(this.componentId, 'ForceOnStateTime'), - new ChannelAddress(this.componentId, 'RegularStateTime'), - new ChannelAddress(this.componentId, 'RecommendationStateTime'), - new ChannelAddress(this.componentId, 'LockStateTime'), + new ChannelAddress(this.componentId, "ForceOnStateTime"), + new ChannelAddress(this.componentId, "RegularStateTime"), + new ChannelAddress(this.componentId, "RecommendationStateTime"), + new ChannelAddress(this.componentId, "LockStateTime"), ]; resolve(channels); }); diff --git a/ui/src/app/edge/history/history.component.html b/ui/src/app/edge/history/history.component.html index 28687881029..8774f678d1b 100644 --- a/ui/src/app/edge/history/history.component.html +++ b/ui/src/app/edge/history/history.component.html @@ -1,7 +1,7 @@
- + diff --git a/ui/src/app/edge/history/history.component.ts b/ui/src/app/edge/history/history.component.ts index b0a4c35e4bf..719a287a158 100644 --- a/ui/src/app/edge/history/history.component.ts +++ b/ui/src/app/edge/history/history.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Component, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { AppService } from 'src/app/app.service'; -import { HeaderComponent } from 'src/app/shared/components/header/header.component'; -import { JsonrpcResponseError } from 'src/app/shared/jsonrpc/base'; -import { Edge, EdgeConfig, Service, Widgets } from 'src/app/shared/shared'; -import { environment } from 'src/environments'; +import { Component, OnInit, ViewChild } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { AppService } from "src/app/app.service"; +import { HeaderComponent } from "src/app/shared/components/header/header.component"; +import { JsonrpcResponseError } from "src/app/shared/jsonrpc/base"; +import { Edge, EdgeConfig, Service, Widgets } from "src/app/shared/shared"; +import { environment } from "src/environments"; @Component({ - selector: 'history', - templateUrl: './history.component.html', + selector: "history", + templateUrl: "./history.component.html", }) export class HistoryComponent implements OnInit { @@ -42,7 +42,6 @@ export class HistoryComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route); this.service.currentEdge.subscribe((edge) => { this.edge = edge; }); @@ -57,8 +56,8 @@ export class HistoryComponent implements OnInit { config.hasStorage(); this.widgets = config.widgets; // Are we connected to OpenEMS Edge and is a timedata service available? - if (environment.backend == 'OpenEMS Edge' - && config.getComponentsImplementingNature('io.openems.edge.timedata.api.Timedata').filter(c => c.isEnabled).length == 0) { + if (environment.backend == "OpenEMS Edge" + && config.getComponentsImplementingNature("io.openems.edge.timedata.api.Timedata").filter(c => c.isEnabled).length == 0) { this.isTimedataAvailable = false; } }); diff --git a/ui/src/app/edge/history/history.module.ts b/ui/src/app/edge/history/history.module.ts index 9642a03adbf..9d45b5ba2df 100644 --- a/ui/src/app/edge/history/history.module.ts +++ b/ui/src/app/edge/history/history.module.ts @@ -1,45 +1,38 @@ -import { NgModule } from '@angular/core'; -import { HistoryDataErrorModule } from 'src/app/shared/components/history-data-error/history-data-error.module'; +import { NgModule } from "@angular/core"; +import { HistoryDataErrorModule } from "src/app/shared/components/history-data-error/history-data-error.module"; -import { SharedModule } from '../../shared/shared.module'; -import { ChpSocChartComponent } from './chpsoc/chart.component'; -import { ChpSocWidgetComponent } from './chpsoc/widget.component'; -import { Common } from './common/common'; -import { Controller } from './Controller/controller.module'; -import { DelayedSellToGridChartComponent } from './delayedselltogrid/chart.component'; -import { DelayedSellToGridChartOverviewComponent } from './delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component'; -import { DelayedSellToGridWidgetComponent } from './delayedselltogrid/widget.component'; -import { FixDigitalOutputChartOverviewComponent } from './fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component'; -import { FixDigitalOutputSingleChartComponent } from './fixdigitaloutput/singlechart.component'; -import { FixDigitalOutputTotalChartComponent } from './fixdigitaloutput/totalchart.component'; -import { FixDigitalOutputWidgetComponent } from './fixdigitaloutput/widget.component'; -import { HeatingelementChartComponent } from './heatingelement/chart.component'; -import { HeatingelementChartOverviewComponent } from './heatingelement/heatingelementchartoverview/heatingelementchartoverview.component'; -import { HeatingelementWidgetComponent } from './heatingelement/widget.component'; -import { HeatPumpChartComponent } from './heatpump/chart.component'; -import { HeatPumpChartOverviewComponent } from './heatpump/heatpumpchartoverview/heatpumpchartoverview.component'; -import { HeatpumpWidgetComponent } from './heatpump/widget.component'; -import { HistoryComponent } from './history.component'; -import { HistoryParentComponent } from './historyparent.component'; -import { AsymmetricPeakshavingChartOverviewComponent } from './peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component'; -import { AsymmetricPeakshavingChartComponent } from './peakshaving/asymmetric/chart.component'; -import { AsymmetricPeakshavingWidgetComponent } from './peakshaving/asymmetric/widget.component'; -import { SymmetricPeakshavingChartComponent } from './peakshaving/symmetric/chart.component'; -import { SymmetricPeakshavingChartOverviewComponent } from './peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component'; -import { SymmetricPeakshavingWidgetComponent } from './peakshaving/symmetric/widget.component'; -import { TimeslotPeakshavingChartComponent } from './peakshaving/timeslot/chart.component'; -import { TimeslotPeakshavingChartOverviewComponent } from './peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component'; -import { TimeslotPeakshavingWidgetComponent } from './peakshaving/timeslot/widget.component'; -import { SinglethresholdChartComponent } from './singlethreshold/chart.component'; -import { SinglethresholdChartOverviewComponent } from './singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component'; -import { SinglethresholdWidgetComponent } from './singlethreshold/widget.component'; -import { StorageChargerChartComponent } from './storage/chargerchart.component'; -import { StorageESSChartComponent } from './storage/esschart.component'; -import { StorageSingleChartComponent } from './storage/singlechart.component'; -import { SocStorageChartComponent } from './storage/socchart.component'; -import { StorageChartOverviewComponent } from './storage/storagechartoverview/storagechartoverview.component'; -import { StorageTotalChartComponent } from './storage/totalchart.component'; -import { StorageComponent } from './storage/widget.component'; +import { SharedModule } from "../../shared/shared.module"; +import { ChpSocChartComponent } from "./chpsoc/chart.component"; +import { ChpSocWidgetComponent } from "./chpsoc/widget.component"; +import { Common } from "./common/common"; +import { Controller } from "./Controller/controller.module"; +import { DelayedSellToGridChartComponent } from "./delayedselltogrid/chart.component"; +import { DelayedSellToGridChartOverviewComponent } from "./delayedselltogrid/symmetricpeakshavingchartoverview/delayedselltogridchartoverview.component"; +import { DelayedSellToGridWidgetComponent } from "./delayedselltogrid/widget.component"; +import { HeatingelementChartComponent } from "./heatingelement/chart.component"; +import { HeatingelementChartOverviewComponent } from "./heatingelement/heatingelementchartoverview/heatingelementchartoverview.component"; +import { HeatingelementWidgetComponent } from "./heatingelement/widget.component"; +import { HeatPumpChartComponent } from "./heatpump/chart.component"; +import { HeatPumpChartOverviewComponent } from "./heatpump/heatpumpchartoverview/heatpumpchartoverview.component"; +import { HeatpumpWidgetComponent } from "./heatpump/widget.component"; +import { HistoryComponent } from "./history.component"; +import { HistoryParentComponent } from "./historyparent.component"; +import { AsymmetricPeakshavingChartOverviewComponent } from "./peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component"; +import { AsymmetricPeakshavingChartComponent } from "./peakshaving/asymmetric/chart.component"; +import { AsymmetricPeakshavingWidgetComponent } from "./peakshaving/asymmetric/widget.component"; +import { SymmetricPeakshavingChartComponent } from "./peakshaving/symmetric/chart.component"; +import { SymmetricPeakshavingChartOverviewComponent } from "./peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component"; +import { SymmetricPeakshavingWidgetComponent } from "./peakshaving/symmetric/widget.component"; +import { TimeslotPeakshavingChartComponent } from "./peakshaving/timeslot/chart.component"; +import { TimeslotPeakshavingChartOverviewComponent } from "./peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component"; +import { TimeslotPeakshavingWidgetComponent } from "./peakshaving/timeslot/widget.component"; +import { StorageChargerChartComponent } from "./storage/chargerchart.component"; +import { StorageESSChartComponent } from "./storage/esschart.component"; +import { StorageSingleChartComponent } from "./storage/singlechart.component"; +import { SocStorageChartComponent } from "./storage/socchart.component"; +import { StorageChartOverviewComponent } from "./storage/storagechartoverview/storagechartoverview.component"; +import { StorageTotalChartComponent } from "./storage/totalchart.component"; +import { StorageComponent } from "./storage/widget.component"; @NgModule({ imports: [ @@ -57,10 +50,6 @@ import { StorageComponent } from './storage/widget.component'; DelayedSellToGridChartComponent, DelayedSellToGridChartOverviewComponent, DelayedSellToGridWidgetComponent, - FixDigitalOutputChartOverviewComponent, - FixDigitalOutputSingleChartComponent, - FixDigitalOutputTotalChartComponent, - FixDigitalOutputWidgetComponent, HeatingelementChartComponent, HeatingelementChartOverviewComponent, HeatingelementWidgetComponent, @@ -68,9 +57,6 @@ import { StorageComponent } from './storage/widget.component'; HeatPumpChartOverviewComponent, HeatpumpWidgetComponent, HistoryComponent, - SinglethresholdChartComponent, - SinglethresholdChartOverviewComponent, - SinglethresholdWidgetComponent, SocStorageChartComponent, StorageChargerChartComponent, StorageChartOverviewComponent, diff --git a/ui/src/app/edge/history/historydataservice.ts b/ui/src/app/edge/history/historydataservice.ts index bf64a942674..5abba259cc0 100644 --- a/ui/src/app/edge/history/historydataservice.ts +++ b/ui/src/app/edge/history/historydataservice.ts @@ -1,20 +1,22 @@ // @ts-strict-ignore import { Inject, Injectable } from "@angular/core"; +import { RefresherCustomEvent } from "@ionic/angular"; +import { ChartConstants } from "src/app/shared/components/chart/chart.constants"; +import { QueryHistoricTimeseriesEnergyRequest } from "src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest"; +import { Service } from "src/app/shared/service/service"; +import { Websocket } from "src/app/shared/service/websocket"; +import { DateUtils } from "src/app/shared/utils/date/dateutils"; import { DataService } from "../../shared/components/shared/dataservice"; import { QueryHistoricTimeseriesEnergyResponse } from "../../shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; import { ChannelAddress, Edge } from "../../shared/shared"; -import { DateUtils } from "src/app/shared/utils/date/dateutils"; -import { QueryHistoricTimeseriesEnergyRequest } from "src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest"; -import { Websocket } from "src/app/shared/service/websocket"; -import { Service } from "src/app/shared/service/service"; -import { RefresherCustomEvent } from "@ionic/angular"; @Injectable() export class HistoryDataService extends DataService { public queryChannelsTimeout: ReturnType | null = null; protected override timestamps: string[] = []; + private activeQueryData: string; private channelAddresses: { [sourceId: string]: ChannelAddress } = {}; constructor( @@ -36,21 +38,36 @@ export class HistoryDataService extends DataService { if (Object.entries(this.channelAddresses).length > 0) { this.service.historyPeriod.subscribe(date => { - edge.sendRequest(this.websocket, new QueryHistoricTimeseriesEnergyRequest(DateUtils.maxDate(date.from, edge?.firstSetupProtocol), date.to, Object.values(this.channelAddresses))) + + const request = new QueryHistoricTimeseriesEnergyRequest( + DateUtils.maxDate(date.from, edge?.firstSetupProtocol), + date.to, + Object.values(this.channelAddresses), + ); + + this.activeQueryData = request.id; + + edge.sendRequest(this.websocket, request) .then((response) => { - const allComponents = {}; - const result = (response as QueryHistoricTimeseriesEnergyResponse).result; - for (const [key, value] of Object.entries(result.data)) { - allComponents[key] = value; + if (this.activeQueryData === response.id) { + const allComponents = {}; + const result = (response as QueryHistoricTimeseriesEnergyResponse).result; + + for (const [key, value] of Object.entries(result.data)) { + allComponents[key] = value; + } + + this.currentValue.next({ allComponents: allComponents }); + this.timestamps = response.result["timestamps"] ?? []; } - this.currentValue.next({ allComponents: allComponents }); - this.timestamps = response.result['timestamps'] ?? []; - }).catch(err => console.warn(err)) + }) + .catch(err => console.warn(err)) .finally(() => { + this.queryChannelsTimeout = null; }); }); } - }, 100); + }, ChartConstants.REQUEST_TIMEOUT); } } diff --git a/ui/src/app/edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component.html b/ui/src/app/edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component.html index 25d95ace1ac..4c6ce917658 100644 --- a/ui/src/app/edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component.html +++ b/ui/src/app/edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component.html @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component.ts b/ui/src/app/edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component.ts index 3cb22de5eca..0cac1b4d2f5 100644 --- a/ui/src/app/edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component.ts +++ b/ui/src/app/edge/history/peakshaving/asymmetric/asymmetricpeakshavingchartoverview/asymmetricpeakshavingchartoverview.component.ts @@ -1,10 +1,10 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Edge, EdgeConfig, Service } from '../../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { Edge, EdgeConfig, Service } from "../../../../../shared/shared"; @Component({ selector: AsymmetricPeakshavingChartOverviewComponent.SELECTOR, - templateUrl: './asymmetricpeakshavingchartoverview.component.html', + templateUrl: "./asymmetricpeakshavingchartoverview.component.html", }) export class AsymmetricPeakshavingChartOverviewComponent implements OnInit { @@ -18,7 +18,7 @@ export class AsymmetricPeakshavingChartOverviewComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.edge = edge; diff --git a/ui/src/app/edge/history/peakshaving/asymmetric/chart.component.ts b/ui/src/app/edge/history/peakshaving/asymmetric/chart.component.ts index a3ace71ad44..d9b4b4ae008 100644 --- a/ui/src/app/edge/history/peakshaving/asymmetric/chart.component.ts +++ b/ui/src/app/edge/history/peakshaving/asymmetric/chart.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { YAxisTitle } from 'src/app/shared/service/utils'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { YAxisType } from "src/app/shared/service/utils"; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from '../../../../shared/shared'; -import { AbstractHistoryChart } from '../../abstracthistorychart'; +import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from "../../../../shared/shared"; +import { AbstractHistoryChart } from "../../abstracthistorychart"; @Component({ - selector: 'asymmetricpeakshavingchart', - templateUrl: '../../abstracthistorychart.html', + selector: "asymmetricpeakshavingchart", + templateUrl: "../../abstracthistorychart.html", }) export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -31,7 +31,6 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -48,11 +47,11 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im this.loading = true; this.colors = []; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - const meterIdActivePowerL1 = this.component.properties['meter.id'] + '/ActivePowerL1'; - const meterIdActivePowerL2 = this.component.properties['meter.id'] + '/ActivePowerL2'; - const meterIdActivePowerL3 = this.component.properties['meter.id'] + '/ActivePowerL3'; - const peakshavingPower = this.component.id + '/_PropertyPeakShavingPower'; - const rechargePower = this.component.id + '/_PropertyRechargePower'; + const meterIdActivePowerL1 = this.component.properties["meter.id"] + "/ActivePowerL1"; + const meterIdActivePowerL2 = this.component.properties["meter.id"] + "/ActivePowerL2"; + const meterIdActivePowerL3 = this.component.properties["meter.id"] + "/ActivePowerL3"; + const peakshavingPower = this.component.id + "/_PropertyPeakShavingPower"; + const rechargePower = this.component.id + "/_PropertyRechargePower"; const result = response.result; // convert labels const labels: Date[] = []; @@ -75,7 +74,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im } }); datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L1', + label: this.translate.instant("General.phase") + " " + "L1", data: data, hidden: false, }); @@ -92,7 +91,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im } }); datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L2', + label: this.translate.instant("General.phase") + " " + "L2", data: data, hidden: false, }); @@ -109,7 +108,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im } }); datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L3', + label: this.translate.instant("General.phase") + " " + "L3", data: data, hidden: false, }); @@ -126,14 +125,14 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im } }); datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.Peakshaving.rechargePower'), + label: this.translate.instant("Edge.Index.Widgets.Peakshaving.rechargePower"), data: data, hidden: false, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(0,223,0,1)", }); } if (peakshavingPower in result.data) { @@ -147,27 +146,27 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im } }); datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.Peakshaving.peakshavingPower'), + label: this.translate.instant("Edge.Index.Widgets.Peakshaving.peakshavingPower"), data: data, hidden: false, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(200,0,0,1)", }); } - if ('_sum/EssActivePower' in result.data) { + if ("_sum/EssActivePower" in result.data) { /* * Storage Charge */ let effectivePower; - if ('_sum/ProductionDcActualPower' in result.data && result.data['_sum/ProductionDcActualPower'].length > 0) { - effectivePower = result.data['_sum/ProductionDcActualPower'].map((value, index) => { - return Utils.subtractSafely(result.data['_sum/EssActivePower'][index], value); + if ("_sum/ProductionDcActualPower" in result.data && result.data["_sum/ProductionDcActualPower"].length > 0) { + effectivePower = result.data["_sum/ProductionDcActualPower"].map((value, index) => { + return Utils.subtractSafely(result.data["_sum/EssActivePower"][index], value); }); } else { - effectivePower = result.data['_sum/EssActivePower']; + effectivePower = result.data["_sum/EssActivePower"]; } const chargeData = effectivePower.map(value => { if (value == null) { @@ -179,12 +178,12 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im } }); datasets.push({ - label: this.translate.instant('General.chargePower'), + label: this.translate.instant("General.chargePower"), data: chargeData, }); this.colors.push({ - backgroundColor: 'rgba(0,223,0,0.05)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0.05)", + borderColor: "rgba(0,223,0,1)", }); /* * Storage Discharge @@ -199,12 +198,12 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im } }); datasets.push({ - label: this.translate.instant('General.dischargePower'), + label: this.translate.instant("General.dischargePower"), data: dischargeData, }); this.colors.push({ - backgroundColor: 'rgba(200,0,0,0.05)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(200,0,0,0.05)", + borderColor: "rgba(200,0,0,1)", }); } this.datasets = datasets; @@ -216,7 +215,7 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im this.initializeChart(); return; }).finally(async () => { - this.unit = YAxisTitle.ENERGY; + this.unit = YAxisType.ENERGY; await this.setOptions(this.options); this.stopSpinner(); }); @@ -225,13 +224,13 @@ export class AsymmetricPeakshavingChartComponent extends AbstractHistoryChart im protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const result: ChannelAddress[] = [ - new ChannelAddress(this.component.id, '_PropertyPeakShavingPower'), - new ChannelAddress(this.component.id, '_PropertyRechargePower'), - new ChannelAddress(this.component.properties['meter.id'], 'ActivePowerL1'), - new ChannelAddress(this.component.properties['meter.id'], 'ActivePowerL2'), - new ChannelAddress(this.component.properties['meter.id'], 'ActivePowerL3'), - new ChannelAddress('_sum', 'ProductionDcActualPower'), - new ChannelAddress('_sum', 'EssActivePower'), + new ChannelAddress(this.component.id, "_PropertyPeakShavingPower"), + new ChannelAddress(this.component.id, "_PropertyRechargePower"), + new ChannelAddress(this.component.properties["meter.id"], "ActivePowerL1"), + new ChannelAddress(this.component.properties["meter.id"], "ActivePowerL2"), + new ChannelAddress(this.component.properties["meter.id"], "ActivePowerL3"), + new ChannelAddress("_sum", "ProductionDcActualPower"), + new ChannelAddress("_sum", "EssActivePower"), ]; resolve(result); }); diff --git a/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.html b/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.html index a2459516627..89e8082f29d 100644 --- a/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.html +++ b/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.html @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.ts b/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.ts index 85a4b2581e2..1d58538f990 100644 --- a/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.ts +++ b/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.ts @@ -1,11 +1,11 @@ -import { ActivatedRoute } from '@angular/router'; -import { Component, Input, OnInit } from '@angular/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { Edge, Service, EdgeConfig } from 'src/app/shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { Edge, EdgeConfig, Service } from "src/app/shared/shared"; @Component({ selector: AsymmetricPeakshavingWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', + templateUrl: "./widget.component.html", }) export class AsymmetricPeakshavingWidgetComponent implements OnInit { @@ -13,7 +13,6 @@ export class AsymmetricPeakshavingWidgetComponent implements OnInit { @Input({ required: true }) public period!: DefaultTypes.HistoryPeriod; @Input({ required: true }) public componentId!: string; - public edge: Edge | null = null; public component: EdgeConfig.Component | null = null; @@ -23,7 +22,7 @@ export class AsymmetricPeakshavingWidgetComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.service.getConfig().then(config => { this.component = config.getComponent(this.componentId); diff --git a/ui/src/app/edge/history/peakshaving/symmetric/chart.component.ts b/ui/src/app/edge/history/peakshaving/symmetric/chart.component.ts index 4d9de7b5dec..4c9d97e725f 100644 --- a/ui/src/app/edge/history/peakshaving/symmetric/chart.component.ts +++ b/ui/src/app/edge/history/peakshaving/symmetric/chart.component.ts @@ -1,15 +1,15 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from '../../../../shared/shared'; -import { AbstractHistoryChart } from '../../abstracthistorychart'; +import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from "../../../../shared/shared"; +import { AbstractHistoryChart } from "../../abstracthistorychart"; @Component({ - selector: 'symmetricpeakshavingchart', - templateUrl: '../../abstracthistorychart.html', + selector: "symmetricpeakshavingchart", + templateUrl: "../../abstracthistorychart.html", }) export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -30,7 +30,6 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -48,9 +47,9 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp this.colors = []; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getConfig().then(config => { - const meterIdActivePower = config.getComponent(this.componentId).properties['meter.id'] + '/ActivePower'; - const peakshavingPower = this.componentId + '/_PropertyPeakShavingPower'; - const rechargePower = this.componentId + '/_PropertyRechargePower'; + const meterIdActivePower = config.getComponent(this.componentId).properties["meter.id"] + "/ActivePower"; + const peakshavingPower = this.componentId + "/_PropertyPeakShavingPower"; + const rechargePower = this.componentId + "/_PropertyRechargePower"; const result = response.result; // convert labels const labels: Date[] = []; @@ -73,13 +72,13 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp } }); datasets.push({ - label: this.translate.instant('General.measuredValue'), + label: this.translate.instant("General.measuredValue"), data: data, hidden: false, }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0.05)', - borderColor: 'rgba(0,0,0,1)', + backgroundColor: "rgba(0,0,0,0.05)", + borderColor: "rgba(0,0,0,1)", }); } if (rechargePower in result.data) { @@ -93,14 +92,14 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp } }); datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.Peakshaving.rechargePower'), + label: this.translate.instant("Edge.Index.Widgets.Peakshaving.rechargePower"), data: data, hidden: false, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(0,223,0,1)", }); } if (peakshavingPower in result.data) { @@ -114,27 +113,27 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp } }); datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.Peakshaving.peakshavingPower'), + label: this.translate.instant("Edge.Index.Widgets.Peakshaving.peakshavingPower"), data: data, hidden: false, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(200,0,0,1)", }); } - if ('_sum/EssActivePower' in result.data) { + if ("_sum/EssActivePower" in result.data) { /* * Storage Charge */ let effectivePower; - if ('_sum/ProductionDcActualPower' in result.data && result.data['_sum/ProductionDcActualPower'].length > 0) { - effectivePower = result.data['_sum/ProductionDcActualPower'].map((value, index) => { - return Utils.subtractSafely(result.data['_sum/EssActivePower'][index], value); + if ("_sum/ProductionDcActualPower" in result.data && result.data["_sum/ProductionDcActualPower"].length > 0) { + effectivePower = result.data["_sum/ProductionDcActualPower"].map((value, index) => { + return Utils.subtractSafely(result.data["_sum/EssActivePower"][index], value); }); } else { - effectivePower = result.data['_sum/EssActivePower']; + effectivePower = result.data["_sum/EssActivePower"]; } const chargeData = effectivePower.map(value => { if (value == null) { @@ -146,13 +145,13 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp } }); datasets.push({ - label: this.translate.instant('General.chargePower'), + label: this.translate.instant("General.chargePower"), data: chargeData, borderDash: [10, 10], }); this.colors.push({ - backgroundColor: 'rgba(0,223,0,0.05)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0.05)", + borderColor: "rgba(0,223,0,1)", }); /* * Storage Discharge @@ -167,13 +166,13 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp } }); datasets.push({ - label: this.translate.instant('General.dischargePower'), + label: this.translate.instant("General.dischargePower"), data: dischargeData, borderDash: [10, 10], }); this.colors.push({ - backgroundColor: 'rgba(200,0,0,0.05)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(200,0,0,0.05)", + borderColor: "rgba(200,0,0,1)", }); } this.datasets = datasets; @@ -198,11 +197,11 @@ export class SymmetricPeakshavingChartComponent extends AbstractHistoryChart imp protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const result: ChannelAddress[] = [ - new ChannelAddress(this.componentId, '_PropertyRechargePower'), - new ChannelAddress(this.componentId, '_PropertyPeakShavingPower'), - new ChannelAddress(config.getComponent(this.componentId).properties['meter.id'], 'ActivePower'), - new ChannelAddress('_sum', 'ProductionDcActualPower'), - new ChannelAddress('_sum', 'EssActivePower'), + new ChannelAddress(this.componentId, "_PropertyRechargePower"), + new ChannelAddress(this.componentId, "_PropertyPeakShavingPower"), + new ChannelAddress(config.getComponent(this.componentId).properties["meter.id"], "ActivePower"), + new ChannelAddress("_sum", "ProductionDcActualPower"), + new ChannelAddress("_sum", "EssActivePower"), ]; resolve(result); }); diff --git a/ui/src/app/edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component.html b/ui/src/app/edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component.html index 86c26ef7e42..278617c5783 100644 --- a/ui/src/app/edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component.html +++ b/ui/src/app/edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component.html @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component.ts b/ui/src/app/edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component.ts index 8e578e2b5fa..5734f7485cc 100644 --- a/ui/src/app/edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component.ts +++ b/ui/src/app/edge/history/peakshaving/symmetric/symmetricpeakshavingchartoverview/symmetricpeakshavingchartoverview.component.ts @@ -1,10 +1,10 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Edge, EdgeConfig, Service } from '../../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { Edge, EdgeConfig, Service } from "../../../../../shared/shared"; @Component({ selector: SymmetricPeakshavingChartOverviewComponent.SELECTOR, - templateUrl: './symmetricpeakshavingchartoverview.component.html', + templateUrl: "./symmetricpeakshavingchartoverview.component.html", }) export class SymmetricPeakshavingChartOverviewComponent implements OnInit { @@ -19,7 +19,7 @@ export class SymmetricPeakshavingChartOverviewComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.edge = edge; this.component = config.getComponent(this.route.snapshot.params.componentId); diff --git a/ui/src/app/edge/history/peakshaving/symmetric/widget.component.html b/ui/src/app/edge/history/peakshaving/symmetric/widget.component.html index 23e49ec1b9f..dbf3842991d 100644 --- a/ui/src/app/edge/history/peakshaving/symmetric/widget.component.html +++ b/ui/src/app/edge/history/peakshaving/symmetric/widget.component.html @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/peakshaving/symmetric/widget.component.ts b/ui/src/app/edge/history/peakshaving/symmetric/widget.component.ts index 0ae228ca9f5..62f86d76e86 100644 --- a/ui/src/app/edge/history/peakshaving/symmetric/widget.component.ts +++ b/ui/src/app/edge/history/peakshaving/symmetric/widget.component.ts @@ -1,11 +1,11 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { Edge, EdgeConfig, Service } from 'src/app/shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { Edge, EdgeConfig, Service } from "src/app/shared/shared"; @Component({ selector: SymmetricPeakshavingWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', + templateUrl: "./widget.component.html", }) export class SymmetricPeakshavingWidgetComponent implements OnInit { @@ -13,7 +13,6 @@ export class SymmetricPeakshavingWidgetComponent implements OnInit { @Input({ required: true }) public period!: DefaultTypes.HistoryPeriod; @Input({ required: true }) public componentId!: string; - public edge: Edge | null = null; public component: EdgeConfig.Component | null = null; @@ -23,7 +22,7 @@ export class SymmetricPeakshavingWidgetComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.service.getConfig().then(config => { this.component = config.getComponent(this.componentId); diff --git a/ui/src/app/edge/history/peakshaving/timeslot/chart.component.ts b/ui/src/app/edge/history/peakshaving/timeslot/chart.component.ts index 379d9d33986..4a62f084032 100644 --- a/ui/src/app/edge/history/peakshaving/timeslot/chart.component.ts +++ b/ui/src/app/edge/history/peakshaving/timeslot/chart.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { YAxisTitle } from 'src/app/shared/service/utils'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { YAxisType } from "src/app/shared/service/utils"; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from '../../../../shared/shared'; -import { AbstractHistoryChart } from '../../abstracthistorychart'; +import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from "../../../../shared/shared"; +import { AbstractHistoryChart } from "../../abstracthistorychart"; @Component({ - selector: 'timeslotpeakshavingchart', - templateUrl: '../../abstracthistorychart.html', + selector: "timeslotpeakshavingchart", + templateUrl: "../../abstracthistorychart.html", }) export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -31,7 +31,6 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -49,10 +48,10 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl this.colors = []; this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { this.service.getConfig().then(config => { - const meterIdActivePower = config.getComponent(this.componentId).properties['meter.id'] + '/ActivePower'; - const peakshavingPower = this.componentId + '/_PropertyPeakShavingPower'; - const rechargePower = this.componentId + '/_PropertyRechargePower'; - const stateMachine = this.componentId + '/StateMachine'; + const meterIdActivePower = config.getComponent(this.componentId).properties["meter.id"] + "/ActivePower"; + const peakshavingPower = this.componentId + "/_PropertyPeakShavingPower"; + const rechargePower = this.componentId + "/_PropertyRechargePower"; + const stateMachine = this.componentId + "/StateMachine"; const result = response.result; @@ -87,13 +86,13 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl } }); datasets.push({ - label: this.translate.instant('General.measuredValue'), + label: this.translate.instant("General.measuredValue"), data: data, hidden: false, }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0.05)', - borderColor: 'rgba(0,0,0,1)', + backgroundColor: "rgba(0,0,0,0.05)", + borderColor: "rgba(0,0,0,1)", }); } if (rechargePower in result.data) { @@ -107,14 +106,14 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl } }); datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.Peakshaving.rechargePower'), + label: this.translate.instant("Edge.Index.Widgets.Peakshaving.rechargePower"), data: data, hidden: false, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(0,223,0,1)", }); } if (peakshavingPower in result.data) { @@ -128,27 +127,27 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl } }); datasets.push({ - label: this.translate.instant('Edge.Index.Widgets.Peakshaving.peakshavingPower'), + label: this.translate.instant("Edge.Index.Widgets.Peakshaving.peakshavingPower"), data: data, hidden: false, borderDash: [3, 3], }); this.colors.push({ - backgroundColor: 'rgba(0,0,0,0)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(0,0,0,0)", + borderColor: "rgba(200,0,0,1)", }); } - if ('_sum/EssActivePower' in result.data) { + if ("_sum/EssActivePower" in result.data) { /* * Storage Charge */ let effectivePower; - if ('_sum/ProductionDcActualPower' in result.data && result.data['_sum/ProductionDcActualPower'].length > 0) { - effectivePower = result.data['_sum/ProductionDcActualPower'].map((value, index) => { - return Utils.subtractSafely(result.data['_sum/EssActivePower'][index], value); + if ("_sum/ProductionDcActualPower" in result.data && result.data["_sum/ProductionDcActualPower"].length > 0) { + effectivePower = result.data["_sum/ProductionDcActualPower"].map((value, index) => { + return Utils.subtractSafely(result.data["_sum/EssActivePower"][index], value); }); } else { - effectivePower = result.data['_sum/EssActivePower']; + effectivePower = result.data["_sum/EssActivePower"]; } const chargeData = effectivePower.map(value => { if (value == null) { @@ -160,13 +159,13 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl } }); datasets.push({ - label: this.translate.instant('General.chargePower'), + label: this.translate.instant("General.chargePower"), data: chargeData, borderDash: [10, 10], }); this.colors.push({ - backgroundColor: 'rgba(0,223,0,0.05)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0.05)", + borderColor: "rgba(0,223,0,1)", }); /* * Storage Discharge @@ -181,13 +180,13 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl } }); datasets.push({ - label: this.translate.instant('General.dischargePower'), + label: this.translate.instant("General.dischargePower"), data: dischargeData, borderDash: [10, 10], }); this.colors.push({ - backgroundColor: 'rgba(200,0,0,0.05)', - borderColor: 'rgba(200,0,0,1)', + backgroundColor: "rgba(200,0,0,0.05)", + borderColor: "rgba(200,0,0,1)", }); } this.datasets = datasets; @@ -205,7 +204,7 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl this.initializeChart(); return; }).finally(async () => { - this.unit = YAxisTitle.ENERGY; + this.unit = YAxisType.ENERGY; await this.setOptions(this.options); }); } @@ -213,12 +212,12 @@ export class TimeslotPeakshavingChartComponent extends AbstractHistoryChart impl protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const result: ChannelAddress[] = [ - new ChannelAddress(this.componentId, '_PropertyRechargePower'), - new ChannelAddress(this.componentId, '_PropertyPeakShavingPower'), - new ChannelAddress(this.componentId, 'StateMachine'), - new ChannelAddress(config.getComponent(this.componentId).properties['meter.id'], 'ActivePower'), - new ChannelAddress('_sum', 'ProductionDcActualPower'), - new ChannelAddress('_sum', 'EssActivePower'), + new ChannelAddress(this.componentId, "_PropertyRechargePower"), + new ChannelAddress(this.componentId, "_PropertyPeakShavingPower"), + new ChannelAddress(this.componentId, "StateMachine"), + new ChannelAddress(config.getComponent(this.componentId).properties["meter.id"], "ActivePower"), + new ChannelAddress("_sum", "ProductionDcActualPower"), + new ChannelAddress("_sum", "EssActivePower"), ]; resolve(result); }); diff --git a/ui/src/app/edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component.html b/ui/src/app/edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component.html index 3d253a4ca80..61e67f32806 100644 --- a/ui/src/app/edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component.html +++ b/ui/src/app/edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component.html @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component.ts b/ui/src/app/edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component.ts index 9c83adacd26..c8c2ed8e7f3 100644 --- a/ui/src/app/edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component.ts +++ b/ui/src/app/edge/history/peakshaving/timeslot/timeslotpeakshavingchartoverview/timeslotpeakshavingchartoverview.component.ts @@ -1,10 +1,10 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Edge, EdgeConfig, Service } from '../../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { Edge, EdgeConfig, Service } from "../../../../../shared/shared"; @Component({ selector: TimeslotPeakshavingChartOverviewComponent.SELECTOR, - templateUrl: './timeslotpeakshavingchartoverview.component.html', + templateUrl: "./timeslotpeakshavingchartoverview.component.html", }) export class TimeslotPeakshavingChartOverviewComponent implements OnInit { @@ -19,7 +19,7 @@ export class TimeslotPeakshavingChartOverviewComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.edge = edge; this.component = config.getComponent(this.route.snapshot.params.componentId); diff --git a/ui/src/app/edge/history/peakshaving/timeslot/widget.component.html b/ui/src/app/edge/history/peakshaving/timeslot/widget.component.html index ea2fdd0d94a..912f7c07fc5 100644 --- a/ui/src/app/edge/history/peakshaving/timeslot/widget.component.html +++ b/ui/src/app/edge/history/peakshaving/timeslot/widget.component.html @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/peakshaving/timeslot/widget.component.ts b/ui/src/app/edge/history/peakshaving/timeslot/widget.component.ts index 6903d838553..7b23394df53 100644 --- a/ui/src/app/edge/history/peakshaving/timeslot/widget.component.ts +++ b/ui/src/app/edge/history/peakshaving/timeslot/widget.component.ts @@ -1,11 +1,11 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { Edge, EdgeConfig, Service } from 'src/app/shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { Edge, EdgeConfig, Service } from "src/app/shared/shared"; @Component({ selector: TimeslotPeakshavingWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', + templateUrl: "./widget.component.html", }) export class TimeslotPeakshavingWidgetComponent implements OnInit { @@ -13,7 +13,6 @@ export class TimeslotPeakshavingWidgetComponent implements OnInit { @Input({ required: true }) public period!: DefaultTypes.HistoryPeriod; @Input({ required: true }) public componentId!: string; - public edge: Edge | null = null; public component: EdgeConfig.Component | null = null; @@ -23,7 +22,7 @@ export class TimeslotPeakshavingWidgetComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.service.getConfig().then(config => { this.component = config.getComponent(this.componentId); diff --git a/ui/src/app/edge/history/shared.ts b/ui/src/app/edge/history/shared.ts index 8ff93006ca0..ac05ac3b66f 100644 --- a/ui/src/app/edge/history/shared.ts +++ b/ui/src/app/edge/history/shared.ts @@ -1,10 +1,10 @@ // @ts-strict-ignore -import * as Chart from 'chart.js'; -import { differenceInDays, differenceInMinutes, startOfDay } from 'date-fns'; -import { de } from 'date-fns/locale'; -import { QueryHistoricTimeseriesDataResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { ChannelAddress, Service } from 'src/app/shared/shared'; -import { DateUtils } from 'src/app/shared/utils/date/dateutils'; +import * as Chart from "chart.js"; +import { differenceInDays, differenceInMinutes, startOfDay } from "date-fns"; +import { de } from "date-fns/locale"; +import { QueryHistoricTimeseriesDataResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse"; +import { ChannelAddress, Service } from "src/app/shared/shared"; +import { DateUtils } from "src/app/shared/utils/date/dateutils"; export interface Dataset { label: string; @@ -146,7 +146,7 @@ export type ChartOptions = { legendCallback?(chart: Chart.Chart): string }; -export const DEFAULT_TIME_CHART_OPTIONS: Chart.ChartOptions = { +export const DEFAULT_TIME_CHART_OPTIONS = (): Chart.ChartOptions => ({ responsive: true, maintainAspectRatio: false, elements: { @@ -168,22 +168,25 @@ export const DEFAULT_TIME_CHART_OPTIONS: Chart.ChartOptions = { annotation: { annotations: [], }, + datalabels: { + display: false, + }, colors: { enabled: false, }, legend: { display: true, - position: 'bottom', + position: "bottom", labels: { - color: getComputedStyle(document.documentElement).getPropertyValue('--ion-color-primary'), + color: getComputedStyle(document.documentElement).getPropertyValue("--ion-color-primary"), generateLabels: (chart: Chart.Chart) => { return null; }, }, onClick: (event, legendItem, legend) => { }, }, tooltip: { intersect: false, - mode: 'index', + mode: "index", filter: function (item, data, test, some) { const value = item.dataset.data[item.dataIndex] as number; return !isNaN(value) && value !== null; @@ -200,10 +203,10 @@ export const DEFAULT_TIME_CHART_OPTIONS: Chart.ChartOptions = { x: { stacked: true, offset: false, - type: 'time', + type: "time", ticks: { }, - bounds: 'data', + bounds: "data", adapters: { date: { @@ -213,23 +216,23 @@ export const DEFAULT_TIME_CHART_OPTIONS: Chart.ChartOptions = { }, time: { // parser: 'MM/DD/YYYY HH:mm', - unit: 'hour', + unit: "hour", displayFormats: { - datetime: 'yyyy-MM-dd HH:mm:ss', - millisecond: 'SSS [ms]', - second: 'HH:mm:ss a', // 17:20:01 - minute: 'HH:mm', // 17:20 - hour: 'HH:00', // 17:20 - day: 'dd', // Sep 04 2015 - week: 'll', // Week 46, or maybe "[W]WW - YYYY" ? - month: 'MM', // September - quarter: '[Q]Q - YYYY', // Q3 - 2015 - year: 'yyyy', // 2015, + datetime: "yyyy-MM-dd HH:mm:ss", + millisecond: "SSS [ms]", + second: "HH:mm:ss a", // 17:20:01 + minute: "HH:mm", // 17:20 + hour: "HH:00", // 17:20 + day: "dd", // Sep 04 2015 + week: "ll", // Week 46, or maybe "[W]WW - YYYY" ? + month: "MM", // September + quarter: "[Q]Q - YYYY", // Q3 - 2015 + year: "yyyy", // 2015, }, }, }, }, -}; +}); export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions = { plugins: { @@ -241,7 +244,7 @@ export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions maintainAspectRatio: false, legend: { labels: {}, - position: 'bottom', + position: "bottom", }, elements: { point: { @@ -258,7 +261,7 @@ export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions }, }, hover: { - mode: 'point', + mode: "point", intersect: true, }, scales: { @@ -266,27 +269,27 @@ export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions xAxes: [{ ticks: {}, stacked: false, - type: 'time', + type: "time", time: { - minUnit: 'hour', + minUnit: "hour", displayFormats: { - millisecond: 'SSS [ms]', - second: 'HH:mm:ss a', // 17:20:01 - minute: 'HH:mm', // 17:20 - hour: 'HH:[00]', // 17:20 - day: 'DD', // Sep 04 2015 - week: 'll', // Week 46, or maybe "[W]WW - YYYY" ? - month: 'MM', // September - quarter: '[Q]Q - YYYY', // Q3 - 2015 - year: 'YYYY', // 2015, + millisecond: "SSS [ms]", + second: "HH:mm:ss a", // 17:20:01 + minute: "HH:mm", // 17:20 + hour: "HH:[00]", // 17:20 + day: "DD", // Sep 04 2015 + week: "ll", // Week 46, or maybe "[W]WW - YYYY" ? + month: "MM", // September + quarter: "[Q]Q - YYYY", // Q3 - 2015 + year: "YYYY", // 2015, }, }, }], }, tooltips: { - mode: 'index', + mode: "index", intersect: false, - axis: 'x', + axis: "x", callbacks: { title(tooltipItems: Chart.TooltipItem[], data: Data): string { const date = DateUtils.stringToDate(tooltipItems[0]?.label); @@ -296,7 +299,7 @@ export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions }, }; -export function calculateActiveTimeOverPeriod(channel: ChannelAddress, queryResult: QueryHistoricTimeseriesDataResponse['result']) { +export function calculateActiveTimeOverPeriod(channel: ChannelAddress, queryResult: QueryHistoricTimeseriesDataResponse["result"]) { const startDate = startOfDay(new Date(queryResult.timestamps[0])); const endDate = new Date(queryResult.timestamps[queryResult.timestamps.length - 1]); let activeSum = 0; @@ -316,61 +319,61 @@ export function calculateActiveTimeOverPeriod(channel: ChannelAddress, queryResu * @param toDate the To-Date * @returns resolution and timeformat */ -export function calculateResolution(service: Service, fromDate: Date, toDate: Date): { resolution: Resolution, timeFormat: 'day' | 'month' | 'hour' | 'year' } { +export function calculateResolution(service: Service, fromDate: Date, toDate: Date): { resolution: Resolution, timeFormat: "day" | "month" | "hour" | "year" } { const days = Math.abs(differenceInDays(toDate, fromDate)); - let result: { resolution: Resolution, timeFormat: 'day' | 'month' | 'hour' | 'year' }; + let result: { resolution: Resolution, timeFormat: "day" | "month" | "hour" | "year" }; if (days <= 1) { if (service.isSmartphoneResolution) { - result = { resolution: { value: 15, unit: ChronoUnit.Type.MINUTES }, timeFormat: 'hour' }; // 1 Day + result = { resolution: { value: 15, unit: ChronoUnit.Type.MINUTES }, timeFormat: "hour" }; // 1 Day } else { - result = { resolution: { value: 5, unit: ChronoUnit.Type.MINUTES }, timeFormat: 'hour' }; // 5 Minutes + result = { resolution: { value: 5, unit: ChronoUnit.Type.MINUTES }, timeFormat: "hour" }; // 5 Minutes } } else if (days == 2) { if (service.isSmartphoneResolution) { - result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'hour' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: "hour" }; // 1 Day } else { - result = { resolution: { value: 10, unit: ChronoUnit.Type.MINUTES }, timeFormat: 'hour' }; // 1 Hour + result = { resolution: { value: 10, unit: ChronoUnit.Type.MINUTES }, timeFormat: "hour" }; // 1 Hour } } else if (days <= 4) { if (service.isSmartphoneResolution) { - result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: "day" }; // 1 Day } else { - result = { resolution: { value: 1, unit: ChronoUnit.Type.HOURS }, timeFormat: 'hour' }; // 1 Hour + result = { resolution: { value: 1, unit: ChronoUnit.Type.HOURS }, timeFormat: "hour" }; // 1 Hour } } else if (days <= 6) { if (service.isSmartphoneResolution) { - result = { resolution: { value: 8, unit: ChronoUnit.Type.HOURS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 8, unit: ChronoUnit.Type.HOURS }, timeFormat: "day" }; // 1 Day } else { // >> show Hours - result = { resolution: { value: 1, unit: ChronoUnit.Type.HOURS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.HOURS }, timeFormat: "day" }; // 1 Day } } else if (days <= 31 && service.isSmartphoneResolution) { // Smartphone-View: show 31 days in daily view - result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: "day" }; // 1 Day } else if (days <= 90) { - result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: "day" }; // 1 Day } else if (days <= 144) { // >> show Days if (service.isSmartphoneResolution == true) { - result = { resolution: { value: 1, unit: ChronoUnit.Type.MONTHS }, timeFormat: 'month' }; // 1 Month + result = { resolution: { value: 1, unit: ChronoUnit.Type.MONTHS }, timeFormat: "month" }; // 1 Month } else { - result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: 'day' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.DAYS }, timeFormat: "day" }; // 1 Day } } else if (days <= 365) { - result = { resolution: { value: 1, unit: ChronoUnit.Type.MONTHS }, timeFormat: 'month' }; // 1 Day + result = { resolution: { value: 1, unit: ChronoUnit.Type.MONTHS }, timeFormat: "month" }; // 1 Day } else { // >> show Years - result = { resolution: { value: 1, unit: ChronoUnit.Type.YEARS }, timeFormat: 'year' }; // 1 Month + result = { resolution: { value: 1, unit: ChronoUnit.Type.YEARS }, timeFormat: "year" }; // 1 Month } return result; @@ -391,7 +394,7 @@ export function isLabelVisible(label: string, orElse?: boolean): boolean { if (orElse != null && value == null) { return orElse; } else { - return value !== 'false'; + return value !== "false"; } } @@ -406,7 +409,7 @@ export function setLabelVisible(label: string, visible: boolean | null): void { return; } const labelWithoutUnit = "LABEL_" + label.split(":")[0]; - sessionStorage.setItem(labelWithoutUnit, visible ? 'true' : 'false'); + sessionStorage.setItem(labelWithoutUnit, visible ? "true" : "false"); } export type Resolution = { @@ -457,7 +460,7 @@ export type ChartData = { }[], tooltip: { /** Unit to be displayed as Tooltips unit */ - unit: '%' | 'kWh' | 'kW', + unit: "%" | "kWh" | "kW", /** Format of Number displayed */ formatNumber: string; }, @@ -465,3 +468,70 @@ export type ChartData = { yAxisTitle: string, }; +export const DEFAULT_NUMBER_CHART_OPTIONS = (labels: (Date | string)[]): Chart.ChartOptions => ({ + responsive: true, + maintainAspectRatio: false, + elements: { + point: { + radius: 0, + hitRadius: 0, + hoverRadius: 0, + }, + line: { + stepped: false, + fill: true, + }, + }, + datasets: { + bar: {}, + line: {}, + }, + plugins: { + colors: { + enabled: false, + }, + legend: { + display: true, + + position: "bottom", + labels: { + color: getComputedStyle(document.documentElement).getPropertyValue("--ion-color-primary"), + generateLabels: (chart: Chart.Chart) => { return null; }, + }, + onClick: (event, legendItem, legend) => { }, + }, + tooltip: { + intersect: false, + mode: "index", + filter: function (item, data, test, some) { + const value = item.dataset.data[item.dataIndex] as number; + return !isNaN(value) && value !== null; + }, + callbacks: { + label: (item: Chart.TooltipItem) => { }, + title: (tooltipItems: Chart.TooltipItem[]) => { }, + afterTitle: (items: Chart.TooltipItem[]) => { }, + labelColor: (context: Chart.TooltipItem) => { }, + }, + }, + datalabels: {}, + }, + scales: { + x: { + stacked: true, + offset: false, + type: "category", + ticks: { + autoSkip: true, + callback: function (value, index, ticks) { + if (index >= labels.length) { + return ""; + } + + return labels[index].toString(); + }, + }, + bounds: "data", + }, + }, +}); diff --git a/ui/src/app/edge/history/singlethreshold/chart.component.ts b/ui/src/app/edge/history/singlethreshold/chart.component.ts deleted file mode 100644 index 3165adec062..00000000000 --- a/ui/src/app/edge/history/singlethreshold/chart.component.ts +++ /dev/null @@ -1,276 +0,0 @@ -// @ts-strict-ignore -import { formatNumber } from '@angular/common'; -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChartAxis, YAxisTitle } from 'src/app/shared/service/utils'; - -import { QueryHistoricTimeseriesDataResponse } from '../../../shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; - -@Component({ - selector: 'singlethresholdChart', - templateUrl: '../abstracthistorychart.html', -}) -export class SinglethresholdChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { - - @Input({ required: true }) public period!: DefaultTypes.HistoryPeriod; - @Input({ required: true }) public componentId!: string; - @Input({ required: true }) public inputChannelUnit!: string; - - constructor( - protected override service: Service, - protected override translate: TranslateService, - private route: ActivatedRoute, - ) { - super("singlethreshold-chart", service, translate); - } - - ngOnInit() { - this.startSpinner(); - this.service.setCurrentComponent('', this.route); - } - - ngOnDestroy() { - this.unsubscribeChartRefresh(); - } - - ngOnChanges() { - this.updateChart(); - } - - public getChartHeight(): number { - return window.innerHeight / 1.3; - } - - protected updateChart() { - this.autoSubscribeChartRefresh(); - this.startSpinner(); - this.colors = []; - this.loading = true; - - this.queryHistoricTimeseriesData(this.period.from, this.period.to).then(response => { - this.service.getConfig().then(config => { - const outputChannel: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; - const inputChannel = config.getComponentProperties(this.componentId)['inputChannelAddress']; - const result = (response as QueryHistoricTimeseriesDataResponse).result; - let yAxisID; - - // set yAxis for % values (if there are no other % values: use left yAxis, if there are: use right yAxis - for percent values) - if (result.data["_sum/EssSoc"]) { - yAxisID = "yAxis1"; - } else { - yAxisID = "yAxis2"; - } - - // convert labels - const labels: Date[] = []; - for (const timestamp of result.timestamps) { - labels.push(new Date(timestamp)); - } - this.labels = labels; - const datasets = []; - - // convert datasets - for (const channel in result.data) { - if ((typeof outputChannel === 'string' && channel == outputChannel) - || (typeof outputChannel !== 'string' && outputChannel.includes(channel))) { - const address = ChannelAddress.fromString(channel); - const data = result.data[channel].map(value => { - if (value == null) { - return null; - } else { - return value * 100; // convert to % [0,100] - } - }); - datasets.push({ - label: address.channelId, - data: data, - hidden: false, - yAxisID: yAxisID, - position: 'right', - }); - this.colors.push({ - backgroundColor: 'rgba(0,191,255,0.05)', - borderColor: 'rgba(0,191,255,1)', - }); - } - if (channel == inputChannel) { - let inputLabel: string | null = null; - const address = ChannelAddress.fromString(channel); - switch (address.channelId) { - case 'GridActivePower': - inputLabel = this.translate.instant('General.grid'); - break; - case 'ProductionActivePower': - inputLabel = this.translate.instant('General.production'); - break; - case 'EssSoc': - inputLabel = this.translate.instant('General.soc'); - break; - default: - inputLabel = this.translate.instant('Edge.Index.Widgets.Singlethreshold.other'); - break; - } - let data; - if (address.channelId == 'EssSoc') { - data = result.data[channel].map(value => { - if (value == null) { - return null; - } else if (value > 100 || value < 0) { - return null; - } else { - return value; - } - }); - } else if (address.channelId == 'ProductionActivePower' || address.channelId == 'GridActivePower') { - data = result.data[channel].map(value => { - if (value == null) { - return null; - } else { - return value / 1000; // convert to kW - } - }); - } else { - data = result.data[channel].map(value => { - if (value == null) { - return null; - } else { - return value; - } - }); - } - if (address.channelId == 'EssSoc') { - datasets.push({ - label: inputLabel, - data: data, - hidden: false, - yAxisID: yAxisID, - position: 'right', - unit: YAxisTitle.PERCENTAGE, - }); - - this.colors.push({ - backgroundColor: 'rgba(189, 195, 199,0.05)', - borderColor: 'rgba(189, 195, 199,1)', - }); - } else { - datasets.push({ - label: inputLabel, - data: data, - hidden: false, - yAxisID: 'yAxis1', - position: 'left', - }); - - this.colors.push({ - backgroundColor: 'rgba(0,0,0,0.05)', - borderColor: 'rgba(0,0,0,1)', - }); - } - } - } - this.datasets = datasets; - this.loading = false; - this.stopSpinner(); - - }).catch(reason => { - console.error(reason); // TODO error message - this.initializeChart(); - return; - }).finally(async () => { - this.unit = YAxisTitle.PERCENTAGE; - await this.setOptions(this.options); - this.addControllerSpecificOptions(this.options); - }); - }).catch(reason => { - console.error(reason); // TODO error message - this.initializeChart(); - return; - }); - } - - protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { - return new Promise((resolve) => { - const inputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['inputChannelAddress']); - const result: ChannelAddress[] = [inputChannel]; - const outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; - if (typeof outputChannelAddress === 'string') { - result.push(ChannelAddress.fromString(outputChannelAddress)); - } else { - outputChannelAddress.forEach(c => result.push(ChannelAddress.fromString(c))); - } - resolve(result); - }); - } - - protected setLabel(config: EdgeConfig) { - this.options = this.createDefaultChartOptions(); - } - - protected addControllerSpecificOptions(options: Chart.ChartOptions) { - - this.service.getConfig().then(config => { - - const inputChannel = ChannelAddress.fromString(config.getComponentProperties(this.componentId)['inputChannelAddress']); - const outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; - let outputChannel: ChannelAddress; - if (typeof outputChannelAddress === 'string') { - outputChannel = ChannelAddress.fromString(outputChannelAddress); - } else { - outputChannel = ChannelAddress.fromString(outputChannelAddress[0]); - } - - let labelString; - - if (inputChannel.channelId == 'EssSoc') { - labelString = '%'; - this.unit = YAxisTitle.PERCENTAGE; - options.scales[ChartAxis.LEFT]['title'].text = labelString; - } else if (inputChannel.channelId == 'GridActivePower' || inputChannel.channelId == 'ProductionActivePower') { - labelString = 'kW'; - this.unit = YAxisTitle.ENERGY; - options.scales[ChartAxis.LEFT]['title'].text = labelString; - } else { - labelString = this.inputChannelUnit; - options.scales[ChartAxis.LEFT]['title'].text = labelString; - } - - if (inputChannel.channelId != 'EssSoc') { - // adds second y-axis to chart - options.scales[ChartAxis.RIGHT] = { - max: 100, - position: 'right', - title: { - text: '%', - display: true, - }, - ticks: { - padding: -5, - stepSize: 20, - }, - }; - } - - const translate = this.translate; - options.plugins.tooltip.callbacks.label = function (item: Chart.TooltipItem) { - const label = item.dataset.label; - const value = item.dataset.data[item.dataIndex]; - if (label == outputChannel.channelId || label == translate.instant('General.soc')) { - return label + ": " + formatNumber(value, 'de', '1.0-0') + " %"; - } else if (label == translate.instant('General.grid') || label == translate.instant('General.production')) { - return label + ": " + formatNumber(value, 'de', '1.0-2') + " kW"; - } else { - return label + ": " + formatNumber(value, 'de', '1.0-2') + " " + labelString; - } - }; - - this.options = options; - }); - - } - -} diff --git a/ui/src/app/edge/history/singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component.html b/ui/src/app/edge/history/singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component.html deleted file mode 100644 index ebd9b564647..00000000000 --- a/ui/src/app/edge/history/singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - {{ component.alias }} - - - - - - - - - - - - - - - - - - - - - -
- - -
-
- - - - - - - - Edge.Index.Widgets.twoWayInfoGrid - - - - - -
-
-
diff --git a/ui/src/app/edge/history/singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component.ts b/ui/src/app/edge/history/singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component.ts deleted file mode 100644 index 752aafb63ea..00000000000 --- a/ui/src/app/edge/history/singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -// @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils, Websocket } from '../../../../shared/shared'; - -@Component({ - selector: SinglethresholdChartOverviewComponent.SELECTOR, - templateUrl: './singlethresholdchartoverview.component.html', -}) -export class SinglethresholdChartOverviewComponent implements OnInit { - - private static readonly SELECTOR = "channelthreshold-chart-overview"; - - public edge: Edge | null = null; - - public component: EdgeConfig.Component | null = null; - public inputChannel: string; - - // reference to the Utils method to access via html - public isLastElement = Utils.isLastElement; - - protected inputChannelUnit: string; - protected readonly spinnerid = SinglethresholdChartOverviewComponent.SELECTOR; - - - constructor( - public service: Service, - private route: ActivatedRoute, - private websocket: Websocket, - ) { } - - ngOnInit() { - this.service.startSpinner(this.spinnerid); - this.service.setCurrentComponent('', this.route).then(edge => { - this.service.getConfig().then(config => { - this.edge = edge; - this.component = config.getComponent(this.route.snapshot.params.componentId); - this.inputChannel = config.getComponentProperties(this.component.id)['inputChannelAddress']; - - this.edge.getChannel(this.websocket, ChannelAddress.fromString(this.inputChannel)).then(c => { - this.inputChannelUnit = c.unit; - }).catch(e => { - console.error(e); - this.inputChannelUnit = ''; - }).finally(() => { - this.service.stopSpinner(this.spinnerid); - }); - }); - }); - } -} diff --git a/ui/src/app/edge/history/singlethreshold/widget.component.html b/ui/src/app/edge/history/singlethreshold/widget.component.html deleted file mode 100644 index 53e0a2d3687..00000000000 --- a/ui/src/app/edge/history/singlethreshold/widget.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - {{ component.alias }} - - - - - - - -
- Edge.History.activeDuration - {{ activeSecondsOverPeriod | formatSecondsToDuration }} -
-
-
\ No newline at end of file diff --git a/ui/src/app/edge/history/singlethreshold/widget.component.ts b/ui/src/app/edge/history/singlethreshold/widget.component.ts deleted file mode 100644 index c0ba1844e78..00000000000 --- a/ui/src/app/edge/history/singlethreshold/widget.component.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { QueryHistoricTimeseriesDataResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; - -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryWidget } from '../abstracthistorywidget'; -import { calculateActiveTimeOverPeriod } from '../shared'; - -@Component({ - selector: SinglethresholdWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', -}) -export class SinglethresholdWidgetComponent extends AbstractHistoryWidget implements OnInit, OnChanges, OnDestroy { - - private static readonly SELECTOR = "singlethresholdWidget"; - - @Input({ required: true }) public period!: DefaultTypes.HistoryPeriod; - @Input({ required: true }) public componentId!: string; - - public activeSecondsOverPeriod: number | null = null; - public edge: Edge | null = null; - public component: EdgeConfig.Component | null = null; - - constructor( - public override service: Service, - private route: ActivatedRoute, - ) { - super(service); - } - - ngOnInit() { - this.service.setCurrentComponent('', this.route).then(response => { - this.edge = response; - this.service.getConfig().then(config => { - this.component = config.getComponent(this.componentId); - }); - }); - } - - ngOnDestroy() { - this.unsubscribeWidgetRefresh(); - } - - ngOnChanges() { - this.updateValues(); - } - - // Gather result & timestamps to calculate effective active time in % - protected updateValues() { - this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).then(response => { - this.service.getConfig().then(config => { - const result = (response as QueryHistoricTimeseriesDataResponse).result; - let outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; - if (typeof outputChannelAddress !== 'string') { - // Takes only the first output for simplicity reasons - outputChannelAddress = outputChannelAddress[0]; - } - this.activeSecondsOverPeriod = calculateActiveTimeOverPeriod(ChannelAddress.fromString(outputChannelAddress), result); - }); - }); - } - - protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { - return new Promise((resolve) => { - const outputChannelAddress: string | string[] = config.getComponentProperties(this.componentId)['outputChannelAddress']; - if (typeof outputChannelAddress === 'string') { - resolve([ChannelAddress.fromString(outputChannelAddress)]); - } else { - resolve(outputChannelAddress.map(c => ChannelAddress.fromString(c))); - } - }); - } -} diff --git a/ui/src/app/edge/history/storage/chargerchart.component.ts b/ui/src/app/edge/history/storage/chargerchart.component.ts index 60c1ddedb19..44395de3842 100644 --- a/ui/src/app/edge/history/storage/chargerchart.component.ts +++ b/ui/src/app/edge/history/storage/chargerchart.component.ts @@ -1,15 +1,15 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; +import { ChannelAddress, Edge, EdgeConfig, Service } from "../../../shared/shared"; +import { AbstractHistoryChart } from "../abstracthistorychart"; @Component({ - selector: 'storageChargerChart', - templateUrl: '../abstracthistorychart.html', + selector: "storageChargerChart", + templateUrl: "../abstracthistorychart.html", }) export class StorageChargerChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -32,7 +32,6 @@ export class StorageChargerChartComponent extends AbstractHistoryChart implement ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -71,13 +70,13 @@ export class StorageChargerChartComponent extends AbstractHistoryChart implement }); if (address.channelId == "ActualPower") { datasets.push({ - label: this.translate.instant('General.chargePower'), + label: this.translate.instant("General.chargePower"), data: chargerData, hidden: false, }); this.colors.push({ - backgroundColor: 'rgba(0,223,0,0.05)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0.05)", + borderColor: "rgba(0,223,0,1)", }); } }); @@ -97,7 +96,7 @@ export class StorageChargerChartComponent extends AbstractHistoryChart implement protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const result: ChannelAddress[] = [ - new ChannelAddress(this.componentId, 'ActualPower'), + new ChannelAddress(this.componentId, "ActualPower"), ]; resolve(result); }); diff --git a/ui/src/app/edge/history/storage/esschart.component.ts b/ui/src/app/edge/history/storage/esschart.component.ts index 45071d138f8..cd83e95a11f 100644 --- a/ui/src/app/edge/history/storage/esschart.component.ts +++ b/ui/src/app/edge/history/storage/esschart.component.ts @@ -1,15 +1,15 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; +import { ChannelAddress, Edge, EdgeConfig, Service } from "../../../shared/shared"; +import { AbstractHistoryChart } from "../abstracthistorychart"; @Component({ - selector: 'storageESSChart', - templateUrl: '../abstracthistorychart.html', + selector: "storageESSChart", + templateUrl: "../abstracthistorychart.html", }) export class StorageESSChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -34,7 +34,6 @@ export class StorageESSChartComponent extends AbstractHistoryChart implements On ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); this.setLabel(); } @@ -78,33 +77,33 @@ export class StorageESSChartComponent extends AbstractHistoryChart implements On } else { if (channelAddress.channelId == "ActivePower") { datasets.push({ - label: this.translate.instant('General.chargeDischarge'), + label: this.translate.instant("General.chargeDischarge"), data: data, hidden: false, }); this.colors.push({ - backgroundColor: 'rgba(0,223,0,0.05)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0.05)", + borderColor: "rgba(0,223,0,1)", }); } - if (this.componentId + '/ActivePowerL1' && this.componentId + '/ActivePowerL2' && this.componentId + '/ActivePowerL3' in result.data && this.showPhases == true) { - if (channelAddress.channelId == 'ActivePowerL1') { + if (this.componentId + "/ActivePowerL1" && this.componentId + "/ActivePowerL2" && this.componentId + "/ActivePowerL3" in result.data && this.showPhases == true) { + if (channelAddress.channelId == "ActivePowerL1") { datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L1', + label: this.translate.instant("General.phase") + " " + "L1", data: data, }); this.colors.push(this.phase1Color); } - if (channelAddress.channelId == 'ActivePowerL2') { + if (channelAddress.channelId == "ActivePowerL2") { datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L2', + label: this.translate.instant("General.phase") + " " + "L2", data: data, }); this.colors.push(this.phase2Color); } - if (channelAddress.channelId == 'ActivePowerL3') { + if (channelAddress.channelId == "ActivePowerL3") { datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L3', + label: this.translate.instant("General.phase") + " " + "L3", data: data, }); this.colors.push(this.phase3Color); @@ -143,13 +142,13 @@ export class StorageESSChartComponent extends AbstractHistoryChart implements On const factory = config.factories[factoryID]; return new Promise((resolve, reject) => { const result: ChannelAddress[] = [ - new ChannelAddress(this.componentId, 'ActivePower'), + new ChannelAddress(this.componentId, "ActivePower"), ]; if ((factory.natureIds.includes("io.openems.edge.ess.api.AsymmetricEss"))) { result.push( - new ChannelAddress(component.id, 'ActivePowerL1'), - new ChannelAddress(component.id, 'ActivePowerL2'), - new ChannelAddress(component.id, 'ActivePowerL3'), + new ChannelAddress(component.id, "ActivePowerL1"), + new ChannelAddress(component.id, "ActivePowerL2"), + new ChannelAddress(component.id, "ActivePowerL3"), ); } resolve(result); diff --git a/ui/src/app/edge/history/storage/singlechart.component.ts b/ui/src/app/edge/history/storage/singlechart.component.ts index 3f670d816ee..4d987a4b2ee 100644 --- a/ui/src/app/edge/history/storage/singlechart.component.ts +++ b/ui/src/app/edge/history/storage/singlechart.component.ts @@ -1,18 +1,18 @@ // @ts-strict-ignore -import { formatNumber } from '@angular/common'; -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChartAxis, YAxisTitle } from 'src/app/shared/service/utils'; +import { formatNumber } from "@angular/common"; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import * as Chart from "chart.js"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChartAxis, YAxisType } from "src/app/shared/service/utils"; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; +import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from "../../../shared/shared"; +import { AbstractHistoryChart } from "../abstracthistorychart"; @Component({ - selector: 'storageSingleChart', - templateUrl: '../abstracthistorychart.html', + selector: "storageSingleChart", + templateUrl: "../abstracthistorychart.html", }) export class StorageSingleChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -33,7 +33,6 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -47,11 +46,11 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const result: ChannelAddress[] = [ - new ChannelAddress('_sum', 'EssActivePower'), - new ChannelAddress('_sum', 'ProductionDcActualPower'), - new ChannelAddress('_sum', 'EssActivePowerL1'), - new ChannelAddress('_sum', 'EssActivePowerL2'), - new ChannelAddress('_sum', 'EssActivePowerL3'), + new ChannelAddress("_sum", "EssActivePower"), + new ChannelAddress("_sum", "ProductionDcActualPower"), + new ChannelAddress("_sum", "EssActivePowerL1"), + new ChannelAddress("_sum", "EssActivePowerL2"), + new ChannelAddress("_sum", "EssActivePowerL3"), ]; resolve(result); }); @@ -86,20 +85,20 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements let effectivePowerL2 = []; let effectivePowerL3 = []; - if (config.getComponentsImplementingNature('io.openems.edge.ess.dccharger.api.EssDcCharger').length > 0) { - result.data['_sum/ProductionDcActualPower'].forEach((value, index) => { - if (result.data['_sum/ProductionDcActualPower'][index] != null) { - effectivePower[index] = Utils.subtractSafely(result.data['_sum/EssActivePower'][index], value); - effectivePowerL1[index] = Utils.subtractSafely(result.data['_sum/EssActivePowerL1'][index], value / 3); - effectivePowerL2[index] = Utils.subtractSafely(result.data['_sum/EssActivePowerL2'][index], value / 3); - effectivePowerL3[index] = Utils.subtractSafely(result.data['_sum/EssActivePowerL3'][index], value / 3); + if (config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger").length > 0) { + result.data["_sum/ProductionDcActualPower"].forEach((value, index) => { + if (result.data["_sum/ProductionDcActualPower"][index] != null) { + effectivePower[index] = Utils.subtractSafely(result.data["_sum/EssActivePower"][index], value); + effectivePowerL1[index] = Utils.subtractSafely(result.data["_sum/EssActivePowerL1"][index], value / 3); + effectivePowerL2[index] = Utils.subtractSafely(result.data["_sum/EssActivePowerL2"][index], value / 3); + effectivePowerL3[index] = Utils.subtractSafely(result.data["_sum/EssActivePowerL3"][index], value / 3); } }); } else { - effectivePower = result.data['_sum/EssActivePower']; - effectivePowerL1 = result.data['_sum/EssActivePowerL1']; - effectivePowerL2 = result.data['_sum/EssActivePowerL2']; - effectivePowerL3 = result.data['_sum/EssActivePowerL3']; + effectivePower = result.data["_sum/EssActivePower"]; + effectivePowerL1 = result.data["_sum/EssActivePowerL1"]; + effectivePowerL2 = result.data["_sum/EssActivePowerL2"]; + effectivePowerL3 = result.data["_sum/EssActivePowerL3"]; } const totalData = effectivePower.map(value => { @@ -148,30 +147,30 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements } else { if (channelAddress.channelId == "EssActivePower") { datasets.push({ - label: this.translate.instant('General.chargeDischarge'), + label: this.translate.instant("General.chargeDischarge"), data: totalData, }); this.colors.push({ - backgroundColor: 'rgba(0,223,0,0.05)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0.05)", + borderColor: "rgba(0,223,0,1)", }); } - if ('_sum/EssActivePowerL1' && '_sum/EssActivePowerL2' && '_sum/EssActivePowerL3' in result.data && this.showPhases == true) { - if (channelAddress.channelId == 'EssActivePowerL1') { + if ("_sum/EssActivePowerL1" && "_sum/EssActivePowerL2" && "_sum/EssActivePowerL3" in result.data && this.showPhases == true) { + if (channelAddress.channelId == "EssActivePowerL1") { datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L1', + label: this.translate.instant("General.phase") + " " + "L1", data: totalDataL1, }); this.colors.push(this.phase1Color); - } if (channelAddress.channelId == 'EssActivePowerL2') { + } if (channelAddress.channelId == "EssActivePowerL2") { datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L2', + label: this.translate.instant("General.phase") + " " + "L2", data: totalDataL2, }); this.colors.push(this.phase2Color); - } if (channelAddress.channelId == 'EssActivePowerL3') { + } if (channelAddress.channelId == "EssActivePowerL3") { datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L3', + label: this.translate.instant("General.phase") + " " + "L3", data: totalDataL3, }); this.colors.push(this.phase3Color); @@ -198,7 +197,7 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements this.initializeChart(); return; }).finally(async () => { - this.unit = YAxisTitle.ENERGY; + this.unit = YAxisType.ENERGY; await this.setOptions(this.options); this.applyControllerSpecificChartOptions(this.options); this.loading = false; @@ -216,24 +215,24 @@ export class StorageSingleChartComponent extends AbstractHistoryChart implements const value = tooltipItem.dataset.data[tooltipItem.dataIndex]; // 0.005 to prevent showing Charge or Discharge if value is e.g. 0.00232138 if (value < -0.005) { - if (label.includes(translate.instant('General.phase'))) { - label += ' ' + translate.instant('General.chargePower'); + if (label.includes(translate.instant("General.phase"))) { + label += " " + translate.instant("General.chargePower"); } else { - label = translate.instant('General.chargePower'); + label = translate.instant("General.chargePower"); } } else if (value > 0.005) { - if (label.includes(translate.instant('General.phase'))) { - label += ' ' + translate.instant('General.dischargePower'); + if (label.includes(translate.instant("General.phase"))) { + label += " " + translate.instant("General.dischargePower"); } else { - label = translate.instant('General.dischargePower'); + label = translate.instant("General.dischargePower"); } } - return label + ": " + formatNumber(value, 'de', '1.0-2') + " kW"; + return label + ": " + formatNumber(value, "de", "1.0-2") + " kW"; }; // Data doesnt have all datapoints for period // original logic has not been touched - options.scales.x.ticks['source'] = 'auto'; + options.scales.x.ticks["source"] = "auto"; this.options = options; } diff --git a/ui/src/app/edge/history/storage/socchart.component.ts b/ui/src/app/edge/history/storage/socchart.component.ts index 6e76644f311..bf127df1811 100644 --- a/ui/src/app/edge/history/storage/socchart.component.ts +++ b/ui/src/app/edge/history/storage/socchart.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { YAxisTitle } from 'src/app/shared/service/utils'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { YAxisType } from "src/app/shared/service/utils"; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; +import { ChannelAddress, Edge, EdgeConfig, Service } from "../../../shared/shared"; +import { AbstractHistoryChart } from "../abstracthistorychart"; @Component({ - selector: 'socStorageChart', - templateUrl: '../abstracthistorychart.html', + selector: "socStorageChart", + templateUrl: "../abstracthistorychart.html", }) export class SocStorageChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -35,7 +35,6 @@ export class SocStorageChartComponent extends AbstractHistoryChart implements On public ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } public ngOnDestroy() { @@ -77,28 +76,28 @@ export class SocStorageChartComponent extends AbstractHistoryChart implements On if (!data) { return; } else { - if (channelAddress.channelId === 'EssSoc') { + if (channelAddress.channelId === "EssSoc") { datasets.push({ - label: (moreThanOneESS ? this.translate.instant('General.TOTAL') : this.translate.instant('General.soc')), + label: (moreThanOneESS ? this.translate.instant("General.TOTAL") : this.translate.instant("General.soc")), data: data, }); this.colors.push({ - backgroundColor: 'rgba(0,223,0,0.05)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0.05)", + borderColor: "rgba(0,223,0,1)", }); } - if (channelAddress.channelId === 'Soc' && moreThanOneESS) { + if (channelAddress.channelId === "Soc" && moreThanOneESS) { datasets.push({ label: (channelAddress.componentId == component.alias ? component.id : component.alias), data: data, }); this.colors.push({ - backgroundColor: 'rgba(128,128,128,0.05)', - borderColor: 'rgba(128,128,128,1)', + backgroundColor: "rgba(128,128,128,0.05)", + borderColor: "rgba(128,128,128,1)", }); } } - if (channelAddress.channelId === 'ActualReserveSoc') { + if (channelAddress.channelId === "ActualReserveSoc") { datasets.push({ label: this.emergencyCapacityReserveComponents.length > 1 ? component.alias : this.translate.instant("Edge.Index.EmergencyReserve.EMERGENCY_RESERVE"), @@ -107,8 +106,8 @@ export class SocStorageChartComponent extends AbstractHistoryChart implements On }); this.colors.push({ - backgroundColor: 'rgba(1, 1, 1,0)', - borderColor: 'rgba(1, 1, 1,1)', + backgroundColor: "rgba(1, 1, 1,0)", + borderColor: "rgba(1, 1, 1,1)", }); } }); @@ -117,8 +116,8 @@ export class SocStorageChartComponent extends AbstractHistoryChart implements On this.loading = false; this.stopSpinner(); }).finally(async () => { - this.unit = YAxisTitle.PERCENTAGE; - this.formatNumber = '1.0-0'; + this.unit = YAxisType.PERCENTAGE; + this.formatNumber = "1.0-0"; await this.setOptions(this.options); }); @@ -144,20 +143,20 @@ export class SocStorageChartComponent extends AbstractHistoryChart implements On protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const channeladdresses: ChannelAddress[] = []; - channeladdresses.push(new ChannelAddress('_sum', 'EssSoc')); + channeladdresses.push(new ChannelAddress("_sum", "EssSoc")); - this.emergencyCapacityReserveComponents = config.getComponentsByFactory('Controller.Ess.EmergencyCapacityReserve') + this.emergencyCapacityReserveComponents = config.getComponentsByFactory("Controller.Ess.EmergencyCapacityReserve") .filter(component => component.isEnabled); this.emergencyCapacityReserveComponents .forEach(component => - channeladdresses.push(new ChannelAddress(component.id, 'ActualReserveSoc')), + channeladdresses.push(new ChannelAddress(component.id, "ActualReserveSoc")), ); const ess = config.getComponentsImplementingNature("io.openems.edge.ess.api.SymmetricEss"); if (ess.length > 1) { - ess.filter(component => !(component.factoryId === 'Ess.Cluster')).forEach(component => { - channeladdresses.push(new ChannelAddress(component.id, 'Soc')); + ess.filter(component => !(component.factoryId === "Ess.Cluster")).forEach(component => { + channeladdresses.push(new ChannelAddress(component.id, "Soc")); }); } resolve(channeladdresses); diff --git a/ui/src/app/edge/history/storage/storagechartoverview/storagechartoverview.component.html b/ui/src/app/edge/history/storage/storagechartoverview/storagechartoverview.component.html index 801f94f1d4b..749335aba84 100644 --- a/ui/src/app/edge/history/storage/storagechartoverview/storagechartoverview.component.html +++ b/ui/src/app/edge/history/storage/storagechartoverview/storagechartoverview.component.html @@ -150,4 +150,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/storage/storagechartoverview/storagechartoverview.component.ts b/ui/src/app/edge/history/storage/storagechartoverview/storagechartoverview.component.ts index 84f1c456a1a..9562ad8825a 100644 --- a/ui/src/app/edge/history/storage/storagechartoverview/storagechartoverview.component.ts +++ b/ui/src/app/edge/history/storage/storagechartoverview/storagechartoverview.component.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Edge, EdgeConfig, Service, Utils } from '../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { Edge, EdgeConfig, Service, Utils } from "../../../../shared/shared"; @Component({ selector: StorageChartOverviewComponent.SELECTOR, - templateUrl: './storagechartoverview.component.html', + templateUrl: "./storagechartoverview.component.html", }) export class StorageChartOverviewComponent implements OnInit { @@ -29,7 +29,7 @@ export class StorageChartOverviewComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { this.edge = edge; this.essComponents = config.getComponentsImplementingNature("io.openems.edge.ess.api.SymmetricEss").filter(component => !component.factoryId.includes("Ess.Cluster")); diff --git a/ui/src/app/edge/history/storage/totalchart.component.ts b/ui/src/app/edge/history/storage/totalchart.component.ts index fa75aaac305..13375ae97db 100644 --- a/ui/src/app/edge/history/storage/totalchart.component.ts +++ b/ui/src/app/edge/history/storage/totalchart.component.ts @@ -1,18 +1,18 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChartAxis, Utils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, Edge, EdgeConfig, Service } from 'src/app/shared/shared'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import * as Chart from "chart.js"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChartAxis, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, Edge, EdgeConfig, Service } from "src/app/shared/shared"; -import { formatNumber } from '@angular/common'; -import { AbstractHistoryChart } from '../abstracthistorychart'; +import { formatNumber } from "@angular/common"; +import { AbstractHistoryChart } from "../abstracthistorychart"; @Component({ - selector: 'storageTotalChart', - templateUrl: '../abstracthistorychart.html', + selector: "storageTotalChart", + templateUrl: "../abstracthistorychart.html", }) export class StorageTotalChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -33,7 +33,6 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -63,12 +62,12 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements // calculate total charge and discharge let effectivePower; - if (config.getComponentsImplementingNature('io.openems.edge.ess.dccharger.api.EssDcCharger').length > 0) { - effectivePower = result.data['_sum/ProductionDcActualPower'].map((value, index) => { - return Utils.subtractSafely(result.data['_sum/EssActivePower'][index], value); + if (config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger").length > 0) { + effectivePower = result.data["_sum/ProductionDcActualPower"].map((value, index) => { + return Utils.subtractSafely(result.data["_sum/EssActivePower"][index], value); }); } else { - effectivePower = result.data['_sum/EssActivePower']; + effectivePower = result.data["_sum/EssActivePower"]; } const totalData = effectivePower.map(value => { if (value == null) { @@ -104,29 +103,29 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements if (channelAddress.channelId == "EssActivePower") { datasets.push({ - label: this.translate.instant('General.TOTAL'), + label: this.translate.instant("General.TOTAL"), data: totalData, }); this.colors.push({ - backgroundColor: 'rgba(0,223,0,0.05)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0.05)", + borderColor: "rgba(0,223,0,1)", }); - } if ('_sum/EssActivePowerL1' && '_sum/EssActivePowerL2' && '_sum/EssActivePowerL3' in result.data && this.showPhases == true) { - if (channelAddress.channelId == 'EssActivePowerL1') { + } if ("_sum/EssActivePowerL1" && "_sum/EssActivePowerL2" && "_sum/EssActivePowerL3" in result.data && this.showPhases == true) { + if (channelAddress.channelId == "EssActivePowerL1") { datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L1', + label: this.translate.instant("General.phase") + " " + "L1", data: data, }); this.colors.push(this.phase1Color); - } if (channelAddress.channelId == 'EssActivePowerL2') { + } if (channelAddress.channelId == "EssActivePowerL2") { datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L2', + label: this.translate.instant("General.phase") + " " + "L2", data: data, }); this.colors.push(this.phase2Color); - } if (channelAddress.channelId == 'EssActivePowerL3') { + } if (channelAddress.channelId == "EssActivePowerL3") { datasets.push({ - label: this.translate.instant('General.phase') + ' ' + 'L3', + label: this.translate.instant("General.phase") + " " + "L3", data: data, }); this.colors.push(this.phase3Color); @@ -139,28 +138,28 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements hidden: false, }); this.colors.push({ - backgroundColor: 'rgba(45,143,171,0.05)', - borderColor: 'rgba(45,143,171,1)', + backgroundColor: "rgba(45,143,171,0.05)", + borderColor: "rgba(45,143,171,1)", }); } - if (component.id + '/ActivePowerL1' && component.id + '/ActivePowerL2' && component.id + '/ActivePowerL3' in result.data && this.showPhases == true) { - if (channelAddress.channelId == 'ActivePowerL1') { + if (component.id + "/ActivePowerL1" && component.id + "/ActivePowerL2" && component.id + "/ActivePowerL3" in result.data && this.showPhases == true) { + if (channelAddress.channelId == "ActivePowerL1") { datasets.push({ - label: (channelAddress.componentId == component.alias ? ' (' + component.id + ')' : ' (' + component.alias + ')') + ' ' + this.translate.instant('General.phase') + ' ' + 'L1', + label: (channelAddress.componentId == component.alias ? " (" + component.id + ")" : " (" + component.alias + ")") + " " + this.translate.instant("General.phase") + " " + "L1", data: data, }); this.colors.push(this.phase1Color); } - if (channelAddress.channelId == 'ActivePowerL2') { + if (channelAddress.channelId == "ActivePowerL2") { datasets.push({ - label: (channelAddress.componentId == component.alias ? ' (' + component.id + ')' : ' (' + component.alias + ')') + ' ' + this.translate.instant('General.phase') + ' ' + 'L2', + label: (channelAddress.componentId == component.alias ? " (" + component.id + ")" : " (" + component.alias + ")") + " " + this.translate.instant("General.phase") + " " + "L2", data: data, }); this.colors.push(this.phase2Color); } - if (channelAddress.channelId == 'ActivePowerL3') { + if (channelAddress.channelId == "ActivePowerL3") { datasets.push({ - label: (channelAddress.componentId == component.alias ? ' (' + component.id + ')' : ' (' + component.alias + ')') + ' ' + this.translate.instant('General.phase') + ' ' + 'L3', + label: (channelAddress.componentId == component.alias ? " (" + component.id + ")" : " (" + component.alias + ")") + " " + this.translate.instant("General.phase") + " " + "L3", data: data, }); this.colors.push(this.phase3Color); @@ -173,14 +172,14 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements hidden: false, }); this.colors.push({ - backgroundColor: 'rgba(255,215,0,0.05)', - borderColor: 'rgba(255,215,0,1)', + backgroundColor: "rgba(255,215,0,0.05)", + borderColor: "rgba(255,215,0,1)", }); } }); }).finally(async () => { this.datasets = datasets; - this.unit = YAxisTitle.ENERGY; + this.unit = YAxisType.ENERGY; await this.setOptions(this.options); this.applyControllerSpecificChartOptions(this.options); this.stopSpinner(); @@ -209,23 +208,23 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements protected getChannelAddresses(edge: Edge, config: EdgeConfig): Promise { return new Promise((resolve) => { const result: ChannelAddress[] = [ - new ChannelAddress('_sum', 'EssActivePower'), - new ChannelAddress('_sum', 'ProductionDcActualPower'), - new ChannelAddress('_sum', 'EssActivePowerL1'), - new ChannelAddress('_sum', 'EssActivePowerL2'), - new ChannelAddress('_sum', 'EssActivePowerL3'), + new ChannelAddress("_sum", "EssActivePower"), + new ChannelAddress("_sum", "ProductionDcActualPower"), + new ChannelAddress("_sum", "EssActivePowerL1"), + new ChannelAddress("_sum", "EssActivePowerL2"), + new ChannelAddress("_sum", "EssActivePowerL3"), ]; config.getComponentsImplementingNature("io.openems.edge.ess.api.SymmetricEss") .filter(component => !component.factoryId.includes("Ess.Cluster")) .forEach(component => { const factoryID = component.factoryId; const factory = config.factories[factoryID]; - result.push(new ChannelAddress(component.id, 'ActivePower')); + result.push(new ChannelAddress(component.id, "ActivePower")); if ((factory.natureIds.includes("io.openems.edge.ess.api.AsymmetricEss"))) { result.push( - new ChannelAddress(component.id, 'ActivePowerL1'), - new ChannelAddress(component.id, 'ActivePowerL2'), - new ChannelAddress(component.id, 'ActivePowerL3'), + new ChannelAddress(component.id, "ActivePowerL1"), + new ChannelAddress(component.id, "ActivePowerL2"), + new ChannelAddress(component.id, "ActivePowerL3"), ); } }); @@ -233,7 +232,7 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements if (config.getComponentsImplementingNature("io.openems.edge.ess.api.SymmetricEss") .filter(component => !component.factoryId.includes("Ess.Cluster")).length != 1 && charger.length > 0) { charger.forEach(component => { - result.push(new ChannelAddress(component.id, 'ActualPower')); + result.push(new ChannelAddress(component.id, "ActualPower")); }); } resolve(result); @@ -253,11 +252,11 @@ export class StorageTotalChartComponent extends AbstractHistoryChart implements const value = tooltipItem.dataset.data[tooltipItem.dataIndex]; // 0.005 to prevent showing Charge or Discharge if value is e.g. 0.00232138 if (value < -0.005) { - label += ' ' + translate.instant('General.chargePower'); + label += " " + translate.instant("General.chargePower"); } else if (value > 0.005) { - label += ' ' + translate.instant('General.dischargePower'); + label += " " + translate.instant("General.dischargePower"); } - return label + ": " + formatNumber(value, 'de', '1.0-2') + " kW"; + return label + ": " + formatNumber(value, "de", "1.0-2") + " kW"; }; } } diff --git a/ui/src/app/edge/history/storage/widget.component.html b/ui/src/app/edge/history/storage/widget.component.html index fe64475d93c..79f3aaac4ce 100644 --- a/ui/src/app/edge/history/storage/widget.component.html +++ b/ui/src/app/edge/history/storage/widget.component.html @@ -29,4 +29,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/storage/widget.component.ts b/ui/src/app/edge/history/storage/widget.component.ts index 57987a5ca63..9e4b95790f8 100644 --- a/ui/src/app/edge/history/storage/widget.component.ts +++ b/ui/src/app/edge/history/storage/widget.component.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Cumulated } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from '../../../shared/shared'; -import { AbstractHistoryWidget } from '../abstracthistorywidget'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { Cumulated } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from "../../../shared/shared"; +import { AbstractHistoryWidget } from "../abstracthistorywidget"; @Component({ selector: StorageComponent.SELECTOR, - templateUrl: './widget.component.html', + templateUrl: "./widget.component.html", }) export class StorageComponent extends AbstractHistoryWidget implements OnInit, OnChanges, OnDestroy { @@ -31,7 +31,7 @@ export class StorageComponent extends AbstractHistoryWidget implements OnInit, O } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(response => { + this.service.getCurrentEdge().then(response => { this.edge = response; }); } @@ -60,8 +60,8 @@ export class StorageComponent extends AbstractHistoryWidget implements OnInit, O return new Promise((resolve) => { const channels: ChannelAddress[] = []; channels.push( - new ChannelAddress('_sum', 'EssDcChargeEnergy'), - new ChannelAddress('_sum', 'EssDcDischargeEnergy'), + new ChannelAddress("_sum", "EssDcChargeEnergy"), + new ChannelAddress("_sum", "EssDcDischargeEnergy"), ); resolve(channels); }); diff --git a/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.html b/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.html index 677d4630fab..8cb74e66409 100644 --- a/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.html +++ b/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.html @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.ts b/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.ts index f4e1909afe6..e33b705a5a7 100644 --- a/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.ts +++ b/ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.ts @@ -1,26 +1,26 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { Icon } from 'src/app/shared/type/widget'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { Icon } from "src/app/shared/type/widget"; -import { ChannelAddress, CurrentData } from '../../../../shared/shared'; +import { ChannelAddress, CurrentData } from "../../../../shared/shared"; @Component({ - selector: 'Controller_Channelthreshold', - templateUrl: './Channelthreshold.html', + selector: "Controller_Channelthreshold", + templateUrl: "./Channelthreshold.html", }) export class Controller_ChannelthresholdComponent extends AbstractFlatWidget { public outputChannel: ChannelAddress; public icon: Icon = { - name: '', - size: 'large', - color: 'dark', + name: "", + size: "large", + color: "dark", }; - public state: string = '?'; + public state: string = "?"; protected override getChannelAddresses() { - this.outputChannel = ChannelAddress.fromString(this.component.properties['outputChannelAddress']); + this.outputChannel = ChannelAddress.fromString(this.component.properties["outputChannelAddress"]); return [this.outputChannel]; } protected override onCurrentData(currentData: CurrentData) { @@ -28,13 +28,13 @@ export class Controller_ChannelthresholdComponent extends AbstractFlatWidget { if (channel != null) { if (channel == 1) { this.icon.name = "radio-button-on-outline"; - this.state = this.translate.instant('General.on'); + this.state = this.translate.instant("General.on"); } else if (channel == 0) { - this.icon.name = 'radio-button-off-outline'; - this.state = this.translate.instant('General.off'); + this.icon.name = "radio-button-off-outline"; + this.state = this.translate.instant("General.off"); } } else { - this.icon.name = 'help-outline'; + this.icon.name = "help-outline"; } } } diff --git a/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.html b/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.html index 751a66c868e..8dc374e330e 100644 --- a/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.html +++ b/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.html @@ -27,4 +27,4 @@ height="16" style="fill:blue" /> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.ts b/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.ts index 9a56102cea6..48adf7600d5 100644 --- a/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.ts +++ b/ui/src/app/edge/live/Controller/ChpSoc/ChpSoc.ts @@ -1,18 +1,18 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { Icon } from 'src/app/shared/type/widget'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { Icon } from "src/app/shared/type/widget"; -import { ChannelAddress, CurrentData } from '../../../../shared/shared'; -import { Controller_ChpSocModalComponent } from './modal/modal.component'; +import { ChannelAddress, CurrentData } from "../../../../shared/shared"; +import { Controller_ChpSocModalComponent } from "./modal/modal.component"; @Component({ - selector: 'Controller_ChpSocComponent', - templateUrl: './ChpSoc.html', + selector: "Controller_ChpSocComponent", + templateUrl: "./ChpSoc.html", }) export class Controller_ChpSocComponent extends AbstractFlatWidget { - private static PROPERTY_MODE: string = '_PropertyMode'; + private static PROPERTY_MODE: string = "_PropertyMode"; public inputChannel: ChannelAddress | null = null; public outputChannel: ChannelAddress | null = null; public propertyModeChannel: ChannelAddress | null = null; @@ -23,9 +23,9 @@ export class Controller_ChpSocComponent extends AbstractFlatWidget { public modeChannelValue: string; public inputChannelValue: number; public icon: Icon = { - name: '', - size: 'large', - color: 'primary', + name: "", + size: "large", + color: "primary", }; async presentModal() { @@ -43,16 +43,16 @@ export class Controller_ChpSocComponent extends AbstractFlatWidget { protected override getChannelAddresses() { this.outputChannel = ChannelAddress.fromString( - this.component.properties['outputChannelAddress']); + this.component.properties["outputChannelAddress"]); this.inputChannel = ChannelAddress.fromString( - this.component.properties['inputChannelAddress']); + this.component.properties["inputChannelAddress"]); this.propertyModeChannel = new ChannelAddress(this.component.id, Controller_ChpSocComponent.PROPERTY_MODE); return [ this.outputChannel, this.inputChannel, this.propertyModeChannel, - new ChannelAddress(this.component.id, '_PropertyHighThreshold'), - new ChannelAddress(this.component.id, '_PropertyLowThreshold'), + new ChannelAddress(this.component.id, "_PropertyHighThreshold"), + new ChannelAddress(this.component.id, "_PropertyLowThreshold"), ]; } @@ -61,31 +61,31 @@ export class Controller_ChpSocComponent extends AbstractFlatWidget { // Mode this.modeChannelValue = currentData.allComponents[this.propertyModeChannel.toString()]; switch (this.modeChannelValue) { - case 'ON': - this.mode = this.translate.instant('General.on'); + case "ON": + this.mode = this.translate.instant("General.on"); break; - case 'OFF': - this.mode = this.translate.instant('General.off'); + case "OFF": + this.mode = this.translate.instant("General.off"); break; - case 'AUTOMATIC': - this.mode = this.translate.instant('General.automatic'); + case "AUTOMATIC": + this.mode = this.translate.instant("General.automatic"); } const outputChannelValue = currentData.allComponents[this.outputChannel.toString()]; switch (outputChannelValue) { case 0: - this.state = this.translate.instant('General.inactive'); - this.icon.name == 'help-outline'; + this.state = this.translate.instant("General.inactive"); + this.icon.name == "help-outline"; break; case 1: - this.state = this.translate.instant('General.active'); + this.state = this.translate.instant("General.active"); break; } this.inputChannelValue = currentData.allComponents[this.inputChannel.toString()]; - this.highThresholdValue = currentData.allComponents[this.component.id + '/_PropertyHighThreshold']; - this.lowThresholdValue = currentData.allComponents[this.component.id + '/_PropertyLowThreshold']; + this.highThresholdValue = currentData.allComponents[this.component.id + "/_PropertyHighThreshold"]; + this.lowThresholdValue = currentData.allComponents[this.component.id + "/_PropertyLowThreshold"]; } } diff --git a/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.html b/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.html index a1a9d050f1c..531dec7234d 100644 --- a/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.html +++ b/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.html @@ -103,4 +103,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.ts b/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.ts index 636e1265b75..0c557361d5a 100644 --- a/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/ChpSoc/modal/modal.component.ts @@ -1,17 +1,17 @@ // @ts-strict-ignore -import { Component, Input, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { RangeValue } from '@ionic/core'; -import { TranslateService } from '@ngx-translate/core'; -import { ChannelAddress, Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { RangeValue } from "@ionic/core"; +import { TranslateService } from "@ngx-translate/core"; +import { ChannelAddress, Edge, EdgeConfig, Service, Websocket } from "src/app/shared/shared"; -type mode = 'MANUAL_ON' | 'MANUAL_OFF' | 'AUTOMATIC'; +type mode = "MANUAL_ON" | "MANUAL_OFF" | "AUTOMATIC"; @Component({ selector: Controller_ChpSocModalComponent.SELECTOR, - templateUrl: './modal.component.html', + templateUrl: "./modal.component.html", }) export class Controller_ChpSocModalComponent implements OnInit { @@ -36,8 +36,8 @@ export class Controller_ChpSocModalComponent implements OnInit { ) { } ngOnInit() { - this.thresholds['lower'] = this.component.properties['lowThreshold']; - this.thresholds['upper'] = this.component.properties['highThreshold']; + this.thresholds["lower"] = this.component.properties["lowThreshold"]; + this.thresholds["upper"] = this.component.properties["highThreshold"]; } /** @@ -50,26 +50,26 @@ export class Controller_ChpSocModalComponent implements OnInit { let newMode: mode; switch (event.detail.value) { - case 'MANUAL_ON': - newMode = 'MANUAL_ON'; + case "MANUAL_ON": + newMode = "MANUAL_ON"; break; - case 'MANUAL_OFF': - newMode = 'MANUAL_OFF'; + case "MANUAL_OFF": + newMode = "MANUAL_OFF"; break; - case 'AUTOMATIC': - newMode = 'AUTOMATIC'; + case "AUTOMATIC": + newMode = "AUTOMATIC"; break; } if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, this.component.id, [ - { name: 'mode', value: newMode }, + { name: "mode", value: newMode }, ]).then(() => { this.component.properties.mode = newMode; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { this.component.properties.mode = oldMode; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -81,25 +81,25 @@ export class Controller_ChpSocModalComponent implements OnInit { * @param event */ updateThresholds() { - const oldLowerThreshold = this.component.properties['lowThreshold']; - const oldUpperThreshold = this.component.properties['highThreshold']; + const oldLowerThreshold = this.component.properties["lowThreshold"]; + const oldUpperThreshold = this.component.properties["highThreshold"]; - const newLowerThreshold = this.thresholds['lower']; - const newUpperThreshold = this.thresholds['upper']; + const newLowerThreshold = this.thresholds["lower"]; + const newUpperThreshold = this.thresholds["upper"]; // prevents automatic update when no values have changed if (this.edge != null && (oldLowerThreshold != newLowerThreshold || oldUpperThreshold != newUpperThreshold)) { this.edge.updateComponentConfig(this.websocket, this.component.id, [ - { name: 'lowThreshold', value: newLowerThreshold }, - { name: 'highThreshold', value: newUpperThreshold }, + { name: "lowThreshold", value: newLowerThreshold }, + { name: "highThreshold", value: newUpperThreshold }, ]).then(() => { - this.component.properties['lowThreshold'] = newLowerThreshold; - this.component.properties['highThreshold'] = newUpperThreshold; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.component.properties["lowThreshold"] = newLowerThreshold; + this.component.properties["highThreshold"] = newUpperThreshold; + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { - this.component.properties['lowThreshold'] = oldLowerThreshold; - this.component.properties['highThreshold'] = oldUpperThreshold; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.component.properties["lowThreshold"] = oldLowerThreshold; + this.component.properties["highThreshold"] = oldUpperThreshold; + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } diff --git a/ui/src/app/edge/live/Controller/Ess/FixActivePower/Ess_FixActivePower.ts b/ui/src/app/edge/live/Controller/Ess/FixActivePower/Ess_FixActivePower.ts index 471d2ee863d..b22ff209e54 100644 --- a/ui/src/app/edge/live/Controller/Ess/FixActivePower/Ess_FixActivePower.ts +++ b/ui/src/app/edge/live/Controller/Ess/FixActivePower/Ess_FixActivePower.ts @@ -1,8 +1,8 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { FlatComponent } from './flat/flat'; -import { ModalComponent } from './modal/modal'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { FlatComponent } from "./flat/flat"; +import { ModalComponent } from "./modal/modal"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/Controller/Ess/FixActivePower/flat/flat.html b/ui/src/app/edge/live/Controller/Ess/FixActivePower/flat/flat.html index 55b1aa87dc2..61ce74a5bd8 100644 --- a/ui/src/app/edge/live/Controller/Ess/FixActivePower/flat/flat.html +++ b/ui/src/app/edge/live/Controller/Ess/FixActivePower/flat/flat.html @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Ess/FixActivePower/flat/flat.ts b/ui/src/app/edge/live/Controller/Ess/FixActivePower/flat/flat.ts index fd80147f88a..73429cc8694 100644 --- a/ui/src/app/edge/live/Controller/Ess/FixActivePower/flat/flat.ts +++ b/ui/src/app/edge/live/Controller/Ess/FixActivePower/flat/flat.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChannelAddress, CurrentData, Utils } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChannelAddress, CurrentData, Utils } from "src/app/shared/shared"; -import { ModalComponent } from '../modal/modal'; +import { ModalComponent } from "../modal/modal"; @Component({ - selector: 'Controller_Ess_FixActivePower', - templateUrl: './flat.html', + selector: "Controller_Ess_FixActivePower", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -39,8 +39,8 @@ export class FlatComponent extends AbstractFlatWidget { } protected override onCurrentData(currentData: CurrentData) { - this.chargeDischargePower = Utils.convertChargeDischargePower(this.translate, currentData.allComponents[this.component.id + '/_PropertyPower']); - this.propertyMode = currentData.allComponents[this.component.id + '/_PropertyMode']; + this.chargeDischargePower = Utils.convertChargeDischargePower(this.translate, currentData.allComponents[this.component.id + "/_PropertyPower"]); + this.propertyMode = currentData.allComponents[this.component.id + "/_PropertyMode"]; } } diff --git a/ui/src/app/edge/live/Controller/Ess/FixActivePower/modal/modal.html b/ui/src/app/edge/live/Controller/Ess/FixActivePower/modal/modal.html index 98c41b705c5..78d026f8af5 100644 --- a/ui/src/app/edge/live/Controller/Ess/FixActivePower/modal/modal.html +++ b/ui/src/app/edge/live/Controller/Ess/FixActivePower/modal/modal.html @@ -31,4 +31,4 @@ [info]="('Edge.Index.Widgets.InfoStorageForCharge' | translate) + '. ' + ('Edge.Index.Widgets.InfoStorageForDischarge' | translate)"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Ess/FixActivePower/modal/modal.ts b/ui/src/app/edge/live/Controller/Ess/FixActivePower/modal/modal.ts index 9653441e6e6..8e1c941963a 100644 --- a/ui/src/app/edge/live/Controller/Ess/FixActivePower/modal/modal.ts +++ b/ui/src/app/edge/live/Controller/Ess/FixActivePower/modal/modal.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { AbstractModal } from 'src/app/shared/components/modal/abstractModal'; -import { ChannelAddress, CurrentData, Utils } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { FormControl, FormGroup } from "@angular/forms"; +import { AbstractModal } from "src/app/shared/components/modal/abstractModal"; +import { ChannelAddress, CurrentData, Utils } from "src/app/shared/shared"; @Component({ - templateUrl: './modal.html', + templateUrl: "./modal.html", }) export class ModalComponent extends AbstractModal { @@ -21,7 +21,7 @@ export class ModalComponent extends AbstractModal { } protected override onCurrentData(currentData: CurrentData) { - this.chargeDischargePower = Utils.convertChargeDischargePower(this.translate, currentData.allComponents[this.component.id + '/_PropertyPower']); + this.chargeDischargePower = Utils.convertChargeDischargePower(this.translate, currentData.allComponents[this.component.id + "/_PropertyPower"]); } protected override getFormGroup(): FormGroup { diff --git a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/Ess_GridOptimizedCharge.ts b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/Ess_GridOptimizedCharge.ts index 90c1bb531b7..71b80fdeab9 100644 --- a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/Ess_GridOptimizedCharge.ts +++ b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/Ess_GridOptimizedCharge.ts @@ -1,9 +1,9 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { FlatComponent } from './flat/flat'; -import { ModalComponent } from './modal/modal'; -import { PredictionChartComponent } from './modal/predictionChart'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { FlatComponent } from "./flat/flat"; +import { ModalComponent } from "./modal/modal"; +import { PredictionChartComponent } from "./modal/predictionChart"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/flat/flat.html b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/flat/flat.html index d20fff09d10..3acb6e36570 100644 --- a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/flat/flat.html +++ b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/flat/flat.html @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/flat/flat.ts b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/flat/flat.ts index 27f56312580..6ba344dd692 100644 --- a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/flat/flat.ts +++ b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/flat/flat.ts @@ -1,19 +1,19 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, EdgeConfig, Utils } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, EdgeConfig, Utils } from "src/app/shared/shared"; -import { ModalComponent } from '../modal/modal'; +import { ModalComponent } from "../modal/modal"; @Component({ - selector: 'Controller_Ess_GridOptimizedCharge', - templateUrl: './flat.html', + selector: "Controller_Ess_GridOptimizedCharge", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { public override component: EdgeConfig.Component | null = null; - public mode: string = '-'; - public state: string = '-'; + public mode: string = "-"; + public state: string = "-"; public isSellToGridLimitAvoided: boolean = false; public sellToGridLimitMinimumChargeLimit: boolean = false; public delayChargeMaximumChargeLimit: number | null = null; @@ -40,46 +40,46 @@ export class FlatComponent extends AbstractFlatWidget { ]; } protected override onCurrentData(currentData: CurrentData) { - this.mode = currentData.allComponents[this.component.id + '/_PropertyMode']; + this.mode = currentData.allComponents[this.component.id + "/_PropertyMode"]; // Check if Grid feed in limitation is avoided - if (currentData.allComponents[this.component.id + '/SellToGridLimitState'] == 0 || - (currentData.allComponents[this.component.id + '/SellToGridLimitState'] == 3 - && currentData.allComponents[this.component.id + '/DelayChargeState'] != 0 - && currentData.allComponents[this.component.id + '/SellToGridLimitMinimumChargeLimit'] > 0)) { + if (currentData.allComponents[this.component.id + "/SellToGridLimitState"] == 0 || + (currentData.allComponents[this.component.id + "/SellToGridLimitState"] == 3 + && currentData.allComponents[this.component.id + "/DelayChargeState"] != 0 + && currentData.allComponents[this.component.id + "/SellToGridLimitMinimumChargeLimit"] > 0)) { this.isSellToGridLimitAvoided = true; } - this.sellToGridLimitMinimumChargeLimit = currentData.allComponents[this.component.id + '/SellToGridLimitMinimumChargeLimit']; + this.sellToGridLimitMinimumChargeLimit = currentData.allComponents[this.component.id + "/SellToGridLimitMinimumChargeLimit"]; - switch (currentData.allComponents[this.component.id + '/DelayChargeState']) { + switch (currentData.allComponents[this.component.id + "/DelayChargeState"]) { case -1: - this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.notDefined'); + this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.notDefined"); break; case 0: - this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.chargeLimitActive'); + this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.chargeLimitActive"); break; case 1: - this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.passedEndTime'); + this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.passedEndTime"); break; case 2: - this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.storageAlreadyFull'); + this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.storageAlreadyFull"); break; case 3: - this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.endTimeNotCalculated'); + this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.endTimeNotCalculated"); break; case 4: - this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.noLimitPossible'); + this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.noLimitPossible"); break; case 5: case 7: - this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.noLimitActive'); + this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.noLimitActive"); break; - case 8: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.chargingDelayed'); + case 8: this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.chargingDelayed"); break; } - this.delayChargeMaximumChargeLimit = currentData.allComponents[this.component.id + '/DelayChargeMaximumChargeLimit']; + this.delayChargeMaximumChargeLimit = currentData.allComponents[this.component.id + "/DelayChargeMaximumChargeLimit"]; } } diff --git a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/modal.ts b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/modal.ts index 07343c6befa..c13073bbc2a 100644 --- a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/modal.ts +++ b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/modal.ts @@ -1,12 +1,12 @@ // @ts-strict-ignore -import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { AbstractModal } from 'src/app/shared/components/modal/abstractModal'; -import { ChannelAddress, CurrentData, Utils } from 'src/app/shared/shared'; -import { Role } from 'src/app/shared/type/role'; +import { ChangeDetectionStrategy, Component } from "@angular/core"; +import { FormControl, FormGroup, Validators } from "@angular/forms"; +import { AbstractModal } from "src/app/shared/components/modal/abstractModal"; +import { ChannelAddress, CurrentData, Utils } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; @Component({ - templateUrl: './modal.html', + templateUrl: "./modal.html", changeDetection: ChangeDetectionStrategy.OnPush, }) export class ModalComponent extends AbstractModal { @@ -19,7 +19,7 @@ export class ModalComponent extends AbstractModal { public readonly CONVERT_MINUTE_TO_TIME_OF_DAY = Utils.CONVERT_MINUTE_TO_TIME_OF_DAY(this.translate); public readonly CONVERT_TO_WATTHOURS = Utils.CONVERT_TO_WATTHOURS; public readonly DelayChargeState = DelayChargeState; - public state: string = ''; + public state: string = ""; public chargeLimit: { name: string, value: number }; public delayChargeState: number | null = null; public maximumSellToGridPower: number | null = null; @@ -33,9 +33,9 @@ export class ModalComponent extends AbstractModal { const channels: ChannelAddress[] = []; if (this.edge.roleIsAtLeast(Role.ADMIN)) { this.isAtLeastAdmin = true; - if ('ess.id' in this.component.properties) { + if ("ess.id" in this.component.properties) { channels.push( - new ChannelAddress(this.component.properties['ess.id'], "Capacity"), + new ChannelAddress(this.component.properties["ess.id"], "Capacity"), ); } } @@ -56,60 +56,60 @@ export class ModalComponent extends AbstractModal { protected override onCurrentData(currentData: CurrentData) { // If the gridfeed in Limit is avoided - if (currentData.allComponents[this.component.id + '/SellToGridLimitState'] == SellToGridLimitState.ACTIVE_LIMIT_FIXED || - (currentData.allComponents[this.component.id + '/SellToGridLimitState'] == SellToGridLimitState.ACTIVE_LIMIT_CONSTRAINT && - currentData.allComponents[this.component.id + '/DelayChargeState'] != DelayChargeState.ACTIVE_LIMIT && - currentData.allComponents[this.component.id + '/SellToGridLimitMinimumChargeLimit'] > 0)) { + if (currentData.allComponents[this.component.id + "/SellToGridLimitState"] == SellToGridLimitState.ACTIVE_LIMIT_FIXED || + (currentData.allComponents[this.component.id + "/SellToGridLimitState"] == SellToGridLimitState.ACTIVE_LIMIT_CONSTRAINT && + currentData.allComponents[this.component.id + "/DelayChargeState"] != DelayChargeState.ACTIVE_LIMIT && + currentData.allComponents[this.component.id + "/SellToGridLimitMinimumChargeLimit"] > 0)) { this.chargeLimit = { - name: this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.minimumCharge'), - value: currentData.allComponents[this.component.id + '/SellToGridLimitMinimumChargeLimit'], + name: this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.minimumCharge"), + value: currentData.allComponents[this.component.id + "/SellToGridLimitMinimumChargeLimit"], }; - this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.gridFeedInLimitationIsAvoided'); + this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.gridFeedInLimitationIsAvoided"); } else { // DelayCharge State - switch (currentData.allComponents[this.component.id + '/DelayChargeState']) { - case -1: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.notDefined'); + switch (currentData.allComponents[this.component.id + "/DelayChargeState"]) { + case -1: this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.notDefined"); break; - case 0: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.chargeLimitActive'); + case 0: this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.chargeLimitActive"); break; - case 1: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.passedEndTime'); + case 1: this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.passedEndTime"); break; - case 2: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.storageAlreadyFull'); + case 2: this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.storageAlreadyFull"); break; - case 3: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.endTimeNotCalculated'); + case 3: this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.endTimeNotCalculated"); break; - case 4: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.noLimitPossible'); + case 4: this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.noLimitPossible"); break; case 5: // Case 6: 'DISABLED' hides 'state-line', so no Message needed - case 7: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.State.noLimitActive'); + case 7: this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.State.noLimitActive"); break; - case 8: this.state = this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.chargingDelayed'); + case 8: this.state = this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.chargingDelayed"); break; } // DelayCharge Maximum Charge Limit - if (currentData.allComponents[this.component.id + '/DelayChargeMaximumChargeLimit'] != null) { + if (currentData.allComponents[this.component.id + "/DelayChargeMaximumChargeLimit"] != null) { this.chargeLimit = { - name: this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.maximumCharge'), - value: currentData.allComponents[this.component.id + '/DelayChargeMaximumChargeLimit'], + name: this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.maximumCharge"), + value: currentData.allComponents[this.component.id + "/DelayChargeMaximumChargeLimit"], }; } } - this.delayChargeState = currentData.allComponents[this.component.id + '/DelayChargeState']; + this.delayChargeState = currentData.allComponents[this.component.id + "/DelayChargeState"]; // Capacity (visible for admin only) - if (this.edge.roleIsAtLeast(Role.ADMIN) && 'ess.id' in this.component.properties) { - this.channelCapacity = currentData.allComponents[this.component.properties['ess.id'] + '/Capacity']; + if (this.edge.roleIsAtLeast(Role.ADMIN) && "ess.id" in this.component.properties) { + this.channelCapacity = currentData.allComponents[this.component.properties["ess.id"] + "/Capacity"]; } - this.maximumSellToGridPower = currentData.allComponents[this.component.id + '/_PropertyMaximumSellToGridPower']; - this.targetMinute = currentData.allComponents[this.component.id + '/TargetMinute']; - this.delayChargeMaximumChargeLimit = currentData.allComponents[this.component.id + '/DelayChargeMaximumChargeLimit']; - this.targetEpochSeconds = currentData.allComponents[this.component.id + '/TargetEpochSeconds']; - this.chargeStartEpochSeconds = currentData.allComponents[this.component.id + '/PredictedChargeStartEpochSeconds']; + this.maximumSellToGridPower = currentData.allComponents[this.component.id + "/_PropertyMaximumSellToGridPower"]; + this.targetMinute = currentData.allComponents[this.component.id + "/TargetMinute"]; + this.delayChargeMaximumChargeLimit = currentData.allComponents[this.component.id + "/DelayChargeMaximumChargeLimit"]; + this.targetEpochSeconds = currentData.allComponents[this.component.id + "/TargetEpochSeconds"]; + this.chargeStartEpochSeconds = currentData.allComponents[this.component.id + "/PredictedChargeStartEpochSeconds"]; } protected override getFormGroup(): FormGroup { @@ -117,7 +117,7 @@ export class ModalComponent extends AbstractModal { mode: new FormControl(this.component.properties.mode), sellToGridLimitEnabled: new FormControl(this.component.properties.sellToGridLimitEnabled), maximumSellToGridPower: new FormControl(this.component.properties.maximumSellToGridPower, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), delayChargeRiskLevel: new FormControl(this.component.properties.delayChargeRiskLevel), diff --git a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/predictionChart.ts b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/predictionChart.ts index f058c8b2480..15ff02bd65f 100644 --- a/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/predictionChart.ts +++ b/ui/src/app/edge/live/Controller/Ess/GridOptimizedCharge/modal/predictionChart.ts @@ -1,17 +1,17 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import { AbstractHistoryChart } from 'src/app/edge/history/abstracthistorychart'; -import { ChronoUnit, DEFAULT_TIME_CHART_OPTIONS } from 'src/app/edge/history/shared'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChartAxis, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from 'src/app/shared/shared'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import * as Chart from "chart.js"; +import { AbstractHistoryChart } from "src/app/edge/history/abstracthistorychart"; +import { ChronoUnit, DEFAULT_TIME_CHART_OPTIONS } from "src/app/edge/history/shared"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChartAxis, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from "src/app/shared/shared"; @Component({ - selector: 'predictionChart', - templateUrl: '../../../../../history/abstracthistorychart.html', + selector: "predictionChart", + templateUrl: "../../../../../history/abstracthistorychart.html", }) export class PredictionChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -37,7 +37,6 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On ngOnInit() { this.service.startSpinner(this.spinnerId); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -69,9 +68,9 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On startIndex = startIndex < 0 ? 0 : startIndex; // Calculate soc and predicted soc data - if ('_sum/EssSoc' in result.data) { + if ("_sum/EssSoc" in result.data) { - const socData = result.data['_sum/EssSoc'].map(value => { + const socData = result.data["_sum/EssSoc"].map(value => { if (value == null) { return null; } else if (value > 100 || value < 0) { @@ -152,7 +151,7 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On const chartEndIndex = targetIndex + 12; // Remove unimportant values that are after the end index - if (chartEndIndex < result.data['_sum/EssSoc'].length - 1) { + if (chartEndIndex < result.data["_sum/EssSoc"].length - 1) { socData.splice(chartEndIndex + 1, socData.length); predictedSocData.splice(chartEndIndex + 1, predictedSocData.length); result.timestamps.splice(chartEndIndex + 1, result.timestamps.length); @@ -175,12 +174,12 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On // Push the prepared data into the datasets datasets.push({ - label: this.translate.instant('General.soc'), + label: this.translate.instant("General.soc"), data: socData, hidden: false, yAxisID: ChartAxis.RIGHT, }, { - label: this.translate.instant('Edge.Index.Widgets.GridOptimizedCharge.expectedSoc'), + label: this.translate.instant("Edge.Index.Widgets.GridOptimizedCharge.expectedSoc"), data: predictedSocData, hidden: false, yAxisID: ChartAxis.RIGHT, @@ -188,19 +187,19 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On // Push the depending colors this.colors.push({ - backgroundColor: 'rgba(189, 195, 199,0.05)', - borderColor: 'rgba(189, 195, 199,1)', + backgroundColor: "rgba(189, 195, 199,0.05)", + borderColor: "rgba(189, 195, 199,1)", }, { - backgroundColor: 'rgba(0,223,0,0)', - borderColor: 'rgba(0,223,0,1)', + backgroundColor: "rgba(0,223,0,0)", + borderColor: "rgba(0,223,0,1)", }); } this.datasets = datasets; this.loading = false; this.service.stopSpinner(this.spinnerId); - this.unit = YAxisTitle.PERCENTAGE; - this.formatNumber = '1.0-0'; + this.unit = YAxisType.PERCENTAGE; + this.formatNumber = "1.0-0"; await this.setOptions(this.options); this.applyControllerSpecificOptions(); @@ -219,22 +218,22 @@ export class PredictionChartComponent extends AbstractHistoryChart implements On return new Promise((resolve) => { const result: ChannelAddress[] = [ - new ChannelAddress('_sum', 'EssSoc'), + new ChannelAddress("_sum", "EssSoc"), ]; if (this.component != null && this.component.id) { - result.push(new ChannelAddress(this.component.id, 'DelayChargeMaximumChargeLimit')); + result.push(new ChannelAddress(this.component.id, "DelayChargeMaximumChargeLimit")); } resolve(result); }); } private applyControllerSpecificOptions() { - this.options.scales[ChartAxis.LEFT]['position'] = 'right'; + this.options.scales[ChartAxis.LEFT]["position"] = "right"; this.options.scales.x.ticks.callback = function (value, index, values) { const date = new Date(value); // Display the label only if the minutes are zero (full hour) - return date.getMinutes() === 0 ? date.getHours() + ':00' : ''; + return date.getMinutes() === 0 ? date.getHours() + ":00" : ""; }; } diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff.ts index bb6eda0caa8..6757a7d7489 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff.ts @@ -26,7 +26,20 @@ import { ScheduleStateAndPriceChartComponent } from "./modal/statePriceChart"; FlatComponent, ], }) -export class Controller_Ess_TimeOfUseTariff { +export class Controller_Ess_TimeOfUseTariff { } + +export namespace Controller_Ess_TimeOfUseTariff { + + export type ScheduleChartData = { + datasets: ChartDataset[], + colors: any[], + labels: Date[] + }; + + export enum ControlMode { + CHARGE_CONSUMPTION = "CHARGE_CONSUMPTION", + DELAY_DISCHARGE = "DELAY_DISCHARGE", + } /** * Gets the schedule chart data containing datasets, colors and labels. @@ -41,7 +54,7 @@ export class Controller_Ess_TimeOfUseTariff { * @param controlMode The Control mode of the controller. * @returns The ScheduleChartData. */ - public static getScheduleChartData(size: number, prices: number[], states: number[], timestamps: string[], + export function getScheduleChartData(size: number, prices: number[], states: number[], timestamps: string[], gridBuy: number[], socArray: number[], translate: TranslateService, controlMode: Controller_Ess_TimeOfUseTariff.ControlMode): Controller_Ess_TimeOfUseTariff.ScheduleChartData { @@ -76,49 +89,49 @@ export class Controller_Ess_TimeOfUseTariff { // Set datasets datasets.push({ - type: 'bar', - label: translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING'), + type: "bar", + label: translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING"), data: barBalancing, order: 1, }); colors.push({ // Dark Green - backgroundColor: 'rgba(51,102,0,0.8)', - borderColor: 'rgba(51,102,0,1)', + backgroundColor: "rgba(51,102,0,0.8)", + borderColor: "rgba(51,102,0,1)", }); // Set dataset for ChargeGrid. if (!barChargeGrid.every(v => v === null) || controlMode == Controller_Ess_TimeOfUseTariff.ControlMode.CHARGE_CONSUMPTION) { datasets.push({ - type: 'bar', - label: translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID'), + type: "bar", + label: translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID"), data: barChargeGrid, order: 1, }); colors.push({ // Sky blue - backgroundColor: 'rgba(0, 204, 204,0.5)', - borderColor: 'rgba(0, 204, 204,0.7)', + backgroundColor: "rgba(0, 204, 204,0.5)", + borderColor: "rgba(0, 204, 204,0.7)", }); } // Set dataset for buy from grid datasets.push({ - type: 'bar', - label: translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE'), + type: "bar", + label: translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE"), data: barDelayDischarge, order: 1, }); colors.push({ // Black - backgroundColor: 'rgba(0,0,0,0.8)', - borderColor: 'rgba(0,0,0,0.9)', + backgroundColor: "rgba(0,0,0,0.8)", + borderColor: "rgba(0,0,0,0.9)", }); // State of charge data datasets.push({ - type: 'line', - label: translate.instant('General.soc'), + type: "line", + label: translate.instant("General.soc"), data: socArray, hidden: false, yAxisID: ChartAxis.RIGHT, @@ -126,21 +139,21 @@ export class Controller_Ess_TimeOfUseTariff { order: 0, }); colors.push({ - backgroundColor: 'rgba(189, 195, 199,0.2)', - borderColor: 'rgba(189, 195, 199,1)', + backgroundColor: "rgba(189, 195, 199,0.2)", + borderColor: "rgba(189, 195, 199,1)", }); datasets.push({ - type: 'line', - label: translate.instant('General.gridBuy'), + type: "line", + label: translate.instant("General.gridBuy"), data: gridBuy.map(v => Utils.divideSafely(v, 1000)), // [W] to [kW] hidden: true, yAxisID: ChartAxis.RIGHT_2, order: 2, }); colors.push({ - backgroundColor: 'rgba(0,0,0, 0.2)', - borderColor: 'rgba(0,0,0, 1)', + backgroundColor: "rgba(0,0,0, 0.2)", + borderColor: "rgba(0,0,0, 1)", }); const scheduleChartData: Controller_Ess_TimeOfUseTariff.ScheduleChartData = { @@ -152,16 +165,3 @@ export class Controller_Ess_TimeOfUseTariff { return scheduleChartData; } } - -export namespace Controller_Ess_TimeOfUseTariff { - export type ScheduleChartData = { - datasets: ChartDataset[], - colors: any[], - labels: Date[] - }; - - export enum ControlMode { - CHARGE_CONSUMPTION = 'CHARGE_CONSUMPTION', - DELAY_DISCHARGE = 'DELAY_DISCHARGE', - } -} diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.html b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.html index 4c9a749c8f7..25962cb6b4a 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.html +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.html @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.ts index fc6f09c6b4b..66bbb03f543 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/flat/flat.ts @@ -1,12 +1,12 @@ -import { Component, OnInit } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, Currency, CurrentData, Utils } from 'src/app/shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, Currency, CurrentData, Utils } from "src/app/shared/shared"; -import { ModalComponent } from '../modal/modal'; +import { ModalComponent } from "../modal/modal"; @Component({ - selector: 'Controller_Ess_TimeOfUseTariff', - templateUrl: './flat.html', + selector: "Controller_Ess_TimeOfUseTariff", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget implements OnInit { @@ -27,12 +27,12 @@ export class FlatComponent extends AbstractFlatWidget implements OnInit { protected override getChannelAddresses(): ChannelAddress[] { return [ - new ChannelAddress(this.component.id, 'QuarterlyPrices'), + new ChannelAddress(this.component.id, "QuarterlyPrices"), ]; } protected override onCurrentData(currentData: CurrentData): void { - const quarterlyPrice = currentData.allComponents[this.component.id + '/QuarterlyPrices']; + const quarterlyPrice = currentData.allComponents[this.component.id + "/QuarterlyPrices"]; const currencyLabel: string = Currency.getCurrencyLabelByEdgeId(this.edge.id); this.priceWithCurrency = Utils.CONVERT_PRICE_TO_CENT_PER_KWH(2, currencyLabel)(quarterlyPrice); } diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/modal.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/modal.ts index b4a182fd769..54ccfba47cb 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/modal.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/modal.ts @@ -1,12 +1,12 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { AbstractModal } from 'src/app/shared/components/modal/abstractModal'; -import { ChannelAddress, Currency, CurrentData } from 'src/app/shared/shared'; -import { Controller_Ess_TimeOfUseTariff } from '../Ess_TimeOfUseTariff'; +import { Component } from "@angular/core"; +import { FormControl, FormGroup } from "@angular/forms"; +import { AbstractModal } from "src/app/shared/components/modal/abstractModal"; +import { ChannelAddress, Currency, CurrentData } from "src/app/shared/shared"; +import { Controller_Ess_TimeOfUseTariff } from "../Ess_TimeOfUseTariff"; @Component({ - templateUrl: './modal.html', + templateUrl: "./modal.html", }) export class ModalComponent extends AbstractModal { @@ -23,25 +23,25 @@ export class ModalComponent extends AbstractModal { protected override getChannelAddresses(): ChannelAddress[] { return [ - new ChannelAddress(this.component.id, 'QuarterlyPrices'), + new ChannelAddress(this.component.id, "QuarterlyPrices"), ]; } protected override onIsInitialized(): void { this.subscription.add( - this.formGroup?.get('chargeConsumptionIsActive') + this.formGroup?.get("chargeConsumptionIsActive") .valueChanges .subscribe(isActive => { const controlMode: Controller_Ess_TimeOfUseTariff.ControlMode = isActive ? Controller_Ess_TimeOfUseTariff.ControlMode.CHARGE_CONSUMPTION : Controller_Ess_TimeOfUseTariff.ControlMode.DELAY_DISCHARGE; - this.formGroup.controls['controlMode'].setValue(controlMode); - this.formGroup.controls['controlMode'].markAsDirty(); + this.formGroup.controls["controlMode"].setValue(controlMode); + this.formGroup.controls["controlMode"].markAsDirty(); })); } protected override onCurrentData(currentData: CurrentData): void { - const quarterlyPrice = currentData.allComponents[this.component.id + '/QuarterlyPrices']; + const quarterlyPrice = currentData.allComponents[this.component.id + "/QuarterlyPrices"]; const currencyLabel: string = Currency.getCurrencyLabelByEdgeId(this.edge?.id); this.priceWithCurrency = this.Utils.CONVERT_PRICE_TO_CENT_PER_KWH(2, currencyLabel)(quarterlyPrice); } diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts index 1c646bf9601..61e457c6d86 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts @@ -1,21 +1,20 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import { AbstractHistoryChart } from 'src/app/edge/history/abstracthistorychart'; -import { AbstractHistoryChart as NewAbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { ChartAxis, HistoryUtils, TimeOfUseTariffUtils, Utils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; - -import { ChartConstants } from 'src/app/shared/components/chart/chart.constants'; -import { GetScheduleRequest } from '../../../../../../shared/jsonrpc/request/getScheduleRequest'; -import { GetScheduleResponse } from '../../../../../../shared/jsonrpc/response/getScheduleResponse'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import * as Chart from "chart.js"; +import { AbstractHistoryChart } from "src/app/edge/history/abstracthistorychart"; +import { AbstractHistoryChart as NewAbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { ChartConstants } from "src/app/shared/components/chart/chart.constants"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { ChartAxis, HistoryUtils, TimeOfUseTariffUtils, Utils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, Edge, EdgeConfig, Service, Websocket } from "src/app/shared/shared"; +import { GetScheduleRequest } from "../../../../../../shared/jsonrpc/request/getScheduleRequest"; +import { GetScheduleResponse } from "../../../../../../shared/jsonrpc/response/getScheduleResponse"; @Component({ - selector: 'powerSocChart', - templateUrl: '../../../../../history/abstracthistorychart.html', + selector: "powerSocChart", + templateUrl: "../../../../../history/abstracthistorychart.html", }) export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -39,7 +38,6 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl public ngOnInit() { this.service.startSpinner(this.spinnerId); - this.service.setCurrentComponent('', this.route); } public ngOnDestroy() { @@ -53,12 +51,18 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl protected setLabel() { this.options = this.createDefaultChartOptions(); const translate = this.translate; - this.options.plugins.tooltip.callbacks.label = function (item: Chart.TooltipItem) { - - const label = item.dataset.label; - const value = item.dataset.data[item.dataIndex]; - - return TimeOfUseTariffUtils.getLabel(value, label, translate); + this.options.plugins = { + tooltip: { + callbacks: { + label: function (item: Chart.TooltipItem) { + + const label = item.dataset.label; + const value = item.dataset.data[item.dataIndex]; + + return TimeOfUseTariffUtils.getLabel(value, label, translate); + }, + }, + }, }; } @@ -93,93 +97,93 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl }; datasets.push({ - type: 'line', - label: this.translate.instant('General.gridBuy'), + type: "line", + label: this.translate.instant("General.gridBuy"), data: gridBuyArray.map(v => Utils.divideSafely(v, 1000)), // [W] to [kW] hidden: true, order: 1, }); this.colors.push({ - backgroundColor: 'rgba(0,0,0, 0.2)', - borderColor: 'rgba(0,0,0, 1)', + backgroundColor: "rgba(0,0,0, 0.2)", + borderColor: "rgba(0,0,0, 1)", }); datasets.push({ - type: 'line', - label: this.translate.instant('General.gridSell'), + type: "line", + label: this.translate.instant("General.gridSell"), data: gridSellArray.map(v => Utils.divideSafely(v, 1000)), // [W] to [kW] hidden: true, order: 1, }); this.colors.push({ - backgroundColor: 'rgba(0,0,200, 0.2)', - borderColor: 'rgba(0,0,200, 1)', + backgroundColor: "rgba(0,0,200, 0.2)", + borderColor: "rgba(0,0,200, 1)", }); datasets.push({ - type: 'line', - label: this.translate.instant('General.production'), + type: "line", + label: this.translate.instant("General.production"), data: productionArray.map(v => Utils.divideSafely(v, 1000)), // [W] to [kW] hidden: false, order: 1, }); this.colors.push({ - backgroundColor: 'rgba(45,143,171, 0.2)', - borderColor: 'rgba(45,143,171, 1)', + backgroundColor: "rgba(45,143,171, 0.2)", + borderColor: "rgba(45,143,171, 1)", }); datasets.push({ - type: 'line', - label: this.translate.instant('General.consumption'), + type: "line", + label: this.translate.instant("General.consumption"), data: consumptionArray.map(v => Utils.divideSafely(v, 1000)), // [W] to [kW] hidden: false, order: 1, }); this.colors.push({ - backgroundColor: 'rgba(253,197,7,0.2)', - borderColor: 'rgba(253,197,7,1)', + backgroundColor: "rgba(253,197,7,0.2)", + borderColor: "rgba(253,197,7,1)", }); datasets.push({ - type: 'line', - label: this.translate.instant('General.chargePower'), + type: "line", + label: this.translate.instant("General.chargePower"), data: essChargeArray.map(v => Utils.divideSafely(v, 1000)), // [W] to [kW] hidden: true, order: 1, - unit: YAxisTitle.POWER, + unit: YAxisType.POWER, }); this.colors.push({ - backgroundColor: 'rgba(0,223,0, 0.2)', - borderColor: 'rgba(0,223,0, 1)', + backgroundColor: "rgba(0,223,0, 0.2)", + borderColor: "rgba(0,223,0, 1)", }); datasets.push({ - type: 'line', - label: this.translate.instant('General.dischargePower'), + type: "line", + label: this.translate.instant("General.dischargePower"), data: essDischargeArray.map(v => Utils.divideSafely(v, 1000)), // [W] to [kW] hidden: true, order: 1, - unit: YAxisTitle.POWER, + unit: YAxisType.POWER, }); this.colors.push({ - backgroundColor: 'rgba(200,0,0, 0.2)', - borderColor: 'rgba(200,0,0, 1)', + backgroundColor: "rgba(200,0,0, 0.2)", + borderColor: "rgba(200,0,0, 1)", }); // State of charge data datasets.push({ - type: 'line', - label: this.translate.instant('General.soc'), + type: "line", + label: this.translate.instant("General.soc"), data: socArray, hidden: false, yAxisID: ChartAxis.RIGHT, borderDash: [10, 10], order: 1, - unit: YAxisTitle.PERCENTAGE, + unit: YAxisType.PERCENTAGE, }); this.colors.push({ - backgroundColor: 'rgba(189, 195, 199,0.2)', - borderColor: 'rgba(189, 195, 199,1)', + backgroundColor: "rgba(189, 195, 199,0.2)", + borderColor: "rgba(189, 195, 199,1)", }); this.datasets = datasets; @@ -198,28 +202,28 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl } private applyControllerSpecificOptions() { - const rightYAxis: HistoryUtils.yAxes = { position: 'right', unit: YAxisTitle.PERCENTAGE, yAxisId: ChartAxis.RIGHT }; - const leftYAxis: HistoryUtils.yAxes = { position: 'left', unit: YAxisTitle.POWER, yAxisId: ChartAxis.LEFT }; + const rightYAxis: HistoryUtils.yAxes = { position: "right", unit: YAxisType.PERCENTAGE, yAxisId: ChartAxis.RIGHT }; + const leftYAxis: HistoryUtils.yAxes = { position: "left", unit: YAxisType.POWER, yAxisId: ChartAxis.LEFT }; const locale = this.service.translate.currentLang; - this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYAxis, this.translate, 'line', locale, ChartConstants.EMPTY_DATASETS, true); - this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, leftYAxis, this.translate, 'line', locale, ChartConstants.EMPTY_DATASETS, true); + this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYAxis, this.translate, "line", locale, ChartConstants.EMPTY_DATASETS, true); + this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, leftYAxis, this.translate, "line", locale, ChartConstants.EMPTY_DATASETS, true); this.datasets = this.datasets.map((el: Chart.ChartDataset) => { // align particular dataset element to right yAxis - if (el.label === this.translate.instant('General.soc')) { - el['yAxisID'] = ChartAxis.RIGHT; + if (el.label === this.translate.instant("General.soc")) { + el["yAxisID"] = ChartAxis.RIGHT; } return el; }); - this.options.scales.x['ticks'] = { source: 'auto', autoSkip: false }; + this.options.scales.x["ticks"] = { source: "auto", autoSkip: false }; this.options.scales.x.ticks.callback = function (value, index, values) { const date = new Date(value); // Display the label only if the minutes are zero (full hour) - return date.getMinutes() === 0 ? date.getHours() + ':00' : ''; + return date.getMinutes() === 0 ? date.getHours() + ":00" : ""; }; this.options.scales[ChartAxis.RIGHT].grid.display = false; diff --git a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts index 51737b33769..3e690c5828f 100644 --- a/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts +++ b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/statePriceChart.ts @@ -1,24 +1,24 @@ // @ts-strict-ignore -import { Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import { AbstractHistoryChart } from 'src/app/edge/history/abstracthistorychart'; -import { AbstractHistoryChart as NewAbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { ChartAxis, HistoryUtils, TimeOfUseTariffUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, Currency, Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; - -import { calculateResolution } from 'src/app/edge/history/shared'; -import { ColorUtils } from 'src/app/shared/utils/color/color.utils'; -import { GetScheduleRequest } from '../../../../../../shared/jsonrpc/request/getScheduleRequest'; -import { GetScheduleResponse } from '../../../../../../shared/jsonrpc/response/getScheduleResponse'; -import { Controller_Ess_TimeOfUseTariff } from '../Ess_TimeOfUseTariff'; -import { ChartConstants } from 'src/app/shared/components/chart/chart.constants'; +import { Component, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import * as Chart from "chart.js"; +import { AbstractHistoryChart } from "src/app/edge/history/abstracthistorychart"; +import { AbstractHistoryChart as NewAbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { ChartAxis, HistoryUtils, TimeOfUseTariffUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress, Currency, Edge, EdgeConfig, Service, Websocket } from "src/app/shared/shared"; + +import { calculateResolution } from "src/app/edge/history/shared"; +import { ChartConstants } from "src/app/shared/components/chart/chart.constants"; +import { ColorUtils } from "src/app/shared/utils/color/color.utils"; +import { GetScheduleRequest } from "../../../../../../shared/jsonrpc/request/getScheduleRequest"; +import { GetScheduleResponse } from "../../../../../../shared/jsonrpc/response/getScheduleResponse"; +import { Controller_Ess_TimeOfUseTariff } from "../Ess_TimeOfUseTariff"; @Component({ - selector: 'statePriceChart', - templateUrl: '../../../../../history/abstracthistorychart.html', + selector: "statePriceChart", + templateUrl: "../../../../../history/abstracthistorychart.html", }) export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart implements OnInit, OnChanges, OnDestroy { @@ -48,7 +48,6 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im public ngOnInit() { this.service.startSpinner(this.spinnerId); - this.service.setCurrentComponent('', this.route); } public ngOnDestroy() { @@ -93,7 +92,7 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im return; }).finally(async () => { - this.unit = YAxisTitle.CURRENCY; + this.unit = YAxisType.CURRENCY; await this.setOptions(this.options); this.applyControllerSpecificOptions(); }); @@ -109,25 +108,25 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im private applyControllerSpecificOptions() { const locale = this.service.translate.currentLang; - const rightYaxisSoc: HistoryUtils.yAxes = { position: 'right', unit: YAxisTitle.PERCENTAGE, yAxisId: ChartAxis.RIGHT }; - this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYaxisSoc, this.translate, 'line', locale, ChartConstants.EMPTY_DATASETS); + const rightYaxisSoc: HistoryUtils.yAxes = { position: "right", unit: YAxisType.PERCENTAGE, yAxisId: ChartAxis.RIGHT }; + this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYaxisSoc, this.translate, "line", locale, ChartConstants.EMPTY_DATASETS); - const rightYAxisPower: HistoryUtils.yAxes = { position: 'right', unit: YAxisTitle.POWER, yAxisId: ChartAxis.RIGHT_2 }; - this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYAxisPower, this.translate, 'line', locale, ChartConstants.EMPTY_DATASETS); + const rightYAxisPower: HistoryUtils.yAxes = { position: "right", unit: YAxisType.POWER, yAxisId: ChartAxis.RIGHT_2 }; + this.options = NewAbstractHistoryChart.getYAxisOptions(this.options, rightYAxisPower, this.translate, "line", locale, ChartConstants.EMPTY_DATASETS); - this.options.scales.x['time'].unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).timeFormat; - this.options.scales.x['ticks'] = { source: 'auto', autoSkip: false }; + this.options.scales.x["time"].unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).timeFormat; + this.options.scales.x["ticks"] = { source: "auto", autoSkip: false }; this.options.scales.x.ticks.maxTicksLimit = 30; - this.options.scales.x['offset'] = false; + this.options.scales.x["offset"] = false; this.options.scales.x.ticks.callback = function (value) { const date = new Date(value); // Display the label only if the minutes are zero (full hour) - return date.getMinutes() === 0 ? date.getHours() + ':00' : ''; + return date.getMinutes() === 0 ? date.getHours() + ":00" : ""; }; // options.plugins. - this.options.plugins.tooltip.mode = 'index'; + this.options.plugins.tooltip.mode = "index"; this.options.plugins.tooltip.callbacks.labelColor = (item: Chart.TooltipItem) => { if (!item) { return; @@ -147,7 +146,7 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im }; this.datasets = this.datasets.map((el) => { - const opacity = el.type === 'line' ? 0.2 : 0.5; + const opacity = el.type === "line" ? 0.2 : 0.5; if (el.backgroundColor && el.borderColor) { el.backgroundColor = ColorUtils.changeOpacityFromRGBA(el.backgroundColor.toString(), opacity); @@ -159,21 +158,21 @@ export class ScheduleStateAndPriceChartComponent extends AbstractHistoryChart im this.datasets = this.datasets.map((el: Chart.ChartDataset) => { // align particular dataset element to right yAxis - if (el.label == this.translate.instant('General.gridBuy')) { - el['yAxisID'] = ChartAxis.RIGHT_2; - } else if (el.label == this.translate.instant('General.soc')) { - el['yAxisID'] = ChartAxis.RIGHT; + if (el.label == this.translate.instant("General.gridBuy")) { + el["yAxisID"] = ChartAxis.RIGHT_2; + } else if (el.label == this.translate.instant("General.soc")) { + el["yAxisID"] = ChartAxis.RIGHT; } return el; }); - this.options.scales[ChartAxis.LEFT]['title'].text = this.currencyLabel; + this.options.scales[ChartAxis.LEFT]["title"].text = this.currencyLabel; this.options.scales[ChartAxis.RIGHT].grid.display = false; this.options.scales[ChartAxis.RIGHT_2].suggestedMin = 0; this.options.scales[ChartAxis.RIGHT_2].suggestedMax = 1; this.options.scales[ChartAxis.RIGHT_2].grid.display = false; - this.options['animation'] = false; + this.options["animation"] = false; } } diff --git a/ui/src/app/edge/live/Controller/Evcs/Evcs.ts b/ui/src/app/edge/live/Controller/Evcs/Evcs.ts index 6a2568a03c5..89fd473682e 100644 --- a/ui/src/app/edge/live/Controller/Evcs/Evcs.ts +++ b/ui/src/app/edge/live/Controller/Evcs/Evcs.ts @@ -1,9 +1,9 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { FlatComponent } from './flat/flat'; -import { ModalComponent } from './modal/modal'; -import { PopoverComponent } from './popover/popover'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { FlatComponent } from "./flat/flat"; +import { ModalComponent } from "./modal/modal"; +import { PopoverComponent } from "./popover/popover"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.html b/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.html index ac292531413..6d2c10d1903 100644 --- a/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.html +++ b/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.html @@ -32,4 +32,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.ts b/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.ts index 9b2d74b6c55..3e38be561f1 100644 --- a/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.ts +++ b/ui/src/app/edge/live/Controller/Evcs/administration/administration.component.ts @@ -1,12 +1,12 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, EdgeConfig, Service, Websocket } from '../../../../../shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, EdgeConfig, Service, Websocket } from "../../../../../shared/shared"; @Component({ selector: AdministrationComponent.SELECTOR, - templateUrl: './administration.component.html', + templateUrl: "./administration.component.html", }) export class AdministrationComponent implements OnInit { @@ -27,16 +27,16 @@ export class AdministrationComponent implements OnInit { ) { } ngOnInit() { - if (this.evcsComponent.properties['minHwCurrent'] == 6000) { + if (this.evcsComponent.properties["minHwCurrent"] == 6000) { this.isCheckedZoe = false; - } else if (this.evcsComponent.properties['minHwCurrent'] == 10000) { + } else if (this.evcsComponent.properties["minHwCurrent"] == 10000) { this.isCheckedZoe = true; } } updateZoeMode(event: CustomEvent) { - let newValue = this.evcsComponent.properties['minHwCurrent']; - const oldValue = this.evcsComponent.properties['minHwCurrent']; + let newValue = this.evcsComponent.properties["minHwCurrent"]; + const oldValue = this.evcsComponent.properties["minHwCurrent"]; if (event.detail.checked == true) { newValue = 10000; @@ -46,13 +46,13 @@ export class AdministrationComponent implements OnInit { if (this.edge != null && oldValue != newValue) { this.edge.updateComponentConfig(this.websocket, this.evcsComponent.id, [ - { name: 'minHwCurrent', value: newValue }, + { name: "minHwCurrent", value: newValue }, ]).then(() => { this.evcsComponent.properties.minHwCurrent = newValue; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { this.evcsComponent.properties.minHwCurrent = oldValue; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason, "danger"); console.warn(reason); }); } diff --git a/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts b/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts index f4d3d8a38e9..ea589527b23 100644 --- a/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts +++ b/ui/src/app/edge/live/Controller/Evcs/flat/flat.ts @@ -1,17 +1,17 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChannelAddress, CurrentData, EdgeConfig, Utils } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChannelAddress, CurrentData, EdgeConfig, Utils } from "src/app/shared/shared"; -import { ModalComponent } from '../modal/modal'; +import { ModalComponent } from "../modal/modal"; -type ChargeMode = 'FORCE_CHARGE' | 'EXCESS_POWER' | 'OFF'; +type ChargeMode = "FORCE_CHARGE" | "EXCESS_POWER" | "OFF"; @Component({ - selector: 'Controller_Evcs', - templateUrl: './flat.html', + selector: "Controller_Evcs", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -29,7 +29,7 @@ export class FlatComponent extends AbstractFlatWidget { protected phases: number; protected maxChargingValue: number; protected energySessionLimit: number; - protected state: string = ''; + protected state: string = ""; protected minChargePower: number; protected maxChargePower: number; protected forceChargeMinPower: string; @@ -61,16 +61,16 @@ export class FlatComponent extends AbstractFlatWidget { protected override getChannelAddresses(): ChannelAddress[] { const result = [ - new ChannelAddress(this.component.id, 'ChargePower'), - new ChannelAddress(this.component.id, 'Phases'), - new ChannelAddress(this.component.id, 'Plug'), - new ChannelAddress(this.component.id, 'Status'), - new ChannelAddress(this.component.id, 'State'), - new ChannelAddress(this.component.id, 'EnergySession'), + new ChannelAddress(this.component.id, "ChargePower"), + new ChannelAddress(this.component.id, "Phases"), + new ChannelAddress(this.component.id, "Plug"), + new ChannelAddress(this.component.id, "Status"), + new ChannelAddress(this.component.id, "State"), + new ChannelAddress(this.component.id, "EnergySession"), // channels for modal component, subscribe here for better UX - new ChannelAddress(this.component.id, 'MinimumHardwarePower'), - new ChannelAddress(this.component.id, 'MaximumHardwarePower'), - new ChannelAddress(this.component.id, 'SetChargePowerLimit'), + new ChannelAddress(this.component.id, "MinimumHardwarePower"), + new ChannelAddress(this.component.id, "MaximumHardwarePower"), + new ChannelAddress(this.component.id, "SetChargePowerLimit"), ]; const controllers = this.config.getComponentsByFactory("Controller.Evcs"); @@ -78,7 +78,7 @@ export class FlatComponent extends AbstractFlatWidget { const properties = controller.properties; if ("evcs.id" in properties && properties["evcs.id"] === this.componentId) { this.controller = controller; - result.push(new ChannelAddress(controller.id, '_PropertyEnabledCharging')); + result.push(new ChannelAddress(controller.id, "_PropertyEnabledCharging")); } } return result; @@ -87,20 +87,20 @@ export class FlatComponent extends AbstractFlatWidget { protected override onCurrentData(currentData: CurrentData) { this.evcsComponent = this.config.getComponent(this.component.id); - this.isConnectionSuccessful = currentData.allComponents[this.component.id + '/State'] != 3 ? true : false; - this.status = this.getState(this.controller ? currentData.allComponents[this.controller.id + '/_PropertyEnabledCharging'] === 1 : null, currentData.allComponents[this.component.id + "/Status"], currentData.allComponents[this.component.id + "/Plug"]); + this.isConnectionSuccessful = currentData.allComponents[this.component.id + "/State"] != 3 ? true : false; + this.status = this.getState(this.controller ? currentData.allComponents[this.controller.id + "/_PropertyEnabledCharging"] === 1 : null, currentData.allComponents[this.component.id + "/Status"], currentData.allComponents[this.component.id + "/Plug"]); // Check if Energy since beginning is allowed - if (currentData.allComponents[this.component.id + '/ChargePower'] > 0 || currentData.allComponents[this.component.id + '/Status'] == 2 || currentData.allComponents[this.component.id + '/Status'] == 7) { + if (currentData.allComponents[this.component.id + "/ChargePower"] > 0 || currentData.allComponents[this.component.id + "/Status"] == 2 || currentData.allComponents[this.component.id + "/Status"] == 7) { this.isEnergySinceBeginningAllowed = true; } // Mode if (this.isChargingEnabled) { - if (this.chargeMode == 'FORCE_CHARGE') { - this.mode = this.translate.instant('General.manually'); - } else if (this.chargeMode == 'EXCESS_POWER') { - this.mode = this.translate.instant('Edge.Index.Widgets.EVCS.OptimizedChargeMode.shortName'); + if (this.chargeMode == "FORCE_CHARGE") { + this.mode = this.translate.instant("General.manually"); + } else if (this.chargeMode == "EXCESS_POWER") { + this.mode = this.translate.instant("Edge.Index.Widgets.EVCS.OptimizedChargeMode.shortName"); } } @@ -108,35 +108,35 @@ export class FlatComponent extends AbstractFlatWidget { if (this.controller) { // ChargeMode - this.chargeMode = this.controller.properties['chargeMode']; + this.chargeMode = this.controller.properties["chargeMode"]; // Check if Charging is enabled - this.isChargingEnabled = currentData.allComponents[this.controller.id + '/_PropertyEnabledCharging'] === 1 ? true : false; + this.isChargingEnabled = currentData.allComponents[this.controller.id + "/_PropertyEnabledCharging"] === 1 ? true : false; // DefaultChargeMinPower - this.defaultChargeMinPower = this.controller.properties['defaultChargeMinPower']; + this.defaultChargeMinPower = this.controller.properties["defaultChargeMinPower"]; // Prioritization this.prioritization = - this.controller.properties['priority'] in Prioritization - ? 'Edge.Index.Widgets.EVCS.OptimizedChargeMode.ChargingPriority.' + this.controller.properties['priority'].toLowerCase() - : ''; + this.controller.properties["priority"] in Prioritization + ? "Edge.Index.Widgets.EVCS.OptimizedChargeMode.ChargingPriority." + this.controller.properties["priority"].toLowerCase() + : ""; // MaxChargingValue if (this.phases) { - this.maxChargingValue = Utils.multiplySafely(this.controller.properties['forceChargeMinPower'], this.phases); + this.maxChargingValue = Utils.multiplySafely(this.controller.properties["forceChargeMinPower"], this.phases); } else { - this.maxChargingValue = Utils.multiplySafely(this.controller.properties['forceChargeMinPower'], 3); + this.maxChargingValue = Utils.multiplySafely(this.controller.properties["forceChargeMinPower"], 3); } // EnergySessionLimit - this.energySessionLimit = this.controller.properties['energySessionLimit']; + this.energySessionLimit = this.controller.properties["energySessionLimit"]; } // Phases - this.phases = currentData.allComponents[this.componentId + '/Phases']; + this.phases = currentData.allComponents[this.componentId + "/Phases"]; this.chargeDischargePower = Utils.convertChargeDischargePower(this.translate, currentData.allComponents[this.component.id + "/ChargePower"]); this.chargeTarget = Utils.CONVERT_TO_WATT(this.formatNumber(currentData.allComponents[this.component.id + "/SetChargePowerLimit"])); this.energySession = Utils.CONVERT_TO_WATT(currentData.allComponents[this.component.id + "/EnergySession"]); - this.minChargePower = this.formatNumber(currentData.allComponents[this.component.id + '/MinimumHardwarePower']); - this.maxChargePower = this.formatNumber(currentData.allComponents[this.component.id + '/MaximumHardwarePower']); + this.minChargePower = this.formatNumber(currentData.allComponents[this.component.id + "/MinimumHardwarePower"]); + this.maxChargePower = this.formatNumber(currentData.allComponents[this.component.id + "/MaximumHardwarePower"]); this.state = currentData.allComponents[this.component.id + "/Status"]; } @@ -149,34 +149,34 @@ export class FlatComponent extends AbstractFlatWidget { private getState(enabledCharging: boolean, state: number, plug: number): string { if (enabledCharging === false) { - return this.translate.instant('Edge.Index.Widgets.EVCS.chargingStationDeactivated'); + return this.translate.instant("Edge.Index.Widgets.EVCS.chargingStationDeactivated"); } if (plug == null) { if (state == null) { - return this.translate.instant('Edge.Index.Widgets.EVCS.notCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.notCharging"); } } else if (plug != ChargePlug.PLUGGED_ON_EVCS_AND_ON_EV_AND_LOCKED) { - return this.translate.instant('Edge.Index.Widgets.EVCS.cableNotConnected'); + return this.translate.instant("Edge.Index.Widgets.EVCS.cableNotConnected"); } switch (state) { case ChargeState.STARTING: - return this.translate.instant('Edge.Index.Widgets.EVCS.starting'); + return this.translate.instant("Edge.Index.Widgets.EVCS.starting"); case ChargeState.UNDEFINED: case ChargeState.ERROR: - return this.translate.instant('Edge.Index.Widgets.EVCS.error'); + return this.translate.instant("Edge.Index.Widgets.EVCS.error"); case ChargeState.READY_FOR_CHARGING: - return this.translate.instant('Edge.Index.Widgets.EVCS.readyForCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.readyForCharging"); case ChargeState.NOT_READY_FOR_CHARGING: - return this.translate.instant('Edge.Index.Widgets.EVCS.notReadyForCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.notReadyForCharging"); case ChargeState.AUTHORIZATION_REJECTED: - return this.translate.instant('Edge.Index.Widgets.EVCS.notCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.notCharging"); case ChargeState.CHARGING: - return this.translate.instant('Edge.Index.Widgets.EVCS.charging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.charging"); case ChargeState.ENERGY_LIMIT_REACHED: - return this.translate.instant('Edge.Index.Widgets.EVCS.chargeLimitReached'); + return this.translate.instant("Edge.Index.Widgets.EVCS.chargeLimitReached"); case ChargeState.CHARGING_FINISHED: - return this.translate.instant('Edge.Index.Widgets.EVCS.carFull'); + return this.translate.instant("Edge.Index.Widgets.EVCS.carFull"); } } diff --git a/ui/src/app/edge/live/Controller/Evcs/modal/modal.html b/ui/src/app/edge/live/Controller/Evcs/modal/modal.html index 8c8c836f943..da7866b9130 100644 --- a/ui/src/app/edge/live/Controller/Evcs/modal/modal.html +++ b/ui/src/app/edge/live/Controller/Evcs/modal/modal.html @@ -154,4 +154,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Evcs/modal/modal.ts b/ui/src/app/edge/live/Controller/Evcs/modal/modal.ts index 461ab9bdba5..0e92bbc6eda 100644 --- a/ui/src/app/edge/live/Controller/Evcs/modal/modal.ts +++ b/ui/src/app/edge/live/Controller/Evcs/modal/modal.ts @@ -1,18 +1,18 @@ // @ts-strict-ignore -import { ChangeDetectorRef, Component, Inject } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { ModalController, PopoverController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { AbstractModal } from 'src/app/shared/components/modal/abstractModal'; -import { ChannelAddress, CurrentData, EdgeConfig, Service, Utils, Websocket } from 'src/app/shared/shared'; +import { ChangeDetectorRef, Component, Inject } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { ModalController, PopoverController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractModal } from "src/app/shared/components/modal/abstractModal"; +import { ChannelAddress, CurrentData, EdgeConfig, Service, Utils, Websocket } from "src/app/shared/shared"; -import { AdministrationComponent } from '../administration/administration.component'; -import { PopoverComponent } from '../popover/popover'; +import { AdministrationComponent } from "../administration/administration.component"; +import { PopoverComponent } from "../popover/popover"; -type ChargeMode = 'FORCE_CHARGE' | 'EXCESS_POWER'; +type ChargeMode = "FORCE_CHARGE" | "EXCESS_POWER"; @Component({ - templateUrl: './modal.html', + templateUrl: "./modal.html", }) export class ModalComponent extends AbstractModal { @@ -21,11 +21,11 @@ export class ModalComponent extends AbstractModal { protected controller: EdgeConfig.Component; protected evcsComponent: EdgeConfig.Component; protected isConnectionSuccessful: boolean = false; - protected readonly emptyValue: string = '-'; + protected readonly emptyValue: string = "-"; protected status: string; protected chargePowerLimit: string; protected chargePower: { name: string; value: number; }; - protected state: string = ''; + protected state: string = ""; protected energySession: string; protected minChargePower: number; protected maxChargePower: number; @@ -59,12 +59,12 @@ export class ModalComponent extends AbstractModal { public static getHelpKey(factoryId: string): string { switch (factoryId) { - case 'Evcs.Keba.KeContact': - return 'EVCS_KEBA_KECONTACT'; - case 'Evcs.HardyBarth': - return 'EVCS_KEBA_KECONTACT'; - case 'Evcs.IesKeywattSingle': - return 'EVCS_OCPP_IESKEYWATTSINGLE'; + case "Evcs.Keba.KeContact": + return "EVCS_KEBA_KECONTACT"; + case "Evcs.HardyBarth": + return "EVCS_KEBA_KECONTACT"; + case "Evcs.IesKeywattSingle": + return "EVCS_OCPP_IESKEYWATTSINGLE"; default: return null; } @@ -74,7 +74,7 @@ export class ModalComponent extends AbstractModal { const popover = await this.popoverctrl.create({ component: PopoverComponent, componentProps: { - chargeMode: this.formGroup.controls['chargeMode'].value, + chargeMode: this.formGroup.controls["chargeMode"].value, }, }); return await popover.present(); @@ -104,23 +104,23 @@ export class ModalComponent extends AbstractModal { return [ // channels for modal component, subscribe here for better UX - new ChannelAddress(this.component.id, 'ChargePower'), - new ChannelAddress(this.component.id, 'Phases'), - new ChannelAddress(this.component.id, 'Plug'), - new ChannelAddress(this.component.id, 'Status'), - new ChannelAddress(this.component.id, 'State'), - new ChannelAddress(this.component.id, 'EnergySession'), - new ChannelAddress(this.component.id, 'MinimumHardwarePower'), - new ChannelAddress(this.component.id, 'MaximumHardwarePower'), - new ChannelAddress(this.component.id, 'SetChargePowerLimit'), - new ChannelAddress(this.controller?.id, '_PropertyChargeMode'), - new ChannelAddress(this.controller?.id, '_PropertyEnabledCharging'), - new ChannelAddress(this.controller?.id, '_PropertyDefaultChargeMinPower'), + new ChannelAddress(this.component.id, "ChargePower"), + new ChannelAddress(this.component.id, "Phases"), + new ChannelAddress(this.component.id, "Plug"), + new ChannelAddress(this.component.id, "Status"), + new ChannelAddress(this.component.id, "State"), + new ChannelAddress(this.component.id, "EnergySession"), + new ChannelAddress(this.component.id, "MinimumHardwarePower"), + new ChannelAddress(this.component.id, "MaximumHardwarePower"), + new ChannelAddress(this.component.id, "SetChargePowerLimit"), + new ChannelAddress(this.controller?.id, "_PropertyChargeMode"), + new ChannelAddress(this.controller?.id, "_PropertyEnabledCharging"), + new ChannelAddress(this.controller?.id, "_PropertyDefaultChargeMinPower"), ]; } protected override onCurrentData(currentData: CurrentData) { - this.isConnectionSuccessful = currentData.allComponents[this.component.id + '/State'] !== 3 ? true : false; + this.isConnectionSuccessful = currentData.allComponents[this.component.id + "/State"] !== 3 ? true : false; // Do not change values after touching formControls if (this.formGroup?.pristine) { this.status = this.getState(this.controller ? currentData.allComponents[this.controller.id + "/_PropertyEnabledCharging"] === 1 : null, currentData.allComponents[this.component.id + "/Status"], currentData.allComponents[this.component.id + "/Plug"]); @@ -128,58 +128,58 @@ export class ModalComponent extends AbstractModal { this.chargePowerLimit = Utils.CONVERT_TO_WATT(this.formatNumber(currentData.allComponents[this.component.id + "/SetChargePowerLimit"])); this.state = currentData.allComponents[this.component.id + "/Status"]; this.energySession = Utils.CONVERT_TO_WATTHOURS(currentData.allComponents[this.component.id + "/EnergySession"]); - this.minChargePower = this.formatNumber(currentData.allComponents[this.component.id + '/MinimumHardwarePower']); - this.maxChargePower = this.formatNumber(currentData.allComponents[this.component.id + '/MaximumHardwarePower']); - this.numberOfPhases = currentData.allComponents[this.component.id + '/Phases'] ? currentData.allComponents[this.component.id + '/Phases'] : 3; - this.defaultChargeMinPower = currentData.allComponents[this.controller?.id + '/_PropertyDefaultChargeMinPower']; + this.minChargePower = this.formatNumber(currentData.allComponents[this.component.id + "/MinimumHardwarePower"]); + this.maxChargePower = this.formatNumber(currentData.allComponents[this.component.id + "/MaximumHardwarePower"]); + this.numberOfPhases = currentData.allComponents[this.component.id + "/Phases"] ? currentData.allComponents[this.component.id + "/Phases"] : 3; + this.defaultChargeMinPower = currentData.allComponents[this.controller?.id + "/_PropertyDefaultChargeMinPower"]; } } protected override onIsInitialized(): void { - this.subscription.add(this.formGroup?.controls['energyLimit']?.valueChanges.subscribe(isEnergyLimit => { + this.subscription.add(this.formGroup?.controls["energyLimit"]?.valueChanges.subscribe(isEnergyLimit => { if (isEnergyLimit) { - if (this.formGroup.controls['energySessionLimit']?.value === 0) { - this.formGroup.controls['energySessionLimit'].setValue(20000); - this.formGroup.controls['energySessionLimit'].markAsDirty(); + if (this.formGroup.controls["energySessionLimit"]?.value === 0) { + this.formGroup.controls["energySessionLimit"].setValue(20000); + this.formGroup.controls["energySessionLimit"].markAsDirty(); } else { // energySessionLimit is already valid -> do nothing } } else { - this.formGroup.controls['energySessionLimit'].setValue(0); - this.formGroup.controls['energySessionLimit'].markAsDirty(); + this.formGroup.controls["energySessionLimit"].setValue(0); + this.formGroup.controls["energySessionLimit"].markAsDirty(); } })); - this.subscription.add(this.formGroup?.get('chargeMode').valueChanges.subscribe(chargeMode => { - if (chargeMode === 'OFF') { - this.formGroup.get('enabledCharging').setValue(false); - this.formGroup.get('chargeMode').markAsPristine(); // do not send chargeMode=OFF to Edge + this.subscription.add(this.formGroup?.get("chargeMode").valueChanges.subscribe(chargeMode => { + if (chargeMode === "OFF") { + this.formGroup.get("enabledCharging").setValue(false); + this.formGroup.get("chargeMode").markAsPristine(); // do not send chargeMode=OFF to Edge } else { - this.formGroup.get('enabledCharging').setValue(true); + this.formGroup.get("enabledCharging").setValue(true); } - this.formGroup.get('enabledCharging').markAsDirty(); + this.formGroup.get("enabledCharging").markAsDirty(); })); - this.subscription.add(this.formGroup?.get('minGuarantee').valueChanges.subscribe(minGuarantee => { + this.subscription.add(this.formGroup?.get("minGuarantee").valueChanges.subscribe(minGuarantee => { if (minGuarantee) { - this.formGroup.controls['defaultChargeMinPower'].setValue(1400 /* approx min power per phase */ * this.numberOfPhases); + this.formGroup.controls["defaultChargeMinPower"].setValue(1400 /* approx min power per phase */ * this.numberOfPhases); } else { - this.formGroup.controls['defaultChargeMinPower'].setValue(0); + this.formGroup.controls["defaultChargeMinPower"].setValue(0); } - this.formGroup.controls['defaultChargeMinPower'].markAsDirty(); + this.formGroup.controls["defaultChargeMinPower"].markAsDirty(); })); // Convert FormGroup value in kWh to Wh for Component config - this.subscription.add(this.formGroup?.get('energySessionLimitKwh').valueChanges.subscribe((newValue) => { - this.formGroup.controls['energySessionLimit'].setValue(newValue * 1000); - this.formGroup.controls['energySessionLimit'].markAsDirty(); - this.formGroup.controls['energySessionLimitKwh'].markAsPristine(); + this.subscription.add(this.formGroup?.get("energySessionLimitKwh").valueChanges.subscribe((newValue) => { + this.formGroup.controls["energySessionLimit"].setValue(newValue * 1000); + this.formGroup.controls["energySessionLimit"].markAsDirty(); + this.formGroup.controls["energySessionLimitKwh"].markAsPristine(); })); } protected override getFormGroup(): FormGroup { return this.formBuilder.group({ - chargeMode: new FormControl(this.controller?.properties.enabledCharging == false ? 'OFF' : this.controller?.properties.chargeMode), + chargeMode: new FormControl(this.controller?.properties.enabledCharging == false ? "OFF" : this.controller?.properties.chargeMode), energyLimit: new FormControl(this.controller?.properties.energySessionLimit > 0), minGuarantee: new FormControl(this.controller?.properties.defaultChargeMinPower > 0), defaultChargeMinPower: new FormControl(this.controller?.properties.defaultChargeMinPower), @@ -201,15 +201,15 @@ export class ModalComponent extends AbstractModal { protected updateForceMinPower(event: CustomEvent, currentController: EdgeConfig.Component, numberOfPhases: number) { const newMinChargePower = event.detail.value / numberOfPhases; - this.formGroup.controls['forceChargeMinPower'].markAsDirty(); - this.formGroup.controls['forceChargeMinPower'].setValue(newMinChargePower); + this.formGroup.controls["forceChargeMinPower"].markAsDirty(); + this.formGroup.controls["forceChargeMinPower"].setValue(newMinChargePower); } /** * Updates the MinChargePower for Renault Zoe Charging Mode if activated in administration component */ protected updateRenaultZoeConfig() { - if (this.controller && this.evcsComponent.properties['minHwCurrent'] == 10000) { + if (this.controller && this.evcsComponent.properties["minHwCurrent"] == 10000) { const oldMinChargePower = this.controller.properties.forceChargeMinPower; const maxAllowedChargePower = 10 /* Ampere */ * 230; /* Volt */ @@ -218,7 +218,7 @@ export class ModalComponent extends AbstractModal { if (this.edge != null) { const newMinChargePower = maxAllowedChargePower; this.edge.updateComponentConfig(this.websocket, this.controller.id, [ - { name: 'forceChargeMinPower', value: newMinChargePower }, + { name: "forceChargeMinPower", value: newMinChargePower }, ]).then(() => { this.controller.properties.forceChargeMinPower = newMinChargePower; }).catch(reason => { @@ -245,34 +245,34 @@ export class ModalComponent extends AbstractModal { private getState(enabledCharging: boolean, state: number, plug: number): string { if (enabledCharging === false) { - return this.translate.instant('Edge.Index.Widgets.EVCS.chargingStationDeactivated'); + return this.translate.instant("Edge.Index.Widgets.EVCS.chargingStationDeactivated"); } if (plug == null) { if (state == null) { - return this.translate.instant('Edge.Index.Widgets.EVCS.notCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.notCharging"); } } else if (plug != ChargePlug.PLUGGED_ON_EVCS_AND_ON_EV_AND_LOCKED) { - return this.translate.instant('Edge.Index.Widgets.EVCS.cableNotConnected'); + return this.translate.instant("Edge.Index.Widgets.EVCS.cableNotConnected"); } switch (state) { case ChargeState.STARTING: - return this.translate.instant('Edge.Index.Widgets.EVCS.starting'); + return this.translate.instant("Edge.Index.Widgets.EVCS.starting"); case ChargeState.UNDEFINED: case ChargeState.ERROR: - return this.translate.instant('Edge.Index.Widgets.EVCS.error'); + return this.translate.instant("Edge.Index.Widgets.EVCS.error"); case ChargeState.READY_FOR_CHARGING: - return this.translate.instant('Edge.Index.Widgets.EVCS.readyForCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.readyForCharging"); case ChargeState.NOT_READY_FOR_CHARGING: - return this.translate.instant('Edge.Index.Widgets.EVCS.notReadyForCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.notReadyForCharging"); case ChargeState.AUTHORIZATION_REJECTED: - return this.translate.instant('Edge.Index.Widgets.EVCS.notCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.notCharging"); case ChargeState.CHARGING: - return this.translate.instant('Edge.Index.Widgets.EVCS.charging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.charging"); case ChargeState.ENERGY_LIMIT_REACHED: - return this.translate.instant('Edge.Index.Widgets.EVCS.chargeLimitReached'); + return this.translate.instant("Edge.Index.Widgets.EVCS.chargeLimitReached"); case ChargeState.CHARGING_FINISHED: - return this.translate.instant('Edge.Index.Widgets.EVCS.carFull'); + return this.translate.instant("Edge.Index.Widgets.EVCS.carFull"); } } diff --git a/ui/src/app/edge/live/Controller/Evcs/popover/popover.html b/ui/src/app/edge/live/Controller/Evcs/popover/popover.html index 3e284d228be..428cef4b69a 100644 --- a/ui/src/app/edge/live/Controller/Evcs/popover/popover.html +++ b/ui/src/app/edge/live/Controller/Evcs/popover/popover.html @@ -26,4 +26,4 @@ style="text-align: center"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Evcs/popover/popover.ts b/ui/src/app/edge/live/Controller/Evcs/popover/popover.ts index 1d53c249443..718bdb5d868 100644 --- a/ui/src/app/edge/live/Controller/Evcs/popover/popover.ts +++ b/ui/src/app/edge/live/Controller/Evcs/popover/popover.ts @@ -1,10 +1,10 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractModal } from 'src/app/shared/components/modal/abstractModal'; +import { Component } from "@angular/core"; +import { AbstractModal } from "src/app/shared/components/modal/abstractModal"; -type ChargeMode = 'FORCE_CHARGE' | 'EXCESS_POWER' | 'OFF'; +type ChargeMode = "FORCE_CHARGE" | "EXCESS_POWER" | "OFF"; @Component({ - templateUrl: './popover.html', + templateUrl: "./popover.html", }) export class PopoverComponent extends AbstractModal { diff --git a/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold.ts b/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold.ts index 452e7643dec..bbed2715a18 100644 --- a/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold.ts +++ b/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, Utils } from 'src/app/shared/shared'; -import { Icon } from 'src/app/shared/type/widget'; -import { Controller_Io_ChannelSingleThresholdModalComponent } from './modal/modal.component'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, Utils } from "src/app/shared/shared"; +import { Icon } from "src/app/shared/type/widget"; +import { Controller_Io_ChannelSingleThresholdModalComponent } from "./modal/modal.component"; @Component({ - selector: 'Controller_Io_ChannelSingleThresholdComponent', - templateUrl: './Io_ChannelSingleThreshold.html', + selector: "Controller_Io_ChannelSingleThresholdComponent", + templateUrl: "./Io_ChannelSingleThreshold.html", }) export class Controller_Io_ChannelSingleThresholdComponent extends AbstractFlatWidget { @@ -17,9 +17,9 @@ export class Controller_Io_ChannelSingleThresholdComponent extends AbstractFlatW public mode: string; public modeValue: string; public icon: Icon = { - name: '', - color: '', - size: '', + name: "", + color: "", + size: "", }; public dependendOn: string; public dependendOnValue: any; @@ -47,7 +47,7 @@ export class Controller_Io_ChannelSingleThresholdComponent extends AbstractFlatW protected override afterIsInitialized(): void { this.inputChannel = ChannelAddress.fromString( - this.component.properties['inputChannelAddress']); + this.component.properties["inputChannelAddress"]); this.edge.getChannel(this.websocket, this.inputChannel) .then(channel => { @@ -56,8 +56,8 @@ export class Controller_Io_ChannelSingleThresholdComponent extends AbstractFlatW } protected override getChannelAddresses() { - const outputChannelAddress: string | string[] = this.component.properties['outputChannelAddress']; - if (typeof outputChannelAddress === 'string') { + const outputChannelAddress: string | string[] = this.component.properties["outputChannelAddress"]; + if (typeof outputChannelAddress === "string") { this.outputChannel = ChannelAddress.fromString(outputChannelAddress); } else { // Takes only the first output for simplicity reasons @@ -66,37 +66,37 @@ export class Controller_Io_ChannelSingleThresholdComponent extends AbstractFlatW return [ this.outputChannel, this.inputChannel, - ChannelAddress.fromString(this.component.id + '/_PropertyMode')]; + ChannelAddress.fromString(this.component.id + "/_PropertyMode")]; } protected override onCurrentData(currentData: CurrentData) { - this.switchValue = this.component.properties['threshold']; + this.switchValue = this.component.properties["threshold"]; // Icon, State this.outputChannelValue = currentData.allComponents[this.outputChannel.toString()]; switch (this.outputChannelValue) { case 0: - this.icon.name = 'radio-button-off-outline'; - this.state = this.translate.instant('General.off'); + this.icon.name = "radio-button-off-outline"; + this.state = this.translate.instant("General.off"); break; case 1: - this.icon.name = 'aperture-outline'; - this.state = this.translate.instant('General.on'); + this.icon.name = "aperture-outline"; + this.state = this.translate.instant("General.on"); break; } // Mode - this.modeValue = currentData.allComponents[this.component.id + '/_PropertyMode']; + this.modeValue = currentData.allComponents[this.component.id + "/_PropertyMode"]; switch (this.modeValue) { - case 'ON': - this.mode = this.translate.instant('General.on'); + case "ON": + this.mode = this.translate.instant("General.on"); break; - case 'OFF': - this.mode = this.translate.instant('General.off'); + case "OFF": + this.mode = this.translate.instant("General.off"); break; - case 'AUTOMATIC': - this.mode = this.translate.instant('General.automatic'); + case "AUTOMATIC": + this.mode = this.translate.instant("General.automatic"); } @@ -105,45 +105,45 @@ export class Controller_Io_ChannelSingleThresholdComponent extends AbstractFlatW // Set dependendOn Value for different inputChannel && Set the switchConverter and switchValue switch (this.inputChannel.toString()) { - case '_sum/EssSoc': - this.dependendOn = this.translate.instant('General.soc'); + case "_sum/EssSoc": + this.dependendOn = this.translate.instant("General.soc"); this.switchConverter = Utils.CONVERT_TO_PERCENT; break; - case '_sum/ProductionActivePower': - this.dependendOn = this.translate.instant('General.production'); + case "_sum/ProductionActivePower": + this.dependendOn = this.translate.instant("General.production"); break; - case '_sum/GridActivePower': + case "_sum/GridActivePower": if (this.component.properties.threshold < 0) { if (this.outputChannelValue == 0) { - this.switchValue = this.component.properties['threshold'] * -1; + this.switchValue = this.component.properties["threshold"] * -1; } else if (this.outputChannelValue == 1) { - this.switchValue = this.component.properties['threshold'] * -1 - this.component.properties['switchedLoadPower']; + this.switchValue = this.component.properties["threshold"] * -1 - this.component.properties["switchedLoadPower"]; } - this.dependendOn = this.translate.instant('General.gridSell'); + this.dependendOn = this.translate.instant("General.gridSell"); } else if (this.component.properties.threshold > 0) { if (this.outputChannelValue == 1) { - this.switchValue = this.component.properties['threshold'] - this.component.properties['switchedLoadPower']; + this.switchValue = this.component.properties["threshold"] - this.component.properties["switchedLoadPower"]; } - this.dependendOn = this.translate.instant('General.gridBuy'); + this.dependendOn = this.translate.instant("General.gridBuy"); } break; default: if (this.component.properties.threshold < 0) { - this.switchValue = Utils.multiplySafely(this.component.properties['threshold'], -1) - + this.unitOfInputChannel !== '' ? this.unitOfInputChannel : ''; + this.switchValue = Utils.multiplySafely(this.component.properties["threshold"], -1) + + this.unitOfInputChannel !== "" ? this.unitOfInputChannel : ""; } else if (this.component.properties.threshold > 0) { - this.switchValue += this.unitOfInputChannel !== '' ? this.unitOfInputChannel : ''; + this.switchValue += this.unitOfInputChannel !== "" ? this.unitOfInputChannel : ""; } - this.dependendOn = this.translate.instant('Edge.Index.Widgets.Singlethreshold.other') - + ' (' + this.component.properties.inputChannelAddress + ')'; + this.dependendOn = this.translate.instant("Edge.Index.Widgets.Singlethreshold.other") + + " (" + this.component.properties.inputChannelAddress + ")"; break; } // True when InputAddress doesnt match any of the following channelIds - this.isOtherInputAddress = this.inputChannel.toString() != (null && '_sum/EssSoc' && '_sum/GridActivePower' && '_sum/ProductionActivePower') ? false : true; + this.isOtherInputAddress = this.inputChannel.toString() != (null && "_sum/EssSoc" && "_sum/GridActivePower" && "_sum/ProductionActivePower") ? false : true; // Switch ON / OFF && BELOW / ABOVE // Threshold greater 0 @@ -152,17 +152,17 @@ export class Controller_Io_ChannelSingleThresholdComponent extends AbstractFlatW // Check if invert is false if (!this.component.properties.invert) { if (this.outputChannelValue == 0) { - this.switchState = this.translate.instant('Edge.Index.Widgets.Singlethreshold.switchOnAbove'); + this.switchState = this.translate.instant("Edge.Index.Widgets.Singlethreshold.switchOnAbove"); } else if (this.outputChannelValue == 1) { - this.switchState = this.translate.instant('Edge.Index.Widgets.Singlethreshold.switchOffBelow'); + this.switchState = this.translate.instant("Edge.Index.Widgets.Singlethreshold.switchOffBelow"); } // Check if invert is true } else if (this.component.properties.invert) { if (this.outputChannelValue == 0) { - this.switchState = this.translate.instant('Edge.Index.Widgets.Singlethreshold.switchOnBelow'); + this.switchState = this.translate.instant("Edge.Index.Widgets.Singlethreshold.switchOnBelow"); } else if (this.outputChannelValue == 1) { - this.switchState = this.translate.instant('Edge.Index.Widgets.Singlethreshold.switchOffAbove'); + this.switchState = this.translate.instant("Edge.Index.Widgets.Singlethreshold.switchOffAbove"); } } @@ -171,17 +171,17 @@ export class Controller_Io_ChannelSingleThresholdComponent extends AbstractFlatW // Check if invert is false if (!this.component.properties.invert) { if (this.outputChannelValue == 0) { - this.switchState = this.translate.instant('Edge.Index.Widgets.Singlethreshold.switchOnBelow'); + this.switchState = this.translate.instant("Edge.Index.Widgets.Singlethreshold.switchOnBelow"); } else if (this.outputChannelValue == 1) { - this.switchState = this.translate.instant('Edge.Index.Widgets.Singlethreshold.switchOffAbove'); + this.switchState = this.translate.instant("Edge.Index.Widgets.Singlethreshold.switchOffAbove"); } // Check if invert is true } else if (this.component.properties.invert) { if (this.outputChannelValue == 0) { - this.switchState = this.translate.instant('Edge.Index.Widgets.Singlethreshold.switchOnAbove'); + this.switchState = this.translate.instant("Edge.Index.Widgets.Singlethreshold.switchOnAbove"); } else if (this.outputChannelValue == 1) { - this.switchState = this.translate.instant('Edge.Index.Widgets.Singlethreshold.switchOffBelow'); + this.switchState = this.translate.instant("Edge.Index.Widgets.Singlethreshold.switchOffBelow"); } } } diff --git a/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/modal/modal.component.ts b/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/modal/modal.component.ts index a17e536b72a..738b4c396bc 100644 --- a/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/Io/ChannelSingleThreshold/modal/modal.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Component, Input, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { ChannelAddress, Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { ChannelAddress, Edge, EdgeConfig, Service, Websocket } from "src/app/shared/shared"; -type mode = 'ON' | 'AUTOMATIC' | 'OFF'; -type inputMode = 'SOC' | 'GRIDSELL' | 'GRIDBUY' | 'PRODUCTION' | 'OTHER'; +type mode = "ON" | "AUTOMATIC" | "OFF"; +type inputMode = "SOC" | "GRIDSELL" | "GRIDBUY" | "PRODUCTION" | "OTHER"; @Component({ - selector: 'Io_ChannelSingleThresholdModalComponent', - templateUrl: './modal.component.html', + selector: "Io_ChannelSingleThresholdModalComponent", + templateUrl: "./modal.component.html", }) export class Controller_Io_ChannelSingleThresholdModalComponent implements OnInit { @@ -44,26 +44,26 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni this.formGroup = this.formBuilder.group({ minimumSwitchingTime: new FormControl(this.component.properties.minimumSwitchingTime, Validators.compose([ Validators.min(5), - Validators.pattern('^[1-9][0-9]*$'), + Validators.pattern("^[1-9][0-9]*$"), Validators.required, ])), switchedLoadPower: new FormControl(this.component.properties.switchedLoadPower, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), - threshold: new FormControl(this.getInputMode() == 'GRIDSELL' ? this.component.properties.threshold * -1 : this.component.properties.threshold, Validators.compose([ + threshold: new FormControl(this.getInputMode() == "GRIDSELL" ? this.component.properties.threshold * -1 : this.component.properties.threshold, Validators.compose([ Validators.min(1), - Validators.pattern('^[1-9][0-9]*$'), + Validators.pattern("^[1-9][0-9]*$"), Validators.required, ])), inputMode: new FormControl(this.getInputMode()), invert: new FormControl(this.component.properties.invert, Validators.requiredTrue), }); - this.minimumSwitchingTime = this.formGroup.controls['minimumSwitchingTime']; - this.threshold = this.formGroup.controls['threshold']; - this.switchedLoadPower = this.formGroup.controls['switchedLoadPower']; - this.inputMode = this.formGroup.controls['inputMode']; - this.invert = this.formGroup.controls['invert']; + this.minimumSwitchingTime = this.formGroup.controls["minimumSwitchingTime"]; + this.threshold = this.formGroup.controls["threshold"]; + this.switchedLoadPower = this.formGroup.controls["switchedLoadPower"]; + this.inputMode = this.formGroup.controls["inputMode"]; + this.invert = this.formGroup.controls["invert"]; } public updateInputMode(event: CustomEvent) { @@ -71,7 +71,7 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni switch (event.detail.value) { case "SOC": - this.inputMode.setValue('SOC'); + this.inputMode.setValue("SOC"); this.switchedLoadPower.setValue(0); this.switchedLoadPower.markAsDirty(); if (Math.abs(this.component.properties.threshold) < 0 || Math.abs(this.component.properties.threshold) > 100) { @@ -84,12 +84,12 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni } break; case "GRIDSELL": - this.inputMode.setValue('GRIDSELL'); + this.inputMode.setValue("GRIDSELL"); this.threshold.markAsDirty(); this.switchedLoadPower.markAsDirty(); break; case "GRIDBUY": - this.inputMode.setValue('GRIDBUY'); + this.inputMode.setValue("GRIDBUY"); this.switchedLoadPower.markAsDirty(); if (this.component.properties.threshold < 0) { newThreshold = this.formGroup.value.threshold; @@ -98,7 +98,7 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni } break; case "PRODUCTION": - this.inputMode.setValue('PRODUCTION'); + this.inputMode.setValue("PRODUCTION"); this.switchedLoadPower.setValue(0); this.switchedLoadPower.markAsDirty(); if (this.component.properties.threshold < 0) { @@ -115,26 +115,26 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni let newMode: mode; switch (event.detail.value) { - case 'ON': - newMode = 'ON'; + case "ON": + newMode = "ON"; break; - case 'OFF': - newMode = 'OFF'; + case "OFF": + newMode = "OFF"; break; - case 'AUTOMATIC': - newMode = 'AUTOMATIC'; + case "AUTOMATIC": + newMode = "AUTOMATIC"; break; } if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, this.component.id, [ - { name: 'mode', value: newMode }, + { name: "mode", value: newMode }, ]).then(() => { this.component.properties.mode = newMode; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { this.component.properties.mode = oldMode; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -142,16 +142,16 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni public applyChanges(): void { if (this.edge != null) { - if (this.edge.roleIsAtLeast('owner')) { + if (this.edge.roleIsAtLeast("owner")) { if (this.minimumSwitchingTime.valid && this.threshold.valid && this.switchedLoadPower.valid) { if (this.threshold.value > this.switchedLoadPower.value) { const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { // catch inputMode and convert it to inputChannelAddress - if (Object.keys(this.formGroup.controls)[index] == 'inputMode') { - updateComponentArray.push({ name: 'inputChannelAddress', value: this.convertToChannelAddress(this.formGroup.controls[element].value) }); - } else if (this.inputMode.value == 'GRIDSELL' && Object.keys(this.formGroup.controls)[index] == 'threshold') { + if (Object.keys(this.formGroup.controls)[index] == "inputMode") { + updateComponentArray.push({ name: "inputChannelAddress", value: this.convertToChannelAddress(this.formGroup.controls[element].value) }); + } else if (this.inputMode.value == "GRIDSELL" && Object.keys(this.formGroup.controls)[index] == "threshold") { this.formGroup.controls[element].setValue(this.formGroup.controls[element].value * -1); updateComponentArray.push({ name: Object.keys(this.formGroup.controls)[index], value: this.formGroup.controls[element].value }); } else { @@ -162,12 +162,12 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni this.loading = true; this.edge.updateComponentConfig(this.websocket, this.component.id, updateComponentArray).then(() => { this.component.properties.minimumSwitchingTime = this.minimumSwitchingTime.value; - this.component.properties.threshold = this.inputMode.value == 'GRIDSELL' ? this.threshold.value * -1 : this.threshold.value; + this.component.properties.threshold = this.inputMode.value == "GRIDSELL" ? this.threshold.value * -1 : this.threshold.value; this.component.properties.switchedLoadPower = this.switchedLoadPower.value; this.component.properties.inputChannelAddress = this.convertToChannelAddress(this.inputMode.value) != this.component.properties.inputChannelAddress ? this.convertToChannelAddress(this.inputMode.value) : this.component.properties.inputChannelAddress; this.component.properties.invert = this.invert.value; this.loading = false; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { this.loading = false; this.minimumSwitchingTime.setValue(this.component.properties.minimumSwitchingTime); @@ -176,65 +176,67 @@ export class Controller_Io_ChannelSingleThresholdModalComponent implements OnIni this.inputMode.setValue(this.convertToInputMode(this.component.properties.inputChannelAddress, this.component.properties.threshold)); this.invert.setValue(this.component.properties.invert); this.loading = false; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); - if (this.inputMode.value == 'GRIDSELL') { + if (this.inputMode.value == "GRIDSELL") { if (this.inputMode.dirty || this.threshold.dirty) { this.threshold.setValue(this.threshold.value * -1); } } this.formGroup.markAsPristine(); } else { - this.service.toast(this.translate.instant('Edge.Index.Widgets.Singlethreshold.relationError'), 'danger'); + this.service.toast(this.translate.instant("Edge.Index.Widgets.Singlethreshold.relationError"), "danger"); } } else { - this.service.toast(this.translate.instant('General.inputNotValid'), 'danger'); + this.service.toast(this.translate.instant("General.inputNotValid"), "danger"); } } else { - this.service.toast(this.translate.instant('General.insufficientRights'), 'danger'); + this.service.toast(this.translate.instant("General.insufficientRights"), "danger"); } } } private getInputMode(): inputMode { - if (this.component.properties.inputChannelAddress == '_sum/GridActivePower' && this.component.properties.threshold < 0) { - return 'GRIDSELL'; - } else if (this.component.properties.inputChannelAddress == '_sum/GridActivePower' && this.component.properties.threshold > 0) { - return 'GRIDBUY'; - } else if (this.component.properties.inputChannelAddress == '_sum/ProductionActivePower') { - return 'PRODUCTION'; - } else if (this.component.properties.inputChannelAddress == '_sum/EssSoc') { - return 'SOC'; + if (this.component.properties.inputChannelAddress == "_sum/GridActivePower" && this.component.properties.threshold < 0) { + return "GRIDSELL"; + } else if (this.component.properties.inputChannelAddress == "_sum/GridActivePower" && this.component.properties.threshold > 0) { + return "GRIDBUY"; + } else if (this.component.properties.inputChannelAddress == "_sum/ProductionActivePower") { + return "PRODUCTION"; + } else if (this.component.properties.inputChannelAddress == "_sum/EssSoc") { + return "SOC"; } else if (this.component.properties.inputChannelAddress != null) { - return 'OTHER'; + return "OTHER"; } } - private convertToChannelAddress(inputMode: inputMode): string { + private convertToChannelAddress(inputMode: inputMode): string | null { switch (inputMode) { - case 'SOC': - return '_sum/EssSoc'; - case 'GRIDBUY': - return '_sum/GridActivePower'; - case 'GRIDSELL': - return '_sum/GridActivePower'; - case 'PRODUCTION': - return '_sum/ProductionActivePower'; + case "SOC": + return "_sum/EssSoc"; + case "GRIDBUY": + return "_sum/GridActivePower"; + case "GRIDSELL": + return "_sum/GridActivePower"; + case "PRODUCTION": + return "_sum/ProductionActivePower"; + default: + return null; } } private convertToInputMode(inputChannelAddress: string, threshold: number): inputMode { switch (inputChannelAddress) { - case '_sum/EssSoc': - return 'SOC'; - case '_sum/ProductionActivePower': - return 'PRODUCTION'; - case '_sum/GridActivePower': + case "_sum/EssSoc": + return "SOC"; + case "_sum/ProductionActivePower": + return "PRODUCTION"; + case "_sum/GridActivePower": if (threshold > 0) { - return 'GRIDBUY'; + return "GRIDBUY"; } else if (threshold < 0) { - return 'GRIDSELL'; + return "GRIDSELL"; } } } diff --git a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.html b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.html index b11e04690a6..6a40da4eee7 100644 --- a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.html +++ b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.html @@ -2,4 +2,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.ts b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.ts index 82f0d1ef04c..b45630af970 100644 --- a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.ts +++ b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/Io_FixDigitalOutput.ts @@ -1,17 +1,17 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData } from "src/app/shared/shared"; -import { Controller_Io_FixDigitalOutputModalComponent } from './modal/modal.component'; +import { Controller_Io_FixDigitalOutputModalComponent } from "./modal/modal.component"; @Component({ - selector: 'Controller_Io_FixDigitalOutput', - templateUrl: './Io_FixDigitalOutput.html', + selector: "Controller_Io_FixDigitalOutput", + templateUrl: "./Io_FixDigitalOutput.html", }) export class Controller_Io_FixDigitalOutputComponent extends AbstractFlatWidget { - public state: string = '-'; + public state: string = "-"; public outputChannel: string; async presentModal() { @@ -29,7 +29,7 @@ export class Controller_Io_FixDigitalOutputComponent extends AbstractFlatWidget } protected override getChannelAddresses(): ChannelAddress[] { - this.outputChannel = this.component.properties['outputChannelAddress']; + this.outputChannel = this.component.properties["outputChannelAddress"]; return [ChannelAddress.fromString(this.outputChannel)]; } @@ -37,9 +37,9 @@ export class Controller_Io_FixDigitalOutputComponent extends AbstractFlatWidget const channel = currentData.allComponents[this.outputChannel]; if (channel != null) { if (channel == 1) { - this.state = this.translate.instant('General.on'); + this.state = this.translate.instant("General.on"); } else if (channel == 0) { - this.state = this.translate.instant('General.off'); + this.state = this.translate.instant("General.off"); } } } diff --git a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.html b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.html index edbd3cb1964..2fd0e5ba02f 100644 --- a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.html +++ b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.html @@ -36,4 +36,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.ts b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.ts index b1564acb6da..ccc9dafd2b2 100644 --- a/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/Io/FixDigitalOutput/modal/modal.component.ts @@ -1,12 +1,12 @@ -import { Component, Input } from '@angular/core'; -import { Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; +import { Component, Input } from "@angular/core"; +import { Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, EdgeConfig, Service, Websocket } from "src/app/shared/shared"; @Component({ - selector: 'fixdigitaloutput-modal', - templateUrl: './modal.component.html', + selector: "fixdigitaloutput-modal", + templateUrl: "./modal.component.html", }) export class Controller_Io_FixDigitalOutputModalComponent { @@ -32,16 +32,16 @@ export class Controller_Io_FixDigitalOutputModalComponent { // ion-segment button only supports string as type // https://ionicframework.com/docs/v4/api/segment-button - const newMode = (event.detail.value.toLowerCase() === 'true'); + const newMode = (event.detail.value.toLowerCase() === "true"); this.edge.updateComponentConfig(this.websocket, this.component.id, [ - { name: 'isOn', value: newMode }, + { name: "isOn", value: newMode }, ]).then(() => { this.component.properties.isOn = newMode; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { this.component.properties.isOn = oldMode; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } diff --git a/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.html b/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.html index 3f6ebad1873..f2440c4a5d5 100644 --- a/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.html +++ b/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.html @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.ts b/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.ts index 1ae49e1b903..732c697cb1a 100644 --- a/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.ts +++ b/ui/src/app/edge/live/Controller/Io/HeatingElement/flat/flat.ts @@ -1,19 +1,19 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, Utils } from 'src/app/shared/shared'; -import { WorkMode } from 'src/app/shared/type/general'; +import { Component } from "@angular/core"; +import { BehaviorSubject } from "rxjs"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, Utils } from "src/app/shared/shared"; +import { WorkMode } from "src/app/shared/type/general"; -import { ModalComponent } from '../modal/modal'; +import { ModalComponent } from "../modal/modal"; @Component({ - selector: 'Controller_Io_HeatingElement', - templateUrl: './flat.html', + selector: "Controller_Io_HeatingElement", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { - private static PROPERTY_MODE: string = '_PropertyMode'; + private static PROPERTY_MODE: string = "_PropertyMode"; protected activePhases: BehaviorSubject = new BehaviorSubject(0); protected mode: string; @@ -38,39 +38,39 @@ export class FlatComponent extends AbstractFlatWidget { this.outputChannelArray.push( ChannelAddress.fromString( - this.component.properties['outputChannelPhaseL1']), + this.component.properties["outputChannelPhaseL1"]), ChannelAddress.fromString( - this.component.properties['outputChannelPhaseL2']), + this.component.properties["outputChannelPhaseL2"]), ChannelAddress.fromString( - this.component.properties['outputChannelPhaseL3']), + this.component.properties["outputChannelPhaseL3"]), ); const channelAddresses: ChannelAddress[] = [ - new ChannelAddress(this.component.id, 'ForceStartAtSecondsOfDay'), + new ChannelAddress(this.component.id, "ForceStartAtSecondsOfDay"), ...this.outputChannelArray, - new ChannelAddress(this.component.id, 'Status'), + new ChannelAddress(this.component.id, "Status"), new ChannelAddress(this.component.id, FlatComponent.PROPERTY_MODE), - new ChannelAddress(this.component.id, '_PropertyWorkMode'), + new ChannelAddress(this.component.id, "_PropertyWorkMode"), ]; return channelAddresses; } protected override onCurrentData(currentData: CurrentData) { - this.workMode = currentData.allComponents[this.component.id + '/' + '_PropertyWorkMode']; + this.workMode = currentData.allComponents[this.component.id + "/" + "_PropertyWorkMode"]; // get current mode - switch (currentData.allComponents[this.component.id + '/' + FlatComponent.PROPERTY_MODE]) { - case 'MANUAL_ON': { - this.mode = 'General.on'; + switch (currentData.allComponents[this.component.id + "/" + FlatComponent.PROPERTY_MODE]) { + case "MANUAL_ON": { + this.mode = "General.on"; break; } - case 'MANUAL_OFF': { - this.mode = 'General.off'; + case "MANUAL_OFF": { + this.mode = "General.off"; break; } - case 'AUTOMATIC': { - this.mode = 'General.automatic'; + case "AUTOMATIC": { + this.mode = "General.automatic"; break; } } @@ -86,17 +86,17 @@ export class FlatComponent extends AbstractFlatWidget { // Get current state this.activePhases.next(value); if (this.activePhases.value > 0) { - this.state = 'General.active'; + this.state = "General.active"; // Check forced heat // TODO: Use only Status if edge version is latest [2022.8] - this.runState = currentData.allComponents[this.component.id + '/' + 'Status']; + this.runState = currentData.allComponents[this.component.id + "/" + "Status"]; if (this.runState == Status.ActiveForced) { - this.state = 'Edge.Index.Widgets.Heatingelement.activeForced'; + this.state = "Edge.Index.Widgets.Heatingelement.activeForced"; } } else if (this.activePhases.value == 0) { - this.state = 'General.inactive'; + this.state = "General.inactive"; } } diff --git a/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.html b/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.html index f83d0dc6aef..3a8e729979e 100644 --- a/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.html +++ b/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.html @@ -75,4 +75,4 @@ [formGroup]="formGroup"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.ts b/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.ts index 193a683bf9b..8a9bd6ad535 100644 --- a/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.ts +++ b/ui/src/app/edge/live/Controller/Io/HeatingElement/modal/modal.ts @@ -1,18 +1,18 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup } from '@angular/forms'; -import { BehaviorSubject } from 'rxjs'; -import { AbstractModal } from 'src/app/shared/components/modal/abstractModal'; -import { ChannelAddress, CurrentData } from 'src/app/shared/shared'; -import { Mode, WorkMode } from 'src/app/shared/type/general'; +import { Component, OnInit } from "@angular/core"; +import { FormControl, FormGroup } from "@angular/forms"; +import { BehaviorSubject } from "rxjs"; +import { AbstractModal } from "src/app/shared/components/modal/abstractModal"; +import { ChannelAddress, CurrentData } from "src/app/shared/shared"; +import { Mode, WorkMode } from "src/app/shared/type/general"; @Component({ - selector: 'heatingelement-modal', - templateUrl: './modal.html', + selector: "heatingelement-modal", + templateUrl: "./modal.html", }) export class ModalComponent extends AbstractModal implements OnInit { - private static PROPERTY_MODE: string = '_PropertyMode'; + private static PROPERTY_MODE: string = "_PropertyMode"; protected activePhases: BehaviorSubject = new BehaviorSubject(0); protected mode: string; protected state: string; @@ -25,30 +25,30 @@ export class ModalComponent extends AbstractModal implements OnInit { // TODO remove when outputting of event is errorless possible switchAllowMinimumHeating(event: CustomEvent) { if (event.detail.checked == true) { - this.formGroup.controls['workMode'].setValue('TIME'); - this.formGroup.controls['workMode'].markAsDirty(); + this.formGroup.controls["workMode"].setValue("TIME"); + this.formGroup.controls["workMode"].markAsDirty(); } else if (event.detail.checked == false) { - this.formGroup.controls['workMode'].setValue('NONE'); - this.formGroup.controls['workMode'].markAsDirty(); + this.formGroup.controls["workMode"].setValue("NONE"); + this.formGroup.controls["workMode"].markAsDirty(); } } protected override getChannelAddresses(): ChannelAddress[] { const outputChannelPhaseOne = ChannelAddress.fromString( - this.component.properties['outputChannelPhaseL1']); + this.component.properties["outputChannelPhaseL1"]); const outputChannelPhaseTwo = ChannelAddress.fromString( - this.component.properties['outputChannelPhaseL2']); + this.component.properties["outputChannelPhaseL2"]); const outputChannelPhaseThree = ChannelAddress.fromString( - this.component.properties['outputChannelPhaseL3']); + this.component.properties["outputChannelPhaseL3"]); this.outputChannelArray = [outputChannelPhaseOne, outputChannelPhaseTwo, outputChannelPhaseThree]; const channelAddresses: ChannelAddress[] = [ - new ChannelAddress(this.component.id, 'ForceStartAtSecondsOfDay'), + new ChannelAddress(this.component.id, "ForceStartAtSecondsOfDay"), outputChannelPhaseOne, outputChannelPhaseTwo, outputChannelPhaseThree, new ChannelAddress(this.component.id, ModalComponent.PROPERTY_MODE), - new ChannelAddress(this.component.id, '_PropertyWorkMode'), + new ChannelAddress(this.component.id, "_PropertyWorkMode"), ]; return channelAddresses; } @@ -56,7 +56,7 @@ export class ModalComponent extends AbstractModal implements OnInit { protected override onCurrentData(currentData: CurrentData) { // get current mode - this.mode = currentData.allComponents[this.component.id + '/' + ModalComponent.PROPERTY_MODE]; + this.mode = currentData.allComponents[this.component.id + "/" + ModalComponent.PROPERTY_MODE]; let value = 0; this.outputChannelArray.forEach(element => { @@ -68,9 +68,9 @@ export class ModalComponent extends AbstractModal implements OnInit { // Get current state this.activePhases.next(value); if (this.activePhases.value > 0) { - this.state = this.translate.instant('General.active'); + this.state = this.translate.instant("General.active"); } else if (this.activePhases.value == 0) { - this.state = this.translate.instant('General.inactive'); + this.state = this.translate.instant("General.inactive"); } } diff --git a/ui/src/app/edge/live/Controller/Io/Heatpump/Io_Heatpump.html b/ui/src/app/edge/live/Controller/Io/Heatpump/Io_Heatpump.html index 95f97d5a51c..c0ade929d82 100644 --- a/ui/src/app/edge/live/Controller/Io/Heatpump/Io_Heatpump.html +++ b/ui/src/app/edge/live/Controller/Io/Heatpump/Io_Heatpump.html @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Io/Heatpump/Io_Heatpump.ts b/ui/src/app/edge/live/Controller/Io/Heatpump/Io_Heatpump.ts index 2d8ec32c161..3962850c043 100644 --- a/ui/src/app/edge/live/Controller/Io/Heatpump/Io_Heatpump.ts +++ b/ui/src/app/edge/live/Controller/Io/Heatpump/Io_Heatpump.ts @@ -1,18 +1,18 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, EdgeConfig } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { BehaviorSubject } from "rxjs"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, EdgeConfig } from "src/app/shared/shared"; -import { Controller_Io_HeatpumpModalComponent } from './modal/modal.component'; +import { Controller_Io_HeatpumpModalComponent } from "./modal/modal.component"; @Component({ - selector: 'Controller_Io_Heatpump', - templateUrl: './Io_Heatpump.html', + selector: "Controller_Io_Heatpump", + templateUrl: "./Io_Heatpump.html", }) export class Controller_Io_HeatpumpComponent extends AbstractFlatWidget { - private static PROPERTY_MODE: string = '_PropertyMode'; + private static PROPERTY_MODE: string = "_PropertyMode"; public override component: EdgeConfig.Component | null = null; public status: BehaviorSubject<{ name: string }> = new BehaviorSubject(null); @@ -39,42 +39,42 @@ export class Controller_Io_HeatpumpComponent extends AbstractFlatWidget { protected override getChannelAddresses() { return [ - new ChannelAddress(this.component.id, 'Status'), - new ChannelAddress(this.component.id, 'State'), + new ChannelAddress(this.component.id, "Status"), + new ChannelAddress(this.component.id, "State"), new ChannelAddress(this.component.id, Controller_Io_HeatpumpComponent.PROPERTY_MODE), ]; } protected override onCurrentData(currentData: CurrentData) { - this.isConnectionSuccessful = currentData.allComponents[this.componentId + '/State'] != 3 ? true : false; + this.isConnectionSuccessful = currentData.allComponents[this.componentId + "/State"] != 3 ? true : false; // Status - switch (currentData.allComponents[this.componentId + '/Status']) { + switch (currentData.allComponents[this.componentId + "/Status"]) { case -1: - this.statusValue = this.translate.instant('Edge.Index.Widgets.HeatPump.undefined'); + this.statusValue = this.translate.instant("Edge.Index.Widgets.HeatPump.undefined"); break; case 0: - this.statusValue = this.translate.instant('Edge.Index.Widgets.HeatPump.lock'); + this.statusValue = this.translate.instant("Edge.Index.Widgets.HeatPump.lock"); break; case 1: - this.statusValue = this.translate.instant('Edge.Index.Widgets.HeatPump.normalOperation'); + this.statusValue = this.translate.instant("Edge.Index.Widgets.HeatPump.normalOperation"); break; case 2: - this.statusValue = this.translate.instant('Edge.Index.Widgets.HeatPump.switchOnRec'); + this.statusValue = this.translate.instant("Edge.Index.Widgets.HeatPump.switchOnRec"); break; case 3: - this.statusValue = this.translate.instant('Edge.Index.Widgets.HeatPump.switchOnCom'); + this.statusValue = this.translate.instant("Edge.Index.Widgets.HeatPump.switchOnCom"); break; } // Mode - switch (currentData.allComponents[this.component.id + '/' + Controller_Io_HeatpumpComponent.PROPERTY_MODE]) { - case 'AUTOMATIC': { - this.mode = this.translate.instant('General.automatic'); + switch (currentData.allComponents[this.component.id + "/" + Controller_Io_HeatpumpComponent.PROPERTY_MODE]) { + case "AUTOMATIC": { + this.mode = this.translate.instant("General.automatic"); break; } - case 'MANUAL': { - this.mode = this.translate.instant('General.manually'); + case "MANUAL": { + this.mode = this.translate.instant("General.manually"); break; } } diff --git a/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.html b/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.html index eb3859cf803..59063fd023e 100644 --- a/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.html +++ b/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.html @@ -278,4 +278,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.ts b/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.ts index 0970982b294..d12d02ab21b 100644 --- a/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/Io/Heatpump/modal/modal.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Component, Input, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup } from "@angular/forms"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, EdgeConfig, Service, Websocket } from "src/app/shared/shared"; -type ManualMode = 'FORCE_ON' | 'RECOMMENDATION' | 'REGULAR' | 'LOCK'; -type AutomaticEnableMode = 'automaticRecommendationCtrlEnabled' | 'automaticForceOnCtrlEnabled' | 'automaticLockCtrlEnabled'; +type ManualMode = "FORCE_ON" | "RECOMMENDATION" | "REGULAR" | "LOCK"; +type AutomaticEnableMode = "automaticRecommendationCtrlEnabled" | "automaticForceOnCtrlEnabled" | "automaticLockCtrlEnabled"; @Component({ - selector: 'heatpump-modal', - templateUrl: './modal.component.html', + selector: "heatpump-modal", + templateUrl: "./modal.component.html", }) export class Controller_Io_HeatpumpModalComponent implements OnInit { @@ -46,19 +46,19 @@ export class Controller_Io_HeatpumpModalComponent implements OnInit { } public updateControllerMode(event: CustomEvent) { - const oldMode = this.component.properties['mode']; + const oldMode = this.component.properties["mode"]; const newMode = event.detail.value; if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, this.component.id, [ - { name: 'mode', value: newMode }, + { name: "mode", value: newMode }, ]).then(() => { this.component.properties.mode = newMode; this.formGroup.markAsPristine(); - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { this.component.properties.mode = oldMode; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -70,14 +70,14 @@ export class Controller_Io_HeatpumpModalComponent implements OnInit { } public updateManualMode(state: ManualMode) { - this.formGroup.controls['manualState'].setValue(state); - this.formGroup.controls['manualState'].markAsDirty(); + this.formGroup.controls["manualState"].setValue(state); + this.formGroup.controls["manualState"].markAsDirty(); } public applyChanges() { if (this.edge != null) { - if (this.edge.roleIsAtLeast('owner')) { - if (this.formGroup.controls['automaticRecommendationSurplusPower'].value < this.formGroup.controls['automaticForceOnSurplusPower'].value) { + if (this.edge.roleIsAtLeast("owner")) { + if (this.formGroup.controls["automaticRecommendationSurplusPower"].value < this.formGroup.controls["automaticForceOnSurplusPower"].value) { const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { @@ -87,20 +87,20 @@ export class Controller_Io_HeatpumpModalComponent implements OnInit { this.loading = true; this.edge.updateComponentConfig(this.websocket, this.component.id, updateComponentArray).then(() => { this.component.properties.manualState = this.formGroup.value.manualState; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); this.loading = false; }).catch(reason => { - this.formGroup.controls['minTime'].setValue(this.component.properties.manualState); - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason, 'danger'); + this.formGroup.controls["minTime"].setValue(this.component.properties.manualState); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason, "danger"); this.loading = false; console.warn(reason); }); this.formGroup.markAsPristine(); } else { - this.service.toast(this.translate.instant('Edge.Index.Widgets.HeatPump.relationError'), 'danger'); + this.service.toast(this.translate.instant("Edge.Index.Widgets.HeatPump.relationError"), "danger"); } } else { - this.service.toast(this.translate.instant('General.insufficientRights'), 'danger'); + this.service.toast(this.translate.instant("General.insufficientRights"), "danger"); } } } diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.html b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.html index c6780f64a77..9f457005bed 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.html +++ b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.html @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.ts b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.ts index 59bf0a579b8..569e45069ed 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/Asymmetric.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; +import { Component } from "@angular/core"; +import { BehaviorSubject } from "rxjs"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; -import { ChannelAddress, CurrentData, Utils } from '../../../../../shared/shared'; -import { Controller_Asymmetric_PeakShavingModalComponent } from './modal/modal.component'; +import { ChannelAddress, CurrentData, Utils } from "../../../../../shared/shared"; +import { Controller_Asymmetric_PeakShavingModalComponent } from "./modal/modal.component"; @Component({ - selector: 'Controller_Asymmetric_PeakShaving', - templateUrl: './Asymmetric.html', + selector: "Controller_Asymmetric_PeakShaving", + templateUrl: "./Asymmetric.html", }) export class Controller_Asymmetric_PeakShavingComponent extends AbstractFlatWidget { @@ -31,24 +31,24 @@ export class Controller_Asymmetric_PeakShavingComponent extends AbstractFlatWidg } protected override getChannelAddresses() { - this.meterId = this.component.properties['meter.id']; + this.meterId = this.component.properties["meter.id"]; return [ - new ChannelAddress(this.meterId, 'ActivePower'), - new ChannelAddress(this.meterId, 'ActivePowerL1'), - new ChannelAddress(this.meterId, 'ActivePowerL2'), - new ChannelAddress(this.meterId, 'ActivePowerL3'), + new ChannelAddress(this.meterId, "ActivePower"), + new ChannelAddress(this.meterId, "ActivePowerL1"), + new ChannelAddress(this.meterId, "ActivePowerL2"), + new ChannelAddress(this.meterId, "ActivePowerL3"), ]; } protected override onCurrentData(currentData: CurrentData) { const activePowerArray: number[] = [ - currentData.allComponents[this.meterId + '/ActivePowerL1'], - currentData.allComponents[this.meterId + '/ActivePowerL2'], - currentData.allComponents[this.meterId + '/ActivePowerL3'], + currentData.allComponents[this.meterId + "/ActivePowerL1"], + currentData.allComponents[this.meterId + "/ActivePowerL2"], + currentData.allComponents[this.meterId + "/ActivePowerL3"], ]; - const name: string[] = ['L1', 'L2', 'L3']; + const name: string[] = ["L1", "L2", "L3"]; this.mostStressedPhase.next({ @@ -57,8 +57,8 @@ export class Controller_Asymmetric_PeakShavingComponent extends AbstractFlatWidg value: Math.max(...activePowerArray, 0), }); - this.peakShavingPower = this.component.properties['peakShavingPower']; - this.rechargePower = this.component.properties['rechargePower']; + this.peakShavingPower = this.component.properties["peakShavingPower"]; + this.rechargePower = this.component.properties["rechargePower"]; } } diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.html b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.html index a25fdfa4fce..ebcb86c320f 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.html +++ b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.html @@ -121,4 +121,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.ts b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.ts index 327a63386d6..d00c47f25d5 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Asymmetric/modal/modal.component.ts @@ -1,20 +1,20 @@ // @ts-strict-ignore -import { Component, Input, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Subject } from 'rxjs'; -import { Edge, EdgeConfig, Service, Websocket } from '../../../../../../shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Subject } from "rxjs"; +import { Edge, EdgeConfig, Service, Websocket } from "../../../../../../shared/shared"; @Component({ - selector: 'asymmetricpeakshaving-modal', - templateUrl: './modal.component.html', + selector: "asymmetricpeakshaving-modal", + templateUrl: "./modal.component.html", }) export class Controller_Asymmetric_PeakShavingModalComponent implements OnInit { @Input({ required: true }) protected component!: EdgeConfig.Component; @Input({ required: true }) protected edge!: Edge; - @Input({ required: true }) protected mostStressedPhase!: Subject<{ name: 'L1' | 'L2' | 'L3' | '', value: number }>; + @Input({ required: true }) protected mostStressedPhase!: Subject<{ name: "L1" | "L2" | "L3" | "", value: number }>; public formGroup: FormGroup; public loading: boolean = false; @@ -30,11 +30,11 @@ export class Controller_Asymmetric_PeakShavingModalComponent implements OnInit { ngOnInit() { this.formGroup = this.formBuilder.group({ peakShavingPower: new FormControl(this.component.properties.peakShavingPower, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), rechargePower: new FormControl(this.component.properties.rechargePower, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), }); @@ -42,9 +42,9 @@ export class Controller_Asymmetric_PeakShavingModalComponent implements OnInit { applyChanges() { if (this.edge != null) { - if (this.edge.roleIsAtLeast('owner')) { - if (this.formGroup.controls['peakShavingPower'].valid && this.formGroup.controls['rechargePower'].valid) { - if (this.formGroup.controls['peakShavingPower'].value >= this.formGroup.controls['rechargePower'].value) { + if (this.edge.roleIsAtLeast("owner")) { + if (this.formGroup.controls["peakShavingPower"].valid && this.formGroup.controls["rechargePower"].valid) { + if (this.formGroup.controls["peakShavingPower"].value >= this.formGroup.controls["rechargePower"].value) { const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { @@ -56,23 +56,23 @@ export class Controller_Asymmetric_PeakShavingModalComponent implements OnInit { this.component.properties.peakShavingPower = this.formGroup.value.peakShavingPower; this.component.properties.rechargePower = this.formGroup.value.rechargePower; this.loading = false; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { - this.formGroup.controls['peakShavingPower'].setValue(this.component.properties.peakShavingPower); - this.formGroup.controls['rechargePower'].setValue(this.component.properties.rechargePower); + this.formGroup.controls["peakShavingPower"].setValue(this.component.properties.peakShavingPower); + this.formGroup.controls["rechargePower"].setValue(this.component.properties.rechargePower); this.loading = false; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); this.formGroup.markAsPristine(); } else { - this.service.toast(this.translate.instant('Edge.Index.Widgets.Peakshaving.relationError'), 'danger'); + this.service.toast(this.translate.instant("Edge.Index.Widgets.Peakshaving.relationError"), "danger"); } } else { - this.service.toast(this.translate.instant('General.inputNotValid'), 'danger'); + this.service.toast(this.translate.instant("General.inputNotValid"), "danger"); } } else { - this.service.toast(this.translate.instant('General.insufficientRights'), 'danger'); + this.service.toast(this.translate.instant("General.insufficientRights"), "danger"); } } } diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/Symmetric.html b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/Symmetric.html index f5b77fe7087..1ae94833bb1 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/Symmetric.html +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/Symmetric.html @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/Symmetric.ts b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/Symmetric.ts index 3700366d4ad..330b0ed6a28 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/Symmetric.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/Symmetric.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; -import { ChannelAddress, CurrentData, Utils } from '../../../../../shared/shared'; -import { Controller_Symmetric_PeakShavingModalComponent } from './modal/modal.component'; +import { ChannelAddress, CurrentData, Utils } from "../../../../../shared/shared"; +import { Controller_Symmetric_PeakShavingModalComponent } from "./modal/modal.component"; @Component({ - selector: 'Controller_Symmetric_PeakShaving', - templateUrl: './Symmetric.html', + selector: "Controller_Symmetric_PeakShaving", + templateUrl: "./Symmetric.html", }) export class Controller_Symmetric_PeakShavingComponent extends AbstractFlatWidget { @@ -29,19 +29,19 @@ export class Controller_Symmetric_PeakShavingComponent extends AbstractFlatWidge protected override getChannelAddresses() { return [ - new ChannelAddress(this.component.properties['meter.id'], 'ActivePower'), - new ChannelAddress(this.componentId, '_PropertyPeakShavingPower'), - new ChannelAddress(this.componentId, '_PropertyRechargePower'), + new ChannelAddress(this.component.properties["meter.id"], "ActivePower"), + new ChannelAddress(this.componentId, "_PropertyPeakShavingPower"), + new ChannelAddress(this.componentId, "_PropertyRechargePower"), ]; } protected override onCurrentData(currentData: CurrentData) { // Show 0 for negative activePower - this.activePower = currentData.allComponents[this.component.properties['meter.id'] + '/ActivePower'] >= 0 - ? currentData.allComponents[this.component.properties['meter.id'] + '/ActivePower'] : 0; - this.peakShavingPower = this.component.properties['peakShavingPower']; - this.rechargePower = this.component.properties['rechargePower']; + this.activePower = currentData.allComponents[this.component.properties["meter.id"] + "/ActivePower"] >= 0 + ? currentData.allComponents[this.component.properties["meter.id"] + "/ActivePower"] : 0; + this.peakShavingPower = this.component.properties["peakShavingPower"]; + this.rechargePower = this.component.properties["rechargePower"]; } } diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.html b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.html index 4597da00889..fabeafa884e 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.html +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.html @@ -71,4 +71,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.ts b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.ts index b733e98f5b9..aa2f498dc60 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric/modal/modal.component.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component, Input, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, EdgeConfig, Service, Websocket } from '../../../../../../shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, EdgeConfig, Service, Websocket } from "../../../../../../shared/shared"; @Component({ - selector: 'symmetricpeakshaving-modal', - templateUrl: './modal.component.html', + selector: "symmetricpeakshaving-modal", + templateUrl: "./modal.component.html", }) export class Controller_Symmetric_PeakShavingModalComponent implements OnInit { @@ -29,11 +29,11 @@ export class Controller_Symmetric_PeakShavingModalComponent implements OnInit { ngOnInit() { this.formGroup = this.formBuilder.group({ peakShavingPower: new FormControl(this.component.properties.peakShavingPower, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), rechargePower: new FormControl(this.component.properties.rechargePower, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), }); @@ -41,9 +41,9 @@ export class Controller_Symmetric_PeakShavingModalComponent implements OnInit { applyChanges() { if (this.edge != null) { - if (this.edge.roleIsAtLeast('owner')) { - const peakShavingPower = this.formGroup.controls['peakShavingPower']; - const rechargePower = this.formGroup.controls['rechargePower']; + if (this.edge.roleIsAtLeast("owner")) { + const peakShavingPower = this.formGroup.controls["peakShavingPower"]; + const rechargePower = this.formGroup.controls["rechargePower"]; if (peakShavingPower.valid && rechargePower.valid) { if (peakShavingPower.value >= rechargePower.value) { const updateComponentArray = []; @@ -57,23 +57,23 @@ export class Controller_Symmetric_PeakShavingModalComponent implements OnInit { this.component.properties.peakShavingPower = peakShavingPower.value; this.component.properties.rechargePower = rechargePower.value; this.loading = false; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { peakShavingPower.setValue(this.component.properties.peakShavingPower); rechargePower.setValue(this.component.properties.rechargePower); this.loading = false; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); this.formGroup.markAsPristine(); } else { - this.service.toast(this.translate.instant('Edge.Index.Widgets.Peakshaving.relationError'), 'danger'); + this.service.toast(this.translate.instant("Edge.Index.Widgets.Peakshaving.relationError"), "danger"); } } else { - this.service.toast(this.translate.instant('General.inputNotValid'), 'danger'); + this.service.toast(this.translate.instant("General.inputNotValid"), "danger"); } } else { - this.service.toast(this.translate.instant('General.insufficientRights'), 'danger'); + this.service.toast(this.translate.instant("General.insufficientRights"), "danger"); } } } diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot.html b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot.html index 59ae34dcc6a..20ba62c9fe4 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot.html +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot.html @@ -5,4 +5,4 @@ [converter]="CONVERT_WATT_TO_KILOWATT" [value]="peakShavingPower"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot.ts b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot.ts index 6d8ed6784c2..22c4eb19193 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; -import { ChannelAddress, CurrentData, Utils } from '../../../../../shared/shared'; -import { Controller_Symmetric_TimeSlot_PeakShavingModalComponent } from './modal/modal.component'; +import { ChannelAddress, CurrentData, Utils } from "../../../../../shared/shared"; +import { Controller_Symmetric_TimeSlot_PeakShavingModalComponent } from "./modal/modal.component"; @Component({ - selector: 'Controller_Symmetric_TimeSlot_PeakShaving', - templateUrl: './Symmetric_TimeSlot.html', + selector: "Controller_Symmetric_TimeSlot_PeakShaving", + templateUrl: "./Symmetric_TimeSlot.html", }) export class Controller_Symmetric_TimeSlot_PeakShavingComponent extends AbstractFlatWidget { @@ -34,18 +34,18 @@ export class Controller_Symmetric_TimeSlot_PeakShavingComponent extends Abstract protected override getChannelAddresses() { return [ - new ChannelAddress(this.component.properties['meter.id'], 'ActivePower'), - new ChannelAddress(this.componentId, '_PropertyPeakShavingPower'), - new ChannelAddress(this.componentId, '_PropertyRechargePower'), + new ChannelAddress(this.component.properties["meter.id"], "ActivePower"), + new ChannelAddress(this.componentId, "_PropertyPeakShavingPower"), + new ChannelAddress(this.componentId, "_PropertyRechargePower"), ]; } protected override onCurrentData(currentData: CurrentData) { // activePower is 0 for negative Values - this.activePower = currentData.allComponents[this.component.properties['meter.id'] + '/ActivePower'] >= 0 - ? currentData.allComponents[this.component.properties['meter.id'] + '/ActivePower'] : 0; - this.peakShavingPower = this.component.properties['peakShavingPower']; - this.rechargePower = this.component.properties['rechargePower']; + this.activePower = currentData.allComponents[this.component.properties["meter.id"] + "/ActivePower"] >= 0 + ? currentData.allComponents[this.component.properties["meter.id"] + "/ActivePower"] : 0; + this.peakShavingPower = this.component.properties["peakShavingPower"]; + this.rechargePower = this.component.properties["rechargePower"]; } } diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.html b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.html index 53301087624..a143c88db41 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.html +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.html @@ -207,4 +207,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.ts b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.ts index 3655790047f..21f16820d4b 100644 --- a/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.ts +++ b/ui/src/app/edge/live/Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component, Input, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, EdgeConfig, Service, Websocket } from '../../../../../../shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, EdgeConfig, Service, Websocket } from "../../../../../../shared/shared"; @Component({ - selector: 'timeslotpeakshaving-modal', - templateUrl: './modal.component.html', + selector: "timeslotpeakshaving-modal", + templateUrl: "./modal.component.html", }) export class Controller_Symmetric_TimeSlot_PeakShavingModalComponent implements OnInit { @@ -30,29 +30,29 @@ export class Controller_Symmetric_TimeSlot_PeakShavingModalComponent implements ngOnInit() { this.formGroup = this.formBuilder.group({ peakShavingPower: new FormControl(this.component.properties.peakShavingPower, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), rechargePower: new FormControl(this.component.properties.rechargePower, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), slowChargePower: new FormControl((this.component.properties.slowChargePower) * -1), slowChargeStartTime: new FormControl(this.component.properties.slowChargeStartTime, Validators.compose([ - Validators.pattern('^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$'), + Validators.pattern("^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$"), Validators.required, ])), startDate: new FormControl(this.component.properties.startDate, Validators.compose([ - Validators.pattern('^(0[1-9]|[12][0-9]|3[01])[.](0[1-9]|1[012])[.](19|20)[0-9]{2}$'), + Validators.pattern("^(0[1-9]|[12][0-9]|3[01])[.](0[1-9]|1[012])[.](19|20)[0-9]{2}$"), Validators.required, ])), startTime: new FormControl(this.component.properties.startTime, Validators.compose([ - Validators.pattern('^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$'), + Validators.pattern("^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$"), Validators.required, ])), endDate: new FormControl(this.component.properties.endDate), endTime: new FormControl(this.component.properties.endTime, Validators.compose([ - Validators.pattern('^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$'), + Validators.pattern("^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$"), Validators.required, ])), monday: new FormControl(this.component.properties.monday), @@ -67,15 +67,15 @@ export class Controller_Symmetric_TimeSlot_PeakShavingModalComponent implements applyChanges() { if (this.edge != null) { - if (this.edge.roleIsAtLeast('owner')) { - const peakShavingPower = this.formGroup.controls['peakShavingPower']; - const rechargePower = this.formGroup.controls['rechargePower']; + if (this.edge.roleIsAtLeast("owner")) { + const peakShavingPower = this.formGroup.controls["peakShavingPower"]; + const rechargePower = this.formGroup.controls["rechargePower"]; if (peakShavingPower.valid && rechargePower.valid) { if (peakShavingPower.value >= rechargePower.value) { const updateComponentArray = []; Object.keys(this.formGroup.controls).forEach((element, index) => { if (this.formGroup.controls[element].dirty) { - if (Object.keys(this.formGroup.controls)[index] == 'slowChargePower') { + if (Object.keys(this.formGroup.controls)[index] == "slowChargePower") { updateComponentArray.push({ name: Object.keys(this.formGroup.controls)[index], value: (this.formGroup.controls[element].value) * -1 }); } else { updateComponentArray.push({ name: Object.keys(this.formGroup.controls)[index], value: this.formGroup.controls[element].value }); @@ -87,23 +87,23 @@ export class Controller_Symmetric_TimeSlot_PeakShavingModalComponent implements this.component.properties.peakShavingPower = peakShavingPower.value; this.component.properties.rechargePower = rechargePower.value; this.loading = false; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { peakShavingPower.setValue(this.component.properties.peakShavingPower); rechargePower.setValue(this.component.properties.rechargePower); this.loading = false; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); this.formGroup.markAsPristine(); } else { - this.service.toast(this.translate.instant('Edge.Index.Widgets.Peakshaving.relationError'), 'danger'); + this.service.toast(this.translate.instant("Edge.Index.Widgets.Peakshaving.relationError"), "danger"); } } else { - this.service.toast(this.translate.instant('General.inputNotValid'), 'danger'); + this.service.toast(this.translate.instant("General.inputNotValid"), "danger"); } } else { - this.service.toast(this.translate.instant('General.insufficientRights'), 'danger'); + this.service.toast(this.translate.instant("General.insufficientRights"), "danger"); } } } diff --git a/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.html b/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.html index bad2fcee243..b3c997ef533 100644 --- a/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.html +++ b/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.html @@ -2,4 +2,4 @@ [icon]="{name: 'radio-button-off-outline', color: 'dark'}"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.ts b/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.ts index 0c64f49d90c..091f47eff6c 100644 --- a/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.ts +++ b/ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.ts @@ -1,12 +1,12 @@ -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { EdgeConfig } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { EdgeConfig } from "src/app/shared/shared"; -import { Io_Api_DigitalInput_ModalComponent } from './modal/modal.component'; +import { Io_Api_DigitalInput_ModalComponent } from "./modal/modal.component"; @Component({ - selector: 'Io_Api_DigitalInput', - templateUrl: './Io_Api_DigitalInput.html', + selector: "Io_Api_DigitalInput", + templateUrl: "./Io_Api_DigitalInput.html", }) export class Io_Api_DigitalInputComponent extends AbstractFlatWidget { diff --git a/ui/src/app/edge/live/Io/Api_DigitalInput/modal/modal.component.ts b/ui/src/app/edge/live/Io/Api_DigitalInput/modal/modal.component.ts index 5169a6f4ae5..199010f1217 100644 --- a/ui/src/app/edge/live/Io/Api_DigitalInput/modal/modal.component.ts +++ b/ui/src/app/edge/live/Io/Api_DigitalInput/modal/modal.component.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { Edge, Service, EdgeConfig, Websocket, ChannelAddress, EdgePermission } from '../../../../../shared/shared'; -import { ModalController } from '@ionic/angular'; -import { Channel } from 'src/app/shared/jsonrpc/response/getChannelsOfComponentResponse'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { JsonrpcRequest, JsonrpcResponseSuccess } from 'src/app/shared/jsonrpc/base'; +import { Component, Input, OnDestroy, OnInit } from "@angular/core"; +import { ModalController } from "@ionic/angular"; +import { JsonrpcRequest, JsonrpcResponseSuccess } from "src/app/shared/jsonrpc/base"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { Channel } from "src/app/shared/jsonrpc/response/getChannelsOfComponentResponse"; +import { ChannelAddress, Edge, EdgeConfig, EdgePermission, Service, Websocket } from "../../../../../shared/shared"; @Component({ - selector: 'Io_Api_DigitalInputModal', - templateUrl: './modal.component.html', + selector: "Io_Api_DigitalInputModal", + templateUrl: "./modal.component.html", }) export class Io_Api_DigitalInput_ModalComponent implements OnInit, OnDestroy { private static readonly SELECTOR = "Io_Api_DigitalInput_ModalComponent"; @@ -46,13 +46,13 @@ export class Io_Api_DigitalInput_ModalComponent implements OnInit, OnDestroy { componentAlias: e.alias, channels: Object.entries(e.channels) .filter(([key, value]) => { - if (value.accessMode !== 'RO') { + if (value.accessMode !== "RO") { return false; } - if (value.type !== 'BOOLEAN') { + if (value.type !== "BOOLEAN") { return false; } - if (key === '_PropertyEnabled') { + if (key === "_PropertyEnabled") { return false; } return true; @@ -65,7 +65,7 @@ export class Io_Api_DigitalInput_ModalComponent implements OnInit, OnDestroy { } const response = await this.edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_componentManager', + componentId: "_componentManager", payload: new GetDigitalInputChannelsOfComponentsRequest({ componentIds: this.ioComponents.map(e => e.id) }), })); return response.result.channelsPerComponent.map(e => { diff --git a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.html b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.html index da1d7b2a74a..7743c265a65 100644 --- a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.html +++ b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.html @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.ts b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.ts index 830159e6d27..0fa1fbf2ea2 100644 --- a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.ts +++ b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; -import { ChannelAddress, CurrentData, EdgeConfig, Utils } from '../../../../shared/shared'; -import { Evcs_Api_ClusterModalComponent } from './modal/evcsCluster-modal.page'; +import { ChannelAddress, CurrentData, EdgeConfig, Utils } from "../../../../shared/shared"; +import { Evcs_Api_ClusterModalComponent } from "./modal/evcsCluster-modal.page"; @Component({ - selector: 'Evcs_Api_Cluster', - templateUrl: './Evcs_Api_Cluster.html', + selector: "Evcs_Api_Cluster", + templateUrl: "./Evcs_Api_Cluster.html", }) export class Evcs_Api_ClusterComponent extends AbstractFlatWidget { @@ -36,7 +36,7 @@ export class Evcs_Api_ClusterComponent extends AbstractFlatWidget { protected override getChannelAddresses() { this.evcsIdsInCluster = this.config.components[this.componentId].properties["evcs.ids"]; - const nature = 'io.openems.edge.evcs.api.Evcs'; + const nature = "io.openems.edge.evcs.api.Evcs"; for (const component of this.config.getComponentsImplementingNature(nature)) { if (this.evcsIdsInCluster.includes(component.id)) { @@ -45,14 +45,14 @@ export class Evcs_Api_ClusterComponent extends AbstractFlatWidget { } } this.channelAddresses.push( - new ChannelAddress(this.componentId, 'ChargePower'), - new ChannelAddress(this.componentId, 'Phases'), - new ChannelAddress(this.componentId, 'Plug'), - new ChannelAddress(this.componentId, 'Status'), - new ChannelAddress(this.componentId, 'State'), - new ChannelAddress(this.componentId, 'EnergySession'), - new ChannelAddress(this.componentId, 'MinimumHardwarePower'), - new ChannelAddress(this.componentId, 'MaximumHardwarePower'), + new ChannelAddress(this.componentId, "ChargePower"), + new ChannelAddress(this.componentId, "Phases"), + new ChannelAddress(this.componentId, "Plug"), + new ChannelAddress(this.componentId, "Status"), + new ChannelAddress(this.componentId, "State"), + new ChannelAddress(this.componentId, "EnergySession"), + new ChannelAddress(this.componentId, "MinimumHardwarePower"), + new ChannelAddress(this.componentId, "MaximumHardwarePower"), ); return this.channelAddresses; } @@ -60,8 +60,8 @@ export class Evcs_Api_ClusterComponent extends AbstractFlatWidget { protected override onCurrentData(currentData: CurrentData) { this.evcsComponent = this.config.getComponent(this.componentId); - this.alias = this.config.components[this.componentId].properties.alias ?? 'Edge.Index.Widgets.EVCS.chargingStationCluster'; - this.isConnectionSuccessful = currentData.allComponents[this.componentId + '/State'] != 3 ? true : false; + this.alias = this.config.components[this.componentId].properties.alias ?? "Edge.Index.Widgets.EVCS.chargingStationCluster"; + this.isConnectionSuccessful = currentData.allComponents[this.componentId + "/State"] != 3 ? true : false; // Initialise the Map with all evcss this.evcssInCluster.forEach(evcs => { @@ -72,8 +72,8 @@ export class Evcs_Api_ClusterComponent extends AbstractFlatWidget { // Adds the controllers to the each charging stations controllers.forEach(controller => { - if (this.evcsIdsInCluster.includes(controller.properties['evcs.id'])) { - this.evcsMap[controller.properties['evcs.id']] = controller; + if (this.evcsIdsInCluster.includes(controller.properties["evcs.id"])) { + this.evcsMap[controller.properties["evcs.id"]] = controller; } }); @@ -81,16 +81,16 @@ export class Evcs_Api_ClusterComponent extends AbstractFlatWidget { private fillChannelAddresses(componentId: string, channelAddresses: ChannelAddress[]) { channelAddresses.push( - new ChannelAddress(componentId, 'ChargePower'), - new ChannelAddress(componentId, 'MaximumHardwarePower'), - new ChannelAddress(componentId, 'MinimumHardwarePower'), - new ChannelAddress(componentId, 'MaximumPower'), - new ChannelAddress(componentId, 'Phases'), - new ChannelAddress(componentId, 'Plug'), - new ChannelAddress(componentId, 'Status'), - new ChannelAddress(componentId, 'State'), - new ChannelAddress(componentId, 'EnergySession'), - new ChannelAddress(componentId, 'Alias'), + new ChannelAddress(componentId, "ChargePower"), + new ChannelAddress(componentId, "MaximumHardwarePower"), + new ChannelAddress(componentId, "MinimumHardwarePower"), + new ChannelAddress(componentId, "MaximumPower"), + new ChannelAddress(componentId, "Phases"), + new ChannelAddress(componentId, "Plug"), + new ChannelAddress(componentId, "Status"), + new ChannelAddress(componentId, "State"), + new ChannelAddress(componentId, "EnergySession"), + new ChannelAddress(componentId, "Alias"), ); } diff --git a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.html b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.html index 7c11c16ed1a..dea298a6b67 100644 --- a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.html +++ b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.html @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.ts b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.ts index fec7d8e1ebb..f58fe7b24a2 100644 --- a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.ts +++ b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.ts @@ -1,15 +1,15 @@ // @ts-strict-ignore -import * as Chart from 'chart.js'; -import { Component, Input, OnInit, OnChanges } from '@angular/core'; -import { CurrentData } from 'src/app/shared/components/edge/currentdata'; -import { Data } from 'src/app/edge/history/shared'; -import { EdgeConfig, Edge } from 'src/app/shared/shared'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; +import { Component, Input, OnChanges, OnInit } from "@angular/core"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import * as Chart from "chart.js"; +import { Data } from "src/app/edge/history/shared"; +import { CurrentData } from "src/app/shared/components/edge/currentdata"; +import { Edge, EdgeConfig } from "src/app/shared/shared"; @Component({ selector: EvcsChartComponent.SELECTOR, - templateUrl: './evcs.chart.html', + templateUrl: "./evcs.chart.html", }) export class EvcsChartComponent implements OnInit, OnChanges { @@ -34,8 +34,8 @@ export class EvcsChartComponent implements OnInit, OnChanges { getMaxPower() { const minPower = 22; - let maxHW = this.currentData[this.componentId + '/MaximumHardwarePower']; - let chargePower = this.currentData[this.componentId + '/ChargePower']; + let maxHW = this.currentData[this.componentId + "/MaximumHardwarePower"]; + let chargePower = this.currentData[this.componentId + "/ChargePower"]; maxHW = maxHW == null ? minPower : maxHW / 1000; chargePower = chargePower == null ? 0 : chargePower / 1000; @@ -47,9 +47,9 @@ export class EvcsChartComponent implements OnInit, OnChanges { this.options = DEFAULT_BAR_CHART_OPTIONS; this.options.scales.yAxes[0].ticks.max = this.getMaxPower(); - this.labels = ['Ladeleistung']; + this.labels = ["Ladeleistung"]; this.datasets = [ - { data: [], label: '' }, + { data: [], label: "" }, ]; } @@ -67,7 +67,7 @@ export class EvcsChartComponent implements OnInit, OnChanges { this.loading = true; let index = 0; for (const evcsId in this.evcsMap) { - const chargePower = this.edge.currentData.value.channel[evcsId + '/ChargePower']; + const chargePower = this.edge.currentData.value.channel[evcsId + "/ChargePower"]; const chargePowerKW = chargePower / 1000.0; const alias = this.evcsConfigMap[evcsId].properties.alias; if (this.datasets[index] == null) { @@ -91,7 +91,7 @@ export class EvcsChartComponent implements OnInit, OnChanges { export const DEFAULT_BAR_CHART_OPTIONS: BarChartOptions = { maintainAspectRatio: false, legend: { - position: 'bottom', + position: "bottom", }, elements: { point: { @@ -105,7 +105,7 @@ export const DEFAULT_BAR_CHART_OPTIONS: BarChartOptions = { }, }, hover: { - mode: 'point', + mode: "point", intersect: true, }, scales: { @@ -125,30 +125,30 @@ export const DEFAULT_BAR_CHART_OPTIONS: BarChartOptions = { }], }, tooltips: { - mode: 'index', + mode: "index", intersect: false, - axis: 'x', + axis: "x", title: "Ladeleistung", callbacks: { label(tooltipItems: BarChartTooltipItem, data: Data): string { let value: number = tooltipItems.yLabel; //.toFixed(2); value = parseFloat(value.toFixed(2)); const label = data.datasets[tooltipItems.datasetIndex].label; - return label + ": " + value.toLocaleString('de-DE') + " kW"; + return label + ": " + value.toLocaleString("de-DE") + " kW"; }, }, }, annotation: { annotations: [{ - type: 'line', - mode: 'horizontal', - yScaleID: 'y-axis-0', + type: "line", + mode: "horizontal", + yScaleID: "y-axis-0", value: 33, - borderColor: 'green', + borderColor: "green", borderWidth: 4, label: { enabled: true, - content: 'Test label', + content: "Test label", }, }], }, diff --git a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.html b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.html index 4d5e81a8835..e73fe3f8906 100644 --- a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.html +++ b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.html @@ -327,4 +327,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.ts b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.ts index 13b2dfaeb2d..3fbac0a50c9 100644 --- a/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.ts +++ b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { ActivatedRoute, Router } from '@angular/router'; -import { Component, Input, OnInit, ViewChild } from '@angular/core'; -import { Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; -import { IonReorderGroup, ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; +import { Component, Input, OnInit, ViewChild } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { IonReorderGroup, ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, EdgeConfig, Service, Websocket } from "src/app/shared/shared"; -type ChargeMode = 'FORCE_CHARGE' | 'EXCESS_POWER'; -type Priority = 'CAR' | 'STORAGE'; +type ChargeMode = "FORCE_CHARGE" | "EXCESS_POWER"; +type Priority = "CAR" | "STORAGE"; @Component({ - selector: 'Evcs_Api_Cluster-modal', - templateUrl: './evcsCluster-modal.page.html', + selector: "Evcs_Api_Cluster-modal", + templateUrl: "./evcsCluster-modal.page.html", }) export class Evcs_Api_ClusterModalComponent implements OnInit { @@ -25,7 +25,7 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { public swiperIndex: number = 0; public slideOpts = { noSwiping: true, - noSwipingClass: 'swiper-no-swiping', + noSwipingClass: "swiper-no-swiping", //noSwipingSelector: 'ion-range, ion-toggle', initialSlide: 0, speed: 1000, @@ -71,13 +71,13 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, this.config.id, [ - { name: 'evcs.ids', value: newListOrder }, + { name: "evcs.ids", value: newListOrder }, ]).then(response => { this.config.properties.chargeMode = newListOrder; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { this.config.properties.chargeMode = oldListOrder; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -97,23 +97,23 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { let newChargeMode: ChargeMode; switch (event.detail.value) { - case 'FORCE_CHARGE': - newChargeMode = 'FORCE_CHARGE'; + case "FORCE_CHARGE": + newChargeMode = "FORCE_CHARGE"; break; - case 'EXCESS_POWER': - newChargeMode = 'EXCESS_POWER'; + case "EXCESS_POWER": + newChargeMode = "EXCESS_POWER"; break; } if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, currentController.id, [ - { name: 'chargeMode', value: newChargeMode }, + { name: "chargeMode", value: newChargeMode }, ]).then(response => { currentController.properties.chargeMode = newChargeMode; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { currentController.properties.chargeMode = oldChargeMode; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -126,23 +126,23 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { let newPriority: Priority; switch (event.detail.value) { - case 'CAR': - newPriority = 'CAR'; + case "CAR": + newPriority = "CAR"; break; - case 'STORAGE': - newPriority = 'STORAGE'; + case "STORAGE": + newPriority = "STORAGE"; break; } if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, currentController.id, [ - { name: 'priority', value: newPriority }, + { name: "priority", value: newPriority }, ]).then(response => { currentController.properties.priority = newPriority; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { currentController.properties.priority = oldPriority; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -160,13 +160,13 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, currentController.id, [ - { name: 'forceChargeMinPower', value: newMinChargePower }, + { name: "forceChargeMinPower", value: newMinChargePower }, ]).then(response => { currentController.properties.forceChargeMinPower = newMinChargePower; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { currentController.properties.forceChargeMinPower = oldMinChargePower; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -183,13 +183,13 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, currentController.id, [ - { name: 'defaultChargeMinPower', value: newMinChargePower }, + { name: "defaultChargeMinPower", value: newMinChargePower }, ]).then(response => { currentController.properties.defaultChargeMinPower = newMinChargePower; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { currentController.properties.defaultChargeMinPower = oldMinChargePower; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -215,13 +215,13 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { } if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, currentController.id, [ - { name: 'defaultChargeMinPower', value: newMinChargePower }, + { name: "defaultChargeMinPower", value: newMinChargePower }, ]).then(response => { currentController.properties.defaultChargeMinPower = newMinChargePower; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { currentController.properties.defaultChargeMinPower = oldMinChargePower; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -238,13 +238,13 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { const newChargingState = !oldChargingState; if (this.edge != null) { this.edge.updateComponentConfig(this.websocket, currentController.id, [ - { name: 'enabledCharging', value: newChargingState }, + { name: "enabledCharging", value: newChargingState }, ]).then(response => { currentController.properties.enabledCharging = newChargingState; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { currentController.properties.enabledCharging = oldChargingState; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } @@ -259,7 +259,7 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { getState(power: number, state: number, plug: number, currentController: EdgeConfig.Component) { if (currentController != null) { if (currentController.properties.enabledCharging != null && currentController.properties.enabledCharging == false) { - return this.translate.instant('Edge.Index.Widgets.EVCS.chargingStationDeactivated'); + return this.translate.instant("Edge.Index.Widgets.EVCS.chargingStationDeactivated"); } } if (power == null || power == 0) { @@ -269,31 +269,33 @@ export class Evcs_Api_ClusterModalComponent implements OnInit { if (this.chargePlug == null) { if (this.chargeState == null) { - return this.translate.instant('Edge.Index.Widgets.EVCS.notCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.notCharging"); } } else if (this.chargePlug != ChargePlug.PLUGGED_ON_EVCS_AND_ON_EV_AND_LOCKED) { - return this.translate.instant('Edge.Index.Widgets.EVCS.cableNotConnected'); + return this.translate.instant("Edge.Index.Widgets.EVCS.cableNotConnected"); } switch (this.chargeState) { case ChargeState.STARTING: - return this.translate.instant('Edge.Index.Widgets.EVCS.starting'); + return this.translate.instant("Edge.Index.Widgets.EVCS.starting"); case ChargeState.UNDEFINED: case ChargeState.ERROR: - return this.translate.instant('Edge.Index.Widgets.EVCS.error'); + return this.translate.instant("Edge.Index.Widgets.EVCS.error"); case ChargeState.READY_FOR_CHARGING: - return this.translate.instant('Edge.Index.Widgets.EVCS.readyForCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.readyForCharging"); case ChargeState.NOT_READY_FOR_CHARGING: - return this.translate.instant('Edge.Index.Widgets.EVCS.notReadyForCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.notReadyForCharging"); case ChargeState.AUTHORIZATION_REJECTED: - return this.translate.instant('Edge.Index.Widgets.EVCS.notCharging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.notCharging"); case ChargeState.ENERGY_LIMIT_REACHED: - return this.translate.instant('Edge.Index.Widgets.EVCS.chargeLimitReached'); + return this.translate.instant("Edge.Index.Widgets.EVCS.chargeLimitReached"); case ChargeState.CHARGING_FINISHED: - return this.translate.instant('Edge.Index.Widgets.EVCS.carFull'); + return this.translate.instant("Edge.Index.Widgets.EVCS.carFull"); + default: + return this.translate.instant("Edge.Index.Widgets.EVCS.charging"); } } - return this.translate.instant('Edge.Index.Widgets.EVCS.charging'); + return this.translate.instant("Edge.Index.Widgets.EVCS.charging"); } /** diff --git a/ui/src/app/edge/live/common/autarchy/Common_Autarchy.ts b/ui/src/app/edge/live/common/autarchy/Common_Autarchy.ts index 8aa0d3022b4..e76088f26bf 100644 --- a/ui/src/app/edge/live/common/autarchy/Common_Autarchy.ts +++ b/ui/src/app/edge/live/common/autarchy/Common_Autarchy.ts @@ -1,8 +1,8 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { FlatComponent } from './flat/flat'; -import { ModalComponent } from './modal/modal'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { FlatComponent } from "./flat/flat"; +import { ModalComponent } from "./modal/modal"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/common/autarchy/flat/flat.html b/ui/src/app/edge/live/common/autarchy/flat/flat.html index 6ad3ab9290a..1b425accf5e 100644 --- a/ui/src/app/edge/live/common/autarchy/flat/flat.html +++ b/ui/src/app/edge/live/common/autarchy/flat/flat.html @@ -4,4 +4,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/common/autarchy/flat/flat.ts b/ui/src/app/edge/live/common/autarchy/flat/flat.ts index 085e4388119..e9620384f0e 100644 --- a/ui/src/app/edge/live/common/autarchy/flat/flat.ts +++ b/ui/src/app/edge/live/common/autarchy/flat/flat.ts @@ -1,12 +1,12 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, Utils } from 'src/app/shared/shared'; -import { ModalComponent } from '../modal/modal'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, Utils } from "src/app/shared/shared"; +import { ModalComponent } from "../modal/modal"; @Component({ - selector: 'Common_Autarchy', - templateUrl: './flat.html', + selector: "Common_Autarchy", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -21,15 +21,15 @@ export class FlatComponent extends AbstractFlatWidget { protected override getChannelAddresses(): ChannelAddress[] { return [ - new ChannelAddress('_sum', 'GridActivePower'), - new ChannelAddress('_sum', 'ConsumptionActivePower'), + new ChannelAddress("_sum", "GridActivePower"), + new ChannelAddress("_sum", "ConsumptionActivePower"), ]; } protected override onCurrentData(currentData: CurrentData) { this.percentageValue = Utils.calculateAutarchy( - currentData.allComponents['_sum/GridActivePower'], - currentData.allComponents['_sum/ConsumptionActivePower'], + currentData.allComponents["_sum/GridActivePower"], + currentData.allComponents["_sum/ConsumptionActivePower"], ); } diff --git a/ui/src/app/edge/live/common/autarchy/modal/modal.spec.ts b/ui/src/app/edge/live/common/autarchy/modal/modal.spec.ts index 4c8b585b195..d35e4c7ea81 100644 --- a/ui/src/app/edge/live/common/autarchy/modal/modal.spec.ts +++ b/ui/src/app/edge/live/common/autarchy/modal/modal.spec.ts @@ -12,11 +12,11 @@ export function expectView(testContext: TestContext, viewContext: OeFormlyViewTe expect(generatedView).toEqual(view); } -describe('Autarchy - Modal', () => { +describe("Autarchy - Modal", () => { let TEST_CONTEXT: TestContext; beforeEach(async () => TEST_CONTEXT = await sharedSetup()); - it('generateView()', () => { + it("generateView()", () => { { expectView(TEST_CONTEXT, VIEW_CONTEXT, { title: "Autarkie", diff --git a/ui/src/app/edge/live/common/autarchy/modal/modal.ts b/ui/src/app/edge/live/common/autarchy/modal/modal.ts index 8f9fa5aa219..15ed4d35841 100644 --- a/ui/src/app/edge/live/common/autarchy/modal/modal.ts +++ b/ui/src/app/edge/live/common/autarchy/modal/modal.ts @@ -1,19 +1,19 @@ -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { AbstractFormlyComponent, OeFormlyView } from 'src/app/shared/components/shared/oe-formly-component'; -import { EdgeConfig } from 'src/app/shared/shared'; -import { Role } from 'src/app/shared/type/role'; +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractFormlyComponent, OeFormlyView } from "src/app/shared/components/shared/oe-formly-component"; +import { EdgeConfig } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; @Component({ - templateUrl: '../../../../../shared/components/formly/formly-field-modal/template.html', + templateUrl: "../../../../../shared/components/formly/formly-field-modal/template.html", }) export class ModalComponent extends AbstractFormlyComponent { public static generateView(translate: TranslateService): OeFormlyView { return { - title: translate.instant('General.autarchy'), + title: translate.instant("General.autarchy"), lines: [{ - type: 'info-line', + type: "info-line", name: translate.instant("Edge.Index.Widgets.autarchyInfo"), }], }; diff --git a/ui/src/app/edge/live/common/consumption/Common_Consumption.ts b/ui/src/app/edge/live/common/consumption/Common_Consumption.ts index f685ef859cf..9b1b800de3e 100644 --- a/ui/src/app/edge/live/common/consumption/Common_Consumption.ts +++ b/ui/src/app/edge/live/common/consumption/Common_Consumption.ts @@ -1,8 +1,8 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { FlatComponent } from './flat/flat'; -import { ModalComponent } from './modal/modal'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { FlatComponent } from "./flat/flat"; +import { ModalComponent } from "./modal/modal"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/common/consumption/flat/flat.html b/ui/src/app/edge/live/common/consumption/flat/flat.html index 4ac5da6b99d..761302becfe 100644 --- a/ui/src/app/edge/live/common/consumption/flat/flat.html +++ b/ui/src/app/edge/live/common/consumption/flat/flat.html @@ -35,4 +35,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/common/consumption/flat/flat.ts b/ui/src/app/edge/live/common/consumption/flat/flat.ts index bcc6602c7f0..85b0069083f 100644 --- a/ui/src/app/edge/live/common/consumption/flat/flat.ts +++ b/ui/src/app/edge/live/common/consumption/flat/flat.ts @@ -1,12 +1,12 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, EdgeConfig, Utils } from 'src/app/shared/shared'; -import { ModalComponent } from '../modal/modal'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, EdgeConfig, Utils } from "src/app/shared/shared"; +import { ModalComponent } from "../modal/modal"; @Component({ - selector: 'consumption', - templateUrl: './flat.html', + selector: "consumption", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -27,12 +27,12 @@ export class FlatComponent extends AbstractFlatWidget { protected override getChannelAddresses() { const channelAddresses: ChannelAddress[] = [ - new ChannelAddress('_sum', 'ConsumptionActivePower'), + new ChannelAddress("_sum", "ConsumptionActivePower"), // TODO should be moved to Modal - new ChannelAddress('_sum', 'ConsumptionActivePowerL1'), - new ChannelAddress('_sum', 'ConsumptionActivePowerL2'), - new ChannelAddress('_sum', 'ConsumptionActivePowerL3'), + new ChannelAddress("_sum", "ConsumptionActivePowerL1"), + new ChannelAddress("_sum", "ConsumptionActivePowerL2"), + new ChannelAddress("_sum", "ConsumptionActivePowerL3"), ]; // Get consumptionMeterComponents @@ -41,21 +41,21 @@ export class FlatComponent extends AbstractFlatWidget { for (const component of this.consumptionMeters) { channelAddresses.push( - new ChannelAddress(component.id, 'ActivePower'), - new ChannelAddress(component.id, 'ActivePowerL1'), - new ChannelAddress(component.id, 'ActivePowerL2'), - new ChannelAddress(component.id, 'ActivePowerL3'), + new ChannelAddress(component.id, "ActivePower"), + new ChannelAddress(component.id, "ActivePowerL1"), + new ChannelAddress(component.id, "ActivePowerL2"), + new ChannelAddress(component.id, "ActivePowerL3"), ); } // Get EVCSs this.evcss = this.config.getComponentsImplementingNature("io.openems.edge.evcs.api.Evcs") - .filter(component => !(component.factoryId == 'Evcs.Cluster.SelfConsumption') && - !(component.factoryId == 'Evcs.Cluster.PeakShaving') && !component.isEnabled == false); + .filter(component => !(component.factoryId == "Evcs.Cluster.SelfConsumption") && + !(component.factoryId == "Evcs.Cluster.PeakShaving") && !component.isEnabled == false); for (const component of this.evcss) { channelAddresses.push( - new ChannelAddress(component.id, 'ChargePower'), + new ChannelAddress(component.id, "ChargePower"), ); } return channelAddresses; @@ -65,20 +65,20 @@ export class FlatComponent extends AbstractFlatWidget { this.evcsSumOfChargePower = 0; let consumptionMetersSumOfActivePower: number = 0; - this.sumActivePower = currentData.allComponents['_sum/ConsumptionActivePower']; + this.sumActivePower = currentData.allComponents["_sum/ConsumptionActivePower"]; // TODO move sums to Model // Iterate over evcsComponents to get ChargePower for every component for (const component of this.evcss) { - if (currentData.allComponents[component.id + '/ChargePower']) { - this.evcsSumOfChargePower += currentData.allComponents[component.id + '/ChargePower']; + if (currentData.allComponents[component.id + "/ChargePower"]) { + this.evcsSumOfChargePower += currentData.allComponents[component.id + "/ChargePower"]; } } // Iterate over evcsComponents to get ChargePower for every component for (const component of this.consumptionMeters) { - if (currentData.allComponents[component.id + '/ActivePower']) { - consumptionMetersSumOfActivePower += currentData.allComponents[component.id + '/ActivePower']; + if (currentData.allComponents[component.id + "/ActivePower"]) { + consumptionMetersSumOfActivePower += currentData.allComponents[component.id + "/ActivePower"]; } } diff --git a/ui/src/app/edge/live/common/consumption/modal/modal.spec.ts b/ui/src/app/edge/live/common/consumption/modal/modal.spec.ts index a0daa57a406..d81a191bf67 100644 --- a/ui/src/app/edge/live/common/consumption/modal/modal.spec.ts +++ b/ui/src/app/edge/live/common/consumption/modal/modal.spec.ts @@ -6,19 +6,19 @@ import { sharedSetup } from "src/app/shared/components/shared/testing/utils.spec import { expectView } from "./modal.constants.spec"; -describe('Consumption - Modal', () => { +describe("Consumption - Modal", () => { let TEST_CONTEXT; beforeEach(async () => TEST_CONTEXT = await sharedSetup()); - it('generateView()', () => { + it("generateView()", () => { // No evcs and consumptionMeters and negative ConsumptionActivePower { const VIEW_CONTEXT: OeFormlyViewTester.Context = { - '_sum/ConsumptionActivePower': -1000, - '_sum/ConsumptionActivePowerL1': -1000, - '_sum/ConsumptionActivePowerL2': 1000, - '_sum/ConsumptionActivePowerL3': -1000, + "_sum/ConsumptionActivePower": -1000, + "_sum/ConsumptionActivePowerL1": -1000, + "_sum/ConsumptionActivePowerL2": 1000, + "_sum/ConsumptionActivePowerL3": -1000, }; const EMS = DummyConfig.from(); @@ -46,21 +46,21 @@ describe('Consumption - Modal', () => { DummyConfig.Component.EVCS_KEBA_KECONTACT("evcs2", "Evcs 3"), ); const VIEW_CONTEXT: OeFormlyViewTester.Context = { - '_sum/ConsumptionActivePower': 1000, - '_sum/ConsumptionActivePowerL1': 300, - '_sum/ConsumptionActivePowerL2': 350, - '_sum/ConsumptionActivePowerL3': 350, - 'meter0/ActivePower': 1000, - 'meter0/ActivePowerL1': 1000, - 'meter0/ActivePowerL2': -1000, - 'meter0/ActivePowerL3': 1000, - 'meter1/ActivePower': null, - 'meter1/ActivePowerL1': null, - 'meter1/ActivePowerL2': null, - 'meter1/ActivePowerL3': null, - 'evcs0/ChargePower': 1000, - 'evcs1/ChargePower': -1000, - 'evcs2/ChargePower': null, + "_sum/ConsumptionActivePower": 1000, + "_sum/ConsumptionActivePowerL1": 300, + "_sum/ConsumptionActivePowerL2": 350, + "_sum/ConsumptionActivePowerL3": 350, + "meter0/ActivePower": 1000, + "meter0/ActivePowerL1": 1000, + "meter0/ActivePowerL2": -1000, + "meter0/ActivePowerL3": 1000, + "meter1/ActivePower": null, + "meter1/ActivePowerL1": null, + "meter1/ActivePowerL2": null, + "meter1/ActivePowerL3": null, + "evcs0/ChargePower": 1000, + "evcs1/ChargePower": -1000, + "evcs2/ChargePower": null, }; expectView(EMS, VIEW_CONTEXT, TEST_CONTEXT, { @@ -99,11 +99,11 @@ describe('Consumption - Modal', () => { DummyConfig.Component.EVCS_KEBA_KECONTACT("evcs0", "Evcs"), ); const VIEW_CONTEXT: OeFormlyViewTester.Context = { - '_sum/ConsumptionActivePower': 1000, - '_sum/ConsumptionActivePowerL1': 300, - '_sum/ConsumptionActivePowerL2': 350, - '_sum/ConsumptionActivePowerL3': 350, - 'evcs0/ChargePower': 1000, + "_sum/ConsumptionActivePower": 1000, + "_sum/ConsumptionActivePowerL1": 300, + "_sum/ConsumptionActivePowerL2": 350, + "_sum/ConsumptionActivePowerL3": 350, + "evcs0/ChargePower": 1000, }; expectView(EMS, VIEW_CONTEXT, TEST_CONTEXT, { @@ -128,14 +128,14 @@ describe('Consumption - Modal', () => { DummyConfig.Component.SOCOMEC_CONSUMPTION_METER("meter0", "Waermepumpe"), ); const VIEW_CONTEXT: OeFormlyViewTester.Context = { - '_sum/ConsumptionActivePower': 1000, - '_sum/ConsumptionActivePowerL1': 300, - '_sum/ConsumptionActivePowerL2': 350, - '_sum/ConsumptionActivePowerL3': 350, - 'meter0/ActivePower': 1000, - 'meter0/ActivePowerL1': 1000, - 'meter0/ActivePowerL2': -1000, - 'meter0/ActivePowerL3': 1000, + "_sum/ConsumptionActivePower": 1000, + "_sum/ConsumptionActivePowerL1": 300, + "_sum/ConsumptionActivePowerL2": 350, + "_sum/ConsumptionActivePowerL3": 350, + "meter0/ActivePower": 1000, + "meter0/ActivePowerL1": 1000, + "meter0/ActivePowerL2": -1000, + "meter0/ActivePowerL3": 1000, }; expectView(EMS, VIEW_CONTEXT, TEST_CONTEXT, { diff --git a/ui/src/app/edge/live/common/consumption/modal/modal.ts b/ui/src/app/edge/live/common/consumption/modal/modal.ts index 3ed6bfdbded..ccdcd9af819 100644 --- a/ui/src/app/edge/live/common/consumption/modal/modal.ts +++ b/ui/src/app/edge/live/common/consumption/modal/modal.ts @@ -1,23 +1,23 @@ -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { TextIndentation } from 'src/app/shared/components/modal/modal-line/modal-line'; -import { Converter } from 'src/app/shared/components/shared/converter'; -import { Name } from 'src/app/shared/components/shared/name'; -import { AbstractFormlyComponent, OeFormlyField, OeFormlyView } from 'src/app/shared/components/shared/oe-formly-component'; -import { Phase } from 'src/app/shared/components/shared/phase'; +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { TextIndentation } from "src/app/shared/components/modal/modal-line/modal-line"; +import { Converter } from "src/app/shared/components/shared/converter"; +import { Name } from "src/app/shared/components/shared/name"; +import { AbstractFormlyComponent, OeFormlyField, OeFormlyView } from "src/app/shared/components/shared/oe-formly-component"; +import { Phase } from "src/app/shared/components/shared/phase"; -import { ChannelAddress, CurrentData, EdgeConfig } from '../../../../../shared/shared'; +import { ChannelAddress, CurrentData, EdgeConfig } from "../../../../../shared/shared"; @Component({ - templateUrl: '../../../../../shared/components/formly/formly-field-modal/template.html', + templateUrl: "../../../../../shared/components/formly/formly-field-modal/template.html", }) export class ModalComponent extends AbstractFormlyComponent { public static generateView(config: EdgeConfig, translate: TranslateService): OeFormlyView { const evcss: EdgeConfig.Component[] | null = config.getComponentsImplementingNature("io.openems.edge.evcs.api.Evcs") - .filter(component => !(component.factoryId == 'Evcs.Cluster.SelfConsumption') && - !(component.factoryId == 'Evcs.Cluster.PeakShaving') && !component.isEnabled == false); + .filter(component => !(component.factoryId == "Evcs.Cluster.SelfConsumption") && + !(component.factoryId == "Evcs.Cluster.PeakShaving") && !component.isEnabled == false); const consumptionMeters: EdgeConfig.Component[] | null = config.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && config.isTypeConsumptionMetered(component)); @@ -26,59 +26,59 @@ export class ModalComponent extends AbstractFormlyComponent { // Total lines.push({ - type: 'channel-line', - name: translate.instant('General.TOTAL'), - channel: '_sum/ConsumptionActivePower', + type: "channel-line", + name: translate.instant("General.TOTAL"), + channel: "_sum/ConsumptionActivePower", converter: Converter.ONLY_POSITIVE_POWER_AND_NEGATIVE_AS_ZERO, }); Phase.THREE_PHASE.forEach(phase => { lines.push({ - type: 'channel-line', - name: translate.instant('General.phase') + ' ' + phase, + type: "channel-line", + name: translate.instant("General.phase") + " " + phase, indentation: TextIndentation.SINGLE, - channel: '_sum/ConsumptionActivePower' + phase, + channel: "_sum/ConsumptionActivePower" + phase, converter: Converter.ONLY_POSITIVE_POWER_AND_NEGATIVE_AS_ZERO, }); }); if (evcss.length > 0) { lines.push({ - type: 'horizontal-line', + type: "horizontal-line", }); } // Evcss evcss.forEach((evcs, index) => { lines.push({ - type: 'channel-line', + type: "channel-line", name: Name.METER_ALIAS_OR_ID(evcs), - channel: evcs.id + '/ChargePower', + channel: evcs.id + "/ChargePower", converter: Converter.ONLY_POSITIVE_POWER_AND_NEGATIVE_AS_ZERO, }); if (index < (evcss.length - 1)) { - lines.push({ type: 'horizontal-line' }); + lines.push({ type: "horizontal-line" }); } }); if (consumptionMeters.length > 0) { - lines.push({ type: 'horizontal-line' }); + lines.push({ type: "horizontal-line" }); } // Consumptionmeters consumptionMeters.forEach((meter, index) => { lines.push({ - type: 'channel-line', + type: "channel-line", name: Name.METER_ALIAS_OR_ID(meter), - channel: meter.id + '/ActivePower', + channel: meter.id + "/ActivePower", converter: Converter.ONLY_POSITIVE_POWER_AND_NEGATIVE_AS_ZERO, }); Phase.THREE_PHASE.forEach(phase => { lines.push({ - type: 'channel-line', - name: 'Phase ' + phase, - channel: meter.id + '/ActivePower' + phase, + type: "channel-line", + name: "Phase " + phase, + channel: meter.id + "/ActivePower" + phase, indentation: TextIndentation.SINGLE, converter: Converter.ONLY_POSITIVE_POWER_AND_NEGATIVE_AS_ZERO, }); @@ -86,35 +86,35 @@ export class ModalComponent extends AbstractFormlyComponent { if (index < (consumptionMeters.length - 1)) { lines.push({ - type: 'horizontal-line', + type: "horizontal-line", }); } }); - lines.push({ type: 'horizontal-line' }); + lines.push({ type: "horizontal-line" }); // OtherPower - const channelsToSubscribe: ChannelAddress[] = [new ChannelAddress('_sum', 'ConsumptionActivePower')]; + const channelsToSubscribe: ChannelAddress[] = [new ChannelAddress("_sum", "ConsumptionActivePower")]; - evcss.forEach(evcs => channelsToSubscribe.push(new ChannelAddress(evcs.id, 'ChargePower'))); + evcss.forEach(evcs => channelsToSubscribe.push(new ChannelAddress(evcs.id, "ChargePower"))); consumptionMeters.forEach(meter => { - channelsToSubscribe.push(...[new ChannelAddress(meter.id, 'ActivePower')]); + channelsToSubscribe.push(...[new ChannelAddress(meter.id, "ActivePower")]); }); lines.push({ - type: 'value-from-channels-line', - name: translate.instant('General.otherConsumption'), + type: "value-from-channels-line", + name: translate.instant("General.otherConsumption"), value: (currentData: CurrentData) => Converter.ONLY_POSITIVE_POWER_AND_NEGATIVE_AS_ZERO(Converter.CALCULATE_CONSUMPTION_OTHER_POWER(evcss, consumptionMeters, currentData)), channelsToSubscribe: channelsToSubscribe, }); lines.push({ - type: 'info-line', - name: translate.instant('Edge.Index.Widgets.phasesInfo'), + type: "info-line", + name: translate.instant("Edge.Index.Widgets.phasesInfo"), }); return { - title: translate.instant('General.consumption'), + title: translate.instant("General.consumption"), lines: lines, }; } diff --git a/ui/src/app/edge/live/common/grid/Common_Grid.ts b/ui/src/app/edge/live/common/grid/Common_Grid.ts index b560e4725d4..f0383f18ff1 100644 --- a/ui/src/app/edge/live/common/grid/Common_Grid.ts +++ b/ui/src/app/edge/live/common/grid/Common_Grid.ts @@ -1,8 +1,8 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { FlatComponent } from './flat/flat'; -import { ModalComponent } from './modal/modal'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { FlatComponent } from "./flat/flat"; +import { ModalComponent } from "./modal/modal"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/common/grid/flat/flat.html b/ui/src/app/edge/live/common/grid/flat/flat.html index 9c330d1db35..0005f51617a 100644 --- a/ui/src/app/edge/live/common/grid/flat/flat.html +++ b/ui/src/app/edge/live/common/grid/flat/flat.html @@ -12,4 +12,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/common/grid/flat/flat.ts b/ui/src/app/edge/live/common/grid/flat/flat.ts index f89da9ed307..64bc50f0ff6 100644 --- a/ui/src/app/edge/live/common/grid/flat/flat.ts +++ b/ui/src/app/edge/live/common/grid/flat/flat.ts @@ -1,21 +1,21 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { Converter } from 'src/app/shared/components/shared/converter'; -import { ChannelAddress, CurrentData, GridMode, Utils } from 'src/app/shared/shared'; -import { Icon } from 'src/app/shared/type/widget'; -import { GridSectionComponent } from '../../../energymonitor/chart/section/grid.component'; -import { ModalComponent } from '../modal/modal'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { Converter } from "src/app/shared/components/shared/converter"; +import { ChannelAddress, CurrentData, GridMode, Utils } from "src/app/shared/shared"; +import { Icon } from "src/app/shared/type/widget"; +import { GridSectionComponent } from "../../../energymonitor/chart/section/grid.component"; +import { ModalComponent } from "../modal/modal"; @Component({ - selector: 'grid', - templateUrl: './flat.html', + selector: "grid", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { - private static readonly RESTRICTION_MODE: ChannelAddress = new ChannelAddress('ctrlEssLimiter14a0', 'RestrictionMode'); - private static readonly GRID_ACTIVE_POWER: ChannelAddress = new ChannelAddress('_sum', 'GridActivePower'); - private static readonly GRID_MODE: ChannelAddress = new ChannelAddress('_sum', 'GridMode'); + private static readonly RESTRICTION_MODE: ChannelAddress = new ChannelAddress("ctrlEssLimiter14a0", "RestrictionMode"); + private static readonly GRID_ACTIVE_POWER: ChannelAddress = new ChannelAddress("_sum", "GridActivePower"); + private static readonly GRID_MODE: ChannelAddress = new ChannelAddress("_sum", "GridMode"); public readonly CONVERT_WATT_TO_KILOWATT = Utils.CONVERT_WATT_TO_KILOWATT; public readonly GridMode = GridMode; @@ -43,9 +43,9 @@ export class FlatComponent extends AbstractFlatWidget { FlatComponent.GRID_ACTIVE_POWER, FlatComponent.GRID_MODE, // TODO should be moved to Modal - new ChannelAddress('_sum', 'GridActivePowerL1'), - new ChannelAddress('_sum', 'GridActivePowerL2'), - new ChannelAddress('_sum', 'GridActivePowerL3'), + new ChannelAddress("_sum", "GridActivePowerL1"), + new ChannelAddress("_sum", "GridActivePowerL2"), + new ChannelAddress("_sum", "GridActivePowerL3"), ]; if (GridSectionComponent.isControllerEnabled(this.config, "Controller.Ess.Limiter14a")) { diff --git a/ui/src/app/edge/live/common/grid/modal/modal.spec.ts b/ui/src/app/edge/live/common/grid/modal/modal.spec.ts index e78fcf03a69..f886559ec80 100644 --- a/ui/src/app/edge/live/common/grid/modal/modal.spec.ts +++ b/ui/src/app/edge/live/common/grid/modal/modal.spec.ts @@ -17,11 +17,11 @@ const VIEW_CONTEXT = (properties?: {}): OeFormlyViewTester.Context => ({ ...properties, }); -describe('Grid - Modal', () => { +describe("Grid - Modal", () => { let TEST_CONTEXT: TestContext; beforeEach(async () => TEST_CONTEXT = await sharedSetup()); - it('generateView()', () => { + it("generateView()", () => { { // No Meters const EMS = DummyConfig.from(); @@ -71,7 +71,7 @@ describe('Grid - Modal', () => { }); // Offgrid - expectView(EMS, Role.ADMIN, VIEW_CONTEXT({ '_sum/GridMode': GridMode.OFF_GRID }), TEST_CONTEXT, { + expectView(EMS, Role.ADMIN, VIEW_CONTEXT({ "_sum/GridMode": GridMode.OFF_GRID }), TEST_CONTEXT, { title: "Netz", lines: [ { diff --git a/ui/src/app/edge/live/common/grid/modal/modal.ts b/ui/src/app/edge/live/common/grid/modal/modal.ts index 1087a3a69f4..899d9f6642a 100644 --- a/ui/src/app/edge/live/common/grid/modal/modal.ts +++ b/ui/src/app/edge/live/common/grid/modal/modal.ts @@ -1,27 +1,27 @@ -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { TextIndentation } from 'src/app/shared/components/modal/modal-line/modal-line'; -import { Converter } from 'src/app/shared/components/shared/converter'; -import { Filter } from 'src/app/shared/components/shared/filter'; -import { Name } from 'src/app/shared/components/shared/name'; -import { AbstractFormlyComponent, OeFormlyField, OeFormlyView } from 'src/app/shared/components/shared/oe-formly-component'; -import { ChannelAddress, CurrentData, EdgeConfig } from 'src/app/shared/shared'; -import { Role } from 'src/app/shared/type/role'; -import { GridSectionComponent } from '../../../energymonitor/chart/section/grid.component'; +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { TextIndentation } from "src/app/shared/components/modal/modal-line/modal-line"; +import { Converter } from "src/app/shared/components/shared/converter"; +import { Filter } from "src/app/shared/components/shared/filter"; +import { Name } from "src/app/shared/components/shared/name"; +import { AbstractFormlyComponent, OeFormlyField, OeFormlyView } from "src/app/shared/components/shared/oe-formly-component"; +import { ChannelAddress, CurrentData, EdgeConfig } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; +import { GridSectionComponent } from "../../../energymonitor/chart/section/grid.component"; @Component({ - templateUrl: '../../../../../shared/components/formly/formly-field-modal/template.html', + templateUrl: "../../../../../shared/components/formly/formly-field-modal/template.html", }) export class ModalComponent extends AbstractFormlyComponent { public static generateView(config: EdgeConfig, role: Role, translate: TranslateService): OeFormlyView { - const isActivated = GridSectionComponent.isControllerEnabled(config, 'Controller.Ess.Limiter14a'); + const isActivated = GridSectionComponent.isControllerEnabled(config, "Controller.Ess.Limiter14a"); // Grid-Mode const lines: OeFormlyField[] = [{ - type: 'channel-line', + type: "channel-line", name: translate.instant("General.offGrid"), - channel: '_sum/GridMode', + channel: "_sum/GridMode", filter: Filter.GRID_MODE_IS_OFF_GRID, converter: Converter.HIDE_VALUE, }]; @@ -32,7 +32,7 @@ export class ModalComponent extends AbstractFormlyComponent { if (gridMeters.length > 1) { if (isActivated) { lines.push({ - type: 'value-from-channels-line', + type: "value-from-channels-line", name: translate.instant("General.state"), value: (currentData: CurrentData) => Converter.GRID_STATE_TO_MESSAGE(translate, currentData), channelsToSubscribe: [ @@ -44,19 +44,19 @@ export class ModalComponent extends AbstractFormlyComponent { lines.push( { - type: 'channel-line', + type: "channel-line", name: translate.instant("General.gridSellAdvanced"), - channel: '_sum/GridActivePower', + channel: "_sum/GridActivePower", converter: Converter.GRID_SELL_POWER_OR_ZERO, }, { - type: 'channel-line', + type: "channel-line", name: translate.instant("General.gridBuyAdvanced"), - channel: '_sum/GridActivePower', + channel: "_sum/GridActivePower", converter: Converter.GRID_BUY_POWER_OR_ZERO, }, { - type: 'horizontal-line', + type: "horizontal-line", }, ); } @@ -68,7 +68,7 @@ export class ModalComponent extends AbstractFormlyComponent { // Two lines if there is only one meter (= same visualization as with Sum Channels) if (isActivated) { lines.push({ - type: 'value-from-channels-line', + type: "value-from-channels-line", name: translate.instant("General.state"), value: (currentData: CurrentData) => Converter.GRID_STATE_TO_MESSAGE(translate, currentData), channelsToSubscribe: [ @@ -80,15 +80,15 @@ export class ModalComponent extends AbstractFormlyComponent { lines.push( { - type: 'channel-line', + type: "channel-line", name: translate.instant("General.gridSellAdvanced"), - channel: meter.id + '/ActivePower', + channel: meter.id + "/ActivePower", converter: Converter.GRID_SELL_POWER_OR_ZERO, }, { - type: 'channel-line', + type: "channel-line", name: translate.instant("General.gridBuyAdvanced"), - channel: meter.id + '/ActivePower', + channel: meter.id + "/ActivePower", converter: Converter.GRID_BUY_POWER_OR_ZERO, }, ); @@ -96,9 +96,9 @@ export class ModalComponent extends AbstractFormlyComponent { } else { // More than one meter? Show only one line per meter. lines.push({ - type: 'channel-line', + type: "channel-line", name: Name.SUFFIX_FOR_GRID_SELL_OR_GRID_BUY(translate, meter.alias), - channel: meter.id + '/ActivePower', + channel: meter.id + "/ActivePower", converter: Converter.POWER_IN_WATT, }); } @@ -108,7 +108,7 @@ export class ModalComponent extends AbstractFormlyComponent { ...ModalComponent.generatePhasesView(meter, translate, role), { // Line separator - type: 'horizontal-line', + type: "horizontal-line", }, ); } @@ -116,24 +116,24 @@ export class ModalComponent extends AbstractFormlyComponent { if (gridMeters.length > 0) { // Technical info lines.push({ - type: 'info-line', + type: "info-line", name: translate.instant("Edge.Index.Widgets.phasesInfo"), }); } return { - title: translate.instant('General.grid'), + title: translate.instant("General.grid"), lines: lines, }; } private static generatePhasesView(component: EdgeConfig.Component, translate: TranslateService, role: Role): OeFormlyField[] { - return ['L1', 'L2', 'L3'] + return ["L1", "L2", "L3"] .map(phase => { - type: 'children-line', + type: "children-line", name: { - channel: ChannelAddress.fromString(component.id + '/ActivePower' + phase), - converter: Name.SUFFIX_FOR_GRID_SELL_OR_GRID_BUY(translate, translate.instant('General.phase') + " " + phase), + channel: ChannelAddress.fromString(component.id + "/ActivePower" + phase), + converter: Name.SUFFIX_FOR_GRID_SELL_OR_GRID_BUY(translate, translate.instant("General.phase") + " " + phase), }, indentation: TextIndentation.SINGLE, children: ModalComponent.generatePhasesLineItems(role, phase, component), @@ -144,19 +144,19 @@ export class ModalComponent extends AbstractFormlyComponent { const children: OeFormlyField[] = []; if (Role.isAtLeast(role, Role.INSTALLER)) { children.push({ - type: 'item', - channel: component.id + '/Voltage' + phase, + type: "item", + channel: component.id + "/Voltage" + phase, converter: Converter.VOLTAGE_IN_MILLIVOLT_TO_VOLT, }, { - type: 'item', - channel: component.id + '/Current' + phase, + type: "item", + channel: component.id + "/Current" + phase, converter: Converter.CURRENT_IN_MILLIAMPERE_TO_AMPERE, }); } children.push({ - type: 'item', - channel: component.id + '/ActivePower' + phase, + type: "item", + channel: component.id + "/ActivePower" + phase, converter: Converter.POSITIVE_POWER, }); diff --git a/ui/src/app/edge/live/common/production/Common_Production.ts b/ui/src/app/edge/live/common/production/Common_Production.ts index ab5942cf712..6ca75abadc7 100644 --- a/ui/src/app/edge/live/common/production/Common_Production.ts +++ b/ui/src/app/edge/live/common/production/Common_Production.ts @@ -1,8 +1,8 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { FlatComponent } from './flat/flat'; -import { ModalComponent } from './modal/modal'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { FlatComponent } from "./flat/flat"; +import { ModalComponent } from "./modal/modal"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/common/production/flat/flat.html b/ui/src/app/edge/live/common/production/flat/flat.html index 3f5ed5d187b..77b660e2749 100644 --- a/ui/src/app/edge/live/common/production/flat/flat.html +++ b/ui/src/app/edge/live/common/production/flat/flat.html @@ -10,4 +10,4 @@ [converter]="CONVERT_WATT_TO_KILOWATT"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/common/production/flat/flat.ts b/ui/src/app/edge/live/common/production/flat/flat.ts index c0459210a0c..678ef3f8c87 100644 --- a/ui/src/app/edge/live/common/production/flat/flat.ts +++ b/ui/src/app/edge/live/common/production/flat/flat.ts @@ -1,11 +1,11 @@ -import { EdgeConfig, Utils } from 'src/app/shared/shared'; -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ModalComponent } from '../modal/modal'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { EdgeConfig, Utils } from "src/app/shared/shared"; +import { ModalComponent } from "../modal/modal"; @Component({ - selector: 'Common_Production', - templateUrl: './flat.html', + selector: "Common_Production", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { diff --git a/ui/src/app/edge/live/common/production/modal/modal.html b/ui/src/app/edge/live/common/production/modal/modal.html index e48c4cf52f6..81848b9b156 100644 --- a/ui/src/app/edge/live/common/production/modal/modal.html +++ b/ui/src/app/edge/live/common/production/modal/modal.html @@ -47,4 +47,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/common/production/modal/modal.ts b/ui/src/app/edge/live/common/production/modal/modal.ts index a631d288bef..013ab5b5307 100644 --- a/ui/src/app/edge/live/common/production/modal/modal.ts +++ b/ui/src/app/edge/live/common/production/modal/modal.ts @@ -1,9 +1,9 @@ -import { Component } from '@angular/core'; -import { AbstractModal } from 'src/app/shared/components/modal/abstractModal'; -import { ChannelAddress, EdgeConfig, Utils } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractModal } from "src/app/shared/components/modal/abstractModal"; +import { ChannelAddress, EdgeConfig, Utils } from "src/app/shared/shared"; @Component({ - templateUrl: './modal.html', + templateUrl: "./modal.html", }) export class ModalComponent extends AbstractModal { @@ -27,10 +27,10 @@ export class ModalComponent extends AbstractModal { this.config.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && this.config.isProducer(component)) .forEach(component => { - channelAddresses.push(new ChannelAddress(component.id, 'ActivePower')); - channelAddresses.push(new ChannelAddress(component.id, 'ActivePowerL1')); - channelAddresses.push(new ChannelAddress(component.id, 'ActivePowerL2')); - channelAddresses.push(new ChannelAddress(component.id, 'ActivePowerL3')); + channelAddresses.push(new ChannelAddress(component.id, "ActivePower")); + channelAddresses.push(new ChannelAddress(component.id, "ActivePowerL1")); + channelAddresses.push(new ChannelAddress(component.id, "ActivePowerL2")); + channelAddresses.push(new ChannelAddress(component.id, "ActivePowerL3")); this.productionMeters.push(component); }); diff --git a/ui/src/app/edge/live/common/selfconsumption/Common_Selfconsumption.ts b/ui/src/app/edge/live/common/selfconsumption/Common_Selfconsumption.ts index 6c49f7603a4..af8b2b70f3b 100644 --- a/ui/src/app/edge/live/common/selfconsumption/Common_Selfconsumption.ts +++ b/ui/src/app/edge/live/common/selfconsumption/Common_Selfconsumption.ts @@ -1,8 +1,8 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { FlatComponent } from './flat/flat'; -import { ModalComponent } from './modal/modal'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { SharedModule } from "src/app/shared/shared.module"; +import { FlatComponent } from "./flat/flat"; +import { ModalComponent } from "./modal/modal"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/common/selfconsumption/flat/flat.html b/ui/src/app/edge/live/common/selfconsumption/flat/flat.html index d013066fd28..87d7e770b3e 100644 --- a/ui/src/app/edge/live/common/selfconsumption/flat/flat.html +++ b/ui/src/app/edge/live/common/selfconsumption/flat/flat.html @@ -1,4 +1,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/common/selfconsumption/flat/flat.ts b/ui/src/app/edge/live/common/selfconsumption/flat/flat.ts index 60c4c13b999..f1bf518f2b2 100644 --- a/ui/src/app/edge/live/common/selfconsumption/flat/flat.ts +++ b/ui/src/app/edge/live/common/selfconsumption/flat/flat.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { ChannelAddress, CurrentData, Utils } from 'src/app/shared/shared'; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { ChannelAddress, CurrentData, Utils } from "src/app/shared/shared"; -import { ModalComponent } from '../modal/modal'; +import { ModalComponent } from "../modal/modal"; @Component({ - selector: 'Common_Selfconsumption', - templateUrl: './flat.html', + selector: "Common_Selfconsumption", + templateUrl: "./flat.html", }) export class FlatComponent extends AbstractFlatWidget { @@ -22,18 +22,18 @@ export class FlatComponent extends AbstractFlatWidget { protected override getChannelAddresses() { return [ - new ChannelAddress('_sum', 'GridActivePower'), - new ChannelAddress('_sum', 'ProductionActivePower'), + new ChannelAddress("_sum", "GridActivePower"), + new ChannelAddress("_sum", "ProductionActivePower"), ]; } protected override onCurrentData(currentData: CurrentData) { this.calculatedSelfConsumption = Utils.calculateSelfConsumption( Utils.multiplySafely( - currentData.allComponents['_sum/GridActivePower'], + currentData.allComponents["_sum/GridActivePower"], -1, ), - currentData.allComponents['_sum/ProductionActivePower'], + currentData.allComponents["_sum/ProductionActivePower"], ); } diff --git a/ui/src/app/edge/live/common/selfconsumption/modal/modal.spec.ts b/ui/src/app/edge/live/common/selfconsumption/modal/modal.spec.ts index f640f899548..9571d751120 100644 --- a/ui/src/app/edge/live/common/selfconsumption/modal/modal.spec.ts +++ b/ui/src/app/edge/live/common/selfconsumption/modal/modal.spec.ts @@ -13,11 +13,11 @@ export function expectView(testContext: TestContext, viewContext: OeFormlyViewTe expect(generatedView).toEqual(view); } -describe('SelfConsumption - Modal', () => { +describe("SelfConsumption - Modal", () => { let TEST_CONTEXT: TestContext; beforeEach(async () => TEST_CONTEXT = await sharedSetup()); - it('generateView()', () => { + it("generateView()", () => { { expectView(TEST_CONTEXT, VIEW_CONTEXT, { title: "Eigenverbrauch", diff --git a/ui/src/app/edge/live/common/selfconsumption/modal/modal.ts b/ui/src/app/edge/live/common/selfconsumption/modal/modal.ts index 531b1b41123..81894e904dd 100644 --- a/ui/src/app/edge/live/common/selfconsumption/modal/modal.ts +++ b/ui/src/app/edge/live/common/selfconsumption/modal/modal.ts @@ -1,19 +1,19 @@ -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { AbstractFormlyComponent, OeFormlyView } from 'src/app/shared/components/shared/oe-formly-component'; -import { EdgeConfig } from 'src/app/shared/shared'; -import { Role } from 'src/app/shared/type/role'; +import { Component } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { AbstractFormlyComponent, OeFormlyView } from "src/app/shared/components/shared/oe-formly-component"; +import { EdgeConfig } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; @Component({ - templateUrl: '../../../../../shared/components/formly/formly-field-modal/template.html', + templateUrl: "../../../../../shared/components/formly/formly-field-modal/template.html", }) export class ModalComponent extends AbstractFormlyComponent { public static generateView(translate: TranslateService): OeFormlyView { return { - title: translate.instant('General.selfConsumption'), + title: translate.instant("General.selfConsumption"), lines: [{ - type: 'info-line', + type: "info-line", name: translate.instant("Edge.Index.Widgets.selfconsumptionInfo"), }], }; diff --git a/ui/src/app/edge/live/common/storage/modal/modal.component.ts b/ui/src/app/edge/live/common/storage/modal/modal.component.ts index e64da36eb1b..6ce266a1401 100644 --- a/ui/src/app/edge/live/common/storage/modal/modal.component.ts +++ b/ui/src/app/edge/live/common/storage/modal/modal.component.ts @@ -1,15 +1,15 @@ // @ts-strict-ignore -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { isBefore } from 'date-fns'; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils, Websocket } from 'src/app/shared/shared'; -import { Role } from 'src/app/shared/type/role'; +import { Component, Input, OnDestroy, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup } from "@angular/forms"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { isBefore } from "date-fns"; +import { ChannelAddress, Edge, EdgeConfig, Service, Utils, Websocket } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; @Component({ - selector: 'storage-modal', - templateUrl: './modal.component.html', + selector: "storage-modal", + templateUrl: "./modal.component.html", }) export class StorageModalComponent implements OnInit, OnDestroy { @@ -40,13 +40,13 @@ export class StorageModalComponent implements OnInit, OnDestroy { ngOnInit() { // Future Work: Remove when all ems are at least at this version - this.controllerIsRequiredEdgeVersion = this.edge.isVersionAtLeast('2023.2.5'); + this.controllerIsRequiredEdgeVersion = this.edge.isVersionAtLeast("2023.2.5"); this.isAtLeastInstaller = this.edge.roleIsAtLeast(Role.INSTALLER); - const emergencyReserveCtrl = this.config.getComponentsByFactory('Controller.Ess.EmergencyCapacityReserve'); + const emergencyReserveCtrl = this.config.getComponentsByFactory("Controller.Ess.EmergencyCapacityReserve"); const prepareBatteryExtensionCtrl = this.config.getComponentsByFactory("Controller.Ess.PrepareBatteryExtension"); const components = [...prepareBatteryExtensionCtrl, ...emergencyReserveCtrl].filter(component => component.isEnabled).reduce((result, component) => { - const essId = component.properties['ess.id']; + const essId = component.properties["ess.id"]; if (result[essId] == null) { result[essId] = []; } @@ -78,18 +78,18 @@ export class StorageModalComponent implements OnInit, OnDestroy { const controllerFrmGrp: FormGroup = new FormGroup({}); for (const controller of (controllers as EdgeConfig.Component[])) { - if (controller.factoryId == 'Controller.Ess.EmergencyCapacityReserve') { + if (controller.factoryId == "Controller.Ess.EmergencyCapacityReserve") { const reserveSoc = currentData.channel[controller.id + "/_PropertyReserveSoc"] ?? 20 /* default Reserve-Soc */; const isReserveSocEnabled = currentData.channel[controller.id + "/_PropertyIsReserveSocEnabled"] == 1; - controllerFrmGrp.addControl('emergencyReserveController', + controllerFrmGrp.addControl("emergencyReserveController", this.formBuilder.group({ - controllerId: new FormControl(controller['id']), + controllerId: new FormControl(controller["id"]), isReserveSocEnabled: new FormControl(isReserveSocEnabled), reserveSoc: new FormControl(reserveSoc), }), ); - } else if (controller.factoryId == 'Controller.Ess.PrepareBatteryExtension') { + } else if (controller.factoryId == "Controller.Ess.PrepareBatteryExtension") { const isRunning = currentData.channel[controller.id + "/_PropertyIsRunning"] == 1; @@ -124,7 +124,7 @@ export class StorageModalComponent implements OnInit, OnDestroy { this.isTargetTimeInValid.set(essId, false); } - controllerFrmGrp.addControl('prepareBatteryExtensionController', + controllerFrmGrp.addControl("prepareBatteryExtensionController", this.formBuilder.group({ controllerId: new FormControl(controller.id), isRunning: new FormControl(isRunning), @@ -155,26 +155,26 @@ export class StorageModalComponent implements OnInit, OnDestroy { for (const essId in this.formGroup.controls) { const essGroups = this.formGroup.controls[essId]; - const emergencyReserveController = (essGroups.get('emergencyReserveController') as FormGroup)?.controls ?? {}; + const emergencyReserveController = (essGroups.get("emergencyReserveController") as FormGroup)?.controls ?? {}; for (const essGroup of Object.keys(emergencyReserveController)) { if (emergencyReserveController[essGroup].dirty) { - if (updateArray.get(emergencyReserveController['controllerId'].value)) { - updateArray.get(emergencyReserveController['controllerId'].value).push(new Map().set(essGroup, emergencyReserveController[essGroup].value)); + if (updateArray.get(emergencyReserveController["controllerId"].value)) { + updateArray.get(emergencyReserveController["controllerId"].value).push(new Map().set(essGroup, emergencyReserveController[essGroup].value)); } else { - updateArray.set(emergencyReserveController['controllerId'].value, [new Map().set(essGroup, emergencyReserveController[essGroup].value)]); + updateArray.set(emergencyReserveController["controllerId"].value, [new Map().set(essGroup, emergencyReserveController[essGroup].value)]); } } } - const prepareBatteryExtensionController = (essGroups.get('prepareBatteryExtensionController') as FormGroup)?.controls ?? {}; + const prepareBatteryExtensionController = (essGroups.get("prepareBatteryExtensionController") as FormGroup)?.controls ?? {}; for (const essGroup of Object.keys(prepareBatteryExtensionController)) { if (prepareBatteryExtensionController[essGroup].dirty) { // For simplicity, split targetTimeSpecified in 2 for template formControlName - if (updateArray.get(prepareBatteryExtensionController['controllerId'].value)) { - updateArray.get(prepareBatteryExtensionController['controllerId'].value).push(new Map().set(essGroup, prepareBatteryExtensionController[essGroup].value)); + if (updateArray.get(prepareBatteryExtensionController["controllerId"].value)) { + updateArray.get(prepareBatteryExtensionController["controllerId"].value).push(new Map().set(essGroup, prepareBatteryExtensionController[essGroup].value)); } else { - updateArray.set(prepareBatteryExtensionController['controllerId'].value, [new Map().set(essGroup, prepareBatteryExtensionController[essGroup].value)]); + updateArray.set(prepareBatteryExtensionController["controllerId"].value, [new Map().set(essGroup, prepareBatteryExtensionController[essGroup].value)]); } } } @@ -193,10 +193,10 @@ export class StorageModalComponent implements OnInit, OnDestroy { }); this.edge.updateComponentConfig(this.websocket, controllerId, properties).then(() => { - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); this.formGroup.markAsPristine(); }).catch(reason => { - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason, "danger"); }); } } diff --git a/ui/src/app/edge/live/common/storage/storage.component.html b/ui/src/app/edge/live/common/storage/storage.component.html index 13715f5e0ca..d7ffcb21081 100644 --- a/ui/src/app/edge/live/common/storage/storage.component.html +++ b/ui/src/app/edge/live/common/storage/storage.component.html @@ -16,9 +16,9 @@ - + @@ -60,4 +60,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/common/storage/storage.component.ts b/ui/src/app/edge/live/common/storage/storage.component.ts index 98549f34bff..ca1846f220f 100644 --- a/ui/src/app/edge/live/common/storage/storage.component.ts +++ b/ui/src/app/edge/live/common/storage/storage.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { formatNumber } from '@angular/common'; -import { Component } from '@angular/core'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; +import { formatNumber } from "@angular/common"; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; import { CurrentData } from "src/app/shared/shared"; -import { DateUtils } from 'src/app/shared/utils/date/dateutils'; +import { DateUtils } from "src/app/shared/utils/date/dateutils"; -import { ChannelAddress, EdgeConfig, Utils } from '../../../../shared/shared'; -import { StorageModalComponent } from './modal/modal.component'; +import { ChannelAddress, EdgeConfig, Utils } from "../../../../shared/shared"; +import { StorageModalComponent } from "./modal/modal.component"; @Component({ - selector: 'storage', - templateUrl: './storage.component.html', + selector: "storage", + templateUrl: "./storage.component.html", }) export class StorageComponent extends AbstractFlatWidget { @@ -52,21 +52,21 @@ export class StorageComponent extends AbstractFlatWidget { */ public convertPower(value: number, isCharge?: boolean) { if (value == null) { - return '-'; + return "-"; } const thisValue: number = (value / 1000); // Round thisValue to Integer when decimal place equals 0 if (thisValue > 0) { - return formatNumber(thisValue, 'de', '1.0-1') + " kW"; // TODO get locale dynamically + return formatNumber(thisValue, "de", "1.0-1") + " kW"; // TODO get locale dynamically } else if (thisValue == 0 && isCharge) { // if thisValue is 0, then show only when charge and not discharge - return '0 kW'; + return "0 kW"; } else { - return '-'; + return "-"; } } @@ -88,12 +88,12 @@ export class StorageComponent extends AbstractFlatWidget { protected override getChannelAddresses() { const channelAddresses: ChannelAddress[] = [ - new ChannelAddress('_sum', 'EssSoc'), + new ChannelAddress("_sum", "EssSoc"), // TODO should be moved to Modal - new ChannelAddress('_sum', 'EssActivePowerL1'), - new ChannelAddress('_sum', 'EssActivePowerL2'), - new ChannelAddress('_sum', 'EssActivePowerL3'), + new ChannelAddress("_sum", "EssActivePowerL1"), + new ChannelAddress("_sum", "EssActivePowerL2"), + new ChannelAddress("_sum", "EssActivePowerL3"), ]; this.prepareBatteryExtensionCtrl = this.config.getComponentsByFactory("Controller.Ess.PrepareBatteryExtension") @@ -101,7 +101,7 @@ export class StorageComponent extends AbstractFlatWidget { .reduce((result, component) => { return { ...result, - [component.properties['ess.id']]: component, + [component.properties["ess.id"]]: component, }; }, {}); @@ -113,26 +113,26 @@ export class StorageComponent extends AbstractFlatWidget { new ChannelAddress(controller.id, "CtrlIsChargingEss"), new ChannelAddress(controller.id, "CtrlIsDischargingEss"), new ChannelAddress(controller.id, "_PropertyIsRunning"), - new ChannelAddress(controller.id, '_PropertyTargetTimeSpecified'), - new ChannelAddress(controller.id, '_PropertyTargetTime'), + new ChannelAddress(controller.id, "_PropertyTargetTimeSpecified"), + new ChannelAddress(controller.id, "_PropertyTargetTime"), ); } // Get emergencyReserves this.emergencyReserveComponents = this.config - .getComponentsByFactory('Controller.Ess.EmergencyCapacityReserve') + .getComponentsByFactory("Controller.Ess.EmergencyCapacityReserve") .filter(component => component.isEnabled) .reduce((result, component) => { return { ...result, - [component.properties['ess.id']]: component, + [component.properties["ess.id"]]: component, }; }, {}); for (const component of Object.values(this.emergencyReserveComponents)) { channelAddresses.push( - new ChannelAddress(component.id, '_PropertyReserveSoc'), - new ChannelAddress(component.id, '_PropertyIsReserveSocEnabled'), + new ChannelAddress(component.id, "_PropertyReserveSoc"), + new ChannelAddress(component.id, "_PropertyIsReserveSocEnabled"), ); } // Get Chargers @@ -142,7 +142,7 @@ export class StorageComponent extends AbstractFlatWidget { .filter(component => component.isEnabled); for (const component of this.chargerComponents) { channelAddresses.push( - new ChannelAddress(component.id, 'ActualPower'), + new ChannelAddress(component.id, "ActualPower"), ); } @@ -165,14 +165,14 @@ export class StorageComponent extends AbstractFlatWidget { .includes("io.openems.edge.ess.api.HybridEss"); channelAddresses.push( - new ChannelAddress(component.id, 'Soc'), - new ChannelAddress(component.id, 'Capacity'), + new ChannelAddress(component.id, "Soc"), + new ChannelAddress(component.id, "Capacity"), ); if (this.config.factories[component.factoryId].natureIds.includes("io.openems.edge.ess.api.AsymmetricEss")) { channelAddresses.push( - new ChannelAddress(component.id, 'ActivePowerL1'), - new ChannelAddress(component.id, 'ActivePowerL2'), - new ChannelAddress(component.id, 'ActivePowerL3'), + new ChannelAddress(component.id, "ActivePowerL1"), + new ChannelAddress(component.id, "ActivePowerL2"), + new ChannelAddress(component.id, "ActivePowerL3"), ); } } @@ -187,22 +187,22 @@ export class StorageComponent extends AbstractFlatWidget { this.possibleBatteryExtensionMessage.set( essId, this.getBatteryCapacityExtensionStatus( - currentData.allComponents[controller.id + '/_PropertyIsRunning'] == 1, - currentData.allComponents[controller.id + '/CtrlIsBlockingEss'], - currentData.allComponents[controller.id + '/CtrlIsChargingEss'], - currentData.allComponents[controller.id + '/CtrlIsDischargingEss'], - currentData.allComponents[controller.id + '/_PropertyTargetTimeSpecified'], - currentData.allComponents[controller.id + '/_PropertyTargetTime'], + currentData.allComponents[controller.id + "/_PropertyIsRunning"] == 1, + currentData.allComponents[controller.id + "/CtrlIsBlockingEss"], + currentData.allComponents[controller.id + "/CtrlIsChargingEss"], + currentData.allComponents[controller.id + "/CtrlIsDischargingEss"], + currentData.allComponents[controller.id + "/_PropertyTargetTimeSpecified"], + currentData.allComponents[controller.id + "/_PropertyTargetTime"], )); } // Check total State_of_Charge for dynamical icon in widget-header - const soc = currentData.allComponents['_sum/EssSoc']; - this.storageIconStyle = 'storage-' + Utils.getStorageSocSegment(soc); + const soc = currentData.allComponents["_sum/EssSoc"]; + this.storageIconStyle = "storage-" + Utils.getStorageSocSegment(soc); for (const essId in this.emergencyReserveComponents) { const controller = this.emergencyReserveComponents[essId]; - controller['currentReserveSoc'] = currentData.allComponents[controller.id + '/_PropertyReserveSoc']; + controller["currentReserveSoc"] = currentData.allComponents[controller.id + "/_PropertyReserveSoc"]; this.isEmergencyReserveEnabled[essId] = currentData.allComponents[controller.id + "/_PropertyIsReserveSocEnabled"] == 1 ? true : false; } } @@ -217,7 +217,7 @@ export class StorageComponent extends AbstractFlatWidget { const date = DateUtils.stringToDate(targetDate.toString()); return { - color: 'green', text: this.translate.instant('Edge.Index.RETROFITTING.TARGET_TIME_SPECIFIED', { + color: "green", text: this.translate.instant("Edge.Index.RETROFITTING.TARGET_TIME_SPECIFIED", { targetDate: DateUtils.toLocaleDateString(date), targetTime: date.toLocaleTimeString(), }), @@ -226,12 +226,12 @@ export class StorageComponent extends AbstractFlatWidget { if (essIsBlocking != null && essIsBlocking == 1) { // If ess reached targetSoc - return { color: 'green', text: this.translate.instant('Edge.Index.RETROFITTING.REACHED_TARGET_SOC') }; + return { color: "green", text: this.translate.instant("Edge.Index.RETROFITTING.REACHED_TARGET_SOC") }; } else if ((essIsCharging != null && essIsCharging == 1) || (essIsDischarging != null && essIsDischarging == 1)) { // If Ess is charging to or discharging to the targetSoc - return { color: 'orange', text: this.translate.instant('Edge.Index.RETROFITTING.PREPARING') }; + return { color: "orange", text: this.translate.instant("Edge.Index.RETROFITTING.PREPARING") }; } else { return null; } diff --git a/ui/src/app/edge/live/delayedselltogrid/delayedselltogrid.component.html b/ui/src/app/edge/live/delayedselltogrid/delayedselltogrid.component.html index 10874fd1d55..352d15d1357 100644 --- a/ui/src/app/edge/live/delayedselltogrid/delayedselltogrid.component.html +++ b/ui/src/app/edge/live/delayedselltogrid/delayedselltogrid.component.html @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/delayedselltogrid/delayedselltogrid.component.ts b/ui/src/app/edge/live/delayedselltogrid/delayedselltogrid.component.ts index 13e4c3dd1b9..89febc1abd0 100644 --- a/ui/src/app/edge/live/delayedselltogrid/delayedselltogrid.component.ts +++ b/ui/src/app/edge/live/delayedselltogrid/delayedselltogrid.component.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, EdgeConfig, Service, Websocket } from '../../../shared/shared'; -import { DelayedSellToGridModalComponent } from './modal/modal.component'; +import { Component, Input, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, EdgeConfig, Service, Websocket } from "../../../shared/shared"; +import { DelayedSellToGridModalComponent } from "./modal/modal.component"; @Component({ selector: DelayedSellToGridComponent.SELECTOR, - templateUrl: './delayedselltogrid.component.html', + templateUrl: "./delayedselltogrid.component.html", }) export class DelayedSellToGridComponent implements OnInit, OnDestroy { @@ -29,7 +29,7 @@ export class DelayedSellToGridComponent implements OnInit, OnDestroy { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.service.getConfig().then(config => { this.component = config.getComponent(this.componentId); diff --git a/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.html b/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.html index a439486f2c1..0327fd96b05 100644 --- a/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.html +++ b/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.html @@ -57,4 +57,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.ts b/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.ts index ef45722f679..b688531b982 100644 --- a/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.ts +++ b/ui/src/app/edge/live/delayedselltogrid/modal/modal.component.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component, Input, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, EdgeConfig, Service, Websocket } from '../../../../shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, EdgeConfig, Service, Websocket } from "../../../../shared/shared"; @Component({ selector: DelayedSellToGridModalComponent.SELECTOR, - templateUrl: './modal.component.html', + templateUrl: "./modal.component.html", }) export class DelayedSellToGridModalComponent implements OnInit { @@ -30,11 +30,11 @@ export class DelayedSellToGridModalComponent implements OnInit { ngOnInit() { this.formGroup = this.formBuilder.group({ continuousSellToGridPower: new FormControl(this.component.properties.continuousSellToGridPower, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), sellToGridPowerLimit: new FormControl(this.component.properties.sellToGridPowerLimit, Validators.compose([ - Validators.pattern('^(?:[1-9][0-9]*|0)$'), + Validators.pattern("^(?:[1-9][0-9]*|0)$"), Validators.required, ])), }); @@ -42,9 +42,9 @@ export class DelayedSellToGridModalComponent implements OnInit { applyChanges() { if (this.edge != null) { - if (this.edge.roleIsAtLeast('owner')) { - const continuousSellToGridPower = this.formGroup.controls['continuousSellToGridPower']; - const sellToGridPowerLimit = this.formGroup.controls['sellToGridPowerLimit']; + if (this.edge.roleIsAtLeast("owner")) { + const continuousSellToGridPower = this.formGroup.controls["continuousSellToGridPower"]; + const sellToGridPowerLimit = this.formGroup.controls["sellToGridPowerLimit"]; if (continuousSellToGridPower.valid && sellToGridPowerLimit.valid) { if (sellToGridPowerLimit.value > continuousSellToGridPower.value) { const updateComponentArray = []; @@ -58,23 +58,23 @@ export class DelayedSellToGridModalComponent implements OnInit { this.component.properties.continuousSellToGridPower = continuousSellToGridPower.value; this.component.properties.sellToGridPowerLimit = sellToGridPowerLimit.value; this.loading = false; - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { continuousSellToGridPower.setValue(this.component.properties.continuousSellToGridPower); sellToGridPowerLimit.setValue(this.component.properties.sellToGridPowerLimit); this.loading = false; - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); this.formGroup.markAsPristine(); } else { - this.service.toast(this.translate.instant('Edge.Index.Widgets.DelayedSellToGrid.relationError'), 'danger'); + this.service.toast(this.translate.instant("Edge.Index.Widgets.DelayedSellToGrid.relationError"), "danger"); } } else { - this.service.toast(this.translate.instant('General.inputNotValid'), 'danger'); + this.service.toast(this.translate.instant("General.inputNotValid"), "danger"); } } else { - this.service.toast(this.translate.instant('General.insufficientRights'), 'danger'); + this.service.toast(this.translate.instant("General.insufficientRights"), "danger"); } } } diff --git a/ui/src/app/edge/live/energymonitor/chart/chart.component.html b/ui/src/app/edge/live/energymonitor/chart/chart.component.html index f1a4f537a10..c2eddea61c8 100644 --- a/ui/src/app/edge/live/energymonitor/chart/chart.component.html +++ b/ui/src/app/edge/live/energymonitor/chart/chart.component.html @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/energymonitor/chart/chart.component.ts b/ui/src/app/edge/live/energymonitor/chart/chart.component.ts index 042fb641643..f0852e5d2f4 100644 --- a/ui/src/app/edge/live/energymonitor/chart/chart.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/chart.component.ts @@ -1,17 +1,17 @@ // @ts-strict-ignore -import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { fromEvent, Subject } from 'rxjs'; -import { debounceTime, delay, takeUntil } from 'rxjs/operators'; -import { Service } from 'src/app/shared/shared'; -import { CurrentData } from '../../../../shared/components/edge/currentdata'; -import { ConsumptionSectionComponent } from './section/consumption.component'; -import { GridSectionComponent } from './section/grid.component'; -import { ProductionSectionComponent } from './section/production.component'; -import { StorageSectionComponent } from './section/storage.component'; +import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from "@angular/core"; +import { Subject, fromEvent } from "rxjs"; +import { debounceTime, delay, takeUntil } from "rxjs/operators"; +import { Service } from "src/app/shared/shared"; +import { CurrentData } from "../../../../shared/components/edge/currentdata"; +import { ConsumptionSectionComponent } from "./section/consumption.component"; +import { GridSectionComponent } from "./section/grid.component"; +import { ProductionSectionComponent } from "./section/production.component"; +import { StorageSectionComponent } from "./section/storage.component"; @Component({ - selector: 'energymonitor-chart', - templateUrl: './chart.component.html', + selector: "energymonitor-chart", + templateUrl: "./chart.component.html", }) export class EnergymonitorChartComponent implements OnInit, OnDestroy { @@ -27,7 +27,7 @@ export class EnergymonitorChartComponent implements OnInit, OnDestroy { @ViewChild(StorageSectionComponent, { static: true }) public storageSection: StorageSectionComponent; - @ViewChild('energymonitorChart', { static: true }) + @ViewChild("energymonitorChart", { static: true }) private chartDiv: ElementRef; public translation: string; @@ -39,8 +39,6 @@ export class EnergymonitorChartComponent implements OnInit, OnDestroy { private ngUnsubscribe: Subject = new Subject(); - - constructor( private service: Service, ) { } @@ -54,7 +52,7 @@ export class EnergymonitorChartComponent implements OnInit, OnDestroy { this.service.startSpinner(this.spinnerId); // make sure chart is redrawn in the beginning and on window resize setTimeout(() => this.updateOnWindowResize(), 500); - const source = fromEvent(window, 'resize', null, null); + const source = fromEvent(window, "resize", null, null); source.pipe(takeUntil(this.ngUnsubscribe), debounceTime(200), delay(100)).subscribe(e => { this.updateOnWindowResize(); }); diff --git a/ui/src/app/edge/live/energymonitor/chart/section/abstractsection.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/abstractsection.component.ts index 869a8d30bf9..e254768d5ca 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/abstractsection.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/abstractsection.component.ts @@ -1,10 +1,10 @@ // @ts-strict-ignore -import { DefaultTypes } from '../../../../../shared/service/defaulttypes'; -import { GridMode, Service } from 'src/app/shared/shared'; -import { TranslateService } from '@ngx-translate/core'; -import * as d3 from 'd3'; +import { TranslateService } from "@ngx-translate/core"; +import * as d3 from "d3"; +import { GridMode, Service } from "src/app/shared/shared"; +import { DefaultTypes } from "../../../../../shared/service/defaulttypes"; -export type Ratio = 'Only Positive [0,1]' | 'Negative and Positive [-1,1]'; +export type Ratio = "Only Positive [0,1]" | "Negative and Positive [-1,1]"; export class SectionValue { public absolute: number; @@ -101,17 +101,17 @@ export class EnergyFlow { } public switchState() { - if (this.state == 'one') { - this.state = 'two'; - } else if (this.state == 'two') { - this.state = 'one'; + if (this.state == "one") { + this.state = "two"; + } else if (this.state == "two") { + this.state = "one"; } else { - this.state = 'one'; + this.state = "one"; } } public hide() { - this.state = 'three'; + this.state = "three"; } } diff --git a/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.html b/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.html index 3d3d27d3451..fdef929c624 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.html +++ b/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.html @@ -23,4 +23,4 @@ [attr.width]="square.image.length" [attr.height]="square.image.length" [attr.href]="square.image.image + '#root'"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.ts index 642f1725a2d..440054a0768 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/consumption.component.ts @@ -1,27 +1,27 @@ // @ts-strict-ignore -import { animate, state, style, transition, trigger } from '@angular/animations'; -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { UnitvaluePipe } from 'src/app/shared/pipe/unitvalue/unitvalue.pipe'; -import { DefaultTypes } from '../../../../../shared/service/defaulttypes'; -import { Service, Utils } from '../../../../../shared/shared'; -import { AbstractSection, EnergyFlow, Ratio, SvgEnergyFlow, SvgSquare, SvgSquarePosition } from './abstractsection.component'; +import { animate, state, style, transition, trigger } from "@angular/animations"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { UnitvaluePipe } from "src/app/shared/pipe/unitvalue/unitvalue.pipe"; +import { DefaultTypes } from "../../../../../shared/service/defaulttypes"; +import { Service, Utils } from "../../../../../shared/shared"; +import { AbstractSection, EnergyFlow, Ratio, SvgEnergyFlow, SvgSquare, SvgSquarePosition } from "./abstractsection.component"; @Component({ - selector: '[consumptionsection]', - templateUrl: './consumption.component.html', + selector: "[consumptionsection]", + templateUrl: "./consumption.component.html", animations: [ - trigger('Consumption', [ - state('show', style({ + trigger("Consumption", [ + state("show", style({ opacity: 0.1, - transform: 'translateX(0%)', + transform: "translateX(0%)", })), - state('hide', style({ + state("hide", style({ opacity: 0.6, - transform: 'translateX(17%)', + transform: "translateX(17%)", })), - transition('show => hide', animate('650ms ease-out')), - transition('hide => show', animate('0ms ease-in')), + transition("show => hide", animate("650ms ease-out")), + transition("hide => show", animate("0ms ease-in")), ]), ], }) @@ -38,12 +38,12 @@ export class ConsumptionSectionComponent extends AbstractSection implements OnIn translate: TranslateService, service: Service, ) { - super('General.consumption', "right", "#FDC507", translate, service, "Consumption"); + super("General.consumption", "right", "#FDC507", translate, service, "Consumption"); this.unitpipe = unitpipe; } get stateName() { - return this.showAnimation ? 'show' : 'hide'; + return this.showAnimation ? "show" : "hide"; } ngOnInit() { @@ -70,7 +70,7 @@ export class ConsumptionSectionComponent extends AbstractSection implements OnIn } protected getRatioType(): Ratio { - return 'Only Positive [0,1]'; + return "Only Positive [0,1]"; } protected _updateCurrentData(sum: DefaultTypes.Summary): void { @@ -103,7 +103,7 @@ export class ConsumptionSectionComponent extends AbstractSection implements OnIn if (value == null || Number.isNaN(value)) { return ""; } - return this.unitpipe.transform(value, 'kW'); + return this.unitpipe.transform(value, "kW"); } protected initEnergyFlow(radius: number): EnergyFlow { diff --git a/ui/src/app/edge/live/energymonitor/chart/section/grid.component.html b/ui/src/app/edge/live/energymonitor/chart/section/grid.component.html index 3d84fdbbdb2..d35a089e698 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/grid.component.html +++ b/ui/src/app/edge/live/energymonitor/chart/section/grid.component.html @@ -29,4 +29,4 @@ [attr.width]="square.image.length" [attr.height]="square.image.length" [attr.href]="square.image.image + '#root'"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/energymonitor/chart/section/grid.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/grid.component.ts index e5183e215c4..c0c61013161 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/grid.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/grid.component.ts @@ -1,40 +1,40 @@ // @ts-strict-ignore -import { animate, state, style, transition, trigger } from '@angular/animations'; -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { UnitvaluePipe } from 'src/app/shared/pipe/unitvalue/unitvalue.pipe'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { Icon } from 'src/app/shared/type/widget'; -import { CurrentData, EdgeConfig, GridMode, Service, Utils } from '../../../../../shared/shared'; -import { AbstractSection, EnergyFlow, Ratio, SvgEnergyFlow, SvgSquare, SvgSquarePosition } from './abstractsection.component'; +import { animate, state, style, transition, trigger } from "@angular/animations"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { UnitvaluePipe } from "src/app/shared/pipe/unitvalue/unitvalue.pipe"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { Icon } from "src/app/shared/type/widget"; +import { CurrentData, EdgeConfig, GridMode, Service, Utils } from "../../../../../shared/shared"; +import { AbstractSection, EnergyFlow, Ratio, SvgEnergyFlow, SvgSquare, SvgSquarePosition } from "./abstractsection.component"; @Component({ - selector: '[gridsection]', - templateUrl: './grid.component.html', + selector: "[gridsection]", + templateUrl: "./grid.component.html", animations: [ - trigger('GridBuy', [ - state('show', style({ + trigger("GridBuy", [ + state("show", style({ opacity: 0.4, - transform: 'translateX(0%)', + transform: "translateX(0%)", })), - state('hide', style({ + state("hide", style({ opacity: 0.1, - transform: 'translateX(17%)', + transform: "translateX(17%)", })), - transition('show => hide', animate('650ms')), - transition('hide => show', animate('0ms')), + transition("show => hide", animate("650ms")), + transition("hide => show", animate("0ms")), ]), - trigger('GridSell', [ - state('show', style({ + trigger("GridSell", [ + state("show", style({ opacity: 0.1, - transform: 'translateX(0%)', + transform: "translateX(0%)", })), - state('hide', style({ + state("hide", style({ opacity: 0.4, - transform: 'translateX(-17%)', + transform: "translateX(-17%)", })), - transition('show => hide', animate('650ms ease-out')), - transition('hide => show', animate('0ms ease-in')), + transition("show => hide", animate("650ms ease-out")), + transition("hide => show", animate("0ms ease-in")), ]), ], }) @@ -54,39 +54,39 @@ export class GridSectionComponent extends AbstractSection implements OnInit, OnD service: Service, unitpipe: UnitvaluePipe, ) { - super('General.grid', "left", "#1d1d1d", translate, service, "Grid"); + super("General.grid", "left", "#1d1d1d", translate, service, "Grid"); this.unitpipe = unitpipe; } get stateNameBuy() { - return this.showBuyAnimation ? 'show' : 'hide'; + return this.showBuyAnimation ? "show" : "hide"; } get stateNameSell() { - return this.showSellAnimation ? 'show' : 'hide'; + return this.showSellAnimation ? "show" : "hide"; } public static getCurrentGridIcon(currentData: CurrentData): Icon { - const gridMode = currentData.allComponents['_sum/GridMode']; - const restrictionMode = currentData.allComponents['ctrlEssLimiter14a0/RestrictionMode']; + const gridMode = currentData.allComponents["_sum/GridMode"]; + const restrictionMode = currentData.allComponents["ctrlEssLimiter14a0/RestrictionMode"]; if (gridMode === GridMode.OFF_GRID) { return { - color: 'dark', - name: 'oe-offgrid', - size: '', + color: "dark", + name: "oe-offgrid", + size: "", }; } if (restrictionMode === 1) { return { - color: 'dark', - name: 'oe-grid-restriction', - size: '', + color: "dark", + name: "oe-grid-restriction", + size: "", }; } return { - color: 'dark', - name: 'oe-grid', - size: '', + color: "dark", + name: "oe-grid", + size: "", }; } @@ -131,7 +131,7 @@ export class GridSectionComponent extends AbstractSection implements OnInit, OnD } else { arrowIndicate = 0; } - this.name = this.translate.instant('General.gridBuy'); + this.name = this.translate.instant("General.gridBuy"); super.updateSectionData( sum.grid.buyActivePower, sum.grid.powerRatio, @@ -147,13 +147,13 @@ export class GridSectionComponent extends AbstractSection implements OnInit, OnD } else { arrowIndicate = 0; } - this.name = this.translate.instant('General.gridSell'); + this.name = this.translate.instant("General.gridSell"); super.updateSectionData( sum.grid.sellActivePower, sum.grid.powerRatio, arrowIndicate); } else { - this.name = this.translate.instant('General.grid'); + this.name = this.translate.instant("General.grid"); super.updateSectionData(0, null, null); } @@ -173,7 +173,7 @@ export class GridSectionComponent extends AbstractSection implements OnInit, OnD } protected getRatioType(): Ratio { - return 'Negative and Positive [-1,1]'; + return "Negative and Positive [-1,1]"; } protected getSquarePosition(square: SvgSquare, innerRadius: number): SvgSquarePosition { @@ -195,7 +195,7 @@ export class GridSectionComponent extends AbstractSection implements OnInit, OnD if (value == null || Number.isNaN(value)) { return ""; } - return this.unitpipe.transform(value, 'kW'); + return this.unitpipe.transform(value, "kW"); } protected initEnergyFlow(radius: number): EnergyFlow { diff --git a/ui/src/app/edge/live/energymonitor/chart/section/production.component.html b/ui/src/app/edge/live/energymonitor/chart/section/production.component.html index 28d77c53120..520a36472ff 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/production.component.html +++ b/ui/src/app/edge/live/energymonitor/chart/section/production.component.html @@ -23,4 +23,4 @@ [attr.width]="square.image.length" [attr.height]="square.image.length" [attr.href]="square.image.image + '#root'"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/energymonitor/chart/section/production.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/production.component.ts index e3615983827..a5efc3de02e 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/production.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/production.component.ts @@ -1,27 +1,27 @@ // @ts-strict-ignore -import { animate, state, style, transition, trigger } from '@angular/animations'; -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { UnitvaluePipe } from 'src/app/shared/pipe/unitvalue/unitvalue.pipe'; -import { DefaultTypes } from '../../../../../shared/service/defaulttypes'; -import { Service, Utils } from '../../../../../shared/shared'; -import { AbstractSection, EnergyFlow, Ratio, SvgEnergyFlow, SvgSquare, SvgSquarePosition } from './abstractsection.component'; +import { animate, state, style, transition, trigger } from "@angular/animations"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { UnitvaluePipe } from "src/app/shared/pipe/unitvalue/unitvalue.pipe"; +import { DefaultTypes } from "../../../../../shared/service/defaulttypes"; +import { Service, Utils } from "../../../../../shared/shared"; +import { AbstractSection, EnergyFlow, Ratio, SvgEnergyFlow, SvgSquare, SvgSquarePosition } from "./abstractsection.component"; @Component({ - selector: '[productionsection]', - templateUrl: './production.component.html', + selector: "[productionsection]", + templateUrl: "./production.component.html", animations: [ - trigger('Production', [ - state('show', style({ + trigger("Production", [ + state("show", style({ opacity: 0.4, - transform: 'translateY(0)', + transform: "translateY(0)", })), - state('hide', style({ + state("hide", style({ opacity: 0.1, - transform: 'translateY(17%)', + transform: "translateY(17%)", })), - transition('show => hide', animate('650ms ease-out')), - transition('hide => show', animate('0ms ease-in')), + transition("show => hide", animate("650ms ease-out")), + transition("hide => show", animate("0ms ease-in")), ]), ], }) @@ -38,12 +38,12 @@ export class ProductionSectionComponent extends AbstractSection implements OnIni service: Service, unitpipe: UnitvaluePipe, ) { - super('General.production', "up", "#36aed1", translate, service, "Common_Production"); + super("General.production", "up", "#36aed1", translate, service, "Common_Production"); this.unitpipe = unitpipe; } get stateName() { - return this.showAnimation ? 'show' : 'hide'; + return this.showAnimation ? "show" : "hide"; } ngOnInit() { @@ -70,7 +70,7 @@ export class ProductionSectionComponent extends AbstractSection implements OnIni } protected getRatioType(): Ratio { - return 'Only Positive [0,1]'; + return "Only Positive [0,1]"; } protected _updateCurrentData(sum: DefaultTypes.Summary): void { @@ -105,7 +105,7 @@ export class ProductionSectionComponent extends AbstractSection implements OnIni return ""; } - return this.unitpipe.transform(value, 'kW'); + return this.unitpipe.transform(value, "kW"); } protected initEnergyFlow(radius: number): EnergyFlow { diff --git a/ui/src/app/edge/live/energymonitor/chart/section/storage.component.html b/ui/src/app/edge/live/energymonitor/chart/section/storage.component.html index 9fd35bf0f26..266ac898342 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/storage.component.html +++ b/ui/src/app/edge/live/energymonitor/chart/section/storage.component.html @@ -29,4 +29,4 @@ [attr.y]="square.image.y" [attr.width]="square.image.length" [attr.height]="square.image.length" [attr.href]="square.image.image + '#root'"> - \ No newline at end of file + diff --git a/ui/src/app/edge/live/energymonitor/chart/section/storage.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/storage.component.ts index 62f95103b1a..e98c6d563cf 100644 --- a/ui/src/app/edge/live/energymonitor/chart/section/storage.component.ts +++ b/ui/src/app/edge/live/energymonitor/chart/section/storage.component.ts @@ -1,40 +1,40 @@ // @ts-strict-ignore -import { animate, state, style, transition, trigger } from '@angular/animations'; -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { CurrentData } from 'src/app/shared/components/edge/currentdata'; -import { UnitvaluePipe } from 'src/app/shared/pipe/unitvalue/unitvalue.pipe'; -import { DefaultTypes } from '../../../../../shared/service/defaulttypes'; -import { Service, Utils } from '../../../../../shared/shared'; -import { AbstractSection, EnergyFlow, Ratio, SvgEnergyFlow, SvgSquare, SvgSquarePosition } from './abstractsection.component'; +import { animate, state, style, transition, trigger } from "@angular/animations"; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { CurrentData } from "src/app/shared/components/edge/currentdata"; +import { UnitvaluePipe } from "src/app/shared/pipe/unitvalue/unitvalue.pipe"; +import { DefaultTypes } from "../../../../../shared/service/defaulttypes"; +import { Service, Utils } from "../../../../../shared/shared"; +import { AbstractSection, EnergyFlow, Ratio, SvgEnergyFlow, SvgSquare, SvgSquarePosition } from "./abstractsection.component"; @Component({ - selector: '[storagesection]', - templateUrl: './storage.component.html', + selector: "[storagesection]", + templateUrl: "./storage.component.html", animations: [ - trigger('Discharge', [ - state('show', style({ + trigger("Discharge", [ + state("show", style({ opacity: 0.4, - transform: 'translateY(0)', + transform: "translateY(0)", })), - state('hide', style({ + state("hide", style({ opacity: 0.1, - transform: 'translateY(-17%)', + transform: "translateY(-17%)", })), - transition('show => hide', animate('650ms ease-out')), - transition('hide => show', animate('0ms ease-in')), + transition("show => hide", animate("650ms ease-out")), + transition("hide => show", animate("0ms ease-in")), ]), - trigger('Charge', [ - state('show', style({ + trigger("Charge", [ + state("show", style({ opacity: 0.1, - transform: 'translateY(0)', + transform: "translateY(0)", })), - state('hide', style({ + state("hide", style({ opacity: 0.4, - transform: 'translateY(17%)', + transform: "translateY(17%)", })), - transition('show => hide', animate('650ms ease-out')), - transition('hide => show', animate('0ms ease-out')), + transition("show => hide", animate("650ms ease-out")), + transition("hide => show", animate("0ms ease-out")), ]), ], }) @@ -55,16 +55,16 @@ export class StorageSectionComponent extends AbstractSection implements OnInit, protected override service: Service, unitpipe: UnitvaluePipe, ) { - super('Edge.Index.Energymonitor.storage', "down", "#009846", translate, service, "Storage"); + super("Edge.Index.Energymonitor.storage", "down", "#009846", translate, service, "Storage"); this.unitpipe = unitpipe; } get stateNameCharge() { - return this.showChargeAnimation ? 'show' : 'hide'; + return this.showChargeAnimation ? "show" : "hide"; } get stateNameDischarge() { - return this.showDischargeAnimation ? 'show' : 'hide'; + return this.showDischargeAnimation ? "show" : "hide"; } ngOnInit() { @@ -96,12 +96,12 @@ export class StorageSectionComponent extends AbstractSection implements OnInit, this.service.getCurrentEdge() .then(async edge => { edge.currentData.subscribe(curr => { - const maxApparentPower = edge.isVersionAtLeast('2024.2.2') - ? curr.channel['_sum/EssMaxDischargePower'] - : curr.channel['_sum/EssMaxApparentPower']; - const minDischargePower = edge.isVersionAtLeast('2024.2.2') - ? curr.channel['_sum/EssMinDischargePower'] - : curr.channel['_sum/EssMaxApparentPower']; + const maxApparentPower = edge.isVersionAtLeast("2024.2.2") + ? curr.channel["_sum/EssMaxDischargePower"] + : curr.channel["_sum/EssMaxApparentPower"]; + const minDischargePower = edge.isVersionAtLeast("2024.2.2") + ? curr.channel["_sum/EssMinDischargePower"] + : curr.channel["_sum/EssMaxApparentPower"]; sum.storage.powerRatio = CurrentData.getEssPowerRatio(maxApparentPower, minDischargePower, sum.storage.effectivePower); @@ -117,7 +117,7 @@ export class StorageSectionComponent extends AbstractSection implements OnInit, arrowIndicate = 0; } - this.name = this.translate.instant('Edge.Index.Energymonitor.storageCharge'); + this.name = this.translate.instant("Edge.Index.Energymonitor.storageCharge"); super.updateSectionData( sum.storage.effectiveChargePower, sum.storage.powerRatio, @@ -133,20 +133,20 @@ export class StorageSectionComponent extends AbstractSection implements OnInit, } else { arrowIndicate = 0; } - this.name = this.translate.instant('Edge.Index.Energymonitor.storageDischarge'); + this.name = this.translate.instant("Edge.Index.Energymonitor.storageDischarge"); super.updateSectionData( sum.storage.effectiveDischargePower, sum.storage.powerRatio, arrowIndicate); } else { - this.name = this.translate.instant('Edge.Index.Energymonitor.storage'); + this.name = this.translate.instant("Edge.Index.Energymonitor.storage"); super.updateSectionData(null, null, null); } this.socValue = sum.storage.soc; if (this.square) { this.square.image.image = "assets/img/" + this.getImagePath(); - this.svgStyle = 'storage-' + Utils.getStorageSocSegment(this.socValue); + this.svgStyle = "storage-" + Utils.getStorageSocSegment(this.socValue); } }); }); @@ -161,7 +161,7 @@ export class StorageSectionComponent extends AbstractSection implements OnInit, } protected getRatioType(): Ratio { - return 'Negative and Positive [-1,1]'; + return "Negative and Positive [-1,1]"; } protected getSquarePosition(square: SvgSquare, innerRadius: number): SvgSquarePosition { @@ -178,7 +178,7 @@ export class StorageSectionComponent extends AbstractSection implements OnInit, if (value == null || Number.isNaN(value)) { return ""; } - return this.unitpipe.transform(value, 'kW'); + return this.unitpipe.transform(value, "kW"); } protected initEnergyFlow(radius: number): EnergyFlow { diff --git a/ui/src/app/edge/live/energymonitor/energymonitor.component.html b/ui/src/app/edge/live/energymonitor/energymonitor.component.html index f7c1e05e63a..779a8c37cc4 100644 --- a/ui/src/app/edge/live/energymonitor/energymonitor.component.html +++ b/ui/src/app/edge/live/energymonitor/energymonitor.component.html @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/energymonitor/energymonitor.component.ts b/ui/src/app/edge/live/energymonitor/energymonitor.component.ts index d696a7497ba..8e07bbd2b83 100644 --- a/ui/src/app/edge/live/energymonitor/energymonitor.component.ts +++ b/ui/src/app/edge/live/energymonitor/energymonitor.component.ts @@ -1,10 +1,10 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { ChannelAddress, Edge, Service, Websocket } from '../../../shared/shared'; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { ChannelAddress, Edge, Service, Websocket } from "../../../shared/shared"; @Component({ selector: EnergymonitorComponent.SELECTOR, - templateUrl: './energymonitor.component.html', + templateUrl: "./energymonitor.component.html", }) export class EnergymonitorComponent implements OnInit, OnDestroy { @@ -18,23 +18,23 @@ export class EnergymonitorComponent implements OnInit, OnDestroy { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; - const essMinMaxChannels = this.edge.isVersionAtLeast('2024.2.2') - ? [new ChannelAddress('_sum', 'EssMinDischargePower'), new ChannelAddress('_sum', 'EssMaxDischargePower')] - : [new ChannelAddress('_sum', 'EssMaxApparentPower')]; + const essMinMaxChannels = this.edge.isVersionAtLeast("2024.2.2") + ? [new ChannelAddress("_sum", "EssMinDischargePower"), new ChannelAddress("_sum", "EssMaxDischargePower")] + : [new ChannelAddress("_sum", "EssMaxApparentPower")]; edge.subscribeChannels(this.websocket, EnergymonitorComponent.SELECTOR, [ // Ess - new ChannelAddress('_sum', 'EssSoc'), new ChannelAddress('_sum', 'EssActivePower'), + new ChannelAddress("_sum", "EssSoc"), new ChannelAddress("_sum", "EssActivePower"), ...essMinMaxChannels, // Grid - new ChannelAddress('_sum', 'GridActivePower'), new ChannelAddress('_sum', 'GridMinActivePower'), new ChannelAddress('_sum', 'GridMaxActivePower'), new ChannelAddress('_sum', 'GridMode'), + new ChannelAddress("_sum", "GridActivePower"), new ChannelAddress("_sum", "GridMinActivePower"), new ChannelAddress("_sum", "GridMaxActivePower"), new ChannelAddress("_sum", "GridMode"), // Production - new ChannelAddress('_sum', 'ProductionActivePower'), new ChannelAddress('_sum', 'ProductionDcActualPower'), new ChannelAddress('_sum', 'ProductionAcActivePower'), new ChannelAddress('_sum', 'ProductionMaxActivePower'), + new ChannelAddress("_sum", "ProductionActivePower"), new ChannelAddress("_sum", "ProductionDcActualPower"), new ChannelAddress("_sum", "ProductionAcActivePower"), new ChannelAddress("_sum", "ProductionMaxActivePower"), // Consumption - new ChannelAddress('_sum', 'ConsumptionActivePower'), new ChannelAddress('_sum', 'ConsumptionMaxActivePower'), + new ChannelAddress("_sum", "ConsumptionActivePower"), new ChannelAddress("_sum", "ConsumptionMaxActivePower"), ]); }); } diff --git a/ui/src/app/edge/live/energymonitor/energymonitor.module.ts b/ui/src/app/edge/live/energymonitor/energymonitor.module.ts index ac7eb9461f4..9da9e75aa96 100644 --- a/ui/src/app/edge/live/energymonitor/energymonitor.module.ts +++ b/ui/src/app/edge/live/energymonitor/energymonitor.module.ts @@ -1,14 +1,13 @@ -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; -import { SharedModule } from './../../../shared/shared.module'; - -import { ConsumptionSectionComponent } from './chart/section/consumption.component'; -import { EnergymonitorChartComponent } from './chart/chart.component'; -import { EnergymonitorComponent } from './energymonitor.component'; -import { GridSectionComponent } from './chart/section/grid.component'; -import { ProductionSectionComponent } from './chart/section/production.component'; -import { StorageSectionComponent } from './chart/section/storage.component'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { SharedModule } from "./../../../shared/shared.module"; +import { EnergymonitorChartComponent } from "./chart/chart.component"; +import { ConsumptionSectionComponent } from "./chart/section/consumption.component"; +import { GridSectionComponent } from "./chart/section/grid.component"; +import { ProductionSectionComponent } from "./chart/section/production.component"; +import { StorageSectionComponent } from "./chart/section/storage.component"; +import { EnergymonitorComponent } from "./energymonitor.component"; @NgModule({ imports: [ @@ -29,6 +28,3 @@ import { StorageSectionComponent } from './chart/section/storage.component'; ], }) export class EnergymonitorModule { } - - - diff --git a/ui/src/app/edge/live/info/info.component.html b/ui/src/app/edge/live/info/info.component.html index 2e49a4083b3..47687b987ab 100644 --- a/ui/src/app/edge/live/info/info.component.html +++ b/ui/src/app/edge/live/info/info.component.html @@ -1,2 +1,2 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/info/info.component.ts b/ui/src/app/edge/live/info/info.component.ts index bc48bcc65e9..92da7235422 100644 --- a/ui/src/app/edge/live/info/info.component.ts +++ b/ui/src/app/edge/live/info/info.component.ts @@ -1,7 +1,7 @@ -import { Component } from '@angular/core'; +import { Component } from "@angular/core"; @Component({ - selector: 'info', - templateUrl: './info.component.html', + selector: "info", + templateUrl: "./info.component.html", }) export class InfoComponent { } diff --git a/ui/src/app/edge/live/live.component.html b/ui/src/app/edge/live/live.component.html index e771887a085..edf538ba7ab 100644 --- a/ui/src/app/edge/live/live.component.html +++ b/ui/src/app/edge/live/live.component.html @@ -1,7 +1,7 @@
- + @@ -44,7 +44,6 @@ - @@ -57,7 +56,6 @@ *ngIf="factoryId !== 'Evcs.Cluster.PeakShaving' && factoryId !== 'Evcs.Cluster.SelfConsumption'"> - @@ -159,4 +157,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/live/live.component.ts b/ui/src/app/edge/live/live.component.ts index 07ef40f7c93..e3e022542c6 100644 --- a/ui/src/app/edge/live/live.component.ts +++ b/ui/src/app/edge/live/live.component.ts @@ -1,13 +1,13 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { RefresherCustomEvent } from '@ionic/angular'; -import { Subject } from 'rxjs'; -import { DataService } from 'src/app/shared/components/shared/dataservice'; -import { Edge, EdgeConfig, Service, Utils, Websocket, Widgets } from 'src/app/shared/shared'; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { RefresherCustomEvent } from "@ionic/angular"; +import { Subject } from "rxjs"; +import { DataService } from "src/app/shared/components/shared/dataservice"; +import { Edge, EdgeConfig, Service, Utils, Websocket, Widgets } from "src/app/shared/shared"; @Component({ - selector: 'live', - templateUrl: './live.component.html', + selector: "live", + templateUrl: "./live.component.html", }) export class LiveComponent implements OnInit, OnDestroy { @@ -25,7 +25,6 @@ export class LiveComponent implements OnInit, OnDestroy { ) { } public ngOnInit() { - this.service.setCurrentComponent('', this.route); this.service.currentEdge.subscribe((edge) => { this.edge = edge; }); diff --git a/ui/src/app/edge/live/live.module.ts b/ui/src/app/edge/live/live.module.ts index 62c2a8b672e..e3d7bbc0de3 100644 --- a/ui/src/app/edge/live/live.module.ts +++ b/ui/src/app/edge/live/live.module.ts @@ -1,46 +1,46 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { SharedModule } from './../../shared/shared.module'; -import { Common_Autarchy } from './common/autarchy/Common_Autarchy'; -import { Common_Consumption } from './common/consumption/Common_Consumption'; -import { Common_Grid } from './common/grid/Common_Grid'; -import { Common_Production } from './common/production/Common_Production'; -import { Common_Selfconsumption } from './common/selfconsumption/Common_Selfconsumption'; -import { StorageModalComponent } from './common/storage/modal/modal.component'; -import { StorageComponent } from './common/storage/storage.component'; -import { Controller_ChannelthresholdComponent } from './Controller/Channelthreshold/Channelthreshold'; -import { Controller_ChpSocComponent } from './Controller/ChpSoc/ChpSoc'; -import { Controller_ChpSocModalComponent } from './Controller/ChpSoc/modal/modal.component'; -import { Controller_Ess_FixActivePower } from './Controller/Ess/FixActivePower/Ess_FixActivePower'; -import { Controller_Ess_GridOptimizedCharge } from './Controller/Ess/GridOptimizedCharge/Ess_GridOptimizedCharge'; -import { Controller_Ess_TimeOfUseTariff } from './Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff'; -import { AdministrationComponent } from './Controller/Evcs/administration/administration.component'; -import { Controller_Io_ChannelSingleThresholdComponent } from './Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold'; -import { Controller_Io_ChannelSingleThresholdModalComponent } from './Controller/Io/ChannelSingleThreshold/modal/modal.component'; -import { Controller_Io_FixDigitalOutputComponent } from './Controller/Io/FixDigitalOutput/Io_FixDigitalOutput'; -import { Controller_Io_FixDigitalOutputModalComponent } from './Controller/Io/FixDigitalOutput/modal/modal.component'; -import { Controller_Io_HeatingElement } from './Controller/Io/HeatingElement/Io_HeatingElement'; -import { Controller_Io_HeatpumpComponent } from './Controller/Io/Heatpump/Io_Heatpump'; -import { Controller_Io_HeatpumpModalComponent } from './Controller/Io/Heatpump/modal/modal.component'; -import { Controller_Asymmetric_PeakShavingComponent } from './Controller/PeakShaving/Asymmetric/Asymmetric'; -import { Controller_Asymmetric_PeakShavingModalComponent } from './Controller/PeakShaving/Asymmetric/modal/modal.component'; -import { Controller_Symmetric_PeakShavingModalComponent } from './Controller/PeakShaving/Symmetric/modal/modal.component'; -import { Controller_Symmetric_PeakShavingComponent } from './Controller/PeakShaving/Symmetric/Symmetric'; -import { Controller_Symmetric_TimeSlot_PeakShavingModalComponent } from './Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component'; -import { Controller_Symmetric_TimeSlot_PeakShavingComponent } from './Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot'; -import { DelayedSellToGridComponent } from './delayedselltogrid/delayedselltogrid.component'; -import { DelayedSellToGridModalComponent } from './delayedselltogrid/modal/modal.component'; -import { EnergymonitorModule } from './energymonitor/energymonitor.module'; -import { InfoComponent } from './info/info.component'; -import { Io_Api_DigitalInputComponent } from './Io/Api_DigitalInput/Io_Api_DigitalInput'; -import { Io_Api_DigitalInput_ModalComponent } from './Io/Api_DigitalInput/modal/modal.component'; -import { LiveComponent } from './live.component'; -import { Evcs_Api_ClusterComponent } from './Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster'; -import { EvcsChartComponent } from './Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart'; -import { Evcs_Api_ClusterModalComponent } from './Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page'; -import { OfflineComponent } from './offline/offline.component'; -import { Controller_Evcs } from './Controller/Evcs/Evcs'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { SharedModule } from "./../../shared/shared.module"; +import { Common_Autarchy } from "./common/autarchy/Common_Autarchy"; +import { Common_Consumption } from "./common/consumption/Common_Consumption"; +import { Common_Grid } from "./common/grid/Common_Grid"; +import { Common_Production } from "./common/production/Common_Production"; +import { Common_Selfconsumption } from "./common/selfconsumption/Common_Selfconsumption"; +import { StorageModalComponent } from "./common/storage/modal/modal.component"; +import { StorageComponent } from "./common/storage/storage.component"; +import { Controller_ChannelthresholdComponent } from "./Controller/Channelthreshold/Channelthreshold"; +import { Controller_ChpSocComponent } from "./Controller/ChpSoc/ChpSoc"; +import { Controller_ChpSocModalComponent } from "./Controller/ChpSoc/modal/modal.component"; +import { Controller_Ess_FixActivePower } from "./Controller/Ess/FixActivePower/Ess_FixActivePower"; +import { Controller_Ess_GridOptimizedCharge } from "./Controller/Ess/GridOptimizedCharge/Ess_GridOptimizedCharge"; +import { Controller_Ess_TimeOfUseTariff } from "./Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff"; +import { AdministrationComponent } from "./Controller/Evcs/administration/administration.component"; +import { Controller_Evcs } from "./Controller/Evcs/Evcs"; +import { Controller_Io_ChannelSingleThresholdComponent } from "./Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold"; +import { Controller_Io_ChannelSingleThresholdModalComponent } from "./Controller/Io/ChannelSingleThreshold/modal/modal.component"; +import { Controller_Io_FixDigitalOutputComponent } from "./Controller/Io/FixDigitalOutput/Io_FixDigitalOutput"; +import { Controller_Io_FixDigitalOutputModalComponent } from "./Controller/Io/FixDigitalOutput/modal/modal.component"; +import { Controller_Io_HeatingElement } from "./Controller/Io/HeatingElement/Io_HeatingElement"; +import { Controller_Io_HeatpumpComponent } from "./Controller/Io/Heatpump/Io_Heatpump"; +import { Controller_Io_HeatpumpModalComponent } from "./Controller/Io/Heatpump/modal/modal.component"; +import { Controller_Asymmetric_PeakShavingComponent } from "./Controller/PeakShaving/Asymmetric/Asymmetric"; +import { Controller_Asymmetric_PeakShavingModalComponent } from "./Controller/PeakShaving/Asymmetric/modal/modal.component"; +import { Controller_Symmetric_PeakShavingModalComponent } from "./Controller/PeakShaving/Symmetric/modal/modal.component"; +import { Controller_Symmetric_PeakShavingComponent } from "./Controller/PeakShaving/Symmetric/Symmetric"; +import { Controller_Symmetric_TimeSlot_PeakShavingModalComponent } from "./Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.component"; +import { Controller_Symmetric_TimeSlot_PeakShavingComponent } from "./Controller/PeakShaving/Symmetric_TimeSlot/Symmetric_TimeSlot"; +import { DelayedSellToGridComponent } from "./delayedselltogrid/delayedselltogrid.component"; +import { DelayedSellToGridModalComponent } from "./delayedselltogrid/modal/modal.component"; +import { EnergymonitorModule } from "./energymonitor/energymonitor.module"; +import { InfoComponent } from "./info/info.component"; +import { Io_Api_DigitalInputComponent } from "./Io/Api_DigitalInput/Io_Api_DigitalInput"; +import { Io_Api_DigitalInput_ModalComponent } from "./Io/Api_DigitalInput/modal/modal.component"; +import { LiveComponent } from "./live.component"; +import { Evcs_Api_ClusterComponent } from "./Multiple/Evcs_Api_Cluster/Evcs_Api_Cluster"; +import { EvcsChartComponent } from "./Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart"; +import { Evcs_Api_ClusterModalComponent } from "./Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page"; +import { OfflineComponent } from "./offline/offline.component"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/livedataservice.ts b/ui/src/app/edge/live/livedataservice.ts index 268b392bf72..e4eda4ab642 100644 --- a/ui/src/app/edge/live/livedataservice.ts +++ b/ui/src/app/edge/live/livedataservice.ts @@ -1,11 +1,10 @@ // @ts-strict-ignore import { Directive, Inject, OnDestroy } from "@angular/core"; +import { RefresherCustomEvent } from "@ionic/angular"; import { takeUntil } from "rxjs/operators"; -import { v4 as uuidv4 } from 'uuid'; - +import { v4 as uuidv4 } from "uuid"; import { DataService } from "../../shared/components/shared/dataservice"; import { ChannelAddress, Edge, Service, Websocket } from "../../shared/shared"; -import { RefresherCustomEvent } from "@ionic/angular"; @Directive() export class LiveDataService extends DataService implements OnDestroy { diff --git a/ui/src/app/edge/live/offline/offline.component.html b/ui/src/app/edge/live/offline/offline.component.html index dc4b68b4b11..d9fb11a00c5 100644 --- a/ui/src/app/edge/live/offline/offline.component.html +++ b/ui/src/app/edge/live/offline/offline.component.html @@ -1,6 +1,6 @@ - OpenEMS is offline + OpenEMS is offline since {{timeSinceOffline}} - \ No newline at end of file + diff --git a/ui/src/app/edge/live/offline/offline.component.ts b/ui/src/app/edge/live/offline/offline.component.ts index 6122b2b0af7..5af0358d185 100644 --- a/ui/src/app/edge/live/offline/offline.component.ts +++ b/ui/src/app/edge/live/offline/offline.component.ts @@ -1,21 +1,51 @@ -import { Component, OnInit } from '@angular/core'; -import { Edge, Service } from 'src/app/shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { Edge, Service, Utils } from "src/app/shared/shared"; +import { DateUtils } from "src/app/shared/utils/date/dateutils"; +// TODO add translations when refactoring offline.component.html @Component({ - selector: 'offline', - templateUrl: './offline.component.html', + selector: "offline", + templateUrl: "./offline.component.html", }) export class OfflineComponent implements OnInit { - public edge: Edge | null = null; + protected edge: Edge | null = null; + protected timeSinceOffline: string | null = null; constructor( public service: Service, ) { } + private static formatSecondsToFullMinutes(date: string): null | string { + + const _date: Date | null = DateUtils.stringToDate(date); + if (!_date) { + return null; + } + + const milliSeconds: number = _date.getTime(); + const _diff: number | null = Utils.subtractSafely(new Date().getTime(), milliSeconds); + + if (_diff === null) { + return null; + } + + if (_diff > 2 * 24 * 60 * 60 * 1000) { + return Utils.floorSafely(Utils.divideSafely(_diff, 24 * 60 * 60 * 1000)) + " Tagen"; + } + + if (_diff > 2 * 60 * 60 * 1000) { + return Utils.floorSafely(Utils.divideSafely(_diff, 60 * 60 * 1000)) + " Stunden"; + } + + const minutes: number | null = Utils.floorSafely(Utils.divideSafely(_diff, 60 * 1000)); + return Utils.floorSafely(Utils.divideSafely(_diff, 60 * 1000)) + " " + (minutes === 1 ? "Minute" : "Minuten"); + } + ngOnInit() { this.service.getCurrentEdge().then(edge => { this.edge = edge; + this.timeSinceOffline = OfflineComponent.formatSecondsToFullMinutes(edge.lastmessage.toString()); }); } } diff --git a/ui/src/app/edge/settings/alerting/alerting.component.ts b/ui/src/app/edge/settings/alerting/alerting.component.ts index a9d378aa220..865420ec5bc 100644 --- a/ui/src/app/edge/settings/alerting/alerting.component.ts +++ b/ui/src/app/edge/settings/alerting/alerting.component.ts @@ -1,12 +1,12 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { GetUserAlertingConfigsRequest } from 'src/app/shared/jsonrpc/request/getUserAlertingConfigsRequest'; -import { SetUserAlertingConfigsRequest, UserSettingRequest } from 'src/app/shared/jsonrpc/request/setUserAlertingConfigsRequest'; -import { AlertingSettingResponse, GetUserAlertingConfigsResponse } from 'src/app/shared/jsonrpc/response/getUserAlertingConfigsResponse'; -import { Edge, Service, Utils, Websocket } from 'src/app/shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { GetUserAlertingConfigsRequest } from "src/app/shared/jsonrpc/request/getUserAlertingConfigsRequest"; +import { SetUserAlertingConfigsRequest, UserSettingRequest } from "src/app/shared/jsonrpc/request/setUserAlertingConfigsRequest"; +import { AlertingSettingResponse, GetUserAlertingConfigsResponse } from "src/app/shared/jsonrpc/response/getUserAlertingConfigsResponse"; +import { Edge, Service, Utils, Websocket } from "src/app/shared/shared"; export enum AlertingType { offline = 0, @@ -21,7 +21,7 @@ type DetailedAlertingSetting = AlertingSetting & { isOfflineActive: boolean, isF @Component({ selector: AlertingComponent.SELECTOR, - templateUrl: './alerting.component.html', + templateUrl: "./alerting.component.html", }) export class AlertingComponent implements OnInit { @@ -55,7 +55,7 @@ export class AlertingComponent implements OnInit { } public ngOnInit(): void { - this.service.setCurrentComponent({ languageKey: 'Edge.Config.Index.alerting' }, this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; const request = new GetUserAlertingConfigsRequest({ edgeId: this.edge.id }); @@ -94,16 +94,16 @@ export class AlertingComponent implements OnInit { } if (delay >= 1440) { delay = delay / 1440; - return delay + ' ' + (delay == 1 + return delay + " " + (delay == 1 ? this.translate.instant("General.TIME.DAY") : this.translate.instant("General.TIME.DAYS")); } else if (delay >= 60) { delay = delay / 60; - return delay + ' ' + (delay == 1 + return delay + " " + (delay == 1 ? this.translate.instant("General.TIME.HOUR") : this.translate.instant("General.TIME.HOURS")); } else { - return delay + ' ' + (delay == 1 + return delay + " " + (delay == 1 ? this.translate.instant("General.TIME.MINUTE") : this.translate.instant("General.TIME.MINUTES")); } @@ -142,9 +142,9 @@ export class AlertingComponent implements OnInit { for (const user of this.otherUserInformation) { const control = this.otherUserForm.controls[user.userLogin]; if (control.dirty) { - const offlineEdgeDelay = control.value['offlineEdgeDelay']; - const faultEdgeDelay = control.value['faultEdgeDelay']; - const warningEdgeDelay = control.value['warningEdgeDelay']; + const offlineEdgeDelay = control.value["offlineEdgeDelay"]; + const faultEdgeDelay = control.value["faultEdgeDelay"]; + const warningEdgeDelay = control.value["warningEdgeDelay"]; //let isActivated = control.value['isActivated']; changedUserSettings.push({ userLogin: user.userLogin, @@ -228,8 +228,6 @@ export class AlertingComponent implements OnInit { return setting.faultEdgeDelay; case AlertingType.warning: return setting.warningEdgeDelay; - default: - return 0; } } @@ -252,7 +250,7 @@ export class AlertingComponent implements OnInit { private sortedAlphabetically(userSettings: AlertingSettingResponse[]): AlertingSettingResponse[] { return userSettings.sort((userA, userB) => { - return userA.userLogin.localeCompare(userB.userLogin, undefined, { sensitivity: 'accent' }); + return userA.userLogin.localeCompare(userB.userLogin, undefined, { sensitivity: "accent" }); }); } @@ -273,14 +271,14 @@ export class AlertingComponent implements OnInit { private sendRequestAndUpdate(request: GetUserAlertingConfigsRequest | SetUserAlertingConfigsRequest, formGroup: FormGroup[]) { this.sendRequest(request) .then(() => { - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); for (const group of formGroup.values()) { group.markAsPristine(); } }) .catch((response) => { const error = response.error; - this.errorToast(this.translate.instant('General.changeFailed'), error.message); + this.errorToast(this.translate.instant("General.changeFailed"), error.message); }); } @@ -297,7 +295,7 @@ export class AlertingComponent implements OnInit { }).catch(reason => { const error = reason.error; console.error(error); - this.errorToast(this.translate.instant('Edge.Config.ALERTING.TOAST.ERROR'), error.message); + this.errorToast(this.translate.instant("Edge.Config.ALERTING.TOAST.ERROR"), error.message); reject(reason); }).finally(() => { this.service.stopSpinner(this.spinnerId); @@ -306,6 +304,6 @@ export class AlertingComponent implements OnInit { } private errorToast(errorType: string, errorMsg: string) { - this.service.toast('[ ' + errorType + ' ]
' + errorMsg, 'danger'); + this.service.toast("[ " + errorType + " ]
" + errorMsg, "danger"); } } diff --git a/ui/src/app/edge/settings/app/app.module.ts b/ui/src/app/edge/settings/app/app.module.ts index 3b12184a7ed..80554dac42b 100644 --- a/ui/src/app/edge/settings/app/app.module.ts +++ b/ui/src/app/edge/settings/app/app.module.ts @@ -1,32 +1,32 @@ // @ts-strict-ignore -import { NgModule } from '@angular/core'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { InstallAppComponent } from './install.component'; -import { IndexComponent } from './index.component'; -import { SingleAppComponent } from './single.component'; -import { UpdateAppComponent } from './update.component'; -import { KeyModalComponent } from './keypopup/modal.component'; -import { FormControl, ValidationErrors } from '@angular/forms'; -import { FormlyModule, FORMLY_CONFIG } from '@ngx-formly/core'; -import { TranslateService } from '@ngx-translate/core'; -import { FormlySafeInputModalComponent } from './formly/safe-input/formly-safe-input-modal.component'; -import { FormlySafeInputWrapperComponent } from './formly/safe-input/formly-safe-input.extended'; -import { FormlyTextComponent } from './formly/formly-text'; -import { FormlyInputWithUnitComponent } from './formly/input-with-unit'; -import { FormlyOptionGroupPickerComponent } from './formly/option-group-picker/formly-option-group-picker.component'; -import { FormlyReorderArrayComponent } from './formly/reorder-select/formly-reorder-array.component'; +import { NgModule } from "@angular/core"; +import { FormControl, ValidationErrors } from "@angular/forms"; +import { FORMLY_CONFIG, FormlyModule } from "@ngx-formly/core"; +import { TranslateService } from "@ngx-translate/core"; +import { SharedModule } from "src/app/shared/shared.module"; +import { FormlyTextComponent } from "./formly/formly-text"; +import { FormlyInputWithUnitComponent } from "./formly/input-with-unit"; +import { FormlyOptionGroupPickerComponent } from "./formly/option-group-picker/formly-option-group-picker.component"; +import { FormlyReorderArrayComponent } from "./formly/reorder-select/formly-reorder-array.component"; +import { FormlySafeInputModalComponent } from "./formly/safe-input/formly-safe-input-modal.component"; +import { FormlySafeInputWrapperComponent } from "./formly/safe-input/formly-safe-input.extended"; +import { IndexComponent } from "./index.component"; +import { InstallAppComponent } from "./install.component"; +import { KeyModalComponent } from "./keypopup/modal.component"; +import { SingleAppComponent } from "./single.component"; +import { UpdateAppComponent } from "./update.component"; export function KeyValidator(control: FormControl): ValidationErrors { - return /^(.{4}-){3}.{4}$/.test(control.value) ? null : { 'key': true }; + return /^(.{4}-){3}.{4}$/.test(control.value) ? null : { "key": true }; } export function registerTranslateExtension(translate: TranslateService) { return { validationMessages: [ { - name: 'key', + name: "key", message() { - return translate.stream('Edge.Config.App.Key.invalidPattern'); + return translate.stream("Edge.Config.App.Key.invalidPattern"); }, }, ], @@ -47,10 +47,10 @@ export function registerTranslateExtension(translate: TranslateService) { { name: "reorder-array", component: FormlyReorderArrayComponent }, ], validators: [ - { name: 'key', validation: KeyValidator }, + { name: "key", validation: KeyValidator }, ], validationMessages: [ - { name: 'key', message: "The key doesnt match the pattern!" }, + { name: "key", message: "The key doesnt match the pattern!" }, ], }), ], diff --git a/ui/src/app/edge/settings/app/formly/formly-text.ts b/ui/src/app/edge/settings/app/formly/formly-text.ts index 6e206169d13..d8fe8a1c681 100644 --- a/ui/src/app/edge/settings/app/formly/formly-text.ts +++ b/ui/src/app/edge/settings/app/formly/formly-text.ts @@ -2,8 +2,8 @@ import { Component, ViewEncapsulation } from "@angular/core"; import { FieldType, FieldTypeConfig } from "@ngx-formly/core"; @Component({ - selector: 'formly-text', - styles: ['.warning {color: red}'], + selector: "formly-text", + styles: [".warning {color: red}"], template: ` @@ -11,7 +11,7 @@ import { FieldType, FieldTypeConfig } from "@ngx-formly/core"; `, encapsulation: ViewEncapsulation.None, }) -export class FormlyTextComponent extends FieldType { +export class FormlyTextComponent extends FieldType { constructor( ) { diff --git a/ui/src/app/edge/settings/app/formly/input-with-unit.ts b/ui/src/app/edge/settings/app/formly/input-with-unit.ts index f36cdd12bdd..12852b9c35a 100644 --- a/ui/src/app/edge/settings/app/formly/input-with-unit.ts +++ b/ui/src/app/edge/settings/app/formly/input-with-unit.ts @@ -1,8 +1,8 @@ -import { Component } from '@angular/core'; -import { FieldWrapper } from '@ngx-formly/core'; +import { Component } from "@angular/core"; +import { FieldWrapper } from "@ngx-formly/core"; @Component({ - selector: 'formly-input-with-unit', + selector: "formly-input-with-unit", template: ` diff --git a/ui/src/app/edge/settings/app/formly/option-group-picker/formly-option-group-picker.component.html b/ui/src/app/edge/settings/app/formly/option-group-picker/formly-option-group-picker.component.html index 4b291de45e1..3919cd33ff9 100644 --- a/ui/src/app/edge/settings/app/formly/option-group-picker/formly-option-group-picker.component.html +++ b/ui/src/app/edge/settings/app/formly/option-group-picker/formly-option-group-picker.component.html @@ -39,4 +39,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/app/formly/option-group-picker/formly-option-group-picker.component.ts b/ui/src/app/edge/settings/app/formly/option-group-picker/formly-option-group-picker.component.ts index b707644d911..0e0ec8e1f60 100644 --- a/ui/src/app/edge/settings/app/formly/option-group-picker/formly-option-group-picker.component.ts +++ b/ui/src/app/edge/settings/app/formly/option-group-picker/formly-option-group-picker.component.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore import { Component, OnInit } from "@angular/core"; import { FieldType, FieldTypeConfig, FormlyFieldConfig } from "@ngx-formly/core"; -import { OptionGroup, OptionGroupConfig, Option, getTitleFromOptionConfig } from "./optionGroupPickerConfiguration"; +import { Option, OptionGroup, OptionGroupConfig, getTitleFromOptionConfig } from "./optionGroupPickerConfiguration"; @Component({ - selector: 'formly-option-group-picker', - templateUrl: './formly-option-group-picker.component.html', + selector: "formly-option-group-picker", + templateUrl: "./formly-option-group-picker.component.html", }) export class FormlyOptionGroupPickerComponent extends FieldType implements OnInit { diff --git a/ui/src/app/edge/settings/app/formly/reorder-select/formly-reorder-array.component.html b/ui/src/app/edge/settings/app/formly/reorder-select/formly-reorder-array.component.html index 61f3a2ecd8c..16c3d0ff194 100644 --- a/ui/src/app/edge/settings/app/formly/reorder-select/formly-reorder-array.component.html +++ b/ui/src/app/edge/settings/app/formly/reorder-select/formly-reorder-array.component.html @@ -41,4 +41,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/app/formly/reorder-select/formly-reorder-array.component.ts b/ui/src/app/edge/settings/app/formly/reorder-select/formly-reorder-array.component.ts index f9923d3a31b..808171892bb 100644 --- a/ui/src/app/edge/settings/app/formly/reorder-select/formly-reorder-array.component.ts +++ b/ui/src/app/edge/settings/app/formly/reorder-select/formly-reorder-array.component.ts @@ -4,8 +4,8 @@ import { ItemReorderEventDetail } from "@ionic/angular"; import { FieldType, FieldTypeConfig, FormlyFieldConfig, FormlyFieldProps } from "@ngx-formly/core"; @Component({ - selector: 'reorder-array', - templateUrl: './formly-reorder-array.component.html', + selector: "reorder-array", + templateUrl: "./formly-reorder-array.component.html", }) export class FormlyReorderArrayComponent extends FieldType - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input-modal.component.ts b/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input-modal.component.ts index 87110962d05..09429469287 100644 --- a/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input-modal.component.ts +++ b/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input-modal.component.ts @@ -5,8 +5,8 @@ import { ModalController } from "@ionic/angular"; import { FormlyFieldConfig } from "@ngx-formly/core"; @Component({ - selector: 'formly-safe-input-modal', - templateUrl: './formly-safe-input-modal.component.html', + selector: "formly-safe-input-modal", + templateUrl: "./formly-safe-input-modal.component.html", }) export class FormlySafeInputModalComponent implements OnInit { diff --git a/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input.extended.html b/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input.extended.html index 58d5124f8b3..08481c07142 100644 --- a/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input.extended.html +++ b/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input.extended.html @@ -22,4 +22,4 @@

-
\ No newline at end of file + diff --git a/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input.extended.ts b/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input.extended.ts index 32aae50bfda..cf4d9ebbf40 100644 --- a/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input.extended.ts +++ b/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input.extended.ts @@ -2,18 +2,18 @@ import { Component, OnInit } from "@angular/core"; import { ModalController } from "@ionic/angular"; import { FieldWrapper, FormlyFieldConfig } from "@ngx-formly/core"; -import { FormlySafeInputModalComponent } from "./formly-safe-input-modal.component"; import { GetAppAssistant } from "../../jsonrpc/getAppAssistant"; import { OptionGroupConfig, getTitleFromOptionConfig } from "../option-group-picker/optionGroupPickerConfiguration"; +import { FormlySafeInputModalComponent } from "./formly-safe-input-modal.component"; @Component({ - selector: 'formly-safe-input-wrapper', - templateUrl: './formly-safe-input.extended.html', + selector: "formly-safe-input-wrapper", + templateUrl: "./formly-safe-input.extended.html", }) export class FormlySafeInputWrapperComponent extends FieldWrapper implements OnInit { protected pathToDisplayValue: string; - protected displayType: 'string' | 'boolean' | 'number' | 'optionGroup'; + protected displayType: "string" | "boolean" | "number" | "optionGroup"; constructor( private modalController: ModalController, @@ -23,17 +23,17 @@ export class FormlySafeInputWrapperComponent extends FieldWrapper implements OnI ngOnInit(): void { this.pathToDisplayValue = this.props["pathToDisplayValue"]; - this.displayType = this.props["displayType"] ?? 'string'; + this.displayType = this.props["displayType"] ?? "string"; } public getValue() { - if (this.displayType === 'boolean' - || this.displayType === 'number' - || this.displayType === 'string') { + if (this.displayType === "boolean" + || this.displayType === "number" + || this.displayType === "string") { return this.model[this.pathToDisplayValue]; } - if (this.displayType === 'optionGroup') { + if (this.displayType === "optionGroup") { const value = this.getValueOfOptionGroup(); if (value) { return value; @@ -60,7 +60,7 @@ export class FormlySafeInputWrapperComponent extends FieldWrapper implements OnI fields: this.getFields(), model: this.model, }, - cssClass: ['auto-height'], + cssClass: ["auto-height"], }); modal.onDidDismiss().then(event => { if (!event.data) { @@ -102,7 +102,7 @@ export class FormlySafeInputWrapperComponent extends FieldWrapper implements OnI } private getValueOfOptionGroup(): string { - const field = GetAppAssistant.findField(this.getFields(), this.pathToDisplayValue.split('.')); + const field = GetAppAssistant.findField(this.getFields(), this.pathToDisplayValue.split(".")); if (!field) { return null; } @@ -112,7 +112,7 @@ export class FormlySafeInputWrapperComponent extends FieldWrapper implements OnI if (Array.isArray(value)) { return (value as []).map(e => options.find(option => option.value === e)) .map(option => getTitleFromOptionConfig(option, this.field)) - .join(', '); + .join(", "); } else { const option = options.find(option => option.value === value); if (!option) { diff --git a/ui/src/app/edge/settings/app/index.component.ts b/ui/src/app/edge/settings/app/index.component.ts index 02051b79b30..e0b1966f563 100644 --- a/ui/src/app/edge/settings/app/index.component.ts +++ b/ui/src/app/edge/settings/app/index.component.ts @@ -1,52 +1,52 @@ // @ts-strict-ignore -import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { IonPopover, ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { Role } from 'src/app/shared/type/role'; -import { Environment, environment } from 'src/environments'; -import { Edge, Service, Websocket } from '../../../shared/shared'; -import { ExecuteSystemUpdate } from '../system/executeSystemUpdate'; -import { GetApps } from './jsonrpc/getApps'; -import { AppCenter } from './keypopup/appCenter'; -import { AppCenterGetPossibleApps } from './keypopup/appCenterGetPossibleApps'; -import { Key } from './keypopup/key'; -import { KeyModalComponent, KeyValidationBehaviour } from './keypopup/modal.component'; -import { canEnterKey } from './permissions'; -import { Flags } from './jsonrpc/flag/flags'; -import { App } from './keypopup/app'; -import { InstallAppComponent } from './install.component'; -import { AppCenterGetRegisteredKeys } from './keypopup/appCenterGetRegisteredKeys'; +import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core"; +import { ActivatedRoute, NavigationEnd, NavigationExtras, Router } from "@angular/router"; +import { IonPopover, ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Subject } from "rxjs"; +import { filter, switchMap, takeUntil } from "rxjs/operators"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { Role } from "src/app/shared/type/role"; +import { Environment, environment } from "src/environments"; +import { Edge, Service, Websocket } from "../../../shared/shared"; +import { ExecuteSystemUpdate } from "../system/executeSystemUpdate"; +import { InstallAppComponent } from "./install.component"; +import { Flags } from "./jsonrpc/flag/flags"; +import { GetApps } from "./jsonrpc/getApps"; +import { App } from "./keypopup/app"; +import { AppCenter } from "./keypopup/appCenter"; +import { AppCenterGetPossibleApps } from "./keypopup/appCenterGetPossibleApps"; +import { AppCenterGetRegisteredKeys } from "./keypopup/appCenterGetRegisteredKeys"; +import { Key } from "./keypopup/key"; +import { KeyModalComponent, KeyValidationBehaviour } from "./keypopup/modal.component"; +import { canEnterKey } from "./permissions"; @Component({ selector: IndexComponent.SELECTOR, - templateUrl: './index.component.html', + templateUrl: "./index.component.html", }) export class IndexComponent implements OnInit, OnDestroy { - private static readonly SELECTOR = 'app-index'; + private static readonly SELECTOR = "app-index"; /** * e. g. if more than 4 apps are in a list the apps are displayed in their categories */ private static readonly MAX_APPS_IN_LIST: number = 4; - @ViewChild('hasKeyPopover') private hasKeyPopover: IonPopover; + @ViewChild("hasKeyPopover") private hasKeyPopover: IonPopover; public readonly spinnerId: string = IndexComponent.SELECTOR; public apps: GetApps.App[] = []; public installedApps: AppList = { - name: 'Edge.Config.App.installed', appCategories: [] + name: "Edge.Config.App.installed", appCategories: [] , shouldBeShown: () => this.key === null, // only show installed apps when the user is not currently selecting an app from a key }; public availableApps: AppList = { - name: 'Edge.Config.App.available', appCategories: [] + name: "Edge.Config.App.available", appCategories: [] , shouldBeShown: () => true, // always show available apps }; public incompatibleApps: AppList = { - name: 'Edge.Config.App.incompatible', appCategories: [] + name: "Edge.Config.App.incompatible", appCategories: [] , shouldBeShown: () => this.edge.roleIsAtLeast(Role.ADMIN), // only show incompatible apps for admins }; @@ -76,6 +76,17 @@ export class IndexComponent implements OnInit, OnDestroy { public ngOnInit() { this.init(); + this.router.events.pipe( + filter(event => event instanceof NavigationEnd), + switchMap(() => this.route.url), + takeUntil(this.stopOnDestroy), + ).subscribe(() => { + const navigationExtras = this.router.getCurrentNavigation()?.extras as NavigationExtras; + const appInstanceChange = navigationExtras?.state?.appInstanceChange; + if (appInstanceChange != null && appInstanceChange) { + this.init(); + } + }); } public ngOnDestroy(): void { @@ -120,11 +131,11 @@ export class IndexComponent implements OnInit, OnDestroy { sortedApps.forEach(a => { if (a.instanceIds.length > 0) { this.pushIntoCategory(a, this.installedApps); - if (a.cardinality === 'MULTIPLE' && a.status.name !== 'INCOMPATIBLE') { + if (a.cardinality === "MULTIPLE" && a.status.name !== "INCOMPATIBLE") { this.pushIntoCategory(a, this.availableApps); } } else { - if (a.status.name === 'INCOMPATIBLE') { + if (a.status.name === "INCOMPATIBLE") { this.pushIntoCategory(a, this.incompatibleApps); } else { this.pushIntoCategory(a, this.availableApps); @@ -152,7 +163,7 @@ export class IndexComponent implements OnInit, OnDestroy { behaviour: KeyValidationBehaviour.SELECT, knownApps: this.apps, }, - cssClass: 'auto-height', + cssClass: "auto-height", }); modal.onDidDismiss().then(data => { if (!data.data) { @@ -200,10 +211,10 @@ export class IndexComponent implements OnInit, OnDestroy { protected onAppClicked(app: GetApps.App): void { // navigate if (this.key != null || this.useMasterKey) { - this.router.navigate(['device/' + (this.edge.id) + '/settings/app/single/' + app.appId] + this.router.navigate(["device/" + (this.edge.id) + "/settings/app/single/" + app.appId] , { queryParams: { name: app.name }, state: { app: app, appKey: this.key.keyId, useMasterKey: this.useMasterKey } }); } else { - this.router.navigate(['device/' + (this.edge.id) + '/settings/app/single/' + app.appId], { queryParams: { name: app.name }, state: app }); + this.router.navigate(["device/" + (this.edge.id) + "/settings/app/single/" + app.appId], { queryParams: { name: app.name }, state: app }); } // reset keys this.key = null; @@ -220,7 +231,7 @@ export class IndexComponent implements OnInit, OnDestroy { edge: this.edge, behaviour: KeyValidationBehaviour.REGISTER, }, - cssClass: 'auto-height', + cssClass: "auto-height", }); return await modal.present(); @@ -240,8 +251,8 @@ export class IndexComponent implements OnInit, OnDestroy { this.hasSeenPopover = true; this.hasKeyPopover.event = { - type: 'willPresent', - target: document.querySelector('#redeemKeyCard'), + type: "willPresent", + target: document.querySelector("#redeemKeyCard"), }; this.showPopover = true; } @@ -271,7 +282,7 @@ export class IndexComponent implements OnInit, OnDestroy { }); this.service.setCurrentComponent({ - languageKey: 'Edge.Config.App.NAME_WITH_EDGE_NAME', + languageKey: "Edge.Config.App.NAME_WITH_EDGE_NAME", interpolateParams: { edgeShortName: environment.edgeShortName }, }, this.route).then(edge => { this.edge = edge; @@ -284,7 +295,7 @@ export class IndexComponent implements OnInit, OnDestroy { }); edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_appManager', + componentId: "_appManager", payload: new GetApps.Request(), })).then(response => { @@ -313,7 +324,7 @@ export class IndexComponent implements OnInit, OnDestroy { this.numberOfUnusedRegisteredKeys = result.keys.length; this.updateHasUnusedKeysPopover(); }).catch(this.service.handleError); - }).catch(InstallAppComponent.errorToast(this.service, error => 'Error while receiving available apps: ' + error)); + }).catch(InstallAppComponent.errorToast(this.service, error => "Error while receiving available apps: " + error)); const systemUpdate = new ExecuteSystemUpdate(edge, this.websocket); systemUpdate.systemUpdateStateChange = (updateState) => { diff --git a/ui/src/app/edge/settings/app/install.component.html b/ui/src/app/edge/settings/app/install.component.html index 92b8960b12f..2418d652e3a 100644 --- a/ui/src/app/edge/settings/app/install.component.html +++ b/ui/src/app/edge/settings/app/install.component.html @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/app/install.component.ts b/ui/src/app/edge/settings/app/install.component.ts index 18468365653..d41cb72f035 100644 --- a/ui/src/app/edge/settings/app/install.component.ts +++ b/ui/src/app/edge/settings/app/install.component.ts @@ -1,30 +1,30 @@ // @ts-strict-ignore -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { FormlyFieldConfig } from '@ngx-formly/core'; -import { TranslateService } from '@ngx-translate/core'; -import { Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; -import { JsonrpcRequest } from 'src/app/shared/jsonrpc/base'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { Edge, Service, Utils, Websocket } from '../../../shared/shared'; -import { AddAppInstance } from './jsonrpc/addAppInstance'; -import { GetAppAssistant } from './jsonrpc/getAppAssistant'; -import { AppCenter } from './keypopup/appCenter'; -import { AppCenterInstallAppWithSuppliedKeyRequest } from './keypopup/appCenterInstallAppWithSuppliedKey'; -import { AppCenterIsAppFree } from './keypopup/appCenterIsAppFree'; -import { KeyModalComponent, KeyValidationBehaviour } from './keypopup/modal.component'; -import { hasPredefinedKey } from './permissions'; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { FormlyFieldConfig } from "@ngx-formly/core"; +import { TranslateService } from "@ngx-translate/core"; +import { Subject } from "rxjs"; +import { takeUntil } from "rxjs/operators"; +import { JsonrpcRequest } from "src/app/shared/jsonrpc/base"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { Edge, Service, Utils, Websocket } from "../../../shared/shared"; +import { AddAppInstance } from "./jsonrpc/addAppInstance"; +import { GetAppAssistant } from "./jsonrpc/getAppAssistant"; +import { AppCenter } from "./keypopup/appCenter"; +import { AppCenterInstallAppWithSuppliedKeyRequest } from "./keypopup/appCenterInstallAppWithSuppliedKey"; +import { AppCenterIsAppFree } from "./keypopup/appCenterIsAppFree"; +import { KeyModalComponent, KeyValidationBehaviour } from "./keypopup/modal.component"; +import { hasPredefinedKey } from "./permissions"; @Component({ selector: InstallAppComponent.SELECTOR, - templateUrl: './install.component.html', + templateUrl: "./install.component.html", }) export class InstallAppComponent implements OnInit, OnDestroy { - private static readonly SELECTOR = 'app-install'; + private static readonly SELECTOR = "app-install"; public readonly spinnerId: string = InstallAppComponent.SELECTOR; protected form: FormGroup | null = null; @@ -68,7 +68,7 @@ export class InstallAppComponent implements OnInit, OnDestroy { } } console.error(reason); - service.toast(messageBuilder(reason), 'danger'); + service.toast(messageBuilder(reason), "danger"); }; } @@ -76,15 +76,15 @@ export class InstallAppComponent implements OnInit, OnDestroy { this.service.startSpinner(this.spinnerId); const state = history?.state; if (state) { - if ('appKey' in state) { - this.key = state['appKey']; + if ("appKey" in state) { + this.key = state["appKey"]; } - if ('useMasterKey' in state) { - this.useMasterKey = state['useMasterKey']; + if ("useMasterKey" in state) { + this.useMasterKey = state["useMasterKey"]; } } - const appId = this.route.snapshot.params['appId']; - const appName = this.route.snapshot.queryParams['name']; + const appId = this.route.snapshot.params["appId"]; + const appName = this.route.snapshot.queryParams["name"]; this.appId = appId; this.service.setCurrentComponent(appName, this.route).then(edge => { this.edge = edge; @@ -109,7 +109,7 @@ export class InstallAppComponent implements OnInit, OnDestroy { }); edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_appManager', + componentId: "_appManager", payload: new GetAppAssistant.Request({ appId: appId }), })).then(response => { const appAssistant = GetAppAssistant.postprocess((response as GetAppAssistant.Response).result); @@ -139,16 +139,16 @@ export class InstallAppComponent implements OnInit, OnDestroy { this.obtainKey().then(key => { this.service.startSpinnerTransparentBackground(this.appId); // remove alias field from properties - const alias = this.form.value['ALIAS']; + const alias = this.form.value["ALIAS"]; const clonedFields = {}; for (const item in this.form.value) { - if (item !== 'ALIAS') { + if (item !== "ALIAS") { clonedFields[item] = this.form.value[item]; } } let request: JsonrpcRequest = new ComponentJsonApiRequest({ - componentId: '_appManager', + componentId: "_appManager", payload: new AddAppInstance.Request({ appId: this.appId, alias: alias, @@ -174,15 +174,16 @@ export class InstallAppComponent implements OnInit, OnDestroy { this.model = result.instance.properties; } if (result.warnings && result.warnings.length > 0) { - this.service.toast(result.warnings.join(';'), 'warning'); + this.service.toast(result.warnings.join(";"), "warning"); } else { - this.service.toast(this.translate.instant('Edge.Config.App.successInstall'), 'success'); + this.service.toast(this.translate.instant("Edge.Config.App.successInstall"), "success"); } this.form.markAsPristine(); - this.router.navigate(['device/' + (this.edge.id) + '/settings/app/']); + const navigationExtras = { state: { appInstanceChange: true } }; + this.router.navigate(["device/" + (this.edge.id) + "/settings/app/"], navigationExtras); }) - .catch(InstallAppComponent.errorToast(this.service, error => this.translate.instant('Edge.Config.App.failInstall', { error: error }))) + .catch(InstallAppComponent.errorToast(this.service, error => this.translate.instant("Edge.Config.App.failInstall", { error: error }))) .finally(() => { this.isInstalling = false; this.service.stopSpinner(this.appId); @@ -227,7 +228,7 @@ export class InstallAppComponent implements OnInit, OnDestroy { behaviour: KeyValidationBehaviour.SELECT, appName: this.appName, }, - cssClass: 'auto-height', + cssClass: "auto-height", }); const selectKeyPromise = new Promise((resolve, reject) => { diff --git a/ui/src/app/edge/settings/app/jsonrpc/flag/flags.ts b/ui/src/app/edge/settings/app/jsonrpc/flag/flags.ts index e3041790b9e..99d62ac7742 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/flag/flags.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/flag/flags.ts @@ -3,7 +3,7 @@ import { FlagType } from "./flagType"; export namespace Flags { - export const SHOW_AFTER_KEY_REDEEM: FlagType = { name: 'showAfterKeyRedeem' }; + export const SHOW_AFTER_KEY_REDEEM: FlagType = { name: "showAfterKeyRedeem" }; /** * Gets a flag by its type from an array of flags. diff --git a/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.spec.ts b/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.spec.ts index d6cb07561a0..588aa68cc5e 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.spec.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.spec.ts @@ -1,58 +1,58 @@ // @ts-strict-ignore -import { GetAppAssistant } from "./getAppAssistant"; import { FormlyFieldConfig } from "@ngx-formly/core"; +import { GetAppAssistant } from "./getAppAssistant"; -describe('GetAppAssistant', () => { +describe("GetAppAssistant", () => { let fields: FormlyFieldConfig[]; beforeEach(() => { fields = [ { - key: 'a', - type: 'input', + key: "a", + type: "input", props: { - type: 'text', + type: "text", }, fieldGroup: [ { - key: 'b', - type: 'input', + key: "b", + type: "input", props: { - type: 'number', + type: "number", }, }, ], }, { - key: 'c', - type: 'input', + key: "c", + type: "input", props: { - type: 'number', + type: "number", }, }, ]; }); - it('#findField should find a field by a path', () => { - expect(GetAppAssistant.findField(fields, ['a'])).toBeDefined(); - expect(GetAppAssistant.findField(fields, ['a', 'b'])).toBeDefined(); - expect(GetAppAssistant.findField(fields, ['c'])).toBeDefined(); + it("#findField should find a field by a path", () => { + expect(GetAppAssistant.findField(fields, ["a"])).toBeDefined(); + expect(GetAppAssistant.findField(fields, ["a", "b"])).toBeDefined(); + expect(GetAppAssistant.findField(fields, ["c"])).toBeDefined(); }); - it('#setInitialModel should set the initial model on every field', () => { - expect(GetAppAssistant.findField(fields, ['a'])['initialModel']).toBeUndefined(); - expect(GetAppAssistant.findField(fields, ['a', 'b'])['initialModel']).toBeUndefined(); - expect(GetAppAssistant.findField(fields, ['c'])['initialModel']).toBeUndefined(); + it("#setInitialModel should set the initial model on every field", () => { + expect(GetAppAssistant.findField(fields, ["a"])["initialModel"]).toBeUndefined(); + expect(GetAppAssistant.findField(fields, ["a", "b"])["initialModel"]).toBeUndefined(); + expect(GetAppAssistant.findField(fields, ["c"])["initialModel"]).toBeUndefined(); GetAppAssistant.setInitialModel(fields, {}); - expect(GetAppAssistant.findField(fields, ['a'])['initialModel']).toBeDefined(); - expect(GetAppAssistant.findField(fields, ['a', 'b'])['initialModel']).toBeDefined(); - expect(GetAppAssistant.findField(fields, ['c'])['initialModel']).toBeDefined(); + expect(GetAppAssistant.findField(fields, ["a"])["initialModel"]).toBeDefined(); + expect(GetAppAssistant.findField(fields, ["a", "b"])["initialModel"]).toBeDefined(); + expect(GetAppAssistant.findField(fields, ["c"])["initialModel"]).toBeDefined(); }); - it('#convertStringExpressions should parse number inputs to numbers', () => { - const expression = 'model.a < 1 || model.a.b < 1 && [1,2].every(i => i < initialModel.c)'; + it("#convertStringExpressions should parse number inputs to numbers", () => { + const expression = "model.a < 1 || model.a.b < 1 && [1,2].every(i => i < initialModel.c)"; const converted = GetAppAssistant.convertStringExpressions(fields, fields[0], expression); - expect(converted).toBe('model.a < 1 || +model.a.b < 1 && [1,2].every(i => i < +initialModel.c)'); + expect(converted).toBe("model.a < 1 || +model.a.b < 1 && [1,2].every(i => i < +initialModel.c)"); }); }); diff --git a/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.ts b/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.ts index a9d1bc58355..571b7c34205 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.ts @@ -75,7 +75,7 @@ export namespace GetAppAssistant { } if (!hasAliasField) { // insert alias field into appAssistant fields - const aliasField = { key: 'ALIAS', type: 'input', templateOptions: { label: 'Alias' }, defaultValue: appAssistant.alias }; + const aliasField = { key: "ALIAS", type: "input", templateOptions: { label: "Alias" }, defaultValue: appAssistant.alias }; appAssistant.fields.splice(0, 0, aliasField); } return appAssistant; @@ -87,7 +87,7 @@ export namespace GetAppAssistant { if (!field) { return; } - field['initialModel'] = structuredClone(model); + field["initialModel"] = structuredClone(model); [field.fieldGroup, field.templateOptions?.fields ?? field.props?.fields].forEach(fieldGroup => { if (!fieldGroup) { return; @@ -103,7 +103,7 @@ export namespace GetAppAssistant { } export function convertStringExpressions(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig, expression: string): string { - return ['model.', 'initialModel.', 'control.value.'].reduce((p, c) => convertStringExpression(rootFields, field, p, c), expression); + return ["model.", "initialModel.", "control.value."].reduce((p, c) => convertStringExpression(rootFields, field, p, c), expression); } /** @@ -127,7 +127,7 @@ export namespace GetAppAssistant { return finalExpression; } - const smallestIndex = [' ', ')'].reduce((previous, current) => { + const smallestIndex = [" ", ")"].reduce((previous, current) => { const index = part.indexOf(current); if (index === -1) { return previous; @@ -148,14 +148,14 @@ export namespace GetAppAssistant { propertyName = part; } - const propertyPathNames = propertyName.split('.') - .map(i => ['(', ')'].reduce((p, c) => p.replace(c, ''), i)); + const propertyPathNames = propertyName.split(".") + .map(i => ["(", ")"].reduce((p, c) => p.replace(c, ""), i)); const f = GetAppAssistant.findField(rootFields, propertyPathNames); - const isNumericInput = !!f && (f.templateOptions?.type === 'number' || f.props?.type === 'number'); + const isNumericInput = !!f && (f.templateOptions?.type === "number" || f.props?.type === "number"); if (isNumericInput) { // parses the value to a number - finalExpression = finalExpression.concat('+'); + finalExpression = finalExpression.concat("+"); } finalExpression = finalExpression.concat(prefix, propertyName); if (smallestIndex != -1) { @@ -207,14 +207,14 @@ export namespace GetAppAssistant { */ function eachFieldRecursive(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig) { // 'defaultValue' false for checkboxes - if (field.type === 'checkbox' && !('defaultValue' in field)) { - field['defaultValue'] = false; + if (field.type === "checkbox" && !("defaultValue" in field)) { + field["defaultValue"] = false; } // this is needed to still show the input as the default style defined by us - if (field.wrappers?.includes('formly-wrapper-default-of-cases') - || field.wrappers?.includes('formly-safe-input-wrapper') - || field.wrappers?.includes('input-with-unit')) { - field.wrappers?.push('form-field'); + if (field.wrappers?.includes("formly-wrapper-default-of-cases") + || field.wrappers?.includes("formly-safe-input-wrapper") + || field.wrappers?.includes("input-with-unit")) { + field.wrappers?.push("form-field"); } if (field.validators) { @@ -222,15 +222,15 @@ function eachFieldRecursive(rootFields: FormlyFieldConfig[], field: FormlyFieldC let expressionString: string = value["expressionString"]; if (expressionString) { expressionString = GetAppAssistant.convertStringExpressions(rootFields, field, expressionString); - const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${expressionString};`); + const func = Function("model", "formState", "field", "control", "initialModel", `return ${expressionString};`); field.validators[key]["expression"] = (control: AbstractControl, f: FormlyFieldConfigWithInitialModel) => { return func(f.model, f.options.formState, f, control, f.initialModel); }; } - let messageExpressionString: string = value['messageString']; + let messageExpressionString: string = value["messageString"]; if (messageExpressionString) { messageExpressionString = GetAppAssistant.convertStringExpressions(rootFields, field, messageExpressionString); - const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${messageExpressionString};`); + const func = Function("model", "formState", "field", "control", "initialModel", `return ${messageExpressionString};`); field.validators[key]["message"] = (error: any, f: FormlyFieldConfigWithInitialModel) => { return func(f.model, f.options.formState, f, f.formControl, f.initialModel); }; @@ -252,7 +252,7 @@ function eachFieldRecursive(rootFields: FormlyFieldConfig[], field: FormlyFieldC } } }); - if (field.key == 'ALIAS') { + if (field.key == "ALIAS") { return true; } return childHasAlias; @@ -290,14 +290,14 @@ function eachFieldRecursive(rootFields: FormlyFieldConfig[], field: FormlyFieldC * @param field the current field */ function convertFormlyOptionGroupPicker(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig) { - if (field.type !== 'formly-option-group-picker') { + if (field.type !== "formly-option-group-picker") { return; } (field.templateOptions ?? field.props).options?.forEach((optionGroup) => { if (!optionGroup) { return; } - (optionGroup['options'] as any[]).forEach((option) => { + (optionGroup["options"] as any[]).forEach((option) => { for (const [key, value] of Object.entries(option?.expressions ?? {})) { if (!key.endsWith("String")) { continue; @@ -306,8 +306,8 @@ function convertFormlyOptionGroupPicker(rootFields: FormlyFieldConfig[], field: const expressionString: string = value as string; if (expressionString) { const convertedExpression = GetAppAssistant.convertStringExpressions(rootFields, field, expressionString); - const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${convertedExpression};`); - option['expressions'][key.substring(0, key.indexOf("String"))] = (f: FormlyFieldConfigWithInitialModel) => { + const func = Function("model", "formState", "field", "control", "initialModel", `return ${convertedExpression};`); + option["expressions"][key.substring(0, key.indexOf("String"))] = (f: FormlyFieldConfigWithInitialModel) => { return func(f.model, f.options.formState, f, f.formControl, f.initialModel); }; } @@ -317,7 +317,7 @@ function convertFormlyOptionGroupPicker(rootFields: FormlyFieldConfig[], field: } function convertFormlyReorderArray(rootFields: FormlyFieldConfig[], field: FormlyFieldConfig) { - if (field.type !== 'reorder-array') { + if (field.type !== "reorder-array") { return; } (field.templateOptions ?? field.props).selectOptions?.forEach((selectOption) => { @@ -333,8 +333,8 @@ function convertFormlyReorderArray(rootFields: FormlyFieldConfig[], field: Forml const expressionString: string = value as string; if (expressionString) { const convertedExpression = GetAppAssistant.convertStringExpressions(rootFields, field, expressionString); - const func = Function('model', 'formState', 'field', 'control', 'initialModel', `return ${convertedExpression};`); - selectOption['expressions'][key.substring(0, key.indexOf("String"))] = (f: FormlyFieldConfigWithInitialModel) => { + const func = Function("model", "formState", "field", "control", "initialModel", `return ${convertedExpression};`); + selectOption["expressions"][key.substring(0, key.indexOf("String"))] = (f: FormlyFieldConfigWithInitialModel) => { return func(f.model, f.options.formState, f, f.formControl, f.initialModel); }; } diff --git a/ui/src/app/edge/settings/app/jsonrpc/getApps.ts b/ui/src/app/edge/settings/app/jsonrpc/getApps.ts index 5c90982b190..a95aa6ea12d 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/getApps.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/getApps.ts @@ -66,7 +66,7 @@ export namespace GetApps { export interface App { categorys: Category[], - cardinality: 'SINGLE' | 'SINGLE_IN_CATEGORY' | 'MULTIPLE', + cardinality: "SINGLE" | "SINGLE_IN_CATEGORY" | "MULTIPLE", appId: string, name: string, shortName?: string, @@ -78,7 +78,7 @@ export namespace GetApps { } export interface Status { - name: 'INCOMPATIBLE' | 'COMPATIBLE' | 'INSTALLABLE', + name: "INCOMPATIBLE" | "COMPATIBLE" | "INSTALLABLE", errorCompatibleMessages: string[], errorInstallableMessages: string[] } diff --git a/ui/src/app/edge/settings/app/keypopup/modal.component.html b/ui/src/app/edge/settings/app/keypopup/modal.component.html index 9e2ede39af0..ea56ffdf288 100644 --- a/ui/src/app/edge/settings/app/keypopup/modal.component.html +++ b/ui/src/app/edge/settings/app/keypopup/modal.component.html @@ -50,4 +50,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/app/keypopup/modal.component.ts b/ui/src/app/edge/settings/app/keypopup/modal.component.ts index 211f1f1a1b1..be5889a230d 100644 --- a/ui/src/app/edge/settings/app/keypopup/modal.component.ts +++ b/ui/src/app/edge/settings/app/keypopup/modal.component.ts @@ -1,28 +1,28 @@ // @ts-strict-ignore -import { Component, Input, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { FormlyFieldConfig, FormlyFormOptions } from '@ngx-formly/core'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, Service, Websocket } from 'src/app/shared/shared'; -import { environment } from 'src/environments'; -import { GetApps } from '../jsonrpc/getApps'; -import { AppCenter } from './appCenter'; -import { AppCenterAddRegisterKeyHistory } from './appCenterAddRegisterKeyHistory'; -import { AppCenterGetRegisteredKeys } from './appCenterGetRegisteredKeys'; -import { AppCenterIsKeyApplicable } from './appCenterIsKeyApplicable'; -import { Key } from './key'; -import { Flags } from '../jsonrpc/flag/flags'; -import { hasPredefinedKey } from '../permissions'; +import { Component, Input, OnInit } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { FormlyFieldConfig, FormlyFormOptions } from "@ngx-formly/core"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, Service, Websocket } from "src/app/shared/shared"; +import { environment } from "src/environments"; +import { Flags } from "../jsonrpc/flag/flags"; +import { GetApps } from "../jsonrpc/getApps"; +import { hasPredefinedKey } from "../permissions"; +import { AppCenter } from "./appCenter"; +import { AppCenterAddRegisterKeyHistory } from "./appCenterAddRegisterKeyHistory"; +import { AppCenterGetRegisteredKeys } from "./appCenterGetRegisteredKeys"; +import { AppCenterIsKeyApplicable } from "./appCenterIsKeyApplicable"; +import { Key } from "./key"; @Component({ selector: KeyModalComponent.SELECTOR, - templateUrl: './modal.component.html', + templateUrl: "./modal.component.html", }) export class KeyModalComponent implements OnInit { - private static readonly SELECTOR = 'key-modal'; + private static readonly SELECTOR = "key-modal"; @Input({ required: true }) public edge!: Edge; @Input() public appId: string | null = null; @@ -63,7 +63,7 @@ export class KeyModalComponent implements OnInit { */ private static transformInput(value: string): string { // remove spaces - let trimmed = value.replace(/\s+/g, ''); + let trimmed = value.replace(/\s+/g, ""); // trimm max length of input if (trimmed.length > 19) { @@ -72,29 +72,29 @@ export class KeyModalComponent implements OnInit { // remove last dash const hasDashAsLastChar = trimmed.substring(trimmed.length - 1, trimmed.length) == "-"; - trimmed = trimmed.replace(/-/g, ''); + trimmed = trimmed.replace(/-/g, ""); const numbers = []; // push single parts into array numbers.push(trimmed.substring(0, 4)); - if (trimmed.substring(4, 8) !== '') { + if (trimmed.substring(4, 8) !== "") { numbers.push(trimmed.substring(4, 8)); } - if (trimmed.substring(8, 12) != '') { + if (trimmed.substring(8, 12) != "") { numbers.push(trimmed.substring(8, 12)); } - if (trimmed.substring(12, 16) != '') { + if (trimmed.substring(12, 16) != "") { numbers.push(trimmed.substring(12, 16)); } // join parts so it matches 'XXXX-XXXX-XXXX-XXXX' - let modifiedValue = numbers.join('-'); + let modifiedValue = numbers.join("-"); // readd last if (hasDashAsLastChar) { - modifiedValue += '-'; + modifiedValue += "-"; } // if there was no change to the original value return null @@ -113,8 +113,8 @@ export class KeyModalComponent implements OnInit { }; this.model = { useRegisteredKeys: false, - registeredKey: '', - key: '', + registeredKey: "", + key: "", }; if (this.behaviour === KeyValidationBehaviour.REGISTER) { @@ -134,7 +134,7 @@ export class KeyModalComponent implements OnInit { this.model.useRegisteredKeys = true; this.model.registeredKey = this.registeredKeys[0].keyId; } - const selectRegisteredKey = this.fields.find(f => f.key === 'registeredKey'); + const selectRegisteredKey = this.fields.find(f => f.key === "registeredKey"); this.registeredKeys.forEach(key => { const desc = this.getDescription(key); (selectRegisteredKey.props.options as any[]).push({ @@ -145,7 +145,7 @@ export class KeyModalComponent implements OnInit { }); }).catch(reason => { this.fields = this.getFields(); - this.service.toast(this.translate.instant('Edge.Config.App.Key.failedLoadingRegisterKey'), 'danger'); + this.service.toast(this.translate.instant("Edge.Config.App.Key.failedLoadingRegisterKey"), "danger"); }).finally(() => { this.service.stopSpinner(this.spinnerId); }); @@ -169,7 +169,7 @@ export class KeyModalComponent implements OnInit { this.service.startSpinner(this.spinnerId); this.modalCtrl.dismiss({ key: this.getSelectedKey(), useMasterKey: this.model.useMasterKey }); // navigate to App install view and pass valid key - this.router.navigate(['device/' + (this.edge.id) + '/settings/app/install/' + this.appId] + this.router.navigate(["device/" + (this.edge.id) + "/settings/app/install/" + this.appId] , { queryParams: { name: this.appName }, state: { appKey: this.getRawAppKey(), useMasterKey: this.model.useMasterKey } }); this.service.stopSpinner(this.spinnerId); break; @@ -178,9 +178,9 @@ export class KeyModalComponent implements OnInit { // only register key for this app this.registerKey().then(() => { this.modalCtrl.dismiss({ key: this.getSelectedKey() }); - this.service.toast(this.translate.instant('Edge.Config.App.Key.successRegisterKey'), 'success'); + this.service.toast(this.translate.instant("Edge.Config.App.Key.successRegisterKey"), "success"); }).catch(() => { - this.service.toast(this.translate.instant('Edge.Config.App.Key.failedRegisterKey'), 'danger'); + this.service.toast(this.translate.instant("Edge.Config.App.Key.failedRegisterKey"), "danger"); }).finally(() => { this.service.stopSpinner(this.spinnerId); }); @@ -219,28 +219,28 @@ export class KeyModalComponent implements OnInit { return registration.edgeId !== this.edge.id; }); if (differentEdge) { - this.service.toast(this.translate.instant('Edge.Config.App.Key.alreadyRegisteredDifferentSystem'), 'warning'); + this.service.toast(this.translate.instant("Edge.Config.App.Key.alreadyRegisteredDifferentSystem"), "warning"); return; } const sameApp = result.additionalInfo.registrations.some(registration => { return registration.appId === this.appId && registration.edgeId === this.edge.id; }); if (!sameApp) { - this.service.toast(this.translate.instant('Edge.Config.App.Key.alreadyRegisteredDifferentApp'), 'warning'); + this.service.toast(this.translate.instant("Edge.Config.App.Key.alreadyRegisteredDifferentApp"), "warning"); return; } } - this.service.toast(this.translate.instant('Edge.Config.App.Key.valid'), 'success'); + this.service.toast(this.translate.instant("Edge.Config.App.Key.valid"), "success"); } else { - this.service.toast(this.translate.instant('Edge.Config.App.Key.invalid'), 'danger'); + this.service.toast(this.translate.instant("Edge.Config.App.Key.invalid"), "danger"); } }).catch(reason => { // this may happen if the key is not stored in the database - this.service.toast(this.translate.instant('Edge.Config.App.Key.invalid'), 'danger'); + this.service.toast(this.translate.instant("Edge.Config.App.Key.invalid"), "danger"); this.options.formState.gotInvalidKeyResponse = true; if (environment.debugMode) { - console.log('Failed to validate Key', reason); + console.log("Failed to validate Key", reason); } }).finally(() => { this.service.stopSpinner(this.spinnerId); @@ -272,7 +272,7 @@ export class KeyModalComponent implements OnInit { return null; } - const appPrefix = environment.edgeShortName + ' App'; + const appPrefix = environment.edgeShortName + " App"; // map to multiple description fields const descriptionFields = []; for (const bundle of bundles) { @@ -305,7 +305,7 @@ export class KeyModalComponent implements OnInit { descriptionFields.push(app.name); } } - return descriptionFields.length === 0 ? null : descriptionFields.map(e => appPrefix + ' ' + e).join(", "); + return descriptionFields.length === 0 ? null : descriptionFields.map(e => appPrefix + " " + e).join(", "); } private getAppsByCategory(): { [key: string]: GetApps.App[]; } { @@ -333,45 +333,45 @@ export class KeyModalComponent implements OnInit { private getFields(): FormlyFieldConfig[] { const fields: FormlyFieldConfig[] = []; fields.push({ - key: 'useRegisteredKeys', - type: 'checkbox', + key: "useRegisteredKeys", + type: "checkbox", props: { - label: this.translate.instant('Edge.Config.App.Key.useRegisteredKey'), + label: this.translate.instant("Edge.Config.App.Key.useRegisteredKey"), }, hide: this.registeredKeys.length === 0, expressions: { - 'props.disabled': field => field.model.useMasterKey, + "props.disabled": field => field.model.useMasterKey, }, }); fields.push({ - key: 'registeredKey', - type: 'select', + key: "registeredKey", + type: "select", props: { - label: this.translate.instant('Edge.Config.App.Key.registeredKey'), + label: this.translate.instant("Edge.Config.App.Key.registeredKey"), required: true, options: [], }, expressions: { - 'hide': () => this.registeredKeys.length === 0, - 'props.disabled': field => !field.model.useRegisteredKeys || field.model.useMasterKey, + "hide": () => this.registeredKeys.length === 0, + "props.disabled": field => !field.model.useRegisteredKeys || field.model.useMasterKey, }, - wrappers: ['formly-select-extended-wrapper'], + wrappers: ["formly-select-extended-wrapper"], }); fields.push({ - key: 'key', - type: 'input', + key: "key", + type: "input", props: { - label: this.translate.instant('Edge.Config.App.Key.key'), + label: this.translate.instant("Edge.Config.App.Key.key"), required: true, - placeholder: 'XXXX-XXXX-XXXX-XXXX', + placeholder: "XXXX-XXXX-XXXX-XXXX", }, expressions: { - 'props.disabled': field => field.model.useRegisteredKeys || field.model.useMasterKey, + "props.disabled": field => field.model.useRegisteredKeys || field.model.useMasterKey, }, validators: { - validation: ['key'], + validation: ["key"], }, hooks: { onInit: (field) => { @@ -391,30 +391,30 @@ export class KeyModalComponent implements OnInit { this.model.useMasterKey = true; fields.push( { - key: 'useMasterKey', - type: 'checkbox', + key: "useMasterKey", + type: "checkbox", props: { - label: this.translate.instant('Edge.Config.App.Key.useMasterKey'), + label: this.translate.instant("Edge.Config.App.Key.useMasterKey"), }, }, { - type: 'text', + type: "text", props: { - description: this.translate.instant('Edge.Config.App.Key.MASTER_KEY_HINT'), + description: this.translate.instant("Edge.Config.App.Key.MASTER_KEY_HINT"), }, expressions: { - hide: '!model.useMasterKey', + hide: "!model.useMasterKey", }, }, ); } fields.push({ - type: 'text', + type: "text", props: { - description: this.translate.instant('Edge.Config.App.Key.KEY_TYPO_MESSAGE_HINT'), + description: this.translate.instant("Edge.Config.App.Key.KEY_TYPO_MESSAGE_HINT"), }, - hideExpression: '!formState.gotInvalidKeyResponse', + hideExpression: "!formState.gotInvalidKeyResponse", }); return fields; diff --git a/ui/src/app/edge/settings/app/permissions.ts b/ui/src/app/edge/settings/app/permissions.ts index 2c107a5c673..0fe3b58071b 100644 --- a/ui/src/app/edge/settings/app/permissions.ts +++ b/ui/src/app/edge/settings/app/permissions.ts @@ -29,5 +29,5 @@ export function hasPredefinedKey(edge: Edge, user: User): boolean { } export function hasKeyModel(edge: Edge): boolean { - return edge.isVersionAtLeast('2023.1.2'); + return edge.isVersionAtLeast("2023.1.2"); } diff --git a/ui/src/app/edge/settings/app/single.component.html b/ui/src/app/edge/settings/app/single.component.html index 5234280d784..465413bd056 100644 --- a/ui/src/app/edge/settings/app/single.component.html +++ b/ui/src/app/edge/settings/app/single.component.html @@ -55,4 +55,4 @@

- \ No newline at end of file + diff --git a/ui/src/app/edge/settings/app/single.component.ts b/ui/src/app/edge/settings/app/single.component.ts index df22cb61b85..0051a69d016 100644 --- a/ui/src/app/edge/settings/app/single.component.ts +++ b/ui/src/app/edge/settings/app/single.component.ts @@ -1,32 +1,32 @@ // @ts-strict-ignore -import { Component, HostListener, OnDestroy, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { DomSanitizer } from '@angular/platform-browser'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { Subject } from 'rxjs'; -import { filter, takeUntil } from 'rxjs/operators'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { Edge, Service, Utils, Websocket } from '../../../shared/shared'; -import { GetApp } from './jsonrpc/getApp'; -import { GetAppDescriptor } from './jsonrpc/getAppDescriptor'; -import { GetApps } from './jsonrpc/getApps'; -import { AppCenter } from './keypopup/appCenter'; -import { AppCenterGetPossibleApps } from './keypopup/appCenterGetPossibleApps'; -import { AppCenterIsAppFree } from './keypopup/appCenterIsAppFree'; -import { KeyModalComponent, KeyValidationBehaviour } from './keypopup/modal.component'; -import { canEnterKey, hasKeyModel, hasPredefinedKey } from './permissions'; -import { InstallAppComponent } from './install.component'; -import { TranslateService } from '@ngx-translate/core'; -import { environment } from 'src/environments'; +import { Component, HostListener, OnDestroy, OnInit } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { DomSanitizer } from "@angular/platform-browser"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Subject } from "rxjs"; +import { filter, takeUntil } from "rxjs/operators"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { environment } from "src/environments"; +import { Edge, Service, Utils, Websocket } from "../../../shared/shared"; +import { InstallAppComponent } from "./install.component"; +import { GetApp } from "./jsonrpc/getApp"; +import { GetAppDescriptor } from "./jsonrpc/getAppDescriptor"; +import { GetApps } from "./jsonrpc/getApps"; +import { AppCenter } from "./keypopup/appCenter"; +import { AppCenterGetPossibleApps } from "./keypopup/appCenterGetPossibleApps"; +import { AppCenterIsAppFree } from "./keypopup/appCenterIsAppFree"; +import { KeyModalComponent, KeyValidationBehaviour } from "./keypopup/modal.component"; +import { canEnterKey, hasKeyModel, hasPredefinedKey } from "./permissions"; @Component({ selector: SingleAppComponent.SELECTOR, - templateUrl: './single.component.html', + templateUrl: "./single.component.html", }) export class SingleAppComponent implements OnInit, OnDestroy { - private static readonly SELECTOR = 'app-single'; + private static readonly SELECTOR = "app-single"; public readonly spinnerId: string = SingleAppComponent.SELECTOR; public form: FormGroup | null = null; @@ -63,7 +63,7 @@ export class SingleAppComponent implements OnInit, OnDestroy { ) { } - @HostListener('window:resize', ['$event']) + @HostListener("window:resize", ["$event"]) private onResize(event) { this.updateIsXL(); } @@ -72,8 +72,8 @@ export class SingleAppComponent implements OnInit, OnDestroy { this.service.startSpinner(this.spinnerId); this.updateIsXL(); - this.appId = this.route.snapshot.params['appId']; - this.appName = this.route.snapshot.queryParams['name']; + this.appId = this.route.snapshot.params["appId"]; + this.appName = this.route.snapshot.queryParams["name"]; const appId = this.appId; this.service.setCurrentComponent(this.appName, this.route).then(edge => { this.edge = edge; @@ -137,20 +137,20 @@ export class SingleAppComponent implements OnInit, OnDestroy { // set appname, image ... const state = history?.state; - if (state && 'app' in history.state) { - if ('app' in history.state) { + if (state && "app" in history.state) { + if ("app" in history.state) { this.setApp(history.state.app); } - if ('appKey' in history.state) { + if ("appKey" in history.state) { this.key = history.state.appKey; } - if ('useMasterKey' in history.state) { + if ("useMasterKey" in history.state) { this.useMasterKey = history.state.useMasterKey; } } else { edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_appManager', + componentId: "_appManager", payload: new GetApp.Request({ appId: appId }), })).then(response => { const app = (response as GetApp.Response).result.app; @@ -158,19 +158,19 @@ export class SingleAppComponent implements OnInit, OnDestroy { this.setApp(app); }).catch(reason => { console.error(reason.error); - this.service.toast('Error while receiving App[' + appId + ']: ' + reason.error.message, 'danger'); + this.service.toast("Error while receiving App[" + appId + "]: " + reason.error.message, "danger"); }); } // set app descriptor edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_appManager', + componentId: "_appManager", payload: new GetAppDescriptor.Request({ appId: appId }), })).then(response => { const descriptor = (response as GetAppDescriptor.Response).result; this.descriptor = GetAppDescriptor.postprocess(descriptor, this.sanitizer); }) - .catch(InstallAppComponent.errorToast(this.service, error => 'Error while receiving AppDescriptor for App[' + appId + ']: ' + error)) + .catch(InstallAppComponent.errorToast(this.service, error => "Error while receiving AppDescriptor for App[" + appId + "]: " + error)) .finally(() => { this.increaseReceivedResponse(); }); @@ -184,7 +184,7 @@ export class SingleAppComponent implements OnInit, OnDestroy { protected iFrameStyle() { const styles = { - 'height': (this.isXL) ? '100%' : window.innerHeight + 'px', + "height": (this.isXL) ? "100%" : window.innerHeight + "px", }; return styles; } @@ -193,13 +193,13 @@ export class SingleAppComponent implements OnInit, OnDestroy { if (this.key || this.useMasterKey) { // if key already set navigate directly to installation view const state = this.useMasterKey ? { useMasterKey: true } : { appKey: this.key }; - this.router.navigate(['device/' + (this.edge.id) + '/settings/app/install/' + this.appId] + this.router.navigate(["device/" + (this.edge.id) + "/settings/app/install/" + this.appId] , { queryParams: { name: this.appName }, state: state }); return; } // if the version is not high enough and the edge doesnt support installing apps via keys directly navigate to installation if (!hasKeyModel(this.edge) || this.isFreeApp) { - this.router.navigate(['device/' + (this.edge.id) + '/settings/app/install/' + this.appId] + this.router.navigate(["device/" + (this.edge.id) + "/settings/app/install/" + this.appId] , { queryParams: { name: this.appName } }); return; } @@ -239,7 +239,7 @@ export class SingleAppComponent implements OnInit, OnDestroy { behaviour: behaviour, appName: this.appName, }, - cssClass: 'auto-height', + cssClass: "auto-height", }); return await modal.present(); } diff --git a/ui/src/app/edge/settings/app/update.component.html b/ui/src/app/edge/settings/app/update.component.html index b773512c8e0..039d79b1826 100644 --- a/ui/src/app/edge/settings/app/update.component.html +++ b/ui/src/app/edge/settings/app/update.component.html @@ -17,7 +17,8 @@ [disabled]="(!((!varinstance.form.pristine) && (varinstance.form.valid))) || varinstance.isDeleting || varinstance.isUpdating" translate> Edge.Config.App.updateApp - + Edge.Config.App.deleteApp
diff --git a/ui/src/app/edge/settings/app/update.component.ts b/ui/src/app/edge/settings/app/update.component.ts index 26bf353a98f..94c049bbcfb 100644 --- a/ui/src/app/edge/settings/app/update.component.ts +++ b/ui/src/app/edge/settings/app/update.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; -import { FormlyFieldConfig } from '@ngx-formly/core'; -import { TranslateService } from '@ngx-translate/core'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { Edge, Service, Utils, Websocket } from '../../../shared/shared'; -import { DeleteAppInstance } from './jsonrpc/deleteAppInstance'; -import { GetAppAssistant } from './jsonrpc/getAppAssistant'; -import { GetAppInstances } from './jsonrpc/getAppInstances'; -import { UpdateAppInstance } from './jsonrpc/updateAppInstance'; -import { InstallAppComponent } from './install.component'; +import { Component, OnInit } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { ActivatedRoute, Router } from "@angular/router"; +import { FormlyFieldConfig } from "@ngx-formly/core"; +import { TranslateService } from "@ngx-translate/core"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { Edge, Service, Utils, Websocket } from "../../../shared/shared"; +import { InstallAppComponent } from "./install.component"; +import { DeleteAppInstance } from "./jsonrpc/deleteAppInstance"; +import { GetAppAssistant } from "./jsonrpc/getAppAssistant"; +import { GetAppInstances } from "./jsonrpc/getAppInstances"; +import { UpdateAppInstance } from "./jsonrpc/updateAppInstance"; interface MyInstance { instanceId: string, // uuid @@ -23,11 +23,11 @@ interface MyInstance { @Component({ selector: UpdateAppComponent.SELECTOR, - templateUrl: './update.component.html', + templateUrl: "./update.component.html", }) export class UpdateAppComponent implements OnInit { - private static readonly SELECTOR = 'app-update'; + private static readonly SELECTOR = "app-update"; public readonly spinnerId: string = UpdateAppComponent.SELECTOR; protected instances: MyInstance[] = []; @@ -48,19 +48,19 @@ export class UpdateAppComponent implements OnInit { public ngOnInit() { this.service.startSpinner(this.spinnerId); const appId = this.route.snapshot.params["appId"]; - const appName = this.route.snapshot.queryParams['name']; + const appName = this.route.snapshot.queryParams["name"]; this.service.setCurrentComponent(appName, this.route).then(edge => { this.edge = edge; edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_appManager', + componentId: "_appManager", payload: new GetAppInstances.Request({ appId: appId }), })).then(getInstancesResponse => { const recInstances = (getInstancesResponse as GetAppInstances.Response).result.instances; edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_appManager', + componentId: "_appManager", payload: new GetAppAssistant.Request({ appId: appId }), })).then(getAppAssistantResponse => { const appAssistant = (getAppAssistantResponse as GetAppAssistant.Response).result; @@ -69,7 +69,7 @@ export class UpdateAppComponent implements OnInit { for (const instance of recInstances) { const form = new FormGroup({}); const model = { - 'ALIAS': instance.alias, + "ALIAS": instance.alias, ...instance.properties, }; this.instances.push({ @@ -83,8 +83,8 @@ export class UpdateAppComponent implements OnInit { } this.service.stopSpinner(this.spinnerId); - }).catch(InstallAppComponent.errorToast(this.service, error => 'Error while receiving App Assistant for [' + appId + ']: ' + error)); - }).catch(InstallAppComponent.errorToast(this.service, error => 'Error while receiving App-Instances for [' + appId + ']: ' + error)); + }).catch(InstallAppComponent.errorToast(this.service, error => "Error while receiving App Assistant for [" + appId + "]: " + error)); + }).catch(InstallAppComponent.errorToast(this.service, error => "Error while receiving App-Instances for [" + appId + "]: " + error)); }); } @@ -92,17 +92,17 @@ export class UpdateAppComponent implements OnInit { this.service.startSpinnerTransparentBackground(instance.instanceId); instance.isUpdating = true; // remove alias field from properties - const alias = instance.form.value['ALIAS']; + const alias = instance.form.value["ALIAS"]; const clonedFields = {}; for (const item in instance.form.value) { - if (item != 'ALIAS') { + if (item != "ALIAS") { clonedFields[item] = instance.form.value[item]; } } instance.form.markAsPristine(); this.edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_appManager', + componentId: "_appManager", payload: new UpdateAppInstance.Request({ instanceId: instance.instanceId, alias: alias, @@ -112,14 +112,14 @@ export class UpdateAppComponent implements OnInit { const result = (response as UpdateAppInstance.Response).result; if (result.warnings && result.warnings.length > 0) { - this.service.toast(result.warnings.join(';'), 'warning'); + this.service.toast(result.warnings.join(";"), "warning"); } else { - this.service.toast(this.translate.instant('Edge.Config.App.successUpdate'), 'success'); + this.service.toast(this.translate.instant("Edge.Config.App.successUpdate"), "success"); } instance.properties = result.instance.properties; - instance.properties['ALIAS'] = result.instance.alias; + instance.properties["ALIAS"] = result.instance.alias; }) - .catch(InstallAppComponent.errorToast(this.service, error => this.translate.instant('Edge.Config.App.failUpdate', { error: error }))) + .catch(InstallAppComponent.errorToast(this.service, error => this.translate.instant("Edge.Config.App.failUpdate", { error: error }))) .finally(() => { instance.isUpdating = false; this.service.stopSpinner(instance.instanceId); @@ -131,16 +131,17 @@ export class UpdateAppComponent implements OnInit { instance.isDeleting = true; this.edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_appManager', + componentId: "_appManager", payload: new DeleteAppInstance.Request({ instanceId: instance.instanceId, }), })).then(response => { this.instances.splice(this.instances.indexOf(instance), 1); - this.service.toast(this.translate.instant('Edge.Config.App.successDelete'), 'success'); - this.router.navigate(['device/' + (this.edge.id) + '/settings/app/']); + this.service.toast(this.translate.instant("Edge.Config.App.successDelete"), "success"); + const navigationExtras = { state: { appInstanceChange: true } }; + this.router.navigate(["device/" + (this.edge.id) + "/settings/app/"], navigationExtras); }) - .catch(InstallAppComponent.errorToast(this.service, error => this.translate.instant('Edge.Config.App.failDelete', { error: error }))) + .catch(InstallAppComponent.errorToast(this.service, error => this.translate.instant("Edge.Config.App.failDelete", { error: error }))) .finally(() => { instance.isDeleting = false; this.service.stopSpinner(instance.instanceId); diff --git a/ui/src/app/edge/settings/channels/channels.component.html b/ui/src/app/edge/settings/channels/channels.component.html index 90d4834506c..ecef95c38f1 100644 --- a/ui/src/app/edge/settings/channels/channels.component.html +++ b/ui/src/app/edge/settings/channels/channels.component.html @@ -24,8 +24,7 @@ + [disabled]="!selectedComponentId?.value" [placeholder]="'CHANNELS.CHANNEL'| translate"> - + @@ -180,5 +179,22 @@ + + + + + + + + + + A component couldn't be found! + + + + + + + diff --git a/ui/src/app/edge/settings/channels/channels.component.ts b/ui/src/app/edge/settings/channels/channels.component.ts index 2cf0ec77779..36ea1f7911c 100644 --- a/ui/src/app/edge/settings/channels/channels.component.ts +++ b/ui/src/app/edge/settings/channels/channels.component.ts @@ -1,27 +1,29 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { PersistencePriority } from 'src/app/shared/components/edge/edgeconfig'; -import { SetChannelValueRequest } from 'src/app/shared/jsonrpc/request/setChannelValueRequest'; -import { environment } from 'src/environments'; - -import { ChannelAddress, Edge, EdgeConfig, EdgePermission, Service, Websocket } from '../../../shared/shared'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { Channel, GetChannelsOfComponentResponse } from 'src/app/shared/jsonrpc/response/getChannelsOfComponentResponse'; -import { GetChannelsOfComponentRequest } from 'src/app/shared/jsonrpc/request/getChannelsOfComponentRequest'; +import { Component } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { PersistencePriority } from "src/app/shared/components/edge/edgeconfig"; +import { SetChannelValueRequest } from "src/app/shared/jsonrpc/request/setChannelValueRequest"; +import { environment } from "src/environments"; + +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { GetChannelsOfComponentRequest } from "src/app/shared/jsonrpc/request/getChannelsOfComponentRequest"; +import { Channel, GetChannelsOfComponentResponse } from "src/app/shared/jsonrpc/response/getChannelsOfComponentResponse"; +import { ChannelAddress, Edge, EdgeConfig, EdgePermission, Service, Websocket } from "../../../shared/shared"; @Component({ selector: ChannelsComponent.SELECTOR, - templateUrl: './channels.component.html', + templateUrl: "./channels.component.html", }) export class ChannelsComponent { private static readonly SELECTOR = "channels"; private static readonly URL_PREFIX = "channels"; public customAlertOptions: any = { - cssClass: 'wide-alert', + cssClass: "wide-alert", }; + + protected isAtLeastOneChannelExistingInEdgeConfig: boolean = false; protected readonly spinnerId = ChannelsComponent.SELECTOR; protected readonly environment = environment; protected edge: Edge | null = null; @@ -40,20 +42,24 @@ export class ChannelsComponent { protected translate: TranslateService, ) { } + private static readonly ERROR_COMPONENT_COULD_NOT_BE_FOUND = (componentId: string) => `[ComponentId] ${componentId} doesn't exist on this edge`; + ionViewWillEnter() { - this.service.setCurrentComponent("Channels", this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; }); this.service.getConfig().then(config => { this.config = config; - this.persistencePriority = this.config.getComponentsByFactory("Controller.Api.Backend")?.[0]?.properties['persistencePriority'] ?? PersistencePriority.DEFAULT_GLOBAL_PRIORITY; + this.persistencePriority = this.config.getComponentsByFactory("Controller.Api.Backend")?.[0]?.properties["persistencePriority"] ?? PersistencePriority.DEFAULT_GLOBAL_PRIORITY; this.service.startSpinner(this.spinnerId); this.loadSavedChannels().then(message => { if (message) { - this.service.toast(message, 'success'); + this.service.toast(message, "success"); } }).catch(reason => { - this.service.toast(reason, 'danger'); + this.service.toast(reason, "danger"); + this.selectedComponentChannels = new Map(); + this.isAtLeastOneChannelExistingInEdgeConfig = true; }).finally(() => { this.service.stopSpinner(this.spinnerId); }); @@ -85,7 +91,7 @@ export class ChannelsComponent { const channelData = await this.getChannel(componentId, channelId); channelEntry.showPersistencePriority = PersistencePriority.isLessThan(channelData.persistencePriority, this.persistencePriority); - if (channelData.accessMode != 'WO') { + if (channelData.accessMode != "WO") { const channelAddress = new ChannelAddress(componentId, channelId); this.subscribedChannels.set(channelAddress.toString(), channelAddress); if (this.edge) { @@ -130,7 +136,7 @@ export class ChannelsComponent { ).then(() => { this.service.toast("Successfully set " + componentId + "/" + channelId + " to [" + channelValue + "]", "success"); }).catch(() => { - this.service.toast("Error setting " + componentId + "/" + channelId + " to [" + channelValue + "]", 'danger'); + this.service.toast("Error setting " + componentId + "/" + channelId + " to [" + channelValue + "]", "danger"); }); } } @@ -155,16 +161,17 @@ export class ChannelsComponent { this.loadChannelsAndStore(componentId).then(() => { // ignore }).catch(reason => { - this.service.toast('Unable to load channels for ' + componentId + ': ' + reason, 'danger'); + this.service.toast("Unable to load channels for " + componentId + ": " + reason, "danger"); }); } private saveChannelsInUrl(): void { const selectedChannels = this.getSelectedChannelStrings(); if (selectedChannels && selectedChannels.length > 0) { - this.router.navigate(['device/' + (this.edge.id) + '/settings/channels/'], { queryParams: { save: selectedChannels.toString() } }); + this.router.navigate(["device/" + (this.edge.id) + "/settings/channels/"], { queryParams: { save: selectedChannels.toString() } }); + this.isAtLeastOneChannelExistingInEdgeConfig = false; } else { - this.router.navigate(['device/' + (this.edge.id) + '/settings/channels/']); + this.router.navigate(["device/" + (this.edge.id) + "/settings/channels/"]); } } @@ -183,14 +190,21 @@ export class ChannelsComponent { } private async loadSavedChannels(): Promise { - const address = this.route.snapshot.queryParamMap.get('save'); + const address = this.route.snapshot.queryParamMap.get("save"); if (address) { - const channels = address.split(',')?.map(element => ChannelAddress.fromString(element)); + const channels = address.split(",")?.map(element => ChannelAddress.fromString(element)); try { + const existingComponents = channels.filter(el => el.componentId in this.config.components); + + if (existingComponents.length > 1) { + this.isAtLeastOneChannelExistingInEdgeConfig = true; + return "No component matches this edges components"; + } + await Promise.all(channels.map(el => this.subscribeChannel(el.componentId, el.channelId))); - return 'Successfully loaded saved channels from url'; + return "Successfully loaded saved channels from url"; } catch (reason) { - throw 'Some channels may not have been loaded from url: ' + reason; + throw "Some channels may not have been loaded from url: " + reason; } } @@ -199,14 +213,13 @@ export class ChannelsComponent { const savedData: ChannelAddress[] = JSON.parse(storedValue); try { await Promise.all(savedData.map(el => this.subscribeChannel(el.componentId, el.channelId))); - return 'Successfully loaded saved channels from session'; + return "Successfully loaded saved channels from session"; } catch (reason) { - throw 'Some channels may not have been loaded from session: ' + reason; + throw "Some channels may not have been loaded from session: " + reason; } } } - private getChannel(componentId: string, channelId: string): Promise { return new Promise((resolve, reject) => { // check if channels of component are already loaded @@ -216,7 +229,7 @@ export class ChannelsComponent { if (channel) { resolve(channel); } else { - reject(channelId + ' is not defined by component ' + componentId); + reject(channelId + " is not defined by component " + componentId); } return; } @@ -226,7 +239,7 @@ export class ChannelsComponent { if (channel) { resolve(channel); } else { - reject(channelId + ' is not defined by component ' + componentId); + reject(channelId + " is not defined by component " + componentId); } }).catch(reject); }); @@ -251,8 +264,15 @@ export class ChannelsComponent { return; } + if (!(componentId in this.config.components)) { + console.warn(ChannelsComponent.ERROR_COMPONENT_COULD_NOT_BE_FOUND(componentId)); + this.isAtLeastOneChannelExistingInEdgeConfig = true; + reject(); + return; + } + this.edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_componentManager', + componentId: "_componentManager", payload: new GetChannelsOfComponentRequest({ componentId: componentId }), })).then((response: GetChannelsOfComponentResponse) => { resolve(response.result.channels); diff --git a/ui/src/app/edge/settings/component/install/index.component.html b/ui/src/app/edge/settings/component/install/index.component.html index 4515acc6a17..c918b508485 100644 --- a/ui/src/app/edge/settings/component/install/index.component.html +++ b/ui/src/app/edge/settings/component/install/index.component.html @@ -24,4 +24,4 @@

{{ item.name }}

- \ No newline at end of file + diff --git a/ui/src/app/edge/settings/component/install/index.component.ts b/ui/src/app/edge/settings/component/install/index.component.ts index 05950505890..a31df0b6bf0 100644 --- a/ui/src/app/edge/settings/component/install/index.component.ts +++ b/ui/src/app/edge/settings/component/install/index.component.ts @@ -1,9 +1,9 @@ // @ts-strict-ignore -import { CategorizedFactories } from 'src/app/shared/components/edge/edgeconfig'; -import { Component, OnInit } from '@angular/core'; -import { Service, Utils, EdgeConfig, Websocket, Edge, EdgePermission } from '../../../../shared/shared'; -import { JsonrpcRequest, JsonrpcResponseSuccess } from 'src/app/shared/jsonrpc/base'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; +import { Component, OnInit } from "@angular/core"; +import { CategorizedFactories } from "src/app/shared/components/edge/edgeconfig"; +import { JsonrpcRequest, JsonrpcResponseSuccess } from "src/app/shared/jsonrpc/base"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { Edge, EdgeConfig, EdgePermission, Service, Utils, Websocket } from "../../../../shared/shared"; interface MyCategorizedFactories extends CategorizedFactories { isClicked?: boolean, @@ -12,7 +12,7 @@ interface MyCategorizedFactories extends CategorizedFactories { @Component({ selector: IndexComponent.SELECTOR, - templateUrl: './index.component.html', + templateUrl: "./index.component.html", }) export class IndexComponent implements OnInit { @@ -41,7 +41,7 @@ export class IndexComponent implements OnInit { updateFilter(completeFilter: string) { // take each space-separated string as an individual and-combined filter - const filters = completeFilter.toLowerCase().split(' '); + const filters = completeFilter.toLowerCase().split(" "); let countFilteredEntries = 0; for (const entry of this.list) { entry.filteredFactories = entry.factories.filter(entry => @@ -65,7 +65,7 @@ export class IndexComponent implements OnInit { private async getCategorizedFactories(): Promise { if (EdgePermission.hasReducedFactories(this.edge)) { const response = await this.edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_componentManager', + componentId: "_componentManager", payload: new GetAllComponentFactoriesRequest(), })); for (const [factoryId, factory] of Object.entries(response.result.factories)) { diff --git a/ui/src/app/edge/settings/component/install/install.component.html b/ui/src/app/edge/settings/component/install/install.component.html index f93712cddf2..ae3916b1def 100644 --- a/ui/src/app/edge/settings/component/install/install.component.html +++ b/ui/src/app/edge/settings/component/install/install.component.html @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/component/install/install.component.ts b/ui/src/app/edge/settings/component/install/install.component.ts index 360f2895de0..965ac7d874e 100644 --- a/ui/src/app/edge/settings/component/install/install.component.ts +++ b/ui/src/app/edge/settings/component/install/install.component.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { ActivatedRoute } from '@angular/router'; -import { Component, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { FormlyFieldConfig } from '@ngx-formly/core'; -import { Service, Utils, Websocket, EdgeConfig, Edge } from '../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { FormlyFieldConfig } from "@ngx-formly/core"; +import { Edge, EdgeConfig, Service, Utils, Websocket } from "../../../../shared/shared"; @Component({ selector: ComponentInstallComponent.SELECTOR, - templateUrl: './install.component.html', + templateUrl: "./install.component.html", }) export class ComponentInstallComponent implements OnInit { @@ -39,15 +39,15 @@ export class ComponentInstallComponent implements OnInit { const fields: FormlyFieldConfig[] = []; const model = {}; for (const property of properties) { - const property_id = property.id.replace('.', '_'); + const property_id = property.id.replace(".", "_"); let defaultValue = property.defaultValue; // if the type is an array and there is no defaultValue then set the defaultValue to an empty array - if (property.schema["type"] === 'repeat' && defaultValue === null) { + if (property.schema["type"] === "repeat" && defaultValue === null) { defaultValue = []; } const field: FormlyFieldConfig = { key: property_id, - type: 'input', + type: "input", templateOptions: { label: property.name, required: defaultValue === null, @@ -61,7 +61,7 @@ export class ComponentInstallComponent implements OnInit { model[property_id] = defaultValue; // Set the next free Component-ID as defaultValue - if (property_id == 'id' && property.schema["type"] !== 'repeat') { + if (property_id == "id" && property.schema["type"] !== "repeat") { const thisMatch = defaultValue.match(/^(.*)(\d+)$/); if (thisMatch) { const thisPrefix = thisMatch[1]; @@ -98,15 +98,15 @@ export class ComponentInstallComponent implements OnInit { // ignore 'null' values continue; } - const property_id = controlKey.replace('_', '.'); + const property_id = controlKey.replace("_", "."); properties.push({ name: property_id, value: control.value }); } this.edge.createComponentConfig(this.websocket, this.factoryId, properties).then(response => { this.form.markAsPristine(); - this.service.toast("Successfully created in instance of " + this.factoryId + ".", 'success'); + this.service.toast("Successfully created in instance of " + this.factoryId + ".", "success"); }).catch(reason => { - this.service.toast("Error creating an instance of " + this.factoryId + ":" + reason.error.message, 'danger'); + this.service.toast("Error creating an instance of " + this.factoryId + ":" + reason.error.message, "danger"); }); } diff --git a/ui/src/app/edge/settings/component/update/index.component.html b/ui/src/app/edge/settings/component/update/index.component.html index c4ebd8a90c5..30373db23e2 100644 --- a/ui/src/app/edge/settings/component/update/index.component.html +++ b/ui/src/app/edge/settings/component/update/index.component.html @@ -27,4 +27,4 @@

{{ item.alias }} - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/component/update/index.component.ts b/ui/src/app/edge/settings/component/update/index.component.ts index 05e6efe2b3f..d35810ed057 100644 --- a/ui/src/app/edge/settings/component/update/index.component.ts +++ b/ui/src/app/edge/settings/component/update/index.component.ts @@ -1,7 +1,7 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { CategorizedComponents } from 'src/app/shared/components/edge/edgeconfig'; -import { EdgeConfig, Service, Utils } from '../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { CategorizedComponents } from "src/app/shared/components/edge/edgeconfig"; +import { EdgeConfig, Service, Utils } from "../../../../shared/shared"; interface MyCategorizedComponents extends CategorizedComponents { isNatureClicked?: boolean, @@ -10,7 +10,7 @@ interface MyCategorizedComponents extends CategorizedComponents { @Component({ selector: IndexComponent.SELECTOR, - templateUrl: './index.component.html', + templateUrl: "./index.component.html", }) export class IndexComponent implements OnInit { @@ -41,7 +41,7 @@ export class IndexComponent implements OnInit { updateFilter(completeFilter: string) { // take each space-separated string as an individual and-combined filter - const filters = completeFilter.toLowerCase().split(' '); + const filters = completeFilter.toLowerCase().split(" "); let countFilteredEntries = 0; for (const entry of this.list) { entry.filteredComponents = entry.components.filter(entry => diff --git a/ui/src/app/edge/settings/component/update/update.component.html b/ui/src/app/edge/settings/component/update/update.component.html index 38297852e60..aeaee6f0114 100644 --- a/ui/src/app/edge/settings/component/update/update.component.html +++ b/ui/src/app/edge/settings/component/update/update.component.html @@ -31,4 +31,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/component/update/update.component.ts b/ui/src/app/edge/settings/component/update/update.component.ts index ff1f9201fcd..3c882e05473 100644 --- a/ui/src/app/edge/settings/component/update/update.component.ts +++ b/ui/src/app/edge/settings/component/update/update.component.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { ActivatedRoute } from '@angular/router'; -import { Component, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { FormlyFieldConfig } from '@ngx-formly/core'; -import { Service, Utils, Websocket, EdgeConfig, Edge } from '../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { FormlyFieldConfig } from "@ngx-formly/core"; +import { Edge, EdgeConfig, Service, Utils, Websocket } from "../../../../shared/shared"; @Component({ selector: ComponentUpdateComponent.SELECTOR, - templateUrl: './update.component.html', + templateUrl: "./update.component.html", }) export class ComponentUpdateComponent implements OnInit { @@ -44,13 +44,13 @@ export class ComponentUpdateComponent implements OnInit { this.factory = factory; for (const property of properties) { - if (property.id === 'id') { + if (property.id === "id") { continue; // ignore Component-ID } - const property_id = property.id.replace('.', '_'); + const property_id = property.id.replace(".", "_"); const field: FormlyFieldConfig = { key: property_id, - type: 'input', + type: "input", templateOptions: { label: property.name, description: property.description, @@ -63,7 +63,7 @@ export class ComponentUpdateComponent implements OnInit { if (component.properties[property.id]) { // filter arrays with nested objects - if (Array.isArray(component.properties[property.id]) && component.properties[property.id]?.length > 0 && component.properties[property.id]?.every(element => typeof element === 'object')) { + if (Array.isArray(component.properties[property.id]) && component.properties[property.id]?.length > 0 && component.properties[property.id]?.every(element => typeof element === "object")) { // Stringify json for objects nested inside an array model[property_id] = JSON.stringify(component.properties[property.id]); @@ -82,24 +82,24 @@ export class ComponentUpdateComponent implements OnInit { for (const controlKey in this.form.controls) { const control = this.form.controls[controlKey]; if (control.dirty) { - const property_id = controlKey.replace('_', '.'); + const property_id = controlKey.replace("_", "."); properties.push({ name: property_id, value: control.value }); } } this.edge.updateComponentConfig(this.websocket, this.componentId, properties).then(() => { this.form.markAsPristine(); - this.service.toast("Successfully updated " + this.componentId + ".", 'success'); + this.service.toast("Successfully updated " + this.componentId + ".", "success"); }).catch(reason => { - this.service.toast("Error updating " + this.componentId + ":" + reason.error.message, 'danger'); + this.service.toast("Error updating " + this.componentId + ":" + reason.error.message, "danger"); }); } public delete() { this.edge.deleteComponentConfig(this.websocket, this.componentId).then(() => { this.form.markAsPristine(); - this.service.toast("Successfully deleted " + this.componentId + ".", 'success'); + this.service.toast("Successfully deleted " + this.componentId + ".", "success"); }).catch(reason => { - this.service.toast("Error deleting " + this.componentId + ":" + reason.error.message, 'danger'); + this.service.toast("Error deleting " + this.componentId + ":" + reason.error.message, "danger"); }); } diff --git a/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.html b/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.html index d10ae978751..0468ec0c4d5 100644 --- a/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.html +++ b/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.html @@ -13,7 +13,7 @@ "{{item.key}}": , -
+
  @@ -25,7 +25,7 @@ + [ngTemplateOutletContext]="{value: value.elementType, indentation: indentation + 4}"> [] diff --git a/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.module.ts b/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.module.ts index f5d2946018f..863a01664e4 100644 --- a/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.module.ts +++ b/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.module.ts @@ -1,6 +1,6 @@ -import { NgModule } from '@angular/core'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { JsonrpcTestComponent } from './jsonrpctest'; +import { NgModule } from "@angular/core"; +import { SharedModule } from "src/app/shared/shared.module"; +import { JsonrpcTestComponent } from "./jsonrpctest"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.permission.ts b/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.permission.ts index 789e472d542..67edc0ee8a0 100644 --- a/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.permission.ts +++ b/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.permission.ts @@ -5,7 +5,7 @@ import { User } from "src/app/shared/jsonrpc/shared"; export namespace JsonrpcTestPermission { export function canSee(user: User, edge: Edge): boolean { - return true; + return true; } } diff --git a/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.ts b/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.ts index b604b231d24..8bab188a03f 100644 --- a/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.ts +++ b/ui/src/app/edge/settings/jsonrpctest/jsonrpctest.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { JsonrpcRequest } from 'src/app/shared/jsonrpc/base'; -import { Edge, Service, Websocket } from 'src/app/shared/shared'; -import { environment } from 'src/environments'; +import { Component, OnInit } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { JsonrpcRequest } from "src/app/shared/jsonrpc/base"; +import { Edge, Service, Websocket } from "src/app/shared/shared"; +import { environment } from "src/environments"; @Component({ selector: JsonrpcTestComponent.SELECTOR, - templateUrl: './jsonrpctest.html', + templateUrl: "./jsonrpctest.html", }) export class JsonrpcTestComponent implements OnInit { @@ -26,19 +26,19 @@ export class JsonrpcTestComponent implements OnInit { } public ngOnInit(): void { - this.service.setCurrentComponent('Jsonrpc Test', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; edge.sendRequest(this.websocket, new JsonrpcRequest("routes", {})).then(response => { - this.endpoints = (response.result['endpoints'] as EndpointResponse[]).map(endpoint => { + this.endpoints = (response.result["endpoints"] as EndpointResponse[]).map(endpoint => { return { method: endpoint.method, - description: endpoint.description ? endpoint.description.replace('\n', '
') : null, + description: endpoint.description ? endpoint.description.replace("\n", "
") : null, tags: endpoint.tags, guards: endpoint.guards, request: endpoint.request, // JSON.stringify(endpoint.request.json, null, 2), response: endpoint.response, parent: endpoint.parent, - requestMethod: 'raw', + requestMethod: "raw", form: new FormGroup({}), model: {}, modelRaw: JSON.stringify(createDummyRequest(endpoint.request.json), null, 2), @@ -46,7 +46,7 @@ export class JsonrpcTestComponent implements OnInit { }); }); }).catch(e => { - this.service.toast(e, 'danger'); + this.service.toast(e, "danger"); }); } @@ -64,8 +64,8 @@ export class JsonrpcTestComponent implements OnInit { ); for (let i = endpoint.parent.length - 1; i >= 0; i--) { const parent = endpoint.parent[i]; - if (environment.backend === 'OpenEMS Backend') { - if (parent.method === 'authenticatedRpc') { + if (environment.backend === "OpenEMS Backend") { + if (parent.method === "authenticatedRpc") { break; } } @@ -88,7 +88,7 @@ export class JsonrpcTestComponent implements OnInit { } - (environment.backend === 'OpenEMS Edge' + (environment.backend === "OpenEMS Edge" ? this.websocket.sendRequest(request) : this.edge.sendRequest(this.websocket, request)) .then(response => { @@ -108,15 +108,15 @@ function createDummyRequest(endpointType?: EndpointType) { return undefined; } switch (endpointType.type) { - case 'object': { + case "object": { const obj = {}; for (const [key, value] of Object.entries(endpointType.properties)) { obj[key] = createDummyRequest(value); } return obj; } - case 'string': { - return 'string'; + case "string": { + return "string"; } } } @@ -153,11 +153,11 @@ type RequestExample = { type EndpointType = { - type: 'object', + type: "object", properties: { [key: string]: EndpointType } } | { - type: 'string', + type: "string", constraints: string[] }; diff --git a/ui/src/app/edge/settings/network/network.component.ts b/ui/src/app/edge/settings/network/network.component.ts index 1d94213534d..99b9af92671 100644 --- a/ui/src/app/edge/settings/network/network.component.ts +++ b/ui/src/app/edge/settings/network/network.component.ts @@ -1,25 +1,25 @@ -import { Component, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { FormlyFieldConfig, FormlyForm } from '@ngx-formly/core'; -import { TranslateService } from '@ngx-translate/core'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { Role } from 'src/app/shared/type/role'; -import { Edge, Service, Websocket } from '../../../shared/shared'; -import { GetNetworkConfigRequest } from './getNetworkConfigRequest'; -import { GetNetworkConfigResponse } from './getNetworkConfigResponse'; -import { SetNetworkConfigRequest } from './setNetworkConfigRequest'; -import { InterfaceForm, InterfaceModel, IpAddress, NetworkConfig, NetworkInterface, NetworkUtils } from './shared'; +import { Component, OnInit } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { FormlyFieldConfig, FormlyForm } from "@ngx-formly/core"; +import { TranslateService } from "@ngx-translate/core"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { Role } from "src/app/shared/type/role"; +import { Edge, Service, Websocket } from "../../../shared/shared"; +import { GetNetworkConfigRequest } from "./getNetworkConfigRequest"; +import { GetNetworkConfigResponse } from "./getNetworkConfigResponse"; +import { SetNetworkConfigRequest } from "./setNetworkConfigRequest"; +import { InterfaceForm, InterfaceModel, IpAddress, NetworkConfig, NetworkInterface, NetworkUtils } from "./shared"; @Component({ selector: NetworkComponent.SELECTOR, - templateUrl: './network.component.html', + templateUrl: "./network.component.html", }) export class NetworkComponent implements OnInit { - private static readonly SELECTOR: string = 'network'; - private static readonly ETH_0: string = 'eth0'; - private static readonly STATIC_LABEL: string = 'static'; - private static readonly NO_LABEL: string = ''; + private static readonly SELECTOR: string = "network"; + private static readonly ETH_0: string = "eth0"; + private static readonly STATIC_LABEL: string = "static"; + private static readonly NO_LABEL: string = ""; public edge: Edge | null = null; protected forms: InterfaceForm[] = []; @@ -37,7 +37,7 @@ export class NetworkComponent implements OnInit { public submit(iface: InterfaceForm): void { if (!iface.formGroup.valid) { - this.service.toast(this.translate.instant('Edge.Network.mandatoryFields'), 'danger'); + this.service.toast(this.translate.instant("Edge.Network.mandatoryFields"), "danger"); return; } @@ -57,9 +57,9 @@ export class NetworkComponent implements OnInit { */ protected hideOrShowFields(form: FormlyForm): void { - const addressField: FormlyFieldConfig | undefined = form.fields.find(element => element.key == 'addressesList'); - const linkLocalAddressField: FormlyFieldConfig | undefined = form.fields.find(element => element.key == 'linkLocalAddressing'); - const metric: FormlyFieldConfig | undefined = form.fields.find(element => element.key == 'metric'); + const addressField: FormlyFieldConfig | undefined = form.fields.find(element => element.key == "addressesList"); + const linkLocalAddressField: FormlyFieldConfig | undefined = form.fields.find(element => element.key == "linkLocalAddressing"); + const metric: FormlyFieldConfig | undefined = form.fields.find(element => element.key == "metric"); const advancedMode: boolean = form.model.advancedMode; if (addressField) { addressField.hide = !advancedMode; } @@ -71,11 +71,11 @@ export class NetworkComponent implements OnInit { try { this.edge = await this.service.getCurrentEdge(); if (this.edge) { - const response: GetNetworkConfigResponse = await this.edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ componentId: '_host', payload: new GetNetworkConfigRequest() })) as GetNetworkConfigResponse; + const response: GetNetworkConfigResponse = await this.edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ componentId: "_host", payload: new GetNetworkConfigRequest() })) as GetNetworkConfigResponse; this.handleNetworkConfigResponse(response); } } catch (reason: any) { - this.service.toast(this.translate.instant('Edge.Network.errorReading') + reason?.error?.message ?? 'Unknown error', 'danger'); + this.service.toast(this.translate.instant("Edge.Network.errorReading") + reason?.error?.message ?? "Unknown error", "danger"); } } @@ -119,10 +119,10 @@ export class NetworkComponent implements OnInit { if (iface.model.addressesList) { for (const addr of iface.model.addressesList) { if (!this.ipRegex.test(addr)) { - this.service.toast(this.translate.instant('Edge.Network.validAddressWarning'), 'danger'); + this.service.toast(this.translate.instant("Edge.Network.validAddressWarning"), "danger"); return []; } - const [address, subnet] = addr.split('/'); + const [address, subnet] = addr.split("/"); const subnetmask = NetworkUtils.getSubnetmaskAsString(Number.parseInt(subnet)); addressJson.push({ @@ -182,12 +182,12 @@ export class NetworkComponent implements OnInit { private async sendRequest(interfaceName: string, request: NetworkConfig): Promise { try { await this.edge?.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_host', + componentId: "_host", payload: new SetNetworkConfigRequest(request), })); - this.service.toast(this.translate.instant('Edge.Network.successUpdate') + `[${interfaceName}].`, 'success'); + this.service.toast(this.translate.instant("Edge.Network.successUpdate") + `[${interfaceName}].`, "success"); } catch (reason: any) { - this.service.toast(this.translate.instant('Edge.Network.errorUpdating') + `[${interfaceName}].` + reason?.error?.message ?? 'Unknown error', 'danger'); + this.service.toast(this.translate.instant("Edge.Network.errorUpdating") + `[${interfaceName}].` + reason?.error?.message ?? "Unknown error", "danger"); } } @@ -211,7 +211,7 @@ export class NetworkComponent implements OnInit { } else { // Converts ip:"192.168.1.50" and subnetmask:"255.255.255.0" -> ["192.168.1.50/24"] const cidr: number = NetworkUtils.getCidrFromSubnetmask(address.subnetmask); - const ip: string = address.address.concat('/' + cidr.toString()); + const ip: string = address.address.concat("/" + cidr.toString()); addressArray.push(ip); } } @@ -238,100 +238,100 @@ export class NetworkComponent implements OnInit { private fillFields(addressArray: string[]): FormlyFieldConfig[] { const fields: FormlyFieldConfig[] = [ { - key: 'dhcp', - type: 'checkbox', + key: "dhcp", + type: "checkbox", defaultValue: true, templateOptions: { - label: 'DHCP', + label: "DHCP", }, }, { - hideExpression: 'model.dhcp', - key: 'ip', - type: 'input', + hideExpression: "model.dhcp", + key: "ip", + type: "input", resetOnHide: false, templateOptions: { - label: this.translate.instant('Edge.Network.ipAddress'), - placeholder: 'z.B. 192.168.0.50', + label: this.translate.instant("Edge.Network.ipAddress"), + placeholder: "z.B. 192.168.0.50", required: true, }, validators: { - validation: ['ip'], + validation: ["ip"], }, }, { - hideExpression: 'model.dhcp', - key: 'subnetmask', - type: 'input', + hideExpression: "model.dhcp", + key: "subnetmask", + type: "input", resetOnHide: false, templateOptions: { - label: this.translate.instant('Edge.Network.subnetmask'), - placeholder: 'z.B. 255.255.255.0', + label: this.translate.instant("Edge.Network.subnetmask"), + placeholder: "z.B. 255.255.255.0", required: true, }, validators: { - validation: ['subnetmask'], + validation: ["subnetmask"], }, }, { - hideExpression: 'model.dhcp', - key: 'gateway', - type: 'input', + hideExpression: "model.dhcp", + key: "gateway", + type: "input", resetOnHide: false, templateOptions: { - label: 'Gateway', - placeholder: 'z.B. 192.168.0.1', + label: "Gateway", + placeholder: "z.B. 192.168.0.1", required: true, }, validators: { - validation: ['ip'], + validation: ["ip"], }, }, { - hideExpression: 'model.dhcp', - key: 'dns', - type: 'input', + hideExpression: "model.dhcp", + key: "dns", + type: "input", resetOnHide: false, templateOptions: { - label: 'DNS-Server', - placeholder: 'z.B. 192.168.0.1', + label: "DNS-Server", + placeholder: "z.B. 192.168.0.1", required: true, }, validators: { - validation: ['ip'], + validation: ["ip"], }, }, { - key: 'linkLocalAddressing', - type: 'checkbox', + key: "linkLocalAddressing", + type: "checkbox", resetOnHide: false, templateOptions: { - label: 'Link-Local Address (z. B. 169.254.XXX.XXX)', + label: "Link-Local Address (z. B. 169.254.XXX.XXX)", }, hide: true, }, { hide: true, - key: 'addressesList', - type: 'repeat', + key: "addressesList", + type: "repeat", resetOnHide: false, defaultValue: addressArray, templateOptions: { - label: this.translate.instant('Edge.Network.addIP'), + label: this.translate.instant("Edge.Network.addIP"), }, fieldArray: { - type: 'input', + type: "input", resetOnHide: false, }, }, { hide: true, - key: 'metric', - type: 'input', + key: "metric", + type: "input", resetOnHide: false, templateOptions: { - label: 'Metric', - placeholder: 'z.B. 512, 1024 ...', + label: "Metric", + placeholder: "z.B. 512, 1024 ...", }, defaultValue: 1024, parsers: [Number], diff --git a/ui/src/app/edge/settings/network/setNetworkConfigRequest.ts b/ui/src/app/edge/settings/network/setNetworkConfigRequest.ts index 71d4d613978..1d8f361de36 100644 --- a/ui/src/app/edge/settings/network/setNetworkConfigRequest.ts +++ b/ui/src/app/edge/settings/network/setNetworkConfigRequest.ts @@ -1,5 +1,5 @@ import { JsonrpcRequest } from "../../../shared/jsonrpc/base"; -import { NetworkConfig } from './shared'; +import { NetworkConfig } from "./shared"; /** * Represents a JSON-RPC Request for 'setNetworkConfig': Updates the current network configuration. diff --git a/ui/src/app/edge/settings/network/shared.ts b/ui/src/app/edge/settings/network/shared.ts index 911c82bc03b..059514e8ebc 100644 --- a/ui/src/app/edge/settings/network/shared.ts +++ b/ui/src/app/edge/settings/network/shared.ts @@ -56,7 +56,7 @@ export namespace NetworkUtils { octets.push(256 - Math.pow(2, 8 - bits)); cidr -= bits; } - return octets.join('.'); + return octets.join("."); } /** @@ -73,12 +73,12 @@ export namespace NetworkUtils { export function getCidrFromSubnetmask(subnetmask: string): number { // Split the subnet mask into its octets, convert them to binary, and join the binary strings const binaryString = subnetmask - .split('.') + .split(".") .map(Number) - .map(part => (part >>> 0).toString(2).padStart(8, '0')) // Ensure each part is represented as 8 bits - .join(''); + .map(part => (part >>> 0).toString(2).padStart(8, "0")) // Ensure each part is represented as 8 bits + .join(""); // return the number of '1's in the binary string to get the CIDR notation - return binaryString.split('1').length - 1; + return binaryString.split("1").length - 1; } } diff --git a/ui/src/app/edge/settings/powerassistant/powerassistant.ts b/ui/src/app/edge/settings/powerassistant/powerassistant.ts index 1cdedeeefe6..4dcc5708141 100644 --- a/ui/src/app/edge/settings/powerassistant/powerassistant.ts +++ b/ui/src/app/edge/settings/powerassistant/powerassistant.ts @@ -1,11 +1,10 @@ // @ts-strict-ignore -import { Component } from '@angular/core'; - -import { formatNumber } from '@angular/common'; -import { ChannelAddress, CurrentData, EdgeConfig, Utils } from '../../../shared/shared'; -import { LiveDataService } from '../../live/livedataservice'; -import { AbstractFlatWidget } from 'src/app/shared/components/flat/abstract-flat-widget'; -import { DataService } from 'src/app/shared/components/shared/dataservice'; +import { formatNumber } from "@angular/common"; +import { Component } from "@angular/core"; +import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget"; +import { DataService } from "src/app/shared/components/shared/dataservice"; +import { ChannelAddress, CurrentData, EdgeConfig, Utils } from "../../../shared/shared"; +import { LiveDataService } from "../../live/livedataservice"; type Channel = { title: string, @@ -29,8 +28,8 @@ type Entry = { }; @Component({ - selector: 'powerassistant', - templateUrl: './powerassistant.html', + selector: "powerassistant", + templateUrl: "./powerassistant.html", providers: [{ useClass: LiveDataService, provide: DataService, @@ -98,7 +97,7 @@ export class PowerAssistantComponent extends AbstractFlatWidget { if (ess.factoryId === "Ess.Generic.ManagedSymmetric") { // Create optional Battery Component const battery = this.config.components[ess.properties["battery.id"]]; - result['battery'] = { + result["battery"] = { id: battery.id, alias: battery.alias, factoryId: battery.factoryId, @@ -129,7 +128,7 @@ export class PowerAssistantComponent extends AbstractFlatWidget { }; // Create optional Battery-Inverter Component const batteryInverter = this.config.components[ess.properties["batteryInverter.id"]]; - result['batteryInverter'] = { + result["batteryInverter"] = { id: batteryInverter.id, alias: batteryInverter.alias, factoryId: batteryInverter.factoryId, @@ -223,9 +222,9 @@ export namespace Converter { export function unit(unit: string): (value: any) => string { return function (value: any): string { if (value == null) { - return '-'; + return "-"; } else if (value >= 0) { - return formatNumber(value, 'de', '1.0-0') + ' ' + unit; + return formatNumber(value, "de", "1.0-0") + " " + unit; } }; } @@ -233,7 +232,7 @@ export namespace Converter { export function enabled(): (value: any) => string { return function (value: any): string { if (value == null) { - return '-'; + return "-"; } else if (value == 1) { return "Enabled"; } else { diff --git a/ui/src/app/edge/settings/profile/aliasupdate.component.html b/ui/src/app/edge/settings/profile/aliasupdate.component.html index 9daf445a05b..1e63df550f6 100644 --- a/ui/src/app/edge/settings/profile/aliasupdate.component.html +++ b/ui/src/app/edge/settings/profile/aliasupdate.component.html @@ -37,4 +37,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/profile/aliasupdate.component.ts b/ui/src/app/edge/settings/profile/aliasupdate.component.ts index 528d653b9da..d0b91e080ca 100644 --- a/ui/src/app/edge/settings/profile/aliasupdate.component.ts +++ b/ui/src/app/edge/settings/profile/aliasupdate.component.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, EdgeConfig, Service, Websocket } from "src/app/shared/shared"; @Component({ - selector: 'aliasupdate', - templateUrl: './aliasupdate.component.html', + selector: "aliasupdate", + templateUrl: "./aliasupdate.component.html", }) export class AliasUpdateComponent implements OnInit { @@ -28,7 +28,7 @@ export class AliasUpdateComponent implements OnInit { ) { } ngOnInit() { - this.service.setCurrentComponent({ languageKey: 'Edge.Config.Index.renameComponents' }, this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; }); this.service.getConfig().then(config => { @@ -46,16 +46,16 @@ export class AliasUpdateComponent implements OnInit { const newAlias = alias; if (this.edge != null) { if (this.component.id == newAlias) { - this.service.toast(this.translate.instant('General.inputNotValid'), 'danger'); + this.service.toast(this.translate.instant("General.inputNotValid"), "danger"); } else { this.edge.updateComponentConfig(this.websocket, this.component.id, [ - { name: 'alias', value: newAlias }, + { name: "alias", value: newAlias }, ]).then(() => { this.formGroup.markAsPristine(); - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { this.formGroup.markAsPristine(); - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); console.warn(reason); }); } diff --git a/ui/src/app/edge/settings/profile/channelexport/channelExportXlsxRequest.ts b/ui/src/app/edge/settings/profile/channelexport/channelExportXlsxRequest.ts index 215dfa96925..90475f77f87 100644 --- a/ui/src/app/edge/settings/profile/channelexport/channelExportXlsxRequest.ts +++ b/ui/src/app/edge/settings/profile/channelexport/channelExportXlsxRequest.ts @@ -1,4 +1,4 @@ -import { JsonrpcRequest } from '../../../../shared/jsonrpc/base'; +import { JsonrpcRequest } from "../../../../shared/jsonrpc/base"; /** * Exports Channels with current value and metadata to an Excel (xlsx) file. diff --git a/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolExportXlsxRequest.ts b/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolExportXlsxRequest.ts index c67d1cafc52..3c691621f86 100644 --- a/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolExportXlsxRequest.ts +++ b/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolExportXlsxRequest.ts @@ -1,4 +1,4 @@ -import { JsonrpcRequest } from '../../../../shared/jsonrpc/base'; +import { JsonrpcRequest } from "../../../../shared/jsonrpc/base"; /** * Wraps a JSON-RPC Request to query the Modbus Protocol from Modbus/TCP diff --git a/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolRequest.ts b/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolRequest.ts index b0dbbcc8cdf..bab6ea90dc1 100644 --- a/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolRequest.ts +++ b/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolRequest.ts @@ -1,4 +1,4 @@ -import { JsonrpcRequest } from '../../../../shared/jsonrpc/base'; +import { JsonrpcRequest } from "../../../../shared/jsonrpc/base"; /** * Wraps a JSON-RPC Request to query the Modbus Protocol from Modbus/TCP diff --git a/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolResponse.ts b/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolResponse.ts index cc25ca0bbb9..56cea28bb6b 100644 --- a/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolResponse.ts +++ b/ui/src/app/edge/settings/profile/modbusapi/getModbusProtocolResponse.ts @@ -1,4 +1,4 @@ -import { JsonrpcResponseSuccess } from '../../../../shared/jsonrpc/base'; +import { JsonrpcResponseSuccess } from "../../../../shared/jsonrpc/base"; /** * Wraps a JSON-RPC Response to "getModbusProtocol" Request diff --git a/ui/src/app/edge/settings/profile/profile.component.ts b/ui/src/app/edge/settings/profile/profile.component.ts index a6ca6b3a0f5..f33d018f26a 100644 --- a/ui/src/app/edge/settings/profile/profile.component.ts +++ b/ui/src/app/edge/settings/profile/profile.component.ts @@ -1,19 +1,19 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { PopoverController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { CategorizedComponents } from 'src/app/shared/components/edge/edgeconfig'; -import { JsonrpcResponseError } from 'src/app/shared/jsonrpc/base'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { Base64PayloadResponse } from 'src/app/shared/jsonrpc/response/base64PayloadResponse'; -import { environment } from '../../../../environments'; -import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from '../../../shared/shared'; -import { ChannelExportXlsxRequest } from './channelexport/channelExportXlsxRequest'; -import { GetModbusProtocolExportXlsxRequest } from './modbusapi/getModbusProtocolExportXlsxRequest'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { PopoverController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { CategorizedComponents } from "src/app/shared/components/edge/edgeconfig"; +import { JsonrpcResponseError } from "src/app/shared/jsonrpc/base"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { Base64PayloadResponse } from "src/app/shared/jsonrpc/response/base64PayloadResponse"; +import { environment } from "../../../../environments"; +import { ChannelAddress, Edge, EdgeConfig, Service, Utils } from "../../../shared/shared"; +import { ChannelExportXlsxRequest } from "./channelexport/channelExportXlsxRequest"; +import { GetModbusProtocolExportXlsxRequest } from "./modbusapi/getModbusProtocolExportXlsxRequest"; @Component({ selector: ProfileComponent.SELECTOR, - templateUrl: './profile.component.html', + templateUrl: "./profile.component.html", }) export class ProfileComponent implements OnInit { @@ -35,7 +35,7 @@ export class ProfileComponent implements OnInit { ) { } public ngOnInit() { - this.service.setCurrentComponent({ languageKey: 'Edge.Config.Index.systemProfile' }, this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.service.getConfig().then(config => { this.config = config; @@ -51,14 +51,14 @@ export class ProfileComponent implements OnInit { edge.sendRequest(this.service.websocket, request).then(response => { Utils.downloadXlsx(response as Base64PayloadResponse, "Modbus-TCP-" + edge.id); }).catch(reason => { - this.service.toast(this.translate.instant('Edge.Config.PROFILE.ERROR_DOWNLOADING_MODBUS_PROTOCOL') + ": " + (reason as JsonrpcResponseError).error.message, 'danger'); + this.service.toast(this.translate.instant("Edge.Config.PROFILE.ERROR_DOWNLOADING_MODBUS_PROTOCOL") + ": " + (reason as JsonrpcResponseError).error.message, "danger"); }); }); } public getChannelExport(componentId: string) { this.service.getCurrentEdge().then(edge => { - const request = new ComponentJsonApiRequest({ componentId: '_componentManager', payload: new ChannelExportXlsxRequest({ componentId: componentId }) }); + const request = new ComponentJsonApiRequest({ componentId: "_componentManager", payload: new ChannelExportXlsxRequest({ componentId: componentId }) }); edge.sendRequest(this.service.websocket, request).then(response => { Utils.downloadXlsx(response as Base64PayloadResponse, "ChannelExport-" + edge.id + "-" + componentId); }).catch(reason => { diff --git a/ui/src/app/edge/settings/settings.component.html b/ui/src/app/edge/settings/settings.component.html index a08457cce91..abfdf9a2a04 100644 --- a/ui/src/app/edge/settings/settings.component.html +++ b/ui/src/app/edge/settings/settings.component.html @@ -103,7 +103,8 @@ Edge.Config.Index.adjustComponents - + @@ -117,7 +118,8 @@ Edge.Config.Index.addComponents - + @@ -146,7 +148,8 @@ Power Assistant - + diff --git a/ui/src/app/edge/settings/settings.component.ts b/ui/src/app/edge/settings/settings.component.ts index 3caf8138939..8c667833490 100644 --- a/ui/src/app/edge/settings/settings.component.ts +++ b/ui/src/app/edge/settings/settings.component.ts @@ -1,12 +1,13 @@ -import { Component, OnInit } from '@angular/core'; -import { Role } from 'src/app/shared/type/role'; -import { environment } from 'src/environments'; -import { Edge, Service, Utils } from '../../shared/shared'; -import { JsonrpcTestPermission } from './jsonrpctest/jsonrpctest.permission'; +import { Component, OnInit } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { Role } from "src/app/shared/type/role"; +import { environment } from "src/environments"; +import { Edge, Service, Utils } from "../../shared/shared"; +import { JsonrpcTestPermission } from "./jsonrpctest/jsonrpctest.permission"; @Component({ - selector: 'settings', - templateUrl: './settings.component.html', + selector: "settings", + templateUrl: "./settings.component.html", }) export class SettingsComponent implements OnInit { @@ -18,11 +19,12 @@ export class SettingsComponent implements OnInit { public isAtLeastAdmin: boolean = false; public canSeeJsonrpcTest: boolean = false; - protected isEdgeBackend: boolean = environment.backend === 'OpenEMS Edge'; + protected isEdgeBackend: boolean = environment.backend === "OpenEMS Edge"; constructor( protected utils: Utils, private service: Service, + private translate: TranslateService, ) { } diff --git a/ui/src/app/edge/settings/settings.module.ts b/ui/src/app/edge/settings/settings.module.ts index a04474e871e..3e12f05e109 100644 --- a/ui/src/app/edge/settings/settings.module.ts +++ b/ui/src/app/edge/settings/settings.module.ts @@ -1,24 +1,24 @@ -import { NgModule } from '@angular/core'; -import { ChangelogModule } from 'src/app/changelog/changelog.module'; +import { NgModule } from "@angular/core"; +import { ChangelogModule } from "src/app/changelog/changelog.module"; -import { SharedModule } from './../../shared/shared.module'; -import { AlertingComponent } from './alerting/alerting.component'; -import { AppModule } from './app/app.module'; -import { ChannelsComponent } from './channels/channels.component'; -import { IndexComponent as ComponentInstallIndexComponent } from './component/install/index.component'; -import { ComponentInstallComponent } from './component/install/install.component'; -import { IndexComponent as ComponentUpdateIndexComponent } from './component/update/index.component'; -import { ComponentUpdateComponent } from './component/update/update.component'; -import { JsonrpcTestComponent } from './jsonrpctest/jsonrpctest'; -import { NetworkComponent } from './network/network.component'; -import { PowerAssistantModule } from './powerassistant/powerassistant.module'; -import { AliasUpdateComponent } from './profile/aliasupdate.component'; -import { ProfileComponent } from './profile/profile.component'; -import { SettingsComponent } from './settings.component'; -import { MaintenanceComponent } from './system/maintenance/maintenance'; -import { OeSystemUpdateComponent } from './system/oe-system-update.component'; -import { SystemComponent } from './system/system.component'; -import { SystemExecuteComponent } from './systemexecute/systemexecute.component'; +import { SharedModule } from "./../../shared/shared.module"; +import { AlertingComponent } from "./alerting/alerting.component"; +import { AppModule } from "./app/app.module"; +import { ChannelsComponent } from "./channels/channels.component"; +import { IndexComponent as ComponentInstallIndexComponent } from "./component/install/index.component"; +import { ComponentInstallComponent } from "./component/install/install.component"; +import { IndexComponent as ComponentUpdateIndexComponent } from "./component/update/index.component"; +import { ComponentUpdateComponent } from "./component/update/update.component"; +import { JsonrpcTestComponent } from "./jsonrpctest/jsonrpctest"; +import { NetworkComponent } from "./network/network.component"; +import { PowerAssistantModule } from "./powerassistant/powerassistant.module"; +import { AliasUpdateComponent } from "./profile/aliasupdate.component"; +import { ProfileComponent } from "./profile/profile.component"; +import { SettingsComponent } from "./settings.component"; +import { MaintenanceComponent } from "./system/maintenance/maintenance"; +import { OeSystemUpdateComponent } from "./system/oe-system-update.component"; +import { SystemComponent } from "./system/system.component"; +import { SystemExecuteComponent } from "./systemexecute/systemexecute.component"; @NgModule({ imports: [ diff --git a/ui/src/app/edge/settings/settings.spec.ts b/ui/src/app/edge/settings/settings.spec.ts index da8089ca1c9..e53b68e6ec4 100644 --- a/ui/src/app/edge/settings/settings.spec.ts +++ b/ui/src/app/edge/settings/settings.spec.ts @@ -1,32 +1,51 @@ // @ts-strict-ignore +import { registerLocaleData } from "@angular/common"; +import localDE from "@angular/common/locales/de"; +import localeDeExtra from "@angular/common/locales/extra/de"; +import { LOCALE_ID } from "@angular/core"; import { TestBed } from "@angular/core/testing"; +import { FORMLY_CONFIG } from "@ngx-formly/core"; +import { TranslateLoader, TranslateModule, TranslateService } from "@ngx-translate/core"; +import { BehaviorSubject } from "rxjs"; import { DummyConfig } from "src/app/shared/components/edge/edgeconfig.spec"; import { Service, Utils } from "src/app/shared/shared"; -import { Language } from "src/app/shared/type/language"; +import { Language, MyTranslateLoader } from "src/app/shared/type/language"; import { Role } from "src/app/shared/type/role"; +import { registerTranslateExtension } from "./app/app.module"; import { SettingsComponent } from "./settings.component"; -import { BehaviorSubject } from "rxjs"; - -describe('Edge', () => { - const serviceSypObject = jasmine.createSpyObj('Service', ['getCurrentEdge'], { +describe("Edge", () => { + const serviceSypObject = jasmine.createSpyObj("Service", ["getCurrentEdge"], { metadata: new BehaviorSubject({ edges: null, - user: { globalRole: 'admin', hasMultipleEdges: true, id: '', language: Language.DE.key, name: 'test.user', settings: {} }, + user: { globalRole: "admin", hasMultipleEdges: true, id: "", language: Language.DE.key, name: "test.user", settings: {} }, }), }); - beforeEach(() => { - TestBed.configureTestingModule({ + let settingsComponent: SettingsComponent; + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: MyTranslateLoader }, defaultLanguage: Language.DEFAULT.key, useDefaultLang: false }), + ], providers: [ + TranslateService, + { provide: FORMLY_CONFIG, multi: true, useFactory: registerTranslateExtension, deps: [TranslateService] }, + { provide: LOCALE_ID, useValue: Language.DEFAULT.key }, { provide: Service, useValue: serviceSypObject }, Utils, ], + }).compileComponents().then(() => { + const translateService = TestBed.inject(TranslateService); + translateService.addLangs(["de"]); + translateService.use("de"); + registerLocaleData(localDE, "de", localeDeExtra); + settingsComponent = new SettingsComponent(Utils, serviceSypObject, translateService); }); + }); - const settingsComponent = new SettingsComponent(Utils, serviceSypObject); - it('+ngOnInit - Role.ADMIN', async () => { + it("+ngOnInit - Role.ADMIN", async () => { const result = await expectNgOnInit(serviceSypObject, Role.ADMIN, settingsComponent); expect(result).toEqual({ isAtLeastOwner: true, @@ -34,7 +53,7 @@ describe('Edge', () => { isAtLeastAdmin: true, }); }); - it('+ngOnInit - Role.INSTALLER', async () => { + it("+ngOnInit - Role.INSTALLER", async () => { const result = await expectNgOnInit(serviceSypObject, Role.INSTALLER, settingsComponent); expect(result).toEqual({ isAtLeastOwner: true, @@ -42,7 +61,7 @@ describe('Edge', () => { isAtLeastAdmin: false, }); }); - it('+ngOnInit - Role.OWNER', async () => { + it("+ngOnInit - Role.OWNER", async () => { const result = await expectNgOnInit(serviceSypObject, Role.OWNER, settingsComponent); expect(result).toEqual({ isAtLeastOwner: true, @@ -50,16 +69,14 @@ describe('Edge', () => { isAtLeastAdmin: false, }); }); - }); - export async function expectNgOnInit(serviceSypObject: jasmine.SpyObj, edgeRole: Role, settingsComponent: SettingsComponent): Promise<{ isAtLeastOwner: boolean; isAtLeastInstaller: boolean; isAtLeastAdmin: boolean; }> { const edge = DummyConfig.dummyEdge({ role: edgeRole }); serviceSypObject.getCurrentEdge.and.resolveTo(edge); serviceSypObject.metadata.next({ edges: { [edge.id]: edge }, - user: { globalRole: 'admin', hasMultipleEdges: true, id: '', language: Language.DE.key, name: 'test.user', settings: {} }, + user: { globalRole: "admin", hasMultipleEdges: true, id: "", language: Language.DE.key, name: "test.user", settings: {} }, }); await settingsComponent.ngOnInit(); return { diff --git a/ui/src/app/edge/settings/system/executeSystemUpdate.ts b/ui/src/app/edge/settings/system/executeSystemUpdate.ts index 6bb7f6b8c2e..8ad1732c5bd 100644 --- a/ui/src/app/edge/settings/system/executeSystemUpdate.ts +++ b/ui/src/app/edge/settings/system/executeSystemUpdate.ts @@ -5,8 +5,8 @@ import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componen import { Edge, Websocket } from "src/app/shared/shared"; import { environment } from "src/environments"; import { ExecuteSystemUpdateRequest } from "./executeSystemUpdateRequest"; -import { GetSystemUpdateStateResponse, SystemUpdateState } from "./getSystemUpdateStateResponse"; import { GetSystemUpdateStateRequest } from "./getSystemUpdateStateRequest"; +import { GetSystemUpdateStateResponse, SystemUpdateState } from "./getSystemUpdateStateResponse"; export class ExecuteSystemUpdate { diff --git a/ui/src/app/edge/settings/system/executesystemupdate.component.html b/ui/src/app/edge/settings/system/executesystemupdate.component.html index a2e0205fe5d..53281fa214c 100644 --- a/ui/src/app/edge/settings/system/executesystemupdate.component.html +++ b/ui/src/app/edge/settings/system/executesystemupdate.component.html @@ -118,4 +118,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/system/executesystemupdate.component.ts b/ui/src/app/edge/settings/system/executesystemupdate.component.ts index 7aed9eef8b7..badb135f909 100644 --- a/ui/src/app/edge/settings/system/executesystemupdate.component.ts +++ b/ui/src/app/edge/settings/system/executesystemupdate.component.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; -import { Edge, Service, Websocket } from 'src/app/shared/shared'; -import { environment } from 'src/environments'; -import { ExecuteSystemUpdate } from './executeSystemUpdate'; -import { SystemUpdateState } from './getSystemUpdateStateResponse'; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; +import { Edge, Service, Websocket } from "src/app/shared/shared"; +import { environment } from "src/environments"; +import { ExecuteSystemUpdate } from "./executeSystemUpdate"; +import { SystemUpdateState } from "./getSystemUpdateStateResponse"; @Component({ selector: ExecuteSystemUpdateComponent.SELECTOR, - templateUrl: './executesystemupdate.component.html', + templateUrl: "./executesystemupdate.component.html", }) export class ExecuteSystemUpdateComponent implements OnInit, OnDestroy { diff --git a/ui/src/app/edge/settings/system/maintenance/maintenance.ts b/ui/src/app/edge/settings/system/maintenance/maintenance.ts index 6964d2461ec..cda8f1e81d6 100644 --- a/ui/src/app/edge/settings/system/maintenance/maintenance.ts +++ b/ui/src/app/edge/settings/system/maintenance/maintenance.ts @@ -1,15 +1,15 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { AlertController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { BehaviorSubject, Subscription } from 'rxjs'; -import { skip } from 'rxjs/operators'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { ExecuteSystemRestartRequest, Type } from 'src/app/shared/jsonrpc/request/executeSystemRestartRequest'; -import { Role } from 'src/app/shared/type/role'; -import { environment } from 'src/environments'; - -import { Edge, presentAlert, Service, Utils, Websocket } from '../../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { AlertController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { BehaviorSubject, Subscription } from "rxjs"; +import { skip } from "rxjs/operators"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { ExecuteSystemRestartRequest, Type } from "src/app/shared/jsonrpc/request/executeSystemRestartRequest"; +import { Role } from "src/app/shared/type/role"; +import { environment } from "src/environments"; + +import { Edge, presentAlert, Service, Utils, Websocket } from "../../../../shared/shared"; enum SystemRestartState { INITIAL, // No restart @@ -20,10 +20,10 @@ enum SystemRestartState { @Component({ selector: MaintenanceComponent.SELECTOR, - templateUrl: './maintenance.html', + templateUrl: "./maintenance.html", styles: [` :host { - ion-card: { + :is(ion-card) { cursor: auto !important;; } } @@ -31,16 +31,16 @@ enum SystemRestartState { }) export class MaintenanceComponent implements OnInit { - private static readonly SELECTOR: string = 'oe-maintenance'; + private static readonly SELECTOR: string = "oe-maintenance"; private static readonly TIMEOUT: number = 3000; protected readonly environment = environment; protected edge: Edge | null = null; - protected options: { key: string, message: string, color: 'success' | 'warning' | null, info: string, roleIsAtLeast: Role, button: { disabled: boolean, label: string, callback: () => void } }[] = [ + protected options: { key: string, message: string, color: "success" | "warning" | null, info: string, roleIsAtLeast: Role, button: { disabled: boolean, label: string, callback: () => void } }[] = [ { - key: Type.HARD, message: null, color: null, info: this.translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_WARNING', { system: environment.edgeShortName }), roleIsAtLeast: Role.OWNER, button: { - callback: () => this.confirmationAlert(Type.HARD), disabled: false, label: this.translate.instant('SETTINGS.SYSTEM_UPDATE.EMS_RESTARTING', { edgeShortName: environment.edgeShortName }), + key: Type.HARD, message: null, color: null, info: this.translate.instant("SETTINGS.SYSTEM_UPDATE.RESTART_WARNING", { system: environment.edgeShortName }), roleIsAtLeast: Role.OWNER, button: { + callback: () => this.confirmationAlert(Type.HARD), disabled: false, label: this.translate.instant("SETTINGS.SYSTEM_UPDATE.EMS_RESTARTING", { edgeShortName: environment.edgeShortName }), }, }, ]; @@ -62,19 +62,19 @@ export class MaintenanceComponent implements OnInit { */ async presentAlert(type: Type) { const translate = this.translate; - const system = type === Type.HARD ? environment.edgeShortName : 'OpenEMS'; + const system = type === Type.HARD ? environment.edgeShortName : "OpenEMS"; const alert = this.alertCtrl.create({ - subHeader: translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_CONFIRMATION', { system: system }), - message: translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_WARNING', { system: system }), + subHeader: translate.instant("SETTINGS.SYSTEM_UPDATE.RESTART_CONFIRMATION", { system: system }), + message: translate.instant("SETTINGS.SYSTEM_UPDATE.RESTART_WARNING", { system: system }), buttons: [{ - text: translate.instant('General.cancel'), - role: 'cancel', + text: translate.instant("General.cancel"), + role: "cancel", }, { - text: translate.instant('General.RESTART'), + text: translate.instant("General.RESTART"), handler: () => this.execRestart(type), }], - cssClass: 'alertController', + cssClass: "alertController", }); (await alert).present(); } @@ -98,10 +98,10 @@ export class MaintenanceComponent implements OnInit { } protected confirmationAlert: (type: Type) => void = (type: Type) => presentAlert(this.alertCtrl, this.translate, { - message: this.translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_WARNING', { system: environment.edgeShortName }), - subHeader: this.translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_CONFIRMATION', { system: environment.edgeShortName }), + message: this.translate.instant("SETTINGS.SYSTEM_UPDATE.RESTART_WARNING", { system: environment.edgeShortName }), + subHeader: this.translate.instant("SETTINGS.SYSTEM_UPDATE.RESTART_CONFIRMATION", { system: environment.edgeShortName }), buttons: [{ - text: this.translate.instant('General.RESTART'), + text: this.translate.instant("General.RESTART"), handler: () => this.execRestart(type), }], }); @@ -115,13 +115,13 @@ export class MaintenanceComponent implements OnInit { let message: string | null = null; let disableButtons: boolean = false; let showInfo: boolean = false; - let color: 'warning' | 'success' | null = null; - const system = type === Type.HARD ? environment.edgeShortName : this.translate.instant('General.SYSTEM'); + let color: "warning" | "success" | null = null; + const system = type === Type.HARD ? environment.edgeShortName : this.translate.instant("General.SYSTEM"); switch (this.systemRestartState?.value?.state) { case SystemRestartState.FAILED: message = this.translate.instant("SETTINGS.SYSTEM_UPDATE.RESTART_FAILED", { system: system }); - color = 'warning'; + color = "warning"; disableButtons = false; showInfo = true; break; @@ -134,10 +134,13 @@ export class MaintenanceComponent implements OnInit { case SystemRestartState.RESTARTED: this.service.stopSpinner(this.spinnerId + type); disableButtons = false; - color = 'success'; + color = "success"; message = this.translate.instant("SETTINGS.SYSTEM_UPDATE.RESTARTED", { system: system }); showInfo = true; break; + default: + break; + } if (!message) { @@ -151,7 +154,7 @@ export class MaintenanceComponent implements OnInit { // Hide and show buttons option.button.disabled = disableButtons ? disableButtons : !this.edge.roleIsAtLeast(option.roleIsAtLeast); option.color = color; - option.info = showInfo ? this.translate.instant('SETTINGS.SYSTEM_UPDATE.RESTART_WARNING', { system: environment.edgeShortName }) : null; + option.info = showInfo ? this.translate.instant("SETTINGS.SYSTEM_UPDATE.RESTART_WARNING", { system: environment.edgeShortName }) : null; return option; }); } @@ -163,7 +166,7 @@ export class MaintenanceComponent implements OnInit { */ private execRestart(type: Type) { - const request = new ComponentJsonApiRequest({ componentId: '_host', payload: new ExecuteSystemRestartRequest({ type: type }) }); + const request = new ComponentJsonApiRequest({ componentId: "_host", payload: new ExecuteSystemRestartRequest({ type: type }) }); // Workaround, there could be no response this.edge.sendRequest(this.websocket, request).catch(() => { diff --git a/ui/src/app/edge/settings/system/oe-system-update.component.ts b/ui/src/app/edge/settings/system/oe-system-update.component.ts index 2e547e5a9a2..b721f60aa44 100644 --- a/ui/src/app/edge/settings/system/oe-system-update.component.ts +++ b/ui/src/app/edge/settings/system/oe-system-update.component.ts @@ -1,15 +1,15 @@ // @ts-strict-ignore -import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; -import { AlertController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Edge, presentAlert, Service, Websocket } from 'src/app/shared/shared'; -import { environment } from 'src/environments'; -import { ExecuteSystemUpdate } from './executeSystemUpdate'; -import { SystemUpdateState } from './getSystemUpdateStateResponse'; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; +import { AlertController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Edge, presentAlert, Service, Websocket } from "src/app/shared/shared"; +import { environment } from "src/environments"; +import { ExecuteSystemUpdate } from "./executeSystemUpdate"; +import { SystemUpdateState } from "./getSystemUpdateStateResponse"; @Component({ selector: OeSystemUpdateComponent.SELECTOR, - templateUrl: './oe-system-update.component.html', + templateUrl: "./oe-system-update.component.html", }) export class OeSystemUpdateComponent implements OnInit, OnDestroy { @@ -67,10 +67,10 @@ export class OeSystemUpdateComponent implements OnInit, OnDestroy { } protected confirmationAlert: () => void = () => presentAlert(this.alertCtrl, this.translate, { - message: this.translate.instant('SETTINGS.SYSTEM_UPDATE.WARNING', { system: environment.edgeShortName }), - subHeader: this.translate.instant('SETTINGS.SYSTEM_UPDATE.SUB_HEADER'), + message: this.translate.instant("SETTINGS.SYSTEM_UPDATE.WARNING", { system: environment.edgeShortName }), + subHeader: this.translate.instant("SETTINGS.SYSTEM_UPDATE.SUB_HEADER"), buttons: [{ - text: this.translate.instant('SETTINGS.SYSTEM_UPDATE.UPDATE_EXECUTE'), + text: this.translate.instant("SETTINGS.SYSTEM_UPDATE.UPDATE_EXECUTE"), handler: () => this.executeSystemUpdate(), }], }); diff --git a/ui/src/app/edge/settings/system/system.component.ts b/ui/src/app/edge/settings/system/system.component.ts index 11c23429957..e6398f41b90 100644 --- a/ui/src/app/edge/settings/system/system.component.ts +++ b/ui/src/app/edge/settings/system/system.component.ts @@ -1,12 +1,12 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { environment } from 'src/environments'; -import { Edge, Service, UserPermission, Utils } from '../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { environment } from "src/environments"; +import { Edge, Service, UserPermission, Utils } from "../../../shared/shared"; @Component({ selector: SystemComponent.SELECTOR, - templateUrl: './system.component.html', + templateUrl: "./system.component.html", }) export class SystemComponent implements OnInit { diff --git a/ui/src/app/edge/settings/systemexecute/systemexecute.component.html b/ui/src/app/edge/settings/systemexecute/systemexecute.component.html index 11216d1262f..c22504d89c5 100644 --- a/ui/src/app/edge/settings/systemexecute/systemexecute.component.html +++ b/ui/src/app/edge/settings/systemexecute/systemexecute.component.html @@ -130,4 +130,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/systemexecute/systemexecute.component.ts b/ui/src/app/edge/settings/systemexecute/systemexecute.component.ts index 46f635743a7..174de06b640 100644 --- a/ui/src/app/edge/settings/systemexecute/systemexecute.component.ts +++ b/ui/src/app/edge/settings/systemexecute/systemexecute.component.ts @@ -1,24 +1,24 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { FormlyFieldConfig, FormlyFormOptions } from '@ngx-formly/core'; -import { TranslateService } from '@ngx-translate/core'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { ExecuteSystemCommandRequest } from 'src/app/shared/jsonrpc/request/executeCommandRequest'; -import { ExecuteSystemCommandResponse } from 'src/app/shared/jsonrpc/response/executeSystemCommandResponse'; -import { Service, Utils, Websocket } from '../../../shared/shared'; +import { Component, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { FormlyFieldConfig, FormlyFormOptions } from "@ngx-formly/core"; +import { TranslateService } from "@ngx-translate/core"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { ExecuteSystemCommandRequest } from "src/app/shared/jsonrpc/request/executeCommandRequest"; +import { ExecuteSystemCommandResponse } from "src/app/shared/jsonrpc/response/executeSystemCommandResponse"; +import { Service, Utils, Websocket } from "../../../shared/shared"; type CommandFunction = (...args: (string | boolean | number)[]) => string; const COMMANDS: { [key: string]: CommandFunction; } = { - 'ping': (ip: string) => `ping -c4 ${ip}`, - 'openems-restart': () => "which at || DEBIAN_FRONTEND=noninteractive apt-get -y install at; echo 'systemctl restart openems' | at now", + "ping": (ip: string) => `ping -c4 ${ip}`, + "openems-restart": () => "which at || DEBIAN_FRONTEND=noninteractive apt-get -y install at; echo 'systemctl restart openems' | at now", }; @Component({ selector: SystemExecuteComponent.SELECTOR, - templateUrl: './systemexecute.component.html', + templateUrl: "./systemexecute.component.html", }) export class SystemExecuteComponent implements OnInit { @@ -34,17 +34,17 @@ export class SystemExecuteComponent implements OnInit { public model: any = {}; public options: FormlyFormOptions = {}; public fields: FormlyFieldConfig[] = [{ - key: 'predefined', - type: 'radio', - templateOptions: { options: [{ value: 'ping', label: 'Ping device in network' }] }, + key: "predefined", + type: "radio", + templateOptions: { options: [{ value: "ping", label: "Ping device in network" }] }, }, { - key: 'ping', - hideExpression: (model: any, formState: any) => this.model['predefined'] !== 'ping', + key: "ping", + hideExpression: (model: any, formState: any) => this.model["predefined"] !== "ping", fieldGroup: [{ - key: 'ip', - type: 'input', + key: "ip", + type: "input", templateOptions: { - label: 'IP-Address', placeholder: "192.168.0.1", required: true, pattern: /(\d{1,3}\.){3}\d{1,3}/, + label: "IP-Address", placeholder: "192.168.0.1", required: true, pattern: /(\d{1,3}\.){3}\d{1,3}/, }, validation: { messages: { @@ -53,11 +53,11 @@ export class SystemExecuteComponent implements OnInit { }, }], }, { - key: 'predefined', - type: 'radio', + key: "predefined", + type: "radio", templateOptions: { options: [ - { value: 'openems-restart', label: 'Restart OpenEMS Edge service' }, + { value: "openems-restart", label: "Restart OpenEMS Edge service" }, ], }, }]; @@ -73,7 +73,6 @@ export class SystemExecuteComponent implements OnInit { } ngOnInit() { - this.service.setCurrentComponent({ languageKey: 'Edge.Config.Index.systemExecute' }, this.route); this.form = this.formBuilder.group({ username: new FormControl("root"), password: new FormControl(""), @@ -99,15 +98,15 @@ export class SystemExecuteComponent implements OnInit { command = cmd(); } } - this.form.controls['command'].setValue(command); + this.form.controls["command"].setValue(command); } public submit() { - const username = this.form.controls['username']; - const password = this.form.controls['password']; - const timeoutSeconds = this.form.controls['timeoutSeconds']; - const runInBackground = this.form.controls['runInBackground']; - const command = this.form.controls['command']; + const username = this.form.controls["username"]; + const password = this.form.controls["password"]; + const timeoutSeconds = this.form.controls["timeoutSeconds"]; + const runInBackground = this.form.controls["runInBackground"]; + const command = this.form.controls["command"]; this.service.getCurrentEdge().then(edge => { this.loading = true; diff --git a/ui/src/app/edge/settings/systemlog/systemlog.component.ts b/ui/src/app/edge/settings/systemlog/systemlog.component.ts index b460c3c7710..8b2776a41a9 100644 --- a/ui/src/app/edge/settings/systemlog/systemlog.component.ts +++ b/ui/src/app/edge/settings/systemlog/systemlog.component.ts @@ -1,28 +1,27 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { Subject } from 'rxjs'; -import { filter, take, takeUntil } from 'rxjs/operators'; -import { Filter } from 'src/app/index/filter/filter.component'; - -import { Service, Utils, Websocket } from '../../../shared/shared'; -import { Role } from 'src/app/shared/type/role'; -import { parse } from 'date-fns'; -import { SelectCustomEvent } from '@ionic/angular'; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { SelectCustomEvent } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { parse } from "date-fns"; +import { Subject } from "rxjs"; +import { filter, take, takeUntil } from "rxjs/operators"; +import { Filter } from "src/app/index/filter/filter.component"; +import { Role } from "src/app/shared/type/role"; +import { Service, Utils, Websocket } from "../../../shared/shared"; export const LOG_LEVEL_FILTER = (translate: TranslateService): Filter => ({ placeholder: translate.instant("Edge.Config.Log.level"), category: "level", options: [ { - name: 'Debug', + name: "Debug", value: "DEBUG", }, { - name: translate.instant('General.info'), + name: translate.instant("General.info"), value: "INFO", }, { - name: translate.instant('General.warning'), + name: translate.instant("General.warning"), value: "WARN", }, { @@ -34,12 +33,12 @@ export const LOG_LEVEL_FILTER = (translate: TranslateService): Filter => ({ @Component({ selector: SystemLogComponent.SELECTOR, - templateUrl: './systemlog.component.html', + templateUrl: "./systemlog.component.html", }) export class SystemLogComponent implements OnInit, OnDestroy { private static readonly SELECTOR = "systemLog"; - private static readonly DEBUG_LOG_CONTROLLER_ID = 'ctrlDebugLog0'; + private static readonly DEBUG_LOG_CONTROLLER_ID = "ctrlDebugLog0"; public isSubscribed: boolean = false; @@ -140,7 +139,7 @@ export class SystemLogComponent implements OnInit, OnDestroy { } public toggleSubscribe(event: CustomEvent) { - if (event.detail['checked']) { + if (event.detail["checked"]) { this.subscribe(); } else { this.unsubscribe(); @@ -160,11 +159,11 @@ export class SystemLogComponent implements OnInit, OnDestroy { this.service.currentEdge.pipe(filter(edge => !!edge), take(1)) .subscribe(edge => edge.updateComponentConfig(this.websocket, SystemLogComponent.DEBUG_LOG_CONTROLLER_ID, [{ - name: 'condensedOutput', value: event.detail['checked'], + name: "condensedOutput", value: event.detail["checked"], }]).then(() => { - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch((reason) => { - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); })); } @@ -182,18 +181,16 @@ export class SystemLogComponent implements OnInit, OnDestroy { this.filterLogs(); } - private getColor(level: 'INFO' | 'WARN' | 'DEBUG' | 'ERROR'): string { + private getColor(level: "INFO" | "WARN" | "DEBUG" | "ERROR"): string { switch (level) { - case 'INFO': - return 'green'; - case 'WARN': - return 'orange'; - case 'DEBUG': - return 'gray'; - case 'ERROR': - return 'red'; - default: - return 'black'; + case "INFO": + return "green"; + case "WARN": + return "orange"; + case "DEBUG": + return "gray"; + case "ERROR": + return "red"; } } @@ -217,7 +214,7 @@ export class SystemLogComponent implements OnInit, OnDestroy { return this._logLines; } - const message = el.message.split('
').filter(el => el.toLowerCase().includes(this.query!.toLowerCase())).join('
'); + const message = el.message.split("
").filter(el => el.toLowerCase().includes(this.query!.toLowerCase())).join("
"); if (message?.length > 0) { el.message = message; diff --git a/ui/src/app/index/filter/filter.component.html b/ui/src/app/index/filter/filter.component.html index 5d4b4593d89..aa8c62bc3e6 100644 --- a/ui/src/app/index/filter/filter.component.html +++ b/ui/src/app/index/filter/filter.component.html @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/index/filter/filter.component.ts b/ui/src/app/index/filter/filter.component.ts index c1019a9afd9..336008c0ca3 100644 --- a/ui/src/app/index/filter/filter.component.ts +++ b/ui/src/app/index/filter/filter.component.ts @@ -2,19 +2,19 @@ import { Component, EventEmitter, Output } from "@angular/core"; import { TranslateService } from "@ngx-translate/core"; import { TKeyValue } from "src/app/shared/service/defaulttypes"; +import { Utils } from "src/app/shared/shared"; import { environment } from "src/environments"; import { SUM_STATES } from "../shared/sumState"; -import { Utils } from "src/app/shared/shared"; @Component({ - selector: 'oe-filter', - templateUrl: './filter.component.html', + selector: "oe-filter", + templateUrl: "./filter.component.html", }) export class FilterComponent { - @Output() protected setSearchParams: EventEmitter> = new EventEmitter>(); + @Output() protected setSearchParams: EventEmitter> = new EventEmitter>(); protected filters: Filter[] = [environment.PRODUCT_TYPES(this.translate), SUM_STATES(this.translate)]; - protected searchParams: Map = new Map(); + protected searchParams: Map = new Map(); constructor(private translate: TranslateService) { } diff --git a/ui/src/app/index/index.module.ts b/ui/src/app/index/index.module.ts index fc90698bdaf..17a07364ee1 100644 --- a/ui/src/app/index/index.module.ts +++ b/ui/src/app/index/index.module.ts @@ -1,12 +1,11 @@ -import { NgModule } from '@angular/core'; - -import { RegistrationModule } from '../registration/registration.module'; -import { SharedModule } from './../shared/shared.module'; -import { FilterComponent } from './filter/filter.component'; -import { OverViewComponent } from './overview/overview.component'; -import { SumStateComponent } from './shared/sumState'; -import { LoginComponent } from './login.component'; -import { LoadingScreenComponent } from './shared/loading-screen'; +import { NgModule } from "@angular/core"; +import { RegistrationModule } from "../registration/registration.module"; +import { SharedModule } from "./../shared/shared.module"; +import { FilterComponent } from "./filter/filter.component"; +import { LoginComponent } from "./login.component"; +import { OverViewComponent } from "./overview/overview.component"; +import { LoadingScreenComponent } from "./shared/loading-screen"; +import { SumStateComponent } from "./shared/sumState"; @NgModule({ imports: [ diff --git a/ui/src/app/index/login.component.ts b/ui/src/app/index/login.component.ts index 50f327e1607..146cbd32166 100644 --- a/ui/src/app/index/login.component.ts +++ b/ui/src/app/index/login.component.ts @@ -1,26 +1,26 @@ // @ts-strict-ignore -import { AfterContentChecked, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Subject } from 'rxjs'; -import { environment } from 'src/environments'; +import { AfterContentChecked, ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { ActivatedRoute, Router } from "@angular/router"; +import { Subject } from "rxjs"; +import { environment } from "src/environments"; -import { Capacitor } from '@capacitor/core'; -import { AppService } from '../app.service'; -import { AuthenticateWithPasswordRequest } from '../shared/jsonrpc/request/authenticateWithPasswordRequest'; -import { Edge, Service, Utils, Websocket } from '../shared/shared'; +import { Capacitor } from "@capacitor/core"; +import { AppService } from "../app.service"; +import { AuthenticateWithPasswordRequest } from "../shared/jsonrpc/request/authenticateWithPasswordRequest"; +import { Edge, Service, Utils, Websocket } from "../shared/shared"; @Component({ - selector: 'login', - templateUrl: './login.component.html', + selector: "login", + templateUrl: "./login.component.html", }) export class LoginComponent implements OnInit, AfterContentChecked, OnDestroy { public environment = environment; public form: FormGroup; protected formIsDisabled: boolean = false; - protected popoverActive: 'android' | 'ios' | null = null; + protected popoverActive: "android" | "ios" | null = null; protected readonly operatingSystem = AppService.deviceInfo.os; - protected readonly isApp: boolean = Capacitor.getPlatform() !== 'web'; + protected readonly isApp: boolean = Capacitor.getPlatform() !== "web"; private stopOnDestroy: Subject = new Subject(); private page = 0; @@ -55,35 +55,33 @@ export class LoginComponent implements OnInit, AfterContentChecked, OnDestroy { // TODO add websocket status observable const interval = setInterval(() => { - if (this.websocket.status === 'online') { - this.router.navigate(['/overview']); + if (this.websocket.status === "online") { + this.router.navigate(["/overview"]); clearInterval(interval); } }, 1000); - - this.service.setCurrentComponent('', this.route); } async ionViewWillEnter() { // Execute Login-Request if url path matches 'demo' - if (this.route.snapshot.routeConfig.path == 'demo') { + if (this.route.snapshot.routeConfig.path == "demo") { await new Promise((resolve) => setTimeout(() => { // Wait for Websocket - if (this.websocket.status == 'waiting for credentials') { - this.service.startSpinner('loginspinner'); - const lang = this.route.snapshot.queryParamMap.get('lang') ?? null; + if (this.websocket.status == "waiting for credentials") { + this.service.startSpinner("loginspinner"); + const lang = this.route.snapshot.queryParamMap.get("lang") ?? null; if (lang) { localStorage.DEMO_LANGUAGE = lang; } resolve( - this.doDemoLogin({ username: 'demo', password: 'demo' })); + this.doDemoLogin({ username: "demo", password: "demo" })); } - }, 2000)).then(() => { this.service.setCurrentComponent('', this.route); }); + }, 2000)); } else { - localStorage.removeItem('DEMO_LANGUAGE'); + localStorage.removeItem("DEMO_LANGUAGE"); } } @@ -120,7 +118,7 @@ export class LoginComponent implements OnInit, AfterContentChecked, OnDestroy { public doDemoLogin(param: { username?: string, password: string }) { this.websocket.login(new AuthenticateWithPasswordRequest(param)).then(() => { - this.service.stopSpinner('loginspinner'); + this.service.stopSpinner("loginspinner"); }); return new Promise((resolve, reject) => { @@ -128,14 +126,14 @@ export class LoginComponent implements OnInit, AfterContentChecked, OnDestroy { this.service.getEdges(this.page) .then((edges) => { setTimeout(() => { - this.router.navigate(['/device', edges[0].id]); + this.router.navigate(["/device", edges[0].id]); }, 100); resolve(edges); }).catch((err) => { reject(err); }); }).finally(() => { - this.service.stopSpinner('loginspinner'); + this.service.stopSpinner("loginspinner"); }, ); } @@ -145,10 +143,10 @@ export class LoginComponent implements OnInit, AfterContentChecked, OnDestroy { this.stopOnDestroy.complete(); } - protected async showPopoverOrRedirectToStore(operatingSystem: 'android' | 'ios') { + protected async showPopoverOrRedirectToStore(operatingSystem: "android" | "ios") { const link: string | null = AppService.getAppStoreLink(); if (link) { - window.open(link, '_blank'); + window.open(link, "_blank"); } else { this.popoverActive = operatingSystem; } diff --git a/ui/src/app/index/login.spec.ts b/ui/src/app/index/login.spec.ts index 47f64346695..dad874f51d4 100644 --- a/ui/src/app/index/login.spec.ts +++ b/ui/src/app/index/login.spec.ts @@ -1,11 +1,18 @@ // @ts-strict-ignore +import { TestBed } from "@angular/core/testing"; import { LoginComponent } from "./login.component"; -describe('Login', () => { +describe("Login", () => { const password = " password "; const username = " username "; - it('#trimCredentials should trim password and username', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [LoginComponent], + }).compileComponents(); + }); + + it("#trimCredentials should trim password and username", () => { { // Username and password - OpenEMS Backend expect(LoginComponent.trimCredentials(password, username)).toEqual({ password: "password", username: "username" }); diff --git a/ui/src/app/index/overview/overview.component.html b/ui/src/app/index/overview/overview.component.html index ceb8d8c680a..e1a0fa4e05d 100644 --- a/ui/src/app/index/overview/overview.component.html +++ b/ui/src/app/index/overview/overview.component.html @@ -128,4 +128,4 @@

{{ edge.comment }}

- \ No newline at end of file + diff --git a/ui/src/app/index/overview/overview.component.ts b/ui/src/app/index/overview/overview.component.ts index b52e924a4bf..f8a129eaa3a 100644 --- a/ui/src/app/index/overview/overview.component.ts +++ b/ui/src/app/index/overview/overview.component.ts @@ -3,9 +3,9 @@ import { Component, OnDestroy, OnInit } from "@angular/core"; import { FormGroup } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { InfiniteScrollCustomEvent } from "@ionic/angular"; -import { TranslateService } from '@ngx-translate/core'; +import { TranslateService } from "@ngx-translate/core"; import { Subject } from "rxjs"; -import { filter, take } from 'rxjs/operators'; +import { filter, take } from "rxjs/operators"; import { Pagination } from "src/app/shared/service/pagination"; import { Edge, Service, Utils, Websocket } from "src/app/shared/shared"; import { Role } from "src/app/shared/type/role"; @@ -14,8 +14,8 @@ import { environment } from "src/environments"; import { ChosenFilter } from "../filter/filter.component"; @Component({ - selector: 'overview', - templateUrl: './overview.component.html', + selector: "overview", + templateUrl: "./overview.component.html", }) export class OverViewComponent implements OnInit, OnDestroy { public environment = environment; @@ -29,7 +29,7 @@ export class OverViewComponent implements OnInit, OnDestroy { public filteredEdges: Edge[] = []; protected loading: boolean = false; - protected searchParams: Map = new Map(); + protected searchParams: Map = new Map(); private stopOnDestroy: Subject = new Subject(); private page = 0; @@ -59,10 +59,6 @@ export class OverViewComponent implements OnInit, OnDestroy { }); } - ionViewWillEnter() { - this.service.setCurrentComponent('', this.route); - } - /** * Updates available edges on scroll-event * @@ -120,7 +116,7 @@ export class OverViewComponent implements OnInit, OnDestroy { * * @param event from template passed event */ - protected searchOnChange(searchParams?: Map) { + protected searchOnChange(searchParams?: Map) { if (searchParams) { this.searchParams = searchParams; @@ -151,10 +147,10 @@ export class OverViewComponent implements OnInit, OnDestroy { // Forward directly to device page, if // - Direct local access to Edge // - No installer (i.e. guest or owner) and access to only one Edge - if (environment.backend == 'OpenEMS Edge' || (!this.loggedInUserCanInstall && edgeIds.length == 1)) { + if (environment.backend == "OpenEMS Edge" || (!this.loggedInUserCanInstall && edgeIds.length == 1)) { const edge = metadata.edges[edgeIds[0]]; setTimeout(() => { - this.router.navigate(['/device', edge.id]); + this.router.navigate(["/device", edge.id]); }, 100); return; } diff --git a/ui/src/app/index/shared/loading-screen.html b/ui/src/app/index/shared/loading-screen.html index c20266ac0b3..2001205da68 100644 --- a/ui/src/app/index/shared/loading-screen.html +++ b/ui/src/app/index/shared/loading-screen.html @@ -2,4 +2,4 @@

Loading...

- \ No newline at end of file + diff --git a/ui/src/app/index/shared/loading-screen.ts b/ui/src/app/index/shared/loading-screen.ts index 8538a706089..14d5d7b43a5 100644 --- a/ui/src/app/index/shared/loading-screen.ts +++ b/ui/src/app/index/shared/loading-screen.ts @@ -1,12 +1,12 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; +import { Component, OnInit } from "@angular/core"; +import { Router } from "@angular/router"; -import { Service, Websocket } from '../../shared/shared'; +import { Service, Websocket } from "../../shared/shared"; @Component({ - selector: 'index', - templateUrl: './loading-screen.html', + selector: "index", + templateUrl: "./loading-screen.html", }) export class LoadingScreenComponent implements OnInit { @@ -23,14 +23,14 @@ export class LoadingScreenComponent implements OnInit { // TODO add websocket status observable const interval = setInterval(() => { this.service.startSpinner(this.spinnerId); - if (this.websocket.status === 'online') { + if (this.websocket.status === "online") { this.service.stopSpinner(this.spinnerId); - this.router.navigate(['/overview']); + this.router.navigate(["/overview"]); clearInterval(interval); } - if (this.websocket.status === 'waiting for credentials') { + if (this.websocket.status === "waiting for credentials") { this.service.stopSpinner(this.spinnerId); - this.router.navigate(['/login']); + this.router.navigate(["/login"]); clearInterval(interval); } }, 1000); diff --git a/ui/src/app/index/shared/sumState.ts b/ui/src/app/index/shared/sumState.ts index c2de550bd7d..38a892087d6 100644 --- a/ui/src/app/index/shared/sumState.ts +++ b/ui/src/app/index/shared/sumState.ts @@ -1,18 +1,18 @@ import { Component, Input, OnInit } from "@angular/core"; import { TranslateService } from "@ngx-translate/core"; -import { Filter } from "../filter/filter.component"; -import { Role } from "src/app/shared/type/role"; import { Service } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; +import { Filter } from "../filter/filter.component"; export enum SumState { - OK = 'OK', - INFO = 'INFO', - WARNING = 'WARNING', - FAULT = 'FAULT', + OK = "OK", + INFO = "INFO", + WARNING = "WARNING", + FAULT = "FAULT", } @Component({ - selector: 'oe-sum-state', + selector: "oe-sum-state", template: ` @@ -65,15 +65,15 @@ export const SUM_STATES = (translate: TranslateService): Filter => ({ category: "sumState", options: [ { - name: 'Ok', + name: "Ok", value: "ok", }, { - name: translate.instant('General.info'), + name: translate.instant("General.info"), value: "Info", }, { - name: translate.instant('General.warning'), + name: translate.instant("General.warning"), value: "Warning", }, { @@ -82,7 +82,7 @@ export const SUM_STATES = (translate: TranslateService): Filter => ({ }, ], setAdditionalFilter: () => ({ - key: 'isOnline', + key: "isOnline", value: true, }), }); diff --git a/ui/src/app/registration/modal/modal.component.html b/ui/src/app/registration/modal/modal.component.html index 93158068f8d..87cbc68a2dc 100644 --- a/ui/src/app/registration/modal/modal.component.html +++ b/ui/src/app/registration/modal/modal.component.html @@ -204,4 +204,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/registration/modal/modal.component.ts b/ui/src/app/registration/modal/modal.component.ts index a52284aa166..430f0d24d1f 100644 --- a/ui/src/app/registration/modal/modal.component.ts +++ b/ui/src/app/registration/modal/modal.component.ts @@ -1,16 +1,16 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { RegisterUserRequest } from 'src/app/shared/jsonrpc/request/registerUserRequest'; -import { Service, Websocket } from 'src/app/shared/shared'; -import { COUNTRY_OPTIONS } from 'src/app/shared/type/country'; -import { environment } from 'src/environments'; +import { Component, OnInit } from "@angular/core"; +import { FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { RegisterUserRequest } from "src/app/shared/jsonrpc/request/registerUserRequest"; +import { Service, Websocket } from "src/app/shared/shared"; +import { COUNTRY_OPTIONS } from "src/app/shared/type/country"; +import { environment } from "src/environments"; @Component({ - selector: 'registration-modal', - templateUrl: './modal.component.html', + selector: "registration-modal", + templateUrl: "./modal.component.html", }) export class RegistrationModalComponent implements OnInit { @@ -44,7 +44,7 @@ export class RegistrationModalComponent implements OnInit { */ onSubmit() { if (!this.formGroup.valid) { - this.service.toast(this.translate.instant("Register.errors.requiredFields"), 'danger'); + this.service.toast(this.translate.instant("Register.errors.requiredFields"), "danger"); return; } @@ -52,7 +52,7 @@ export class RegistrationModalComponent implements OnInit { const confirmPassword = this.formGroup.value.confirmPassword; if (password != confirmPassword) { - this.service.toast(this.translate.instant("Register.errors.passwordNotEqual"), 'danger'); + this.service.toast(this.translate.instant("Register.errors.passwordNotEqual"), "danger"); return; } @@ -60,7 +60,7 @@ export class RegistrationModalComponent implements OnInit { const confirmEmail = this.formGroup.value.confirmEmail; if (email != confirmEmail) { - this.service.toast(this.translate.instant("Register.errors.emailNotEqual"), 'danger'); + this.service.toast(this.translate.instant("Register.errors.emailNotEqual"), "danger"); return; } @@ -92,11 +92,11 @@ export class RegistrationModalComponent implements OnInit { this.websocket.sendRequest(request) .then(() => { - this.service.toast(this.translate.instant("Register.success"), 'success'); + this.service.toast(this.translate.instant("Register.success"), "success"); this.modalCtrl.dismiss(); }) .catch(reason => { - this.service.toast(reason.error.message, 'danger'); + this.service.toast(reason.error.message, "danger"); }); } @@ -105,7 +105,7 @@ export class RegistrationModalComponent implements OnInit { * If no role matches then the default (owner) from will be returnd. */ private getForm(role: string): FormGroup { - if (role === 'installer') { + if (role === "installer") { return this.formBuilder.group({ companyName: new FormControl("", Validators.required), firstname: new FormControl("", Validators.required), diff --git a/ui/src/app/registration/registration.component.html b/ui/src/app/registration/registration.component.html index 399bd0a13d2..8f36566a6fa 100644 --- a/ui/src/app/registration/registration.component.html +++ b/ui/src/app/registration/registration.component.html @@ -1,3 +1,3 @@ Register.createUser - \ No newline at end of file + diff --git a/ui/src/app/registration/registration.component.ts b/ui/src/app/registration/registration.component.ts index ab87858095b..6ac8752cff7 100644 --- a/ui/src/app/registration/registration.component.ts +++ b/ui/src/app/registration/registration.component.ts @@ -1,10 +1,10 @@ -import { Component } from '@angular/core'; -import { ModalController } from '@ionic/angular'; -import { RegistrationModalComponent } from './modal/modal.component'; +import { Component } from "@angular/core"; +import { ModalController } from "@ionic/angular"; +import { RegistrationModalComponent } from "./modal/modal.component"; @Component({ - selector: 'registration', - templateUrl: './registration.component.html', + selector: "registration", + templateUrl: "./registration.component.html", }) export class RegistrationComponent { diff --git a/ui/src/app/registration/registration.module.ts b/ui/src/app/registration/registration.module.ts index d4afbd2bf5c..b5b2b42ee8f 100644 --- a/ui/src/app/registration/registration.module.ts +++ b/ui/src/app/registration/registration.module.ts @@ -1,8 +1,8 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { SharedModule } from '../shared/shared.module'; -import { RegistrationModalComponent } from './modal/modal.component'; -import { RegistrationComponent } from './registration.component'; +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; +import { SharedModule } from "../shared/shared.module"; +import { RegistrationModalComponent } from "./modal/modal.component"; +import { RegistrationComponent } from "./registration.component"; @NgModule({ declarations: [ diff --git a/ui/src/app/shared/components/abstracthistorywidget.ts b/ui/src/app/shared/components/abstracthistorywidget.ts index 2c1bb5f9033..dfc48dffa2a 100644 --- a/ui/src/app/shared/components/abstracthistorywidget.ts +++ b/ui/src/app/shared/components/abstracthistorywidget.ts @@ -1,12 +1,12 @@ // @ts-strict-ignore -import { Directive, Inject, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { ModalController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Subject } from 'rxjs'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { ChannelAddress, CurrentData, Edge, EdgeConfig, Service, Websocket } from 'src/app/shared/shared'; -import { v4 as uuidv4 } from 'uuid'; +import { Directive, Inject, Input, OnChanges, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { ModalController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Subject } from "rxjs"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { ChannelAddress, CurrentData, Edge, EdgeConfig, Service, Websocket } from "src/app/shared/shared"; +import { v4 as uuidv4 } from "uuid"; // NOTE: Auto-refresh of widgets is currently disabled to reduce server load @Directive() @@ -38,7 +38,7 @@ export abstract class AbstractHistoryWidget implements OnInit, OnChanges, OnDest ) { } public ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { // store important variables publically this.edge = edge; diff --git a/ui/src/app/shared/components/chart/abstractHistoryChartOverview.ts b/ui/src/app/shared/components/chart/abstractHistoryChartOverview.ts index 47410194515..6fe6813f36d 100644 --- a/ui/src/app/shared/components/chart/abstractHistoryChartOverview.ts +++ b/ui/src/app/shared/components/chart/abstractHistoryChartOverview.ts @@ -30,7 +30,7 @@ export abstract class AbstractHistoryChartOverview implements OnInit, OnChanges, ) { } public ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { // store important variables publically this.edge = edge; diff --git a/ui/src/app/shared/components/chart/abstracthistorychart.ts b/ui/src/app/shared/components/chart/abstracthistorychart.ts index 4a2a61fadbf..97d491dc2f4 100644 --- a/ui/src/app/shared/components/chart/abstracthistorychart.ts +++ b/ui/src/app/shared/components/chart/abstracthistorychart.ts @@ -1,42 +1,42 @@ // @ts-strict-ignore -import { DecimalPipe, formatNumber } from '@angular/common'; -import { ChangeDetectorRef, Directive, Input, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import * as Chart from 'chart.js'; -import annotationPlugin, { BoxAnnotationOptions } from 'chartjs-plugin-annotation'; -import { calculateResolution, ChronoUnit, DEFAULT_TIME_CHART_OPTIONS, isLabelVisible, Resolution, setLabelVisible } from 'src/app/edge/history/shared'; -import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from 'src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { v4 as uuidv4 } from 'uuid'; - -import { JsonrpcResponseError } from '../../jsonrpc/base'; -import { QueryHistoricTimeseriesDataRequest } from '../../jsonrpc/request/queryHistoricTimeseriesDataRequest'; -import { QueryHistoricTimeseriesEnergyPerPeriodRequest } from '../../jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest'; -import { QueryHistoricTimeseriesEnergyRequest } from '../../jsonrpc/request/queryHistoricTimeseriesEnergyRequest'; -import { QueryHistoricTimeseriesDataResponse } from '../../jsonrpc/response/queryHistoricTimeseriesDataResponse'; -import { QueryHistoricTimeseriesEnergyResponse } from '../../jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { FormatSecondsToDurationPipe } from '../../pipe/formatSecondsToDuration/formatSecondsToDuration.pipe'; -import { ChartAxis, HistoryUtils, YAxisTitle } from '../../service/utils'; -import { ChannelAddress, Currency, Edge, EdgeConfig, Logger, Service, Utils } from '../../shared'; -import { Language } from '../../type/language'; -import { ColorUtils } from '../../utils/color/color.utils'; -import { DateUtils } from '../../utils/date/dateutils'; -import { DateTimeUtils } from '../../utils/datetime/datetime-utils'; -import { TimeUtils } from '../../utils/time/timeutils'; -import { Converter } from '../shared/converter'; -import { ChartConstants } from './chart.constants'; - -import 'chartjs-adapter-date-fns'; +import { DecimalPipe, formatNumber } from "@angular/common"; +import { ChangeDetectorRef, Directive, Input, OnDestroy, OnInit } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import * as Chart from "chart.js"; +import annotationPlugin from "chartjs-plugin-annotation"; +import { calculateResolution, ChronoUnit, DEFAULT_NUMBER_CHART_OPTIONS, DEFAULT_TIME_CHART_OPTIONS, isLabelVisible, Resolution, setLabelVisible } from "src/app/edge/history/shared"; +import { QueryHistoricTimeseriesEnergyPerPeriodResponse } from "src/app/shared/jsonrpc/response/queryHistoricTimeseriesEnergyPerPeriodResponse"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { v4 as uuidv4 } from "uuid"; + +import { JsonrpcResponseError } from "../../jsonrpc/base"; +import { QueryHistoricTimeseriesDataRequest } from "../../jsonrpc/request/queryHistoricTimeseriesDataRequest"; +import { QueryHistoricTimeseriesEnergyPerPeriodRequest } from "../../jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest"; +import { QueryHistoricTimeseriesEnergyRequest } from "../../jsonrpc/request/queryHistoricTimeseriesEnergyRequest"; +import { QueryHistoricTimeseriesDataResponse } from "../../jsonrpc/response/queryHistoricTimeseriesDataResponse"; +import { QueryHistoricTimeseriesEnergyResponse } from "../../jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { FormatSecondsToDurationPipe } from "../../pipe/formatSecondsToDuration/formatSecondsToDuration.pipe"; +import { ChartAxis, HistoryUtils, YAxisType } from "../../service/utils"; +import { ChannelAddress, Currency, Edge, EdgeConfig, Logger, Service, Utils } from "../../shared"; +import { Language } from "../../type/language"; +import { ColorUtils } from "../../utils/color/color.utils"; +import { DateUtils } from "../../utils/date/dateutils"; +import { DateTimeUtils } from "../../utils/datetime/datetime-utils"; +import { TimeUtils } from "../../utils/time/timeutils"; +import { Converter } from "../shared/converter"; +import { ChartConstants, XAxisType } from "./chart.constants"; + +import "chartjs-adapter-date-fns"; Chart.Chart.register(annotationPlugin); // NOTE: Auto-refresh of widgets is currently disabled to reduce server load @Directive() -export abstract class AbstractHistoryChart implements OnInit { +export abstract class AbstractHistoryChart implements OnInit, OnDestroy { - protected static readonly phaseColors: string[] = ['rgb(255,127,80)', 'rgb(0,0,255)', 'rgb(128,128,0)']; + protected static readonly phaseColors: string[] = ["rgb(255,127,80)", "rgb(0,0,255)", "rgb(128,128,0)"]; /** Title for Chart, diplayed above the Chart */ @Input() public chartTitle: string = ""; @@ -46,22 +46,24 @@ export abstract class AbstractHistoryChart implements OnInit { @Input() public showPhases: boolean = false; @Input() public showTotal: boolean = false; @Input() public isOnlyChart: boolean = false; + @Input() public xAxisScalingType: XAxisType = XAxisType.TIMESERIES; public edge: Edge | null = null; public loading: boolean = true; - public labels: Date[] = []; + public labels: (Date | string)[] = []; public datasets: Chart.ChartDataset[] = HistoryUtils.createEmptyDataset(this.translate); - public options: Chart.ChartOptions | null = DEFAULT_TIME_CHART_OPTIONS; + public options: Chart.ChartOptions | null = DEFAULT_TIME_CHART_OPTIONS(); public colors: any[] = []; public chartObject: HistoryUtils.ChartData | null = null; protected spinnerId: string = uuidv4(); - protected chartType: 'line' | 'bar' = 'line'; + protected chartType: "line" | "bar" = "line"; protected isDataExisting: boolean = true; protected config: EdgeConfig = null; protected errorResponse: JsonrpcResponseError | null = null; protected legendOptions: { label: string, strokeThroughHidingStyle: boolean, hideLabelInLegend: boolean }[] = []; + protected debounceTimeout: any | null = null; private channelData: { data: { [name: string]: number[] } } = { data: {} }; constructor( @@ -82,14 +84,17 @@ export abstract class AbstractHistoryChart implements OnInit { * @param energyPeriodResponse the response of a {@link QueryHistoricTimeseriesEnergyPerPeriodRequest} or {@link QueryHistoricTimeseriesDataResponse} * @param energyResponse the response of a {@link QueryHistoricTimeseriesEnergyResponse} */ - public static fillChart(chartType: 'line' | 'bar', chartObject: HistoryUtils.ChartData, energyPeriodResponse: QueryHistoricTimeseriesDataResponse | QueryHistoricTimeseriesEnergyPerPeriodResponse, + public static fillChart(chartType: "line" | "bar", chartObject: HistoryUtils.ChartData, energyPeriodResponse: QueryHistoricTimeseriesDataResponse | QueryHistoricTimeseriesEnergyPerPeriodResponse, energyResponse?: QueryHistoricTimeseriesEnergyResponse) { if (Utils.isDataEmpty(energyPeriodResponse)) { - return; + return { + datasets: ChartConstants.EMPTY_DATASETS, + labels: [], + legendOptions: [], + }; } const channelData: { data: { [name: string]: number[] } } = { data: {} }; - const result = energyPeriodResponse.result; const labels: Date[] = []; for (const timestamp of result.timestamps) { @@ -98,7 +103,7 @@ export abstract class AbstractHistoryChart implements OnInit { chartObject.input.forEach(element => { let channelAddress: ChannelAddress | null = null; - if (chartType == 'bar' && element.energyChannel) { + if (chartType == "bar" && element.energyChannel) { channelAddress = element.energyChannel; } else { channelAddress = element.powerChannel; @@ -158,7 +163,7 @@ export abstract class AbstractHistoryChart implements OnInit { }; } - public static fillData(element: HistoryUtils.DisplayValue, label: string, chartObject: HistoryUtils.ChartData, chartType: 'line' | 'bar', data: number[] | null): { datasets: Chart.ChartDataset[], legendOptions: { label: string, strokeThroughHidingStyle: boolean, hideLabelInLegend: boolean; }[]; } { + public static fillData(element: HistoryUtils.DisplayValue, label: string, chartObject: HistoryUtils.ChartData, chartType: "line" | "bar", data: number[] | null): { datasets: Chart.ChartDataset[], legendOptions: { label: string, strokeThroughHidingStyle: boolean, hideLabelInLegend: boolean; }[]; } { const legendOptions: { label: string, strokeThroughHidingStyle: boolean, hideLabelInLegend: boolean; }[] = []; const datasets: Chart.ChartDataset[] = []; @@ -180,12 +185,12 @@ export abstract class AbstractHistoryChart implements OnInit { } /** - * Gets the legendOptions for a displayValue - * - * @param label the label - * @param element the displayValue - * @returns the label, the hidingStyle of the legendLabel: strokeThroughHidingStyle, hideLabelInLegend - */ + * Gets the legendOptions for a displayValue + * + * @param label the label + * @param element the displayValue + * @returns the label, the hidingStyle of the legendLabel: strokeThroughHidingStyle, hideLabelInLegend + */ public static getLegendOptions(label: string, element: HistoryUtils.DisplayValue): { label: string; strokeThroughHidingStyle: boolean; hideLabelInLegend: boolean; } { return { label: label, @@ -200,38 +205,11 @@ export abstract class AbstractHistoryChart implements OnInit { * @param color the color * @returns the backgroundColor and borderColor */ - public static getColors(color: string, chartType: 'line' | 'bar'): { backgroundColor: string, borderColor: string } { + public static getColors(color: string, chartType: "line" | "bar"): { backgroundColor: string, borderColor: string } { return { - backgroundColor: 'rgba(' + (chartType == 'bar' ? color.split('(').pop().split(')')[0] + ',0.4)' : color.split('(').pop().split(')')[0] + ',0.05)'), - borderColor: 'rgba(' + color.split('(').pop().split(')')[0] + ',1)', - }; - } - - /** - * Gets the dataset for a displayValue - * - * @param element the displayValue - * @param label the label - * @param data the data - * @param stack the stack - * @returns a dataset - */ - public static getDataSet(element: HistoryUtils.DisplayValue, label: string, data: number[], stack: number, chartObject: HistoryUtils.ChartData, chartType: 'line' | 'bar'): Chart.ChartDataset { - const dataset: Chart.ChartDataset = { - label: label, - data: data, - hidden: !isLabelVisible(element.name, !(element.hiddenOnInit)), - ...(stack != null && { stack: stack.toString() }), - maxBarThickness: 100, - ...(element.borderDash != null && { borderDash: element.borderDash }), - yAxisID: element.yAxisId != null ? element.yAxisId : chartObject.yAxes.find(element => element.yAxisId == ChartAxis.LEFT)?.yAxisId, - order: element.order ?? Number.MAX_VALUE, - ...(element.hideShadow && { fill: !element.hideShadow }), - ...(element.custom?.type && { type: chartType }), - ...AbstractHistoryChart.getColors(element.color, chartType), - borderWidth: 2, + backgroundColor: "rgba(" + (chartType == "bar" ? color.split("(").pop().split(")")[0] + ",0.4)" : color.split("(").pop().split(")")[0] + ",0.05)"), + borderColor: "rgba(" + color.split("(").pop().split(")")[0] + ",1)", }; - return dataset; } /** @@ -240,12 +218,12 @@ export abstract class AbstractHistoryChart implements OnInit { * @param chartType the chart type * @returns chart options */ - public static applyChartTypeSpecificOptionsChanges(chartType: 'bar' | 'line', options: Chart.ChartOptions, service: Service, chartObject: HistoryUtils.ChartData | null): Chart.ChartOptions { + public static applyChartTypeSpecificOptionsChanges(chartType: "bar" | "line", options: Chart.ChartOptions, service: Service, chartObject: HistoryUtils.ChartData | null): Chart.ChartOptions { switch (chartType) { - case 'bar': { - options.plugins.tooltip.mode = 'x'; - options.scales.x['offset'] = true; - options.scales.x.ticks['source'] = 'data'; + case "bar": { + options.plugins.tooltip.mode = "x"; + options.scales.x["offset"] = true; + options.scales.x.ticks["source"] = "data"; let barPercentage = 1; switch (service.periodString) { case DefaultTypes.PeriodString.CUSTOM: { @@ -268,6 +246,8 @@ export abstract class AbstractHistoryChart implements OnInit { } break; } + default: + break; } options.datasets.bar = { @@ -276,14 +256,14 @@ export abstract class AbstractHistoryChart implements OnInit { break; } - case 'line': - options.scales.x['offset'] = false; - options.scales.x.ticks['source'] = 'data'; - options.plugins.tooltip.mode = 'index'; + case "line": + options.scales.x["offset"] = false; + options.scales.x.ticks["source"] = "data"; + options.plugins.tooltip.mode = "index"; if (chartObject) { for (const yAxis of chartObject.yAxes) { - options.scales[yAxis.yAxisId]['stacked'] = false; + options.scales[yAxis.yAxisId]["stacked"] = false; } } break; @@ -293,41 +273,101 @@ export abstract class AbstractHistoryChart implements OnInit { } /** - * Gets chart options - {@link Chart.ChartOptions}. + * Gets the dataset for a displayValue * - * @param chartObject the chartObject - * @param chartType the current chart type - * @param service the service - * @param translate the translate service - * @param legendOptions the legend options - * @param channelData the channel data - * @param locale the locale - * @returns options + * @param element the displayValue + * @param label the label + * @param data the data + * @param stack the stack + * @returns a dataset */ + public static getDataSet(element: HistoryUtils.DisplayValue, label: string, data: number[], stack: number, chartObject: HistoryUtils.ChartData, chartType: "line" | "bar"): Chart.ChartDataset { + const dataset: Chart.ChartDataset = { + label: label, + data: data, + hidden: !isLabelVisible(element.name, !(element.hiddenOnInit)), + ...(stack != null && { stack: stack.toString() }), + maxBarThickness: 100, + ...(element.borderDash != null && { borderDash: element.borderDash }), + yAxisID: element.yAxisId != null ? element.yAxisId : chartObject.yAxes.find(element => element.yAxisId == ChartAxis.LEFT)?.yAxisId, + order: element.order ?? Number.MAX_VALUE, + ...(element.hideShadow && { fill: !element.hideShadow }), + ...(element.custom?.type && { type: chartType }), + ...AbstractHistoryChart.getColors(element.color, chartType), + borderWidth: 2, + }; + return dataset; + } + + public static getYAxisType(title: YAxisType, translate: TranslateService, chartType: "bar" | "line", customTitle?: string): string { + switch (title) { + case YAxisType.RELAY: + if (chartType === "line") { + // Hide YAxis title + return ""; + } + return translate.instant("Edge.Index.Widgets.Channeltreshold.ACTIVE_TIME_OVER_PERIOD"); + case YAxisType.TIME: + return translate.instant("Edge.Index.Widgets.Channeltreshold.ACTIVE_TIME_OVER_PERIOD"); + case YAxisType.PERCENTAGE: + return translate.instant("General.percentage"); + case YAxisType.ENERGY: + if (chartType == "bar") { + return "kWh"; + } else { + return "kW"; + } + case YAxisType.VOLTAGE: + return translate.instant("Edge.History.VOLTAGE"); + case YAxisType.CURRENT: + return translate.instant("Edge.History.CURRENT"); + case YAxisType.NONE: + return ""; + default: + return "kW"; + } + } + + /** + * Gets chart options - {@link Chart.ChartOptions}. + * + * @param chartObject the chartObject + * @param chartType the current chart type + * @param service the service + * @param translate the translate service + * @param legendOptions the legend options + * @param channelData the channel data + * @param locale the locale + * @returns options + */ public static getOptions( - chartObject: HistoryUtils.ChartData, chartType: 'line' | 'bar', service: Service, - translate: TranslateService, legendOptions: { label: string, strokeThroughHidingStyle: boolean; }[], - labels: Date[], channelData: { data: { [name: string]: number[]; }; }, locale: string, config: EdgeConfig, + chartObject: HistoryUtils.ChartData, chartType: "line" | "bar", service: Service, + translate: TranslateService, + legendOptions: { label: string, strokeThroughHidingStyle: boolean; }[], + channelData: { data: { [name: string]: number[]; }; }, + locale: string, + config: EdgeConfig, datasets: Chart.ChartDataset[], + chartOptionsType: XAxisType, + labels: (Date | string)[], ): Chart.ChartOptions { + let tooltipsLabel: string | null = null; - let options: Chart.ChartOptions = Utils.deepCopy(Utils.deepCopy(DEFAULT_TIME_CHART_OPTIONS)); - const displayValues: HistoryUtils.DisplayValue[] = chartObject.output(channelData.data, labels); + let options: Chart.ChartOptions = Utils.deepCopy(Utils.deepCopy(AbstractHistoryChart.getDefaultOptions(chartOptionsType, service, labels))); + const displayValues: HistoryUtils.DisplayValue[] = chartObject.output(channelData.data); - const showYAxisTitle: boolean = chartObject.yAxes.length > 1; + const showYAxisType: boolean = chartObject.yAxes.length > 1; chartObject.yAxes.forEach((element) => { - options = AbstractHistoryChart.getYAxisOptions(options, element, translate, chartType, locale, datasets, showYAxisTitle); + options = AbstractHistoryChart.getYAxisOptions(options, element, translate, chartType, locale, datasets, showYAxisType); }); options.plugins.tooltip.callbacks.title = (tooltipItems: Chart.TooltipItem[]): string => { if (tooltipItems?.length === 0) { return null; } - const date = DateUtils.stringToDate(tooltipItems[0]?.label); - return AbstractHistoryChart.toTooltipTitle(service.historyPeriod.value.from, service.historyPeriod.value.to, date, service); + return AbstractHistoryChart.toTooltipTitle(service.historyPeriod.value.from, service.historyPeriod.value.to, tooltipItems[0]?.label, service, chartOptionsType); }; options = AbstractHistoryChart.applyChartTypeSpecificOptionsChanges(chartType, options, service, chartObject); - options.scales.x['time'].unit = calculateResolution(service, service.historyPeriod.value.from, service.historyPeriod.value.to).timeFormat; options.plugins.tooltip.callbacks.label = (item: Chart.TooltipItem) => { const label = item.dataset.label; @@ -338,7 +378,7 @@ export abstract class AbstractHistoryChart implements OnInit { if (displayValue.hiddenInTooltip) { return null; } - const unit = displayValue?.custom?.unit + const unit = chartObject.yAxes?.find(el => el.yAxisId === displayValue.yAxisId)?.unit ?? chartObject.yAxes[0]?.unit; if (value === null) { @@ -352,8 +392,6 @@ export abstract class AbstractHistoryChart implements OnInit { return label.split(":")[0] + ": " + AbstractHistoryChart.getToolTipsSuffix(tooltipsLabel, value, displayValue.custom?.formatNumber ?? chartObject.tooltip.formatNumber, unit, chartType, locale, translate, config); }; - options.scales.x['time'].unit = calculateResolution(service, service.historyPeriod.value.from, service.historyPeriod.value.to).timeFormat; - options.plugins.tooltip.callbacks.labelColor = (item: Chart.TooltipItem) => { return { borderColor: ColorUtils.changeOpacityFromRGBA(item.dataset.borderColor, 1), @@ -362,12 +400,13 @@ export abstract class AbstractHistoryChart implements OnInit { }; options.plugins.legend.labels.generateLabels = function (chart: Chart.Chart) { + const chartLegendLabelItems: Chart.LegendItem[] = []; chart.data.datasets.forEach((dataset: Chart.ChartDataset, index) => { const legendItem = legendOptions?.find(element => element.label == dataset.label); //Remove duplicates like 'directConsumption' from legend - if (chartLegendLabelItems.filter(element => element['text'] == dataset.label).length > 0) { + if (chartLegendLabelItems.filter(element => element["text"] == dataset.label).length > 0) { return; } @@ -377,12 +416,12 @@ export abstract class AbstractHistoryChart implements OnInit { chartLegendLabelItems.push({ text: dataset.label, datasetIndex: index, - fontColor: getComputedStyle(document.documentElement).getPropertyValue('--ion-color-text'), - ...(dataset.backgroundColor != null && {fillStyle: dataset.backgroundColor.toString()}), + fontColor: getComputedStyle(document.documentElement).getPropertyValue("--ion-color-text"), + ...(dataset.backgroundColor != null && { fillStyle: dataset.backgroundColor.toString() }), hidden: isHidden != null ? isHidden : !chart.isDatasetVisible(index), lineWidth: 2, - ...(dataset.borderColor != null && {strokeStyle: dataset.borderColor.toString()}), - ...(dataset['borderDash'] != null && { lineDash: dataset['borderDash'] }), + ...(dataset.borderColor != null && { strokeStyle: dataset.borderColor.toString() }), + ...(dataset["borderDash"] != null && { lineDash: dataset["borderDash"] }), }); }); @@ -390,6 +429,7 @@ export abstract class AbstractHistoryChart implements OnInit { }; options.plugins.tooltip.callbacks.afterTitle = function (items: Chart.TooltipItem[]) { + if (items?.length === 0) { return null; } @@ -408,11 +448,11 @@ export abstract class AbstractHistoryChart implements OnInit { return null; } - const afterTitle = typeof chartObject.tooltip?.afterTitle == 'function' ? chartObject.tooltip?.afterTitle(stack) : null; + const afterTitle = typeof chartObject.tooltip?.afterTitle == "function" ? chartObject.tooltip?.afterTitle(stack) : null; const totalValue = datasets.filter(el => el.stack == stack).reduce((_total, dataset) => Utils.addSafely(_total, Math.abs(dataset.data[datasetIndex])), 0); if (afterTitle) { - return afterTitle + ": " + formatNumber(totalValue, 'de', chartObject.tooltip.formatNumber) + ' ' + tooltipsLabel; + return afterTitle + ": " + formatNumber(totalValue, "de", chartObject.tooltip.formatNumber) + " " + tooltipsLabel; } return null; @@ -441,11 +481,12 @@ export abstract class AbstractHistoryChart implements OnInit { chart.update(); }; - options.scales.x.ticks['source'] = 'auto'; + options.scales.x.ticks["source"] = "auto"; options.scales.x.ticks.maxTicksLimit = 31; - options.scales.x['bounds'] = 'ticks'; + options.scales.x["bounds"] = "ticks"; + options; + options = AbstractHistoryChart.getExternalPluginFeatures(displayValues, options, chartType); - options = AbstractHistoryChart.getPluginFeatures((displayValues.filter(el => (el.custom as HistoryUtils.PluginCustomOptions)?.pluginType === 'box') as HistoryUtils.DisplayValue[]), options, chartType); return options; } @@ -459,10 +500,13 @@ export abstract class AbstractHistoryChart implements OnInit { * @param locale the current locale * @returns the chart options {@link Chart.ChartOptions} */ - public static getYAxisOptions(options: Chart.ChartOptions, element: HistoryUtils.yAxes, translate: TranslateService, chartType: 'line' | 'bar', locale: string, datasets: Chart.ChartDataset[], showYAxisTitle?: boolean): Chart.ChartOptions { - const baseConfig = ChartConstants.DEFAULT_Y_SCALE_OPTIONS(element, translate, chartType, datasets, showYAxisTitle); + public static getYAxisOptions(options: Chart.ChartOptions, element: HistoryUtils.yAxes, translate: TranslateService, chartType: "line" | "bar", locale: string, datasets: Chart.ChartDataset[], showYAxisType?: boolean): Chart.ChartOptions { + + const baseConfig = ChartConstants.DEFAULT_Y_SCALE_OPTIONS(element, translate, chartType, datasets, showYAxisType); + switch (element.unit) { - case YAxisTitle.RELAY: + + case YAxisType.RELAY: options.scales[element.yAxisId] = { ...baseConfig, min: 0, @@ -479,14 +523,14 @@ export abstract class AbstractHistoryChart implements OnInit { }, }; break; - case YAxisTitle.PERCENTAGE: + case YAxisType.PERCENTAGE: options.scales[element.yAxisId] = { ...baseConfig, stacked: true, beginAtZero: true, max: 100, min: 0, - type: 'linear', + type: "linear", ticks: { ...baseConfig.ticks, padding: 5, @@ -494,7 +538,8 @@ export abstract class AbstractHistoryChart implements OnInit { }, }; break; - case YAxisTitle.TIME: + + case YAxisType.TIME: options.scales[element.yAxisId] = { ...baseConfig, min: 0, @@ -502,25 +547,26 @@ export abstract class AbstractHistoryChart implements OnInit { ...baseConfig.ticks, callback: function (value, index, values) { - if (typeof value === 'number') { + if (typeof value === "number") { return TimeUtils.formatSecondsToDuration(value, locale); } }, }, }; break; - case YAxisTitle.POWER: - case YAxisTitle.ENERGY: - case YAxisTitle.VOLTAGE: - case YAxisTitle.NONE: + case YAxisType.POWER: + case YAxisType.ENERGY: + case YAxisType.VOLTAGE: + case YAxisType.CURRENT: + case YAxisType.NONE: options.scales[element.yAxisId] = baseConfig; break; - case YAxisTitle.CURRENCY: + case YAxisType.CURRENCY: options.scales[element.yAxisId] = { ...baseConfig, beginAtZero: false, ticks: { - source: 'auto', + source: "auto", }, }; break; @@ -528,68 +574,75 @@ export abstract class AbstractHistoryChart implements OnInit { return options; } - public static getYAxisTitle(title: YAxisTitle, translate: TranslateService, chartType: 'bar' | 'line', customTitle?: string): string { - switch (title) { - case YAxisTitle.RELAY: - if (chartType === 'line') { - // Hide YAxis title - return ''; - } - return translate.instant('Edge.Index.Widgets.Channeltreshold.ACTIVE_TIME_OVER_PERIOD'); - case YAxisTitle.TIME: - return translate.instant('Edge.Index.Widgets.Channeltreshold.ACTIVE_TIME_OVER_PERIOD'); - case YAxisTitle.PERCENTAGE: - return translate.instant('General.percentage'); - case YAxisTitle.ENERGY: - if (chartType == 'bar') { - return 'kWh'; - } else { - return 'kW'; + /** + * Gets the Name for the tooltips label + * + * @param baseName the baseName = the value + * @param unit the unit + * @param suffix the suffix, a number that will be added to the baseName + * @returns a string, that is either the baseName, if no suffix is provided, or a baseName with a formatted number + */ + public static getTooltipsLabelName(baseName: string, unit: YAxisType, suffix?: number | string): string { + if (suffix != null) { + if (typeof suffix === "string") { + return baseName + " " + suffix; + } else { + switch (unit) { + case YAxisType.ENERGY: + return baseName + ": " + formatNumber(suffix / 1000, "de", "1.0-1") + " kWh"; + case YAxisType.PERCENTAGE: + return baseName + ": " + formatNumber(suffix, "de", "1.0-1") + " %"; + case YAxisType.RELAY: + case YAxisType.TIME: { + const pipe = new FormatSecondsToDurationPipe(new DecimalPipe(Language.DE.key)); + return baseName + ": " + pipe.transform(suffix); + } + default: + return baseName; } - case YAxisTitle.VOLTAGE: - return translate.instant('Edge.History.VOLTAGE'); - case YAxisTitle.NONE: - return ''; - default: - return 'kW'; + } } + return baseName; } /** - * Gets the tooltips label, dependent on YAxisTitle + * Gets the tooltips label, dependent on YAxisType * - * @param title the YAxisTitle - * @returns + * @param title the YAxisType + * @returns the tooltips suffix */ - public static getToolTipsSuffix(label: any, value: number, format: string, title: YAxisTitle, chartType: 'bar' | 'line', language: string, translate: TranslateService, config: EdgeConfig): string { + public static getToolTipsSuffix(label: any, value: number, format: string, title: YAxisType, chartType: "bar" | "line", language: string, translate: TranslateService, config: EdgeConfig): string { let tooltipsLabel: string | null = null; switch (title) { - case YAxisTitle.RELAY: { + case YAxisType.RELAY: { return Converter.ON_OFF(translate)(value); } - case YAxisTitle.TIME: { + case YAxisType.TIME: { const pipe = new FormatSecondsToDurationPipe(new DecimalPipe(language)); return pipe.transform(value); } - case YAxisTitle.CURRENCY: { - const currency = config.components['_meta'].properties.currency; + case YAxisType.CURRENCY: { + const currency = config.components["_meta"].properties.currency; tooltipsLabel = Currency.getCurrencyLabelByCurrency(currency); break; } - case YAxisTitle.PERCENTAGE: + case YAxisType.PERCENTAGE: tooltipsLabel = AbstractHistoryChart.getToolTipsAfterTitleLabel(title, chartType, value, translate); break; - case YAxisTitle.VOLTAGE: - tooltipsLabel = 'V'; + case YAxisType.VOLTAGE: + tooltipsLabel = "V"; break; - case YAxisTitle.POWER: - tooltipsLabel = 'W'; + case YAxisType.CURRENT: + tooltipsLabel = "A"; break; - case YAxisTitle.ENERGY: - if (chartType == 'bar') { - tooltipsLabel = 'kWh'; + case YAxisType.POWER: + tooltipsLabel = "W"; + break; + case YAxisType.ENERGY: + if (chartType == "bar") { + tooltipsLabel = "kWh"; } else { - tooltipsLabel = 'kW'; + tooltipsLabel = "kW"; } break; default: @@ -597,36 +650,23 @@ export abstract class AbstractHistoryChart implements OnInit { break; } - return formatNumber(value, 'de', format) + ' ' + tooltipsLabel; + return formatNumber(value, "de", format) + " " + tooltipsLabel; } - /** - * Gets the Name for the tooltips label - * - * @param baseName the baseName = the value - * @param unit the unit - * @param suffix the suffix, a number that will be added to the baseName - * @returns a string, that is either the baseName, if no suffix is provided, or a baseName with a formatted number - */ - public static getTooltipsLabelName(baseName: string, unit: YAxisTitle, suffix?: number | string): string { - if (suffix != null) { - if (typeof suffix == 'string') { - baseName + " " + suffix; - } else { - switch (unit) { - case YAxisTitle.ENERGY: - return baseName + ": " + formatNumber(suffix / 1000, 'de', "1.0-1") + " kWh"; - case YAxisTitle.PERCENTAGE: - return baseName + ": " + formatNumber(suffix, 'de', "1.0-1") + " %"; - case YAxisTitle.RELAY: - case YAxisTitle.TIME: { - const pipe = new FormatSecondsToDurationPipe(new DecimalPipe(Language.DE.key)); - return baseName + ": " + pipe.transform(suffix); - } - } - } + public static getDefaultOptions(xAxisType: XAxisType, service: Service, labels: (Date | string)[]): Chart.ChartOptions { + + let options: Chart.ChartOptions; + switch (xAxisType) { + case XAxisType.NUMBER: + options = DEFAULT_NUMBER_CHART_OPTIONS(labels); + break; + case XAxisType.TIMESERIES: + options = Utils.deepCopy(DEFAULT_TIME_CHART_OPTIONS()); + options.scales.x["time"].unit = calculateResolution(service, service.historyPeriod.value.from, service.historyPeriod.value.to).timeFormat; + break; } - return baseName; + + return options; } /** @@ -637,44 +677,61 @@ export abstract class AbstractHistoryChart implements OnInit { * @param date Date from TooltipItem * @returns period for Tooltip Header */ - protected static toTooltipTitle(fromDate: Date, toDate: Date, date: Date, service: Service): string { + protected static toTooltipTitle(fromDate: Date, toDate: Date, label: string, service: Service, chartOptionsType: XAxisType): string { const unit = calculateResolution(service, fromDate, toDate).resolution.unit; + + if (chartOptionsType === XAxisType.NUMBER) { + return null; + } + + const date: Date = DateUtils.stringToDate(label); + switch (unit) { case ChronoUnit.Type.YEARS: - return date.toLocaleDateString('default', { year: 'numeric' }); + return date.toLocaleDateString("default", { year: "numeric" }); case ChronoUnit.Type.MONTHS: - return date.toLocaleDateString('default', { month: 'long' }); + return date.toLocaleDateString("default", { month: "long" }); case ChronoUnit.Type.DAYS: - return date.toLocaleDateString('default', { day: '2-digit', month: 'long' }); + return date.toLocaleDateString("default", { day: "2-digit", month: "long" }); default: - return date.toLocaleString('default', { day: '2-digit', month: '2-digit', year: '2-digit' }) + ' ' + date.toLocaleTimeString('default', { hour12: false, hour: '2-digit', minute: '2-digit' }); + return date.toLocaleString("default", { day: "2-digit", month: "2-digit", year: "2-digit" }) + " " + date.toLocaleTimeString("default", { hour12: false, hour: "2-digit", minute: "2-digit" }); } } + protected static removeExternalPluginFeatures(options: Chart.ChartOptions): Chart.ChartOptions { + options.plugins["annotation"] = {}; + options.plugins["datalabels"] = { + display: false, + }; + return options; + } + /** - * Gets the tooltips label, dependent on YAxisTitle + * Gets the tooltips label, dependent on YAxisType * - * @param title the YAxisTitle - * @returns + * @param title the YAxisType + * @returns the tooltips title with the corresponding unit */ - protected static getToolTipsAfterTitleLabel(title: YAxisTitle | null, chartType: 'bar' | 'line', value: number | string | null, translate: TranslateService): string { + protected static getToolTipsAfterTitleLabel(title: YAxisType | null, chartType: "bar" | "line", value: number | string | null, translate: TranslateService): string { switch (title) { - case YAxisTitle.RELAY: + case YAxisType.RELAY: return Converter.ON_OFF(translate)(value); - case YAxisTitle.TIME: - return 'h'; - case YAxisTitle.PERCENTAGE: - return '%'; - case YAxisTitle.VOLTAGE: - return 'V'; - case YAxisTitle.ENERGY: - if (chartType == 'bar') { - return 'kWh'; + case YAxisType.TIME: + return "h"; + case YAxisType.PERCENTAGE: + return "%"; + case YAxisType.VOLTAGE: + return "V"; + case YAxisType.CURRENT: + return "A"; + case YAxisType.ENERGY: + if (chartType == "bar") { + return "kWh"; } else { - return 'kW'; + return "kW"; } default: - return ''; + return ""; } } @@ -686,32 +743,59 @@ export abstract class AbstractHistoryChart implements OnInit { * @param chartType the chartType * @returns plugin options */ - private static getPluginFeatures(displayValues: (HistoryUtils.DisplayValue)[], options: Chart.ChartOptions, chartType: 'line' | 'bar'): Chart.ChartOptions { - const annotations: BoxAnnotationOptions[] = displayValues.flatMap(el => { - return el.custom.annotations.map(annotation => { - return ({ - ...AbstractHistoryChart.getColors(el.color, chartType), - type: 'box', - borderWidth: 1, - xScaleID: 'x', - xMin: annotation.xMin, - xMax: annotation.xMax, - yMin: annotation.yMin, - yMax: annotation.yMax, - yScaleID: annotation.yScaleID, - }); - }); + private static getExternalPluginFeatures(displayValues: (HistoryUtils.DisplayValue)[], options: Chart.ChartOptions, chartType: "line" | "bar"): Chart.ChartOptions { + displayValues.flatMap(el => { + + if (!el.custom) { + return; + } + + switch (el.custom["pluginType"]) { + case "box": + options.plugins["annotation"] = { + annotations: (el.custom as HistoryUtils.BoxCustomOptions).annotations.map(annotation => { + return ({ + ...AbstractHistoryChart.getColors(el.color, chartType), + ...annotation, + }); + }), + }; + break; + case "datalabels": + options.plugins["datalabels"] = + ChartConstants.Plugins.BAR_CHART_DATALABELS((el.custom as HistoryUtils.DataLabelsCustomOptions).datalabels.displayUnit, true); + Chart.Chart.register(ChartConstants.Plugins.BAR_CHART_DATALABELS("kWh", true).plugin); + break; + } }); - options.plugins['annotation'] = { - annotations: annotations, - }; return options; } + /** + * Start NGX-Spinner + * + * Spinner will appear inside html tag only + * + * @example + * the spinnerId represents a uuidv4() generated id + * + */ + public startSpinner() { + this.service.startSpinner(this.spinnerId); + } + + /** + * Stop NGX-Spinner + * @param selector selector for specific spinner + */ + public stopSpinner() { + this.service.stopSpinner(this.spinnerId); + } + ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { // store important variables publically this.edge = edge; @@ -725,25 +809,8 @@ export abstract class AbstractHistoryChart implements OnInit { }); } - /** - * Start NGX-Spinner - * - * Spinner will appear inside html tag only - * - * @example - * the spinnerId represents a uuidv4() generated id - * - */ - public startSpinner() { - this.service.startSpinner(this.spinnerId); - } - - /** - * Stop NGX-Spinner - * @param selector selector for specific spinner - */ - public stopSpinner() { - this.service.stopSpinner(this.spinnerId); + ngOnDestroy() { + this.options = AbstractHistoryChart.removeExternalPluginFeatures(this.options); } protected getChartHeight(): number { @@ -753,6 +820,62 @@ export abstract class AbstractHistoryChart implements OnInit { return window.innerHeight / 21 * 9; } + protected updateChart() { + this.startSpinner(); + this.loadChart(); + } + + /** + * Used to loadChart, dependent on the resolution + */ + protected loadChart() { + this.labels = []; + this.errorResponse = null; + const unit: ChronoUnit.Type = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).resolution.unit; + + // Show Barchart if resolution is days or months + if (ChronoUnit.isAtLeast(unit, ChronoUnit.Type.DAYS)) { + Promise.all([ + this.queryHistoricTimeseriesEnergyPerPeriod(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to), + this.queryHistoricTimeseriesEnergy(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to), + ]).then(([energyPeriodResponse, energyResponse]) => { + this.chartType = "bar"; + this.chartObject = this.getChartData(); + + // TODO after chartjs migration, look for config + energyPeriodResponse = DateTimeUtils.normalizeTimestamps(unit, energyPeriodResponse); + + const displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, energyPeriodResponse, energyResponse); + this.datasets = displayValues.datasets; + this.legendOptions = displayValues.legendOptions; + this.labels = displayValues.labels; + this.channelData = displayValues.channelData; + this.beforeSetChartLabel(); + this.setChartLabel(); + }); + } else { + + // Shows Line-Chart + Promise.all([ + this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to), + this.queryHistoricTimeseriesEnergy(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to), + ]) + .then(([dataResponse, energyResponse]) => { + + dataResponse = DateTimeUtils.normalizeTimestamps(unit, dataResponse); + this.chartType = "line"; + this.chartObject = this.getChartData(); + const displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, dataResponse, energyResponse); + this.datasets = displayValues.datasets; + this.legendOptions = displayValues.legendOptions; + this.labels = displayValues.labels; + this.channelData = displayValues.channelData; + this.beforeSetChartLabel(); + this.setChartLabel(); + }); + } + } + /** * Sends the Historic Timeseries Data Query and makes sure the result is not empty. * @@ -762,41 +885,48 @@ export abstract class AbstractHistoryChart implements OnInit { * @param ws the websocket */ protected queryHistoricTimeseriesData(fromDate: Date, toDate: Date, res?: Resolution): Promise { + this.isDataExisting = true; const resolution = res ?? calculateResolution(this.service, fromDate, toDate).resolution; - const result: Promise = new Promise((resolve, reject) => { - this.service.getCurrentEdge().then(edge => { - this.service.getConfig().then(async () => { - const channelAddresses = (await this.getChannelAddresses()).powerChannels; - const request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, this.edge?.firstSetupProtocol), toDate, channelAddresses, resolution); - edge.sendRequest(this.service.websocket, request).then(response => { - const result = (response as QueryHistoricTimeseriesDataResponse)?.result; - if (Object.keys(result).length != 0) { - resolve(response as QueryHistoricTimeseriesDataResponse); - } else { - this.errorResponse = new JsonrpcResponseError(request.id, { code: 1, message: "Empty Result" }); - resolve(new QueryHistoricTimeseriesDataResponse(response.id, { - timestamps: [null], data: { null: null }, - })); - } - }).catch((response) => { - this.errorResponse = response; - this.initializeChart(); - }); - }); - }); - }).then((response) => { - // Check if channelAddresses are empty - if (Utils.isDataEmpty(response)) { + if (this.debounceTimeout) { + clearTimeout(this.debounceTimeout); + } - // load defaultchart - this.isDataExisting = false; - this.initializeChart(); - } - return response; + return new Promise((resolve, reject) => { + this.service.getCurrentEdge() + .then(edge => this.service.getConfig() + .then(async () => { + const channelAddresses = (await this.getChannelAddresses()).powerChannels; + const request = new QueryHistoricTimeseriesDataRequest(DateUtils.maxDate(fromDate, this.edge?.firstSetupProtocol), toDate, channelAddresses, resolution); + + this.debounceTimeout = setTimeout(() => { + edge.sendRequest(this.service.websocket, request) + .then(response => { + const result = (response as QueryHistoricTimeseriesDataResponse)?.result; + let responseToReturn: QueryHistoricTimeseriesDataResponse; + + if (Object.keys(result).length !== 0) { + responseToReturn = response as QueryHistoricTimeseriesDataResponse; + } else { + this.errorResponse = new JsonrpcResponseError(request.id, { code: 1, message: "Empty Result" }); + responseToReturn = new QueryHistoricTimeseriesDataResponse(response.id, { + timestamps: [null], + data: { null: null }, + }); + } + + if (Utils.isDataEmpty(responseToReturn)) { + this.isDataExisting = false; + this.initializeChart(); + } + resolve(responseToReturn); + }); + }, ChartConstants.REQUEST_TIMEOUT); + }), + ); }); - return result; + } /** @@ -807,6 +937,7 @@ export abstract class AbstractHistoryChart implements OnInit { * @param toDate the To-Date */ protected queryHistoricTimeseriesEnergyPerPeriod(fromDate: Date, toDate: Date): Promise { + this.isDataExisting = true; const resolution = calculateResolution(this.service, fromDate, toDate).resolution; @@ -838,8 +969,10 @@ export abstract class AbstractHistoryChart implements OnInit { }); }); }).then((response) => { + // Check if channelAddresses are empty if (Utils.isDataEmpty(response)) { + // load defaultchart this.isDataExisting = false; this.stopSpinner(); @@ -850,6 +983,7 @@ export abstract class AbstractHistoryChart implements OnInit { return result; } + /** * Sends the Historic Timeseries Energy per Period Query and makes sure the result is not empty. * Symbolizes First substracted from last Datapoint for each period, only used for cumulated channel @@ -858,6 +992,7 @@ export abstract class AbstractHistoryChart implements OnInit { * @param toDate the To-Date */ protected queryHistoricTimeseriesEnergy(fromDate: Date, toDate: Date): Promise { + this.isDataExisting = true; const result: Promise = new Promise((resolve, reject) => { @@ -886,55 +1021,8 @@ export abstract class AbstractHistoryChart implements OnInit { }); }); }); - return result; - } - - /** - * Used to loadChart, dependent on the resolution - */ - protected loadChart() { - this.labels = []; - this.errorResponse = null; - const unit = calculateResolution(this.service, this.service.historyPeriod.value.from, this.service.historyPeriod.value.to).resolution.unit; - - // Show Barchart if resolution is days or months - if (ChronoUnit.isAtLeast(unit, ChronoUnit.Type.DAYS)) { - Promise.all([ - this.queryHistoricTimeseriesEnergyPerPeriod(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to), - this.queryHistoricTimeseriesEnergy(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to), - ]).then(([energyPeriodResponse, energyResponse]) => { - this.chartType = 'bar'; - this.chartObject = this.getChartData(); - - // TODO after chartjs migration, look for config - energyPeriodResponse = DateTimeUtils.normalizeTimestamps(unit, energyPeriodResponse); - - const displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, energyPeriodResponse, energyResponse); - this.datasets = displayValues.datasets; - this.legendOptions = displayValues.legendOptions; - this.labels = displayValues.labels; - this.channelData = displayValues.channelData; - this.setChartLabel(); - }); - } else { - // Shows Line-Chart - Promise.all([ - this.queryHistoricTimeseriesData(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to), - this.queryHistoricTimeseriesEnergy(this.service.historyPeriod.value.from, this.service.historyPeriod.value.to), - ]) - .then(([dataResponse, energyResponse]) => { - dataResponse = DateTimeUtils.normalizeTimestamps(unit, dataResponse); - this.chartType = 'line'; - this.chartObject = this.getChartData(); - const displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, dataResponse, energyResponse); - this.datasets = displayValues.datasets; - this.legendOptions = displayValues.legendOptions; - this.labels = displayValues.labels; - this.channelData = displayValues.channelData; - this.setChartLabel(); - }); - } + return result; } /** @@ -942,7 +1030,7 @@ export abstract class AbstractHistoryChart implements OnInit { */ protected setChartLabel() { const locale = this.service.translate.currentLang; - this.options = AbstractHistoryChart.getOptions(this.chartObject, this.chartType, this.service, this.translate, this.legendOptions, this.labels, this.channelData, locale, this.config, this.datasets); + this.options = AbstractHistoryChart.getOptions(this.chartObject, this.chartType, this.service, this.translate, this.legendOptions, this.channelData, locale, this.config, this.datasets, this.xAxisScalingType, this.labels); this.loading = false; this.stopSpinner(); } @@ -955,17 +1043,29 @@ export abstract class AbstractHistoryChart implements OnInit { this.datasets = HistoryUtils.createEmptyDataset(this.translate); this.labels = []; this.loading = false; - this.options.scales['y'] = { + this.options.scales["y"] = { display: false, }; + this.stopSpinner(); } - private updateChart() { - this.startSpinner(); - this.loadChart(); + /** + * Initialize Chart with no chartGrid or axes shown + */ + protected initializeChartWithBlankCanvas() { + this.datasets = []; + this.labels = []; + this.options.scales = {}; + this.loading = false; + this.stopSpinner(); } + /** + * Executed before {@link setChartLabel setChartLabel} + */ + protected beforeSetChartLabel(): void { } + /** * Gets the ChannelAddresses that should be queried. */ diff --git a/ui/src/app/shared/components/chart/chart.constants.spec.ts b/ui/src/app/shared/components/chart/chart.constants.spec.ts index 275330f89a6..2e38cb4cbe7 100644 --- a/ui/src/app/shared/components/chart/chart.constants.spec.ts +++ b/ui/src/app/shared/components/chart/chart.constants.spec.ts @@ -2,11 +2,11 @@ import { ChartDataset } from "chart.js"; import { History } from "src/app/edge/history/common/energy/chart/channels.spec"; -import { ChartAxis, HistoryUtils, YAxisTitle } from "../../service/utils"; +import { ChartAxis, HistoryUtils, YAxisType } from "../../service/utils"; import { ChartConstants } from "./chart.constants"; -describe('Chart constants', () => { - it('#calculateStepSize', () => { +describe("Chart constants", () => { + it("#calculateStepSize", () => { expect(ChartConstants.calculateStepSize(0, 10)).toEqual(2.5); expect(ChartConstants.calculateStepSize(0, null)).toEqual(null); expect(ChartConstants.calculateStepSize(-10, 0)).toEqual(2.5); @@ -16,12 +16,12 @@ describe('Chart constants', () => { expect(ChartConstants.calculateStepSize(10, 0)).toEqual(null); }); - it('#getScaleOptions', () => { - const yAxis: HistoryUtils.yAxes = { unit: YAxisTitle.ENERGY, position: 'left', yAxisId: ChartAxis.LEFT }; + it("#getScaleOptions", () => { + const yAxis: HistoryUtils.yAxes = { unit: YAxisType.ENERGY, position: "left", yAxisId: ChartAxis.LEFT }; const datasets: ChartDataset[] = [ { - data: History.DAY.dataChannelWithValues.result.data['_sum/ConsumptionActivePower'], - label: 'consumption', + data: History.DAY.dataChannelWithValues.result.data["_sum/ConsumptionActivePower"], + label: "consumption", yAxisID: ChartAxis.LEFT, }, ]; diff --git a/ui/src/app/shared/components/chart/chart.constants.ts b/ui/src/app/shared/components/chart/chart.constants.ts index 1223a86218b..93bf4dc58e7 100644 --- a/ui/src/app/shared/components/chart/chart.constants.ts +++ b/ui/src/app/shared/components/chart/chart.constants.ts @@ -1,7 +1,9 @@ // @ts-strict-ignore -import { ChartDataset } from "chart.js"; +import { ChartComponentLike, ChartDataset } from "chart.js"; +import { formatNumber } from "@angular/common"; import { TranslateService } from "@ngx-translate/core"; +import ChartDataLabels from "chartjs-plugin-datalabels"; import { HistoryUtils, Utils } from "../../service/utils"; import { ArrayUtils } from "../../utils/array/array.utils"; import { AbstractHistoryChart } from "./abstracthistorychart"; @@ -9,6 +11,45 @@ import { AbstractHistoryChart } from "./abstracthistorychart"; export class ChartConstants { public static readonly NUMBER_OF_Y_AXIS_TICKS: number = 6; public static readonly EMPTY_DATASETS: ChartDataset[] = []; + public static readonly REQUEST_TIMEOUT = 500; + + public static Plugins = class { + + public static readonly DEFAULT_EMPTY_SCREEN: (text: string) => ChartComponentLike = (text) => ({ + id: "empty_chart", + beforeDraw: (chart, args, options) => { + const { ctx } = <{ ctx: CanvasRenderingContext2D }>chart; + ctx.save(); + + ctx.textAlign = "center"; + ctx.fillStyle = "grey"; + ctx.font = "1.5em serif"; + ctx.fillText(text, chart.width / 2, chart.height / 2, chart.width); + ctx.restore(); + }, + defaults: { + color: "none", + }, + }); + + /** + * Configuration for plugin {@link ChartDataLabels ChartDataLabels} + * + * @param unit the unit to display + * @returns plugin configuration for {@link ChartDataLabels ChartDataLabels-plugin} + */ + public static readonly BAR_CHART_DATALABELS = (unit: string, disable: boolean): any => ({ + ...ChartDataLabels, + formatter: (value, ctx) => { + return formatNumber(value, "de", "1.0-0") + "\xa0" + unit ?? null; + }, + ...{ + anchor: "end", offset: -18, align: "start", clip: false, clamp: true, + }, + plugin: ChartDataLabels, + display: disable, + }); + }; /** * Default yScale CartesianScaleTypeRegistry.linear @@ -19,12 +60,12 @@ export class ChartConstants { * @param datasets the chart datasets * @returns scale options */ - public static DEFAULT_Y_SCALE_OPTIONS = (element: HistoryUtils.yAxes, translate: TranslateService, chartType: 'line' | 'bar', datasets: ChartDataset[], showYAxisTitle?: boolean) => { + public static DEFAULT_Y_SCALE_OPTIONS = (element: HistoryUtils.yAxes, translate: TranslateService, chartType: "line" | "bar", datasets: ChartDataset[], showYAxisTitle?: boolean) => { const beginAtZero: boolean = ChartConstants.isDataSeriesPositive(datasets); return { title: { - text: element.customTitle ?? AbstractHistoryChart.getYAxisTitle(element.unit, translate, chartType), + text: element.customTitle ?? AbstractHistoryChart.getYAxisType(element.unit, translate, chartType), display: showYAxisTitle, padding: 5, font: { @@ -37,7 +78,7 @@ export class ChartConstants { display: element.displayGrid ?? true, }, ticks: { - color: getComputedStyle(document.documentElement).getPropertyValue('--ion-color-text'), + color: getComputedStyle(document.documentElement).getPropertyValue("--ion-color-text"), padding: 5, maxTicksLimit: ChartConstants.NUMBER_OF_Y_AXIS_TICKS, }, @@ -53,7 +94,7 @@ export class ChartConstants { */ public static getScaleOptions(datasets: ChartDataset[], yAxis: HistoryUtils.yAxes): { min: number; max: number; stepSize: number; } | null { - return datasets?.filter(el => el['yAxisID'] === yAxis.yAxisId) + return datasets?.filter(el => el["yAxisID"] === yAxis.yAxisId) .reduce((arr, dataset) => { const min = Math.floor(Math.min(arr.min, ArrayUtils.findSmallestNumber(dataset.data as number[]))) ?? null; const max = Math.ceil(Math.max(arr.max, ArrayUtils.findBiggestNumber(dataset.data as number[]))) ?? null; @@ -74,12 +115,12 @@ export class ChartConstants { } /** - * Calculates the stepSize - * - * @param min the minimum - * @param max the maximum - * @returns the stepSize if max and min are not null and min is smaller than max - */ + * Calculates the stepSize + * + * @param min the minimum + * @param max the maximum + * @returns the stepSize if max and min are not null and min is smaller than max + */ public static calculateStepSize(min: number, max: number): number | null { if (min == null || max == null || min > max) { @@ -94,13 +135,17 @@ export class ChartConstants { } /** - * Checks if data series is positive. - * - * @param datasets the chart datasets - * @returns true, if only positive data exists - */ + * Checks if data series is positive. + * + * @param datasets the chart datasets + * @returns true, if only positive data exists + */ private static isDataSeriesPositive(datasets: ChartDataset[]): boolean { return datasets.filter(el => el != null).map(el => el.data).every(el => el.every(e => (e as number) >= 0)); } +} +export enum XAxisType { + NUMBER, + TIMESERIES, } diff --git a/ui/src/app/shared/components/chart/chart.module.ts b/ui/src/app/shared/components/chart/chart.module.ts index 63344695849..f86efd0b7df 100644 --- a/ui/src/app/shared/components/chart/chart.module.ts +++ b/ui/src/app/shared/components/chart/chart.module.ts @@ -21,7 +21,7 @@ import { ChartComponent } from "./chart"; NgChartsModule, CommonModule, NgxSpinnerModule.forRoot({ - type: 'ball-clip-rotate-multiple', + type: "ball-clip-rotate-multiple", }), HistoryDataErrorModule, RouterModule, diff --git a/ui/src/app/shared/components/chart/chart.ts b/ui/src/app/shared/components/chart/chart.ts index ad4e7311a1d..d2633c16f14 100644 --- a/ui/src/app/shared/components/chart/chart.ts +++ b/ui/src/app/shared/components/chart/chart.ts @@ -9,12 +9,12 @@ import { DefaultTypes } from "../../service/defaulttypes"; import { Edge, Service } from "../../shared"; @Component({ - selector: 'oe-chart', - templateUrl: './chart.html', + selector: "oe-chart", + templateUrl: "./chart.html", }) export class ChartComponent implements OnInit, OnChanges { - @Input() public title: string = ''; + @Input() public title: string = ""; @Input() public showPhases: boolean | null = null; @Input() public showTotal: boolean | null = null; @Output() public setShowPhases: EventEmitter = new EventEmitter(); @@ -37,7 +37,7 @@ export class ChartComponent implements OnInit, OnChanges { ) { } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; }); @@ -61,8 +61,8 @@ export class ChartComponent implements OnInit, OnChanges { await popover.present(); popover.onDidDismiss().then((data) => { - this.showPhases = data.role == 'Phases' ? data.data : this.showPhases; - this.showTotal = data.role == 'Total' ? data.data : this.showTotal; + this.showPhases = data.role == "Phases" ? data.data : this.showPhases; + this.showTotal = data.role == "Total" ? data.data : this.showTotal; this.setShowPhases.emit(this.showPhases); this.setShowTotal.emit(this.showTotal); }); diff --git a/ui/src/app/shared/components/components.module.ts b/ui/src/app/shared/components/components.module.ts index 27e6ab6e12f..8e39c2dc74e 100644 --- a/ui/src/app/shared/components/components.module.ts +++ b/ui/src/app/shared/components/components.module.ts @@ -1,23 +1,24 @@ -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { BrowserModule } from '@angular/platform-browser'; -import { RouterModule } from '@angular/router'; -import { IonicModule } from '@ionic/angular'; -import { TranslateModule } from '@ngx-translate/core'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from "@angular/core"; +import { ReactiveFormsModule } from "@angular/forms"; +import { BrowserModule } from "@angular/platform-browser"; +import { RouterModule } from "@angular/router"; +import { IonicModule } from "@ionic/angular"; +import { TranslateModule } from "@ngx-translate/core"; -import { PipeModule } from '../pipe/pipe'; -import { ChartModule } from './chart/chart.module'; -import { FlatWidgetComponent } from './flat/flat'; -import { FlatWidgetHorizontalLineComponent } from './flat/flat-widget-horizontal-line/flat-widget-horizontal-line'; -import { FlatWidgetLineComponent } from './flat/flat-widget-line/flat-widget-line'; -import { FlatWidgetLineItemComponent } from './flat/flat-widget-line/flat-widget-line-item/flat-widget-line-item'; -import { FlatWidgetPercentagebarComponent } from './flat/flat-widget-percentagebar/flat-widget-percentagebar'; -import { FooterComponent } from './footer/footer'; -import { FooterNavigationModule } from './footer/subnavigation/footerNavigation.module'; -import { HistoryDataErrorModule } from './history-data-error/history-data-error.module'; -import { ModalModule } from './modal/modal.module'; -import { PickdateModule } from './pickdate/pickdate.module'; -import { NotificationComponent } from './shared/notification/notification'; +import { PipeModule } from "../pipe/pipe"; +import { ChartModule } from "./chart/chart.module"; +import { FlatWidgetComponent } from "./flat/flat"; +import { FlatWidgetHorizontalLineComponent } from "./flat/flat-widget-horizontal-line/flat-widget-horizontal-line"; +import { FlatWidgetLineDividerComponent } from "./flat/flat-widget-line-divider/flat-widget-line-divider"; +import { FlatWidgetLineComponent } from "./flat/flat-widget-line/flat-widget-line"; +import { FlatWidgetLineItemComponent } from "./flat/flat-widget-line/flat-widget-line-item/flat-widget-line-item"; +import { FlatWidgetPercentagebarComponent } from "./flat/flat-widget-percentagebar/flat-widget-percentagebar"; +import { FooterComponent } from "./footer/footer"; +import { FooterNavigationModule } from "./footer/subnavigation/footerNavigation.module"; +import { HistoryDataErrorModule } from "./history-data-error/history-data-error.module"; +import { ModalModule } from "./modal/modal.module"; +import { PickdateModule } from "./pickdate/pickdate.module"; +import { NotificationComponent } from "./shared/notification/notification"; @NgModule({ imports: [ @@ -37,10 +38,11 @@ import { NotificationComponent } from './shared/notification/notification'; // Flat FlatWidgetComponent, - FlatWidgetLineComponent, FlatWidgetHorizontalLineComponent, - FlatWidgetPercentagebarComponent, + FlatWidgetLineComponent, + FlatWidgetLineDividerComponent, FlatWidgetLineItemComponent, + FlatWidgetPercentagebarComponent, // Others NotificationComponent, @@ -49,10 +51,11 @@ import { NotificationComponent } from './shared/notification/notification'; exports: [ // Flat FlatWidgetComponent, - FlatWidgetLineComponent, FlatWidgetHorizontalLineComponent, - FlatWidgetPercentagebarComponent, + FlatWidgetLineComponent, + FlatWidgetLineDividerComponent, FlatWidgetLineItemComponent, + FlatWidgetPercentagebarComponent, // Others NotificationComponent, diff --git a/ui/src/app/shared/components/edge/currentdata.spec.ts b/ui/src/app/shared/components/edge/currentdata.spec.ts index bb45316b2c0..feff8c76e70 100644 --- a/ui/src/app/shared/components/edge/currentdata.spec.ts +++ b/ui/src/app/shared/components/edge/currentdata.spec.ts @@ -1,55 +1,55 @@ -import { CurrentData } from './currentdata'; +import { CurrentData } from "./currentdata"; export function expectRatioToEqual(maxApparentPower: number | null, minDischargePower: number | null, effectivePower: number | null, result: number | null): void { expect(CurrentData.getEssPowerRatio(maxApparentPower, minDischargePower, effectivePower)).toEqual(result); } -describe('CurrentData', () => { - describe('#getEssPowerRatio', () => { +describe("CurrentData", () => { + describe("#getEssPowerRatio", () => { - it('should return the correct power ratio when effectivePower is positive', () => { + it("should return the correct power ratio when effectivePower is positive", () => { const maxApparentPower = 10000; const minDischargePower = -5000; expectRatioToEqual(maxApparentPower, minDischargePower, 2500, 0.25); }); - it('should return the correct power ratio when effectivePower is positive - different version', () => { + it("should return the correct power ratio when effectivePower is positive - different version", () => { const maxApparentPower = 10000; const minDischargePower = -3000; expectRatioToEqual(maxApparentPower, minDischargePower, 1000, 0.1); }); - it('should return 0 when effectivePower is null', () => { + it("should return 0 when effectivePower is null", () => { const maxApparentPower = 10000; const minDischargePower = -3000; expectRatioToEqual(maxApparentPower, minDischargePower, null, 0); }); - it('should return 0 when effectivePower is 0', () => { + it("should return 0 when effectivePower is 0", () => { const maxApparentPower = 10000; const minDischargePower = -3000; expectRatioToEqual(maxApparentPower, minDischargePower, 0, 0); }); - it('should handle negative effectivePower according to minDischargePower', () => { + it("should handle negative effectivePower according to minDischargePower", () => { const maxApparentPower = 10000; const minDischargePower = -5000; expectRatioToEqual(maxApparentPower, minDischargePower, -1000, -0.2); }); - it('should fall back to maxApparentPower if minDischargePower is not relevant', () => { + it("should fall back to maxApparentPower if minDischargePower is not relevant", () => { const maxApparentPower = 10000; const minDischargePower = 0; expectRatioToEqual(maxApparentPower, minDischargePower, -1000, 0); // Since minDischargePower is 0, we assume fall back to maxApparentPower }); - it('should return 0 when dividing by zero maxApparentPower', () => { + it("should return 0 when dividing by zero maxApparentPower", () => { const maxApparentPower = 0; const minDischargePower = -3000; expectRatioToEqual(maxApparentPower, minDischargePower, 1000, 0); }); - it('should return 0 when dividing by zero maxDischargePower with relevant edgeVersion', () => { + it("should return 0 when dividing by zero maxDischargePower with relevant edgeVersion", () => { const maxApparentPower = 10000; const minDischargePower = 0; expectRatioToEqual(maxApparentPower, minDischargePower, -1000, 0); diff --git a/ui/src/app/shared/components/edge/currentdata.ts b/ui/src/app/shared/components/edge/currentdata.ts index bdbd09b4be9..074b20ef8df 100644 --- a/ui/src/app/shared/components/edge/currentdata.ts +++ b/ui/src/app/shared/components/edge/currentdata.ts @@ -121,20 +121,20 @@ export class CurrentData { * > 0 => Buy from grid * < 0 => Sell to grid */ - const gridActivePower: number = c['_sum/GridActivePower']; - result.grid.activePowerL1 = c['_sum/GridActivePowerL1']; - result.grid.activePowerL2 = c['_sum/GridActivePowerL2']; - result.grid.activePowerL3 = c['_sum/GridActivePowerL3']; - result.grid.maxBuyActivePower = c['_sum/GridMaxActivePower']; + const gridActivePower: number = c["_sum/GridActivePower"]; + result.grid.activePowerL1 = c["_sum/GridActivePowerL1"]; + result.grid.activePowerL2 = c["_sum/GridActivePowerL2"]; + result.grid.activePowerL3 = c["_sum/GridActivePowerL3"]; + result.grid.maxBuyActivePower = c["_sum/GridMaxActivePower"]; if (!result.grid.maxBuyActivePower) { result.grid.maxBuyActivePower = 5000; } - result.grid.maxSellActivePower = c['_sum/GridMinActivePower'] * -1; + result.grid.maxSellActivePower = c["_sum/GridMinActivePower"] * -1; if (!result.grid.maxSellActivePower) { result.grid.maxSellActivePower = -5000; } - result.grid.gridMode = c['_sum/GridMode']; - result.grid.restrictionMode = c['ctrlEssLimiter14a0/RestrictionMode']; + result.grid.gridMode = c["_sum/GridMode"]; + result.grid.restrictionMode = c["ctrlEssLimiter14a0/RestrictionMode"]; if (gridActivePower > 0) { result.grid.sellActivePower = 0; result.grid.buyActivePower = gridActivePower; @@ -150,17 +150,17 @@ export class CurrentData { /* * Production */ - result.production.activePowerAc = c['_sum/ProductionAcActivePower']; - result.production.activePowerAcL1 = c['_sum/ProductionAcActivePowerL1']; - result.production.activePowerAcL2 = c['_sum/ProductionAcActivePowerL2']; - result.production.activePowerAcL3 = c['_sum/ProductionAcActivePowerL3']; - result.production.activePower = c['_sum/ProductionActivePower']; - result.production.maxActivePower = c['_sum/ProductionMaxActivePower']; + result.production.activePowerAc = c["_sum/ProductionAcActivePower"]; + result.production.activePowerAcL1 = c["_sum/ProductionAcActivePowerL1"]; + result.production.activePowerAcL2 = c["_sum/ProductionAcActivePowerL2"]; + result.production.activePowerAcL3 = c["_sum/ProductionAcActivePowerL3"]; + result.production.activePower = c["_sum/ProductionActivePower"]; + result.production.maxActivePower = c["_sum/ProductionMaxActivePower"]; if (!result.production.maxActivePower) { result.production.maxActivePower = 10000; } result.production.powerRatio = Utils.orElse(Utils.divideSafely(result.production.activePower, result.production.maxActivePower), 0); - result.production.activePowerDc = c['_sum/ProductionDcActualPower']; + result.production.activePowerDc = c["_sum/ProductionDcActualPower"]; } { @@ -169,18 +169,18 @@ export class CurrentData { * > 0 => Discharge * < 0 => Charge */ - result.storage.soc = c['_sum/EssSoc']; - result.storage.activePowerL1 = c['_sum/EssActivePowerL1']; - result.storage.activePowerL2 = c['_sum/EssActivePowerL2']; - result.storage.activePowerL3 = c['_sum/EssActivePowerL3']; - result.storage.maxApparentPower = c['_sum/EssMaxApparentPower']; - result.storage.capacity = c['_sum/EssCapacity']; - const essActivePower: number = c['_sum/EssActivePower']; + result.storage.soc = c["_sum/EssSoc"]; + result.storage.activePowerL1 = c["_sum/EssActivePowerL1"]; + result.storage.activePowerL2 = c["_sum/EssActivePowerL2"]; + result.storage.activePowerL3 = c["_sum/EssActivePowerL3"]; + result.storage.maxApparentPower = c["_sum/EssMaxApparentPower"]; + result.storage.capacity = c["_sum/EssCapacity"]; + const essActivePower: number = c["_sum/EssActivePower"]; if (!result.storage.maxApparentPower) { result.storage.maxApparentPower = 5000; } - result.storage.chargeActivePowerDc = c['_sum/ProductionDcActualPower']; + result.storage.chargeActivePowerDc = c["_sum/ProductionDcActualPower"]; if (essActivePower == null) { // keep 'null' } else if (essActivePower > 0) { @@ -240,11 +240,11 @@ export class CurrentData { /* * Consumption */ - result.consumption.activePower = c['_sum/ConsumptionActivePower']; - result.consumption.activePowerL1 = c['_sum/ConsumptionActivePowerL1']; - result.consumption.activePowerL2 = c['_sum/ConsumptionActivePowerL2']; - result.consumption.activePowerL3 = c['_sum/ConsumptionActivePowerL3']; - let consumptionMaxActivePower = c['_sum/ConsumptionMaxActivePower']; + result.consumption.activePower = c["_sum/ConsumptionActivePower"]; + result.consumption.activePowerL1 = c["_sum/ConsumptionActivePowerL1"]; + result.consumption.activePowerL2 = c["_sum/ConsumptionActivePowerL2"]; + result.consumption.activePowerL3 = c["_sum/ConsumptionActivePowerL3"]; + let consumptionMaxActivePower = c["_sum/ConsumptionMaxActivePower"]; if (!consumptionMaxActivePower) { consumptionMaxActivePower = 10000; } @@ -273,7 +273,7 @@ export class CurrentData { result.system.autarchy = CurrentData.calculateAutarchy(result.grid.buyActivePower, result.consumption.activePower); result.system.selfConsumption = Utils.calculateSelfConsumption(result.grid.sellActivePower, result.production.activePower); // State - result.system.state = c['_sum/State']; + result.system.state = c["_sum/State"]; } return result; } diff --git a/ui/src/app/shared/components/edge/edge.spec.ts b/ui/src/app/shared/components/edge/edge.spec.ts index c8433fb5cd0..4ec20ab0fe9 100644 --- a/ui/src/app/shared/components/edge/edge.spec.ts +++ b/ui/src/app/shared/components/edge/edge.spec.ts @@ -7,8 +7,8 @@ import { Websocket } from "../../shared"; import { EdgeConfig } from "./edgeconfig"; import { DummyConfig } from "./edgeconfig.spec"; -describe('Edge', () => { - const websocketSpyObject = jasmine.createSpyObj('Websocket', ['sendRequest']); +describe("Edge", () => { + const websocketSpyObject = jasmine.createSpyObj("Websocket", ["sendRequest"]); let websocket: Websocket; beforeEach(() => { @@ -20,13 +20,13 @@ describe('Edge', () => { websocket = TestBed.inject(Websocket); }); - it('#getFactoryPropertiesOldVersion', async () => { - const edge = DummyConfig.dummyEdge({ version: '2024.1.1' }); + it("#getFactoryPropertiesOldVersion", async () => { + const edge = DummyConfig.dummyEdge({ version: "2024.1.1" }); - const dummyConfig = DummyConfig.from(DummyConfig.Component.EVCS_KEBA_KECONTACT('evcs0')); + const dummyConfig = DummyConfig.from(DummyConfig.Component.EVCS_KEBA_KECONTACT("evcs0")); dummyConfig.factories[DummyConfig.Factory.EVCS_KEBA_KECONTACT.id].properties.push(new EdgeConfig.FactoryProperty()); - websocketSpyObject.sendRequest.and.resolveTo(new JsonrpcResponseSuccess('', { - payload: new GetEdgeConfigResponse('', dummyConfig), + websocketSpyObject.sendRequest.and.resolveTo(new JsonrpcResponseSuccess("", { + payload: new GetEdgeConfigResponse("", dummyConfig), })); const [factory, properties] = await edge.getFactoryProperties(websocket, DummyConfig.Factory.EVCS_KEBA_KECONTACT.id); @@ -34,20 +34,20 @@ describe('Edge', () => { expect(properties).toBe(dummyConfig.factories[DummyConfig.Factory.EVCS_KEBA_KECONTACT.id].properties); }); - it('#getFactoryPropertiesNewVersion', async () => { - const edge = DummyConfig.dummyEdge({ version: '2024.6.1' }); + it("#getFactoryPropertiesNewVersion", async () => { + const edge = DummyConfig.dummyEdge({ version: "2024.6.1" }); - const dummmyFactory = new EdgeConfig.Factory('dummy.factory.id', 'description'); + const dummmyFactory = new EdgeConfig.Factory("dummy.factory.id", "description"); const dummyProperties: EdgeConfig.FactoryProperty[] = [new EdgeConfig.FactoryProperty()]; - websocketSpyObject.sendRequest.and.resolveTo(new JsonrpcResponseSuccess('', { - payload: new GetPropertiesOfFactoryResponse('', { + websocketSpyObject.sendRequest.and.resolveTo(new JsonrpcResponseSuccess("", { + payload: new GetPropertiesOfFactoryResponse("", { factory: dummmyFactory, properties: dummyProperties, }), })); - const [factory, properties] = await edge.getFactoryProperties(websocket, 'dummy.factory.id'); + const [factory, properties] = await edge.getFactoryProperties(websocket, "dummy.factory.id"); expect(factory).toBe(dummmyFactory); expect(properties).toBe(dummyProperties); }); diff --git a/ui/src/app/shared/components/edge/edge.ts b/ui/src/app/shared/components/edge/edge.ts index 29a53ed556d..babbb91da9e 100644 --- a/ui/src/app/shared/components/edge/edge.ts +++ b/ui/src/app/shared/components/edge/edge.ts @@ -1,33 +1,32 @@ // @ts-strict-ignore -import { compareVersions } from 'compare-versions'; -import { BehaviorSubject, Subject } from 'rxjs'; -import { SumState } from 'src/app/index/shared/sumState'; - -import { CurrentData } from './currentdata'; -import { EdgeConfig } from './edgeconfig'; -import { filter, first } from 'rxjs/operators'; -import { JsonrpcResponseSuccess, JsonrpcRequest } from '../../jsonrpc/base'; -import { CurrentDataNotification } from '../../jsonrpc/notification/currentDataNotification'; -import { EdgeConfigNotification } from '../../jsonrpc/notification/edgeConfigNotification'; -import { SystemLogNotification } from '../../jsonrpc/notification/systemLogNotification'; -import { ComponentJsonApiRequest } from '../../jsonrpc/request/componentJsonApiRequest'; -import { CreateComponentConfigRequest } from '../../jsonrpc/request/createComponentConfigRequest'; -import { DeleteComponentConfigRequest } from '../../jsonrpc/request/deleteComponentConfigRequest'; -import { EdgeRpcRequest } from '../../jsonrpc/request/edgeRpcRequest'; -import { GetChannelRequest } from '../../jsonrpc/request/getChannelRequest'; -import { GetChannelsOfComponentRequest } from '../../jsonrpc/request/getChannelsOfComponentRequest'; -import { GetPropertiesOfFactoryRequest } from '../../jsonrpc/request/getPropertiesOfFactoryRequest'; -import { SubscribeChannelsRequest } from '../../jsonrpc/request/subscribeChannelsRequest'; -import { SubscribeSystemLogRequest } from '../../jsonrpc/request/subscribeSystemLogRequest'; -import { UpdateComponentConfigRequest } from '../../jsonrpc/request/updateComponentConfigRequest'; -import { GetChannelResponse } from '../../jsonrpc/response/getChannelResponse'; -import { Channel, GetChannelsOfComponentResponse } from '../../jsonrpc/response/getChannelsOfComponentResponse'; -import { GetPropertiesOfFactoryResponse } from '../../jsonrpc/response/getPropertiesOfFactoryResponse'; -import { ArrayUtils } from '../../service/arrayutils'; -import { ChannelAddress, SystemLog, Websocket, EdgePermission } from '../../shared'; -import { Role } from '../../type/role'; -import { GetEdgeConfigResponse } from '../../jsonrpc/response/getEdgeConfigResponse'; -import { GetEdgeConfigRequest } from '../../jsonrpc/request/getEdgeConfigRequest'; +import { compareVersions } from "compare-versions"; +import { BehaviorSubject, Subject } from "rxjs"; +import { filter, first } from "rxjs/operators"; +import { SumState } from "src/app/index/shared/sumState"; +import { JsonrpcRequest, JsonrpcResponseSuccess } from "../../jsonrpc/base"; +import { CurrentDataNotification } from "../../jsonrpc/notification/currentDataNotification"; +import { EdgeConfigNotification } from "../../jsonrpc/notification/edgeConfigNotification"; +import { SystemLogNotification } from "../../jsonrpc/notification/systemLogNotification"; +import { ComponentJsonApiRequest } from "../../jsonrpc/request/componentJsonApiRequest"; +import { CreateComponentConfigRequest } from "../../jsonrpc/request/createComponentConfigRequest"; +import { DeleteComponentConfigRequest } from "../../jsonrpc/request/deleteComponentConfigRequest"; +import { EdgeRpcRequest } from "../../jsonrpc/request/edgeRpcRequest"; +import { GetChannelRequest } from "../../jsonrpc/request/getChannelRequest"; +import { GetChannelsOfComponentRequest } from "../../jsonrpc/request/getChannelsOfComponentRequest"; +import { GetEdgeConfigRequest } from "../../jsonrpc/request/getEdgeConfigRequest"; +import { GetPropertiesOfFactoryRequest } from "../../jsonrpc/request/getPropertiesOfFactoryRequest"; +import { SubscribeChannelsRequest } from "../../jsonrpc/request/subscribeChannelsRequest"; +import { SubscribeSystemLogRequest } from "../../jsonrpc/request/subscribeSystemLogRequest"; +import { UpdateComponentConfigRequest } from "../../jsonrpc/request/updateComponentConfigRequest"; +import { GetChannelResponse } from "../../jsonrpc/response/getChannelResponse"; +import { Channel, GetChannelsOfComponentResponse } from "../../jsonrpc/response/getChannelsOfComponentResponse"; +import { GetEdgeConfigResponse } from "../../jsonrpc/response/getEdgeConfigResponse"; +import { GetPropertiesOfFactoryResponse } from "../../jsonrpc/response/getPropertiesOfFactoryResponse"; +import { ArrayUtils } from "../../service/arrayutils"; +import { ChannelAddress, EdgePermission, SystemLog, Websocket } from "../../shared"; +import { Role } from "../../type/role"; +import { CurrentData } from "./currentdata"; +import { EdgeConfig } from "./edgeconfig"; export class Edge { @@ -105,7 +104,7 @@ export class Edge { } const response = await this.sendRequest(websocket, new ComponentJsonApiRequest({ - componentId: '_componentManager', + componentId: "_componentManager", payload: new GetChannelRequest({ componentId: channel.componentId, channelId: channel.channelId, @@ -128,7 +127,7 @@ export class Edge { const config = await this.getFirstValidConfig(websocket); const component = config.components[componentId]; if (!component) { - throw new Error('Component not found'); + throw new Error("Component not found"); } return Object.entries(component.channels).reduce((p, c) => { return [...p, { id: c[0], ...c[1] }]; @@ -136,7 +135,7 @@ export class Edge { } const response = await this.sendRequest(websocket, new ComponentJsonApiRequest({ - componentId: '_componentManager', + componentId: "_componentManager", payload: new GetChannelsOfComponentRequest({ componentId: componentId }), })); @@ -146,7 +145,7 @@ export class Edge { public async getFactoryProperties(websocket: Websocket, factoryId: string): Promise<[EdgeConfig.Factory, EdgeConfig.FactoryProperty[]]> { if (EdgePermission.hasReducedFactories(this)) { const response = await this.sendRequest(websocket, new ComponentJsonApiRequest({ - componentId: '_componentManager', + componentId: "_componentManager", payload: new GetPropertiesOfFactoryRequest({ factoryId }), })); return [response.result.factory, response.result.properties]; @@ -318,7 +317,7 @@ export class Edge { const wrap = new EdgeRpcRequest({ edgeId: this.id, payload: request }); return new Promise((resolve, reject) => { ws.sendRequest(wrap).then(response => { - resolve(response['result']['payload']); + resolve(response["result"]["payload"]); }).catch(reason => { reject(reason); }); diff --git a/ui/src/app/shared/components/edge/edgeconfig.spec.ts b/ui/src/app/shared/components/edge/edgeconfig.spec.ts index 1c2daecc25f..8921e4235d6 100644 --- a/ui/src/app/shared/components/edge/edgeconfig.spec.ts +++ b/ui/src/app/shared/components/edge/edgeconfig.spec.ts @@ -43,7 +43,7 @@ export namespace DummyConfig { return ({ ...acc, [c.id]: c }); }, {}), factories: components?.reduce((p, c) => { - p[c.factory.id] = new EdgeConfig.Factory(c.factory.id, '', c.factory.natureIds); + p[c.factory.id] = new EdgeConfig.Factory(c.factory.id, "", c.factory.natureIds); return p; }, {}), }); @@ -76,6 +76,16 @@ export namespace DummyConfig { export namespace Factory { + export const SUM = { + id: "Core.Sum", + natureIds: [ + "io.openems.edge.common.sum.Sum", + "io.openems.edge.common.modbusslave.ModbusSlave", + "io.openems.edge.common.component.OpenemsComponent", + "io.openems.edge.timedata.api.TimedataProvider", + ], + }; + export const METER_SOCOMEC_THREEPHASE = { id: "Meter.Socomec.Threephase", natureIds: [ @@ -100,6 +110,17 @@ export namespace DummyConfig { ], }; + export const CHARGER_GOODWE_MPPT_TWO_STRING = { + id: "GoodWe.Charger.Mppt.Two-String", + natureIds: [ + "io.openems.edge.common.modbusslave.ModbusSlave", + "io.openems.edge.ess.dccharger.api.EssDcCharger", + "io.openems.edge.common.component.OpenemsComponent", + "io.openems.edge.goodwe.charger.GoodWeCharger", + "io.openems.edge.timedata.api.TimedataProvider", + ], + }; + export const EVCS_KEBA_KECONTACT = { id: "Evcs.Keba.KeContact", natureIds: [ @@ -155,10 +176,20 @@ export namespace DummyConfig { export namespace Component { + export const SUM = (id: string, alias?: string): Component => ({ + id: id, + alias: alias ?? id, + factoryId: "Core.Sum", + factory: Factory.SUM, + properties: { + enabled: "true", + }, + channels: {}, + }); export const EVCS_HARDY_BARTH = (id: string, alias?: string): Component => ({ id: id, alias: alias ?? id, - factoryId: 'Evcs.HardyBarth', + factoryId: "Evcs.HardyBarth", factory: Factory.EVCS_HARDY_BARTH, properties: { enabled: "true", @@ -169,7 +200,7 @@ export namespace DummyConfig { export const SOCOMEC_GRID_METER = (id: string, alias?: string): Component => ({ id: id, alias: alias ?? id, - factoryId: 'Meter.Socomec.Threephase', + factoryId: "Meter.Socomec.Threephase", factory: Factory.METER_SOCOMEC_THREEPHASE, properties: { invert: false, @@ -203,10 +234,23 @@ export namespace DummyConfig { channels: {}, }); + export const GOODWE_CHARGER_MPPT_TWO_STRING = (id: string, alias?: string): Component => ({ + id: id, + alias: alias, + factory: Factory.CHARGER_GOODWE_MPPT_TWO_STRING, + properties: { + "alias": "MPPT 1", + "enabled": true, + "essOrBatteryInverter.id": "batteryInverter0", + "mpptPort": "MPPT_1", + }, + channels: {}, + }); + export const SOLAR_EDGE_PV_INVERTER = (id: string, alias?: string): Component => ({ id: id, alias: alias ?? id, - factoryId: 'SolarEdge.PV-Inverter', + factoryId: "SolarEdge.PV-Inverter", factory: Factory.SOLAR_EDGE_PV_INVERTER, properties: { invert: false, @@ -219,7 +263,7 @@ export namespace DummyConfig { export const ESS_GENERIC_MANAGEDSYMMETRIC = (id: string, alias?: string): Component => ({ id: id, alias: alias ?? id, - factoryId: 'Ess.Generic.ManagedSymmetric', + factoryId: "Ess.Generic.ManagedSymmetric", factory: Factory.ESS_GENERIC_MANAGEDSYMMETRIC, properties: { invert: false, @@ -340,22 +384,22 @@ export const LINE_INFO = (text: string): OeFormlyViewTester.Field => ({ export namespace ChartConfig { - export const LINE_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', labelString?: string): OeChartTester.Dataset.Option => ({ - type: 'option', - options: { "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} } }, "scales": { "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kW", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": {} } } }, + export const LINE_CHART_OPTIONS = (period: string, chartType: "line" | "bar", labelString?: string): OeChartTester.Dataset.Option => ({ + type: "option", + options: { "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": "" } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} } }, "scales": { "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { ...(chartType === "line" ? { stacked: false } : {}), "title": { "text": "kW", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": {} } } }, }); - export const BAR_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', labelString?: string): OeChartTester.Dataset.Option => ({ - type: 'option', options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} } }, "scales": { - "x": { "stacked": true, "offset": true, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { ...(chartType === 'line' ? { stacked: false } : {}), "title": { "text": "kWh", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": {} }, + export const BAR_CHART_OPTIONS = (period: string, chartType: "line" | "bar", labelString?: string): OeChartTester.Dataset.Option => ({ + type: "option", options: { + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": "" } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} } }, "scales": { + "x": { "stacked": true, "offset": true, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { ...(chartType === "line" ? { stacked: false } : {}), "title": { "text": "kWh", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": {} }, }, }, }); } -describe('PersistencePriority', () => { - it('#isLessThan', () => { +describe("PersistencePriority", () => { + it("#isLessThan", () => { expect(PersistencePriority.isLessThan(PersistencePriority.LOW, PersistencePriority.HIGH)).toBe(true); expect(PersistencePriority.isLessThan(PersistencePriority.VERY_HIGH, PersistencePriority.HIGH)).toBe(false); expect(PersistencePriority.isLessThan(PersistencePriority.HIGH, PersistencePriority.HIGH)).toBe(false); diff --git a/ui/src/app/shared/components/edge/edgeconfig.ts b/ui/src/app/shared/components/edge/edgeconfig.ts index 345c440e2cf..c06af3db4ac 100644 --- a/ui/src/app/shared/components/edge/edgeconfig.ts +++ b/ui/src/app/shared/components/edge/edgeconfig.ts @@ -1,5 +1,5 @@ -import { ChannelAddress, Widgets } from '../../shared'; -import { Edge } from './edge'; +import { ChannelAddress, Widgets } from "../../shared"; +import { Edge } from "./edge"; export interface CategorizedComponents { category: { @@ -49,8 +49,8 @@ export class EdgeConfig { for (const componentId in this.components) { const component = this.components[componentId]; component.id = componentId; - if ('enabled' in component.properties) { - component.isEnabled = component.properties['enabled']; + if ("enabled" in component.properties) { + component.isEnabled = component.properties["enabled"]; } else { component.isEnabled = true; } @@ -106,13 +106,13 @@ export class EdgeConfig { public static listAvailableFactories(factories: { [id: string]: EdgeConfig.Factory }): CategorizedFactories[] { const allFactories: CategorizedFactories[] = [ { - category: { title: 'Simulatoren', icon: 'flask-outline' }, + category: { title: "Simulatoren", icon: "flask-outline" }, factories: Object.entries(factories) - .filter(([factory]) => factory.startsWith('Simulator.')) + .filter(([factory]) => factory.startsWith("Simulator.")) .map(e => e[1]), }, { - category: { title: 'Zähler', icon: 'speedometer-outline' }, + category: { title: "Zähler", icon: "speedometer-outline" }, factories: [ EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.meter.api.SymmetricMeter"), // TODO replaced by ElectricityMeter EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.meter.api.ElectricityMeter"), @@ -120,7 +120,7 @@ export class EdgeConfig { ].flat(2), }, { - category: { title: 'Speichersysteme', icon: 'battery-charging-outline' }, + category: { title: "Speichersysteme", icon: "battery-charging-outline" }, factories: [ EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.ess.api.SymmetricEss"), EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.battery.api.Battery"), @@ -128,7 +128,7 @@ export class EdgeConfig { ].flat(2), }, { - category: { title: 'Speichersystem-Steuerung', icon: 'options-outline' }, + category: { title: "Speichersystem-Steuerung", icon: "options-outline" }, factories: [ EdgeConfig.getFactoriesByIdsPattern(factories, [ /Controller\.Asymmetric.*/, @@ -138,86 +138,86 @@ export class EdgeConfig { ].flat(2), }, { - category: { title: 'E-Auto-Ladestation', icon: 'car-outline' }, + category: { title: "E-Auto-Ladestation", icon: "car-outline" }, factories: [ EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.evcs.api.Evcs"), ].flat(2), }, { - category: { title: 'E-Auto-Ladestation-Steuerung', icon: 'options-outline' }, + category: { title: "E-Auto-Ladestation-Steuerung", icon: "options-outline" }, factories: [ EdgeConfig.getFactoriesByIds(factories, [ - 'Controller.Evcs', + "Controller.Evcs", ]), ].flat(2), }, { - category: { title: 'I/Os', icon: 'log-in-outline' }, + category: { title: "I/Os", icon: "log-in-outline" }, factories: [ EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.io.api.DigitalOutput"), EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.io.api.DigitalInput"), ].flat(2), }, { - category: { title: 'I/O-Steuerung', icon: 'options-outline' }, + category: { title: "I/O-Steuerung", icon: "options-outline" }, factories: [ EdgeConfig.getFactoriesByIds(factories, [ - 'Controller.IO.ChannelSingleThreshold', - 'Controller.Io.FixDigitalOutput', - 'Controller.IO.HeatingElement', - 'Controller.Io.HeatPump.SgReady', + "Controller.IO.ChannelSingleThreshold", + "Controller.Io.FixDigitalOutput", + "Controller.IO.HeatingElement", + "Controller.Io.HeatPump.SgReady", ]), ].flat(2), }, { - category: { title: 'Temperatursensoren', icon: 'thermometer-outline' }, + category: { title: "Temperatursensoren", icon: "thermometer-outline" }, factories: [ EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.thermometer.api.Thermometer"), ].flat(2), }, { - category: { title: 'Externe Schnittstellen', icon: 'megaphone-outline' }, + category: { title: "Externe Schnittstellen", icon: "megaphone-outline" }, factories: [ EdgeConfig.getFactoriesByIds(factories, [ - 'Controller.Api.Websocket', - 'Controller.Api.ModbusTcp', - 'Controller.Api.ModbusTcp.ReadOnly', - 'Controller.Api.ModbusTcp.ReadWrite', - 'Controller.Api.MQTT', - 'Controller.Api.Rest.ReadOnly', - 'Controller.Api.Rest.ReadWrite', + "Controller.Api.Websocket", + "Controller.Api.ModbusTcp", + "Controller.Api.ModbusTcp.ReadOnly", + "Controller.Api.ModbusTcp.ReadWrite", + "Controller.Api.MQTT", + "Controller.Api.Rest.ReadOnly", + "Controller.Api.Rest.ReadWrite", ]), ].flat(2), }, { - category: { title: 'Cloud-Schnittstellen', icon: 'cloud-outline' }, + category: { title: "Cloud-Schnittstellen", icon: "cloud-outline" }, factories: [ EdgeConfig.getFactoriesByIdsPattern(factories, [ /TimeOfUseTariff\.*/, ]), EdgeConfig.getFactoriesByIds(factories, [ - 'Controller.Api.Backend', + "Controller.Api.Backend", ]), ].flat(2), }, { - category: { title: 'Geräte-Schnittstellen', icon: 'swap-horizontal-outline' }, + category: { title: "Geräte-Schnittstellen", icon: "swap-horizontal-outline" }, factories: [ EdgeConfig.getFactoriesByIds(factories, [ - 'Bridge.Mbus', - 'Bridge.Onewire', - 'Bridge.Modbus.Serial', - 'Bridge.Modbus.Tcp', - 'Kaco.BlueplanetHybrid10.Core', + "Bridge.Mbus", + "Bridge.Onewire", + "Bridge.Modbus.Serial", + "Bridge.Modbus.Tcp", + "Kaco.BlueplanetHybrid10.Core", ]), ].flat(2), }, { - category: { title: 'Standard-Komponenten', icon: 'resize-outline' }, + category: { title: "Standard-Komponenten", icon: "resize-outline" }, factories: [ EdgeConfig.getFactoriesByIds(factories, [ - 'Controller.Debug.Log', - 'Controller.Debug.DetailedLog', + "Controller.Debug.Log", + "Controller.Debug.DetailedLog", ]), EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.timedata.api.Timedata"), EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.predictor.api.oneday.Predictor24Hours"), @@ -225,13 +225,13 @@ export class EdgeConfig { ].flat(2), }, { - category: { title: 'Spezial-Controller', icon: 'repeat-outline' }, + category: { title: "Spezial-Controller", icon: "repeat-outline" }, factories: [ EdgeConfig.getFactoriesByNature(factories, "io.openems.edge.controller.api.Controller"), ].flat(2), }, { - category: { title: 'Weitere', icon: 'radio-button-off-outline' }, + category: { title: "Weitere", icon: "radio-button-off-outline" }, factories: Object.values(factories), }, ]; @@ -370,6 +370,21 @@ export class EdgeConfig { return result; } + /** + * Gets the Component Ids by the given Factories. + * + * @param factoryIds the Factory PIDs. + * @returns the component Ids + */ + public getComponentIdsByFactories(...factoryIds: string[]): string[] { + const componentIds: string[] = []; + + for (const factory of factoryIds) { + componentIds.push(...this.getComponentIdsByFactory(factory)); + } + return componentIds; + } + /** * Get Component-IDs of Components that implement the given Nature. * @@ -449,7 +464,7 @@ export class EdgeConfig { * Determines if Edge has a Storage device */ public hasStorage(): boolean { - if (this.getComponentIdsImplementingNature('io.openems.edge.ess.api.SymmetricEss').length > 0) { + if (this.getComponentIdsImplementingNature("io.openems.edge.ess.api.SymmetricEss").length > 0) { return true; } else { return false; @@ -460,7 +475,7 @@ export class EdgeConfig { * Determines if Edge has a Meter device */ public hasMeter(): boolean { - if (this.getComponentIdsImplementingNature('io.openems.edge.meter.api.ElectricityMeter').length > 0) { + if (this.getComponentIdsImplementingNature("io.openems.edge.meter.api.ElectricityMeter").length > 0) { return true; } else { return false; @@ -472,7 +487,7 @@ export class EdgeConfig { */ public hasProducer(): boolean { // Do we have a Ess DC Charger? - if (this.getComponentsImplementingNature('io.openems.edge.ess.dccharger.api.EssDcCharger').length > 0) { + if (this.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger").length > 0) { return true; } // Do we have a Meter with type PRODUCTION? @@ -491,25 +506,25 @@ export class EdgeConfig { * @returns true for PRODUCTION */ public isProducer(component: EdgeConfig.Component) { - if (component.properties['type'] == "PRODUCTION") { + if (component.properties["type"] == "PRODUCTION") { return true; } // TODO properties in OSGi Component annotations are not transmitted correctly with Apache Felix SCR switch (component.factoryId) { - case 'Fenecon.Dess.PvMeter': - case 'Fenecon.Mini.PvMeter': - case 'Fenecon.Pro.PvMeter': - case 'Kaco.BlueplanetHybrid10.PvInverter': - case 'Kostal.Piko.Charger': - case 'PV-Inverter.Fronius': - case 'PV-Inverter.KACO.blueplanet': - case 'PV-Inverter.Kostal': - case 'PV-Inverter.SMA.SunnyTripower': - case 'PV-Inverter.Solarlog': - case 'PV-Inverter.SunSpec': - case 'Simulator.ProductionMeter.Acting': - case 'Simulator.PvInverter': - case 'SolarEdge.PV-Inverter': + case "Fenecon.Dess.PvMeter": + case "Fenecon.Mini.PvMeter": + case "Fenecon.Pro.PvMeter": + case "Kaco.BlueplanetHybrid10.PvInverter": + case "Kostal.Piko.Charger": + case "PV-Inverter.Fronius": + case "PV-Inverter.KACO.blueplanet": + case "PV-Inverter.Kostal": + case "PV-Inverter.SMA.SunnyTripower": + case "PV-Inverter.Solarlog": + case "PV-Inverter.SunSpec": + case "Simulator.ProductionMeter.Acting": + case "Simulator.PvInverter": + case "SolarEdge.PV-Inverter": return true; } @@ -523,11 +538,11 @@ export class EdgeConfig { * @returns true for CONSUMPTION_METERED */ public isTypeConsumptionMetered(component: EdgeConfig.Component) { - if (component.properties['type'] == "CONSUMPTION_METERED") { + if (component.properties["type"] == "CONSUMPTION_METERED") { return true; } else { switch (component.factoryId) { - case 'GoodWe.EmergencyPowerMeter': + case "GoodWe.EmergencyPowerMeter": return true; } } @@ -546,14 +561,14 @@ export class EdgeConfig { } switch (component.factoryId) { - case 'GoodWe.Grid-Meter': - case 'Kaco.BlueplanetHybrid10.GridMeter': - case 'Fenecon.Dess.GridMeter': - case 'Fenecon.Mini.GridMeter': - case 'Kostal.Piko.GridMeter': - case 'SolarEdge.Grid-Meter': - case 'Simulator.GridMeter.Acting': - case 'Simulator.GridMeter.Reacting': + case "GoodWe.Grid-Meter": + case "Kaco.BlueplanetHybrid10.GridMeter": + case "Fenecon.Dess.GridMeter": + case "Fenecon.Mini.GridMeter": + case "Kostal.Piko.GridMeter": + case "SolarEdge.Grid-Meter": + case "Simulator.GridMeter.Acting": + case "Simulator.GridMeter.Reacting": return true; } return false; @@ -588,7 +603,7 @@ export class EdgeConfig { for (const entry of factories) { const components: EdgeConfig.Component[] = []; for (const factory of entry.factories) { - components.concat(...this.getComponentsByFactory(factory.id)); + components.push(...this.getComponentsByFactory(factory.id)); } allComponents.push({ category: entry.category, @@ -688,7 +703,7 @@ export namespace PersistencePriority { * @returns true if prio1 is less than prio2 */ export function isLessThan(prio1: string, prio2: string): boolean { - if (typeof prio1 !== 'string' || typeof prio2 !== 'string') { + if (typeof prio1 !== "string" || typeof prio2 !== "string") { return false; } return Object.keys(PersistencePriority).indexOf(prio1) < Object.keys(PersistencePriority).indexOf(prio2); diff --git a/ui/src/app/shared/components/edge/meter/currentVoltage/chart/asymmetricMeter.ts b/ui/src/app/shared/components/edge/meter/currentVoltage/chart/asymmetricMeter.ts new file mode 100644 index 00000000000..54d5f05ee5c --- /dev/null +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/chart/asymmetricMeter.ts @@ -0,0 +1,67 @@ +import { Component } from "@angular/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { Phase } from "src/app/shared/components/shared/phase"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress } from "src/app/shared/shared"; + +@Component({ + selector: "currentVoltageAsymmetricChart", + templateUrl: "../../../../../components/chart/abstracthistorychart.html", +}) +export class CurrentVoltageAsymmetricChartComponent extends AbstractHistoryChart { + + protected override getChartData(): HistoryUtils.ChartData { + + const component = this.config.getComponent(this.route.snapshot.params.componentId); + const currentPhasesColors: string[] = ["rgb(246, 180, 137)", "rgb(238, 120, 42)", "rgb(118, 52, 9)"]; + const voltagePhasesColors: string[] = ["rgb(255, 0, 0)", "rgb(133, 0, 0)", "rgb(71, 0, 0)"]; + const chartObject: HistoryUtils.ChartData = { + input: [ + ...Phase.THREE_PHASE.map((phase) => ({ + name: "Current" + phase, + powerChannel: ChannelAddress.fromString(component.id + "/Current" + phase), + })), + ...Phase.THREE_PHASE.map((phase) => ({ + name: "Voltage" + phase, + powerChannel: ChannelAddress.fromString(component.id + "/Voltage" + phase), + })), + ], + output: (data: HistoryUtils.ChannelData) => [ + ...Phase.THREE_PHASE.map((phase, index) => ({ + name: this.translate.instant("Edge.History.CURRENT") + " " + phase, + converter: () => { + return data["Current" + phase]; + }, + hideShadow: true, + color: currentPhasesColors[index], + yAxisId: ChartAxis.RIGHT, + })), + ...Phase.THREE_PHASE.map((phase, index) => ({ + name: this.translate.instant("Edge.History.VOLTAGE") + " " + phase, + converter: () => { + return data["Voltage" + phase]; + }, + hideShadow: true, + color: voltagePhasesColors[index], + })), + ], + tooltip: { + formatNumber: "1.1-2", + afterTitle: this.translate.instant("General.TOTAL"), + }, + yAxes: [{ + unit: YAxisType.VOLTAGE, + position: "left", + yAxisId: ChartAxis.LEFT, + }, + { + unit: YAxisType.CURRENT, + position: "right", + yAxisId: ChartAxis.RIGHT, + }, + ], + }; + + return chartObject; + } +} diff --git a/ui/src/app/shared/components/edge/meter/currentVoltage/chart/chart.ts b/ui/src/app/shared/components/edge/meter/currentVoltage/chart/chart.ts deleted file mode 100644 index 917ecd79649..00000000000 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/chart/chart.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractHistoryChart } from 'src/app/shared/components/chart/abstracthistorychart'; -import { ChartAxis, HistoryUtils, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress } from 'src/app/shared/shared'; - -@Component({ - selector: 'currentVoltageChart', - templateUrl: '../../../../../components/chart/abstracthistorychart.html', -}) -export class CurrentVoltageChartComponent extends AbstractHistoryChart { - - protected override getChartData(): HistoryUtils.ChartData { - - const component = this.config.getComponent(this.route.snapshot.params.componentId); - const chartObject: HistoryUtils.ChartData = { - input: [{ - name: component.id + 'Current', - powerChannel: ChannelAddress.fromString(component.id + '/Current'), - - }, - { - name: component.id + 'Voltage', - powerChannel: ChannelAddress.fromString(component.id + '/Voltage'), - }, - ], - output: (data: HistoryUtils.ChannelData) => [ - - { - name: this.translate.instant('Edge.History.CURRENT'), - converter: () => { - return data[component.id + 'Current']; - }, - color: 'rgb(253,197,7)', - hiddenOnInit: false, - stack: 1, - yAxisId: ChartAxis.RIGHT, - }, - { - name: this.translate.instant('Edge.History.VOLTAGE'), - converter: () => { - return data[component.id + 'Voltage']; - }, - color: 'rgb(255,0,0)', - hiddenOnInit: false, - stack: 1, - yAxisId: ChartAxis.LEFT, - }, - ], - tooltip: { - formatNumber: '1.1-2', - afterTitle: this.translate.instant('General.TOTAL'), - }, - yAxes: [{ - unit: YAxisTitle.VOLTAGE, - position: 'left', - yAxisId: ChartAxis.LEFT, - }, - { - unit: YAxisTitle.CURRENT, - position: 'right', - yAxisId: ChartAxis.RIGHT, - }, - ], - }; - - return chartObject; - } -} diff --git a/ui/src/app/shared/components/edge/meter/currentVoltage/chart/symmetricMeter.ts b/ui/src/app/shared/components/edge/meter/currentVoltage/chart/symmetricMeter.ts new file mode 100644 index 00000000000..e7998dda9f6 --- /dev/null +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/chart/symmetricMeter.ts @@ -0,0 +1,70 @@ +import { Component } from "@angular/core"; +import { AbstractHistoryChart } from "src/app/shared/components/chart/abstracthistorychart"; +import { ChartAxis, HistoryUtils, YAxisType } from "src/app/shared/service/utils"; +import { ChannelAddress } from "src/app/shared/shared"; + +@Component({ + selector: "currentVoltageChart", + templateUrl: "../../../../../components/chart/abstracthistorychart.html", +}) +export class CurrentVoltageSymmetricChartComponent extends AbstractHistoryChart { + + protected override getChartData(): HistoryUtils.ChartData { + + const component = this.config.getComponent(this.route.snapshot.params.componentId); + const chartObject: HistoryUtils.ChartData = { + input: [ + { + name: component.id + "Current", + powerChannel: ChannelAddress.fromString(component.id + "/Current"), + + }, + { + name: component.id + "Voltage", + powerChannel: ChannelAddress.fromString(component.id + "/Voltage"), + }, + ], + output: (data: HistoryUtils.ChannelData) => [ + + { + name: this.translate.instant("Edge.History.CURRENT"), + converter: () => { + return data[component.id + "Current"]; + }, + color: "rgb(253,197,7)", + hiddenOnInit: false, + stack: 1, + + yAxisId: ChartAxis.RIGHT, + }, + { + name: this.translate.instant("Edge.History.VOLTAGE"), + converter: () => { + return data[component.id + "Voltage"]; + }, + color: "rgb(255,0,0)", + hiddenOnInit: false, + stack: 1, + yAxisId: ChartAxis.LEFT, + }, + ], + tooltip: { + formatNumber: "1.1-2", + afterTitle: this.translate.instant("General.TOTAL"), + }, + yAxes: [{ + unit: YAxisType.VOLTAGE, + position: "left", + yAxisId: ChartAxis.LEFT, + }, + { + unit: YAxisType.CURRENT, + position: "right", + yAxisId: ChartAxis.RIGHT, + }, + ], + }; + + return chartObject; + } +} diff --git a/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltage.overview.html b/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltage.overview.html index 4bdf6ae256a..71727e415e6 100644 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltage.overview.html +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltage.overview.html @@ -1,6 +1,8 @@ - - + + + diff --git a/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltage.overview.ts b/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltage.overview.ts index 6871370d228..698d2bc6966 100644 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltage.overview.ts +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltage.overview.ts @@ -1,7 +1,15 @@ -import { Component } from '@angular/core'; -import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/abstractHistoryChartOverview'; +import { Component } from "@angular/core"; +import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview"; @Component({ - templateUrl: './currentVoltage.overview.html', + templateUrl: "./currentVoltage.overview.html", }) -export class CurrentAndVoltageOverviewComponent extends AbstractHistoryChartOverview { } +export class CurrentAndVoltageOverviewComponent extends AbstractHistoryChartOverview { + + protected isMeterAsymmetric: boolean | null = null; + + protected override afterIsInitialized(): void { + this.isMeterAsymmetric = this.config.hasComponentNature("io.openems.edge.meter.api.ElectricityMeter", + this.route.snapshot.params.componentId); + } +} diff --git a/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts b/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts index 79755fd35f5..8455ccf34b3 100644 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts @@ -8,8 +8,8 @@ import { FooterNavigationModule } from "src/app/shared/components/footer/subnavi import { ChartModule } from "../../../chart/chart.module"; import { HistoryDataErrorModule } from "../../../history-data-error/history-data-error.module"; import { PickdateModule } from "../../../pickdate/pickdate.module"; - -import { CurrentVoltageChartComponent } from "./chart/chart"; +import { CurrentVoltageAsymmetricChartComponent } from "./chart/asymmetricMeter"; +import { CurrentVoltageSymmetricChartComponent } from "./chart/symmetricMeter"; import { CurrentAndVoltageOverviewComponent } from "./currentVoltage.overview"; @NgModule({ @@ -22,18 +22,20 @@ import { CurrentAndVoltageOverviewComponent } from "./currentVoltage.overview"; NgChartsModule, HistoryDataErrorModule, NgxSpinnerModule.forRoot({ - type: 'ball-clip-rotate-multiple', + type: "ball-clip-rotate-multiple", }), ChartModule, PickdateModule, ], declarations: [ CurrentAndVoltageOverviewComponent, - CurrentVoltageChartComponent, + CurrentVoltageAsymmetricChartComponent, + CurrentVoltageSymmetricChartComponent, ], exports: [ CurrentAndVoltageOverviewComponent, - CurrentVoltageChartComponent, + CurrentVoltageAsymmetricChartComponent, + CurrentVoltageSymmetricChartComponent, ], }) export class CurrentVoltageModule { } diff --git a/ui/src/app/shared/components/edge/meter/electricity/modal.component.html b/ui/src/app/shared/components/edge/meter/electricity/modal.component.html index 6a899a8f470..389bd90116b 100644 --- a/ui/src/app/shared/components/edge/meter/electricity/modal.component.html +++ b/ui/src/app/shared/components/edge/meter/electricity/modal.component.html @@ -3,4 +3,4 @@ [converter]="Utils.CONVERT_TO_WATT"> - \ No newline at end of file + diff --git a/ui/src/app/shared/components/edge/meter/electricity/modal.component.ts b/ui/src/app/shared/components/edge/meter/electricity/modal.component.ts index 7e41b9f447d..6e6d6e981a2 100644 --- a/ui/src/app/shared/components/edge/meter/electricity/modal.component.ts +++ b/ui/src/app/shared/components/edge/meter/electricity/modal.component.ts @@ -1,12 +1,12 @@ -import { Component, OnInit } from '@angular/core'; -import { AbstractModalLine } from 'src/app/shared/components/modal/abstract-modal-line'; -import { TextIndentation } from 'src/app/shared/components/modal/modal-line/modal-line'; -import { ChannelAddress, CurrentData, Utils } from 'src/app/shared/shared'; -import { Role } from 'src/app/shared/type/role'; +import { Component, OnInit } from "@angular/core"; +import { AbstractModalLine } from "src/app/shared/components/modal/abstract-modal-line"; +import { TextIndentation } from "src/app/shared/components/modal/modal-line/modal-line"; +import { ChannelAddress, CurrentData, Utils } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; @Component({ - selector: 'oe-electricity-meter', - templateUrl: './modal.component.html', + selector: "oe-electricity-meter", + templateUrl: "./modal.component.html", }) export class ElectricityMeterComponent extends AbstractModalLine implements OnInit { @@ -24,9 +24,9 @@ export class ElectricityMeterComponent extends AbstractModalLine implements OnIn const channelAddresses: ChannelAddress[] = []; for (const phase of [1, 2, 3]) { channelAddresses.push( - new ChannelAddress(this.component.id, 'CurrentL' + phase), - new ChannelAddress(this.component.id, 'VoltageL' + phase), - new ChannelAddress(this.component.id, 'ActivePowerL' + phase), + new ChannelAddress(this.component.id, "CurrentL" + phase), + new ChannelAddress(this.component.id, "VoltageL" + phase), + new ChannelAddress(this.component.id, "ActivePowerL" + phase), ); } return channelAddresses; @@ -34,11 +34,11 @@ export class ElectricityMeterComponent extends AbstractModalLine implements OnIn protected override onCurrentData(currentData: CurrentData): void { this.phases.forEach((phase) => { - const power = currentData.allComponents[this.component.id + '/ActivePower' + phase.key]; + const power = currentData.allComponents[this.component.id + "/ActivePower" + phase.key]; phase.name = "Phase " + phase.key; phase.power = Utils.absSafely(power); - phase.current = currentData.allComponents[this.component.id + '/Current' + phase.key]; - phase.voltage = currentData.allComponents[this.component.id + '/Voltage' + phase.key]; + phase.current = currentData.allComponents[this.component.id + "/Current" + phase.key]; + phase.voltage = currentData.allComponents[this.component.id + "/Voltage" + phase.key]; }); } } diff --git a/ui/src/app/shared/components/edge/meter/esscharger/modal.component.html b/ui/src/app/shared/components/edge/meter/esscharger/modal.component.html index 8b551aa89f7..d607901c8df 100644 --- a/ui/src/app/shared/components/edge/meter/esscharger/modal.component.html +++ b/ui/src/app/shared/components/edge/meter/esscharger/modal.component.html @@ -7,4 +7,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/edge/meter/esscharger/modal.component.ts b/ui/src/app/shared/components/edge/meter/esscharger/modal.component.ts index a2619bfaa54..f469c1420f2 100644 --- a/ui/src/app/shared/components/edge/meter/esscharger/modal.component.ts +++ b/ui/src/app/shared/components/edge/meter/esscharger/modal.component.ts @@ -1,12 +1,12 @@ -import { Component, Input } from '@angular/core'; -import { Converter } from 'src/app/shared/components/shared/converter'; -import { Utils } from 'src/app/shared/shared'; -import { Role } from 'src/app/shared/type/role'; -import { EdgeConfig } from '../../edgeconfig'; +import { Component, Input } from "@angular/core"; +import { Converter } from "src/app/shared/components/shared/converter"; +import { Utils } from "src/app/shared/shared"; +import { Role } from "src/app/shared/type/role"; +import { EdgeConfig } from "../../edgeconfig"; @Component({ - selector: 'oe-ess-charger', - templateUrl: './modal.component.html', + selector: "oe-ess-charger", + templateUrl: "./modal.component.html", }) export class EssChargerComponent { @Input({ required: true }) public component!: EdgeConfig.Component; diff --git a/ui/src/app/shared/components/edge/meter/meter.module.ts b/ui/src/app/shared/components/edge/meter/meter.module.ts index a8286187170..c3ffddae822 100644 --- a/ui/src/app/shared/components/edge/meter/meter.module.ts +++ b/ui/src/app/shared/components/edge/meter/meter.module.ts @@ -21,7 +21,7 @@ import { EssChargerComponent } from "./esscharger/modal.component"; NgChartsModule, CommonModule, NgxSpinnerModule.forRoot({ - type: 'ball-clip-rotate-multiple', + type: "ball-clip-rotate-multiple", }), HistoryDataErrorModule, ModalModule, diff --git a/ui/src/app/shared/components/flat/abstract-flat-widget-line.ts b/ui/src/app/shared/components/flat/abstract-flat-widget-line.ts index cb3ea6c980e..48738330c12 100644 --- a/ui/src/app/shared/components/flat/abstract-flat-widget-line.ts +++ b/ui/src/app/shared/components/flat/abstract-flat-widget-line.ts @@ -5,7 +5,7 @@ import { ModalController } from "@ionic/angular"; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { ChannelAddress, Edge, Service, Websocket } from "src/app/shared/shared"; -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidv4 } from "uuid"; import { DataService } from "../shared/dataservice"; import { Filter } from "../shared/filter"; @@ -86,7 +86,7 @@ export abstract class AbstractFlatWidgetLine implements OnChanges, OnDestroy { } protected subscribe(channelAddress: ChannelAddress) { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; this.dataService.getValues([channelAddress], this.edge); diff --git a/ui/src/app/shared/components/flat/abstract-flat-widget.ts b/ui/src/app/shared/components/flat/abstract-flat-widget.ts index b18b788fb48..bddb7f5283e 100644 --- a/ui/src/app/shared/components/flat/abstract-flat-widget.ts +++ b/ui/src/app/shared/components/flat/abstract-flat-widget.ts @@ -1,17 +1,18 @@ // @ts-strict-ignore import { Directive, Inject, Input, OnDestroy, OnInit } from "@angular/core"; -import { ActivatedRoute } from "@angular/router"; +import { ActivatedRoute, Router } from "@angular/router"; import { ModalController } from "@ionic/angular"; import { TranslateService } from "@ngx-translate/core"; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { ChannelAddress, CurrentData, Edge, EdgeConfig, Utils } from "src/app/shared/shared"; -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidv4 } from "uuid"; -import { DataService } from "../shared/dataservice"; -import { Converter } from "../shared/converter"; -import { Websocket } from "../../service/websocket"; +import { FormBuilder, FormGroup } from "@angular/forms"; import { Service } from "../../service/service"; +import { Websocket } from "../../service/websocket"; +import { Converter } from "../shared/converter"; +import { DataService } from "../shared/dataservice"; @Directive() export abstract class AbstractFlatWidget implements OnInit, OnDestroy { @@ -30,6 +31,7 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy { public config: EdgeConfig = null; public component: EdgeConfig.Component = null; public stopOnDestroy: Subject = new Subject(); + public formGroup: FormGroup | null = null; private selector: string = uuidv4(); @@ -40,11 +42,13 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy { @Inject(ModalController) protected modalController: ModalController, @Inject(TranslateService) protected translate: TranslateService, protected dataService: DataService, + protected formBuilder: FormBuilder, + protected router: Router, ) { } public ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { // store important variables publically this.edge = edge; @@ -65,6 +69,8 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy { this.onCurrentData(value); this.afterOnCurrentData(); }); + + this.formGroup = this.getFormGroup(); }); }); } @@ -107,4 +113,9 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy { * Gets called after {@link onCurrentData}, every time the currentValue changes */ protected afterOnCurrentData() { } + + /** Gets the FormGroup of the current Component */ + protected getFormGroup(): FormGroup | null { + return null; + } } diff --git a/ui/src/app/shared/components/flat/flat-widget-horizontal-line/flat-widget-horizontal-line.html b/ui/src/app/shared/components/flat/flat-widget-horizontal-line/flat-widget-horizontal-line.html index a38f40454db..1a5d6a96871 100644 --- a/ui/src/app/shared/components/flat/flat-widget-horizontal-line/flat-widget-horizontal-line.html +++ b/ui/src/app/shared/components/flat/flat-widget-horizontal-line/flat-widget-horizontal-line.html @@ -9,4 +9,4 @@
-
\ No newline at end of file + diff --git a/ui/src/app/shared/components/flat/flat-widget-horizontal-line/flat-widget-horizontal-line.ts b/ui/src/app/shared/components/flat/flat-widget-horizontal-line/flat-widget-horizontal-line.ts index 0538ef06be6..514fbd0c68b 100644 --- a/ui/src/app/shared/components/flat/flat-widget-horizontal-line/flat-widget-horizontal-line.ts +++ b/ui/src/app/shared/components/flat/flat-widget-horizontal-line/flat-widget-horizontal-line.ts @@ -4,8 +4,8 @@ import { Component, Input } from "@angular/core"; * Shows a horizontal line on all but the last entry of a "flat-widget" or a "simple line" */ @Component({ - selector: 'oe-flat-widget-horizontal-line', - templateUrl: './flat-widget-horizontal-line.html', + selector: "oe-flat-widget-horizontal-line", + templateUrl: "./flat-widget-horizontal-line.html", }) export class FlatWidgetHorizontalLineComponent { /** Components-Array to iterate over */ diff --git a/ui/src/app/shared/components/flat/flat-widget-line-divider/flat-widget-line-divider.html b/ui/src/app/shared/components/flat/flat-widget-line-divider/flat-widget-line-divider.html new file mode 100644 index 00000000000..4837d923c57 --- /dev/null +++ b/ui/src/app/shared/components/flat/flat-widget-line-divider/flat-widget-line-divider.html @@ -0,0 +1 @@ + diff --git a/ui/src/app/shared/components/flat/flat-widget-line-divider/flat-widget-line-divider.ts b/ui/src/app/shared/components/flat/flat-widget-line-divider/flat-widget-line-divider.ts new file mode 100644 index 00000000000..059b5e487fe --- /dev/null +++ b/ui/src/app/shared/components/flat/flat-widget-line-divider/flat-widget-line-divider.ts @@ -0,0 +1,26 @@ +// @ts-strict-ignore +import { Component, Input } from "@angular/core"; +import { Icon } from "src/app/shared/type/widget"; + +/** + * Inserts a transparent divider + */ +@Component({ + selector: "oe-flat-widget-line-divider", + templateUrl: "./flat-widget-line-divider.html", +}) +export class FlatWidgetLineDividerComponent { + + /** + * Info-Text, displayed on the right side, optional style for all lines + * Multiple lines with own style is possible + */ + @Input() public info: { text: string, lineStyle?: string }[] | string; + + /** Icon, displayed on the left side */ + @Input() protected icon: Icon; + + @Input() protected lineStyle: string; + + @Input() protected rowStyle: string; +} diff --git a/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line-item/flat-widget-line-item.html b/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line-item/flat-widget-line-item.html index 17bd64df05e..7ac84753d40 100644 --- a/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line-item/flat-widget-line-item.html +++ b/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line-item/flat-widget-line-item.html @@ -1,4 +1,4 @@   {{ displayValue }} - \ No newline at end of file + diff --git a/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line.html b/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line.html index 48644948aae..46424574ca4 100644 --- a/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line.html +++ b/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line.html @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line.ts b/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line.ts index 78d3dcabd73..288f0f5aced 100644 --- a/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line.ts +++ b/ui/src/app/shared/components/flat/flat-widget-line/flat-widget-line.ts @@ -3,8 +3,8 @@ import { Component, Input } from "@angular/core"; import { AbstractFlatWidgetLine } from "../abstract-flat-widget-line"; @Component({ - selector: 'oe-flat-widget-line', - templateUrl: './flat-widget-line.html', + selector: "oe-flat-widget-line", + templateUrl: "./flat-widget-line.html", }) export class FlatWidgetLineComponent extends AbstractFlatWidgetLine { /** Name for parameter, displayed on the left side */ diff --git a/ui/src/app/shared/components/flat/flat-widget-percentagebar/flat-widget-percentagebar.html b/ui/src/app/shared/components/flat/flat-widget-percentagebar/flat-widget-percentagebar.html index 8c5bb50478f..5570abc71b8 100644 --- a/ui/src/app/shared/components/flat/flat-widget-percentagebar/flat-widget-percentagebar.html +++ b/ui/src/app/shared/components/flat/flat-widget-percentagebar/flat-widget-percentagebar.html @@ -1,10 +1,10 @@ - - - - + + + {{ displayValue | unitvalue: '%' }} - \ No newline at end of file + diff --git a/ui/src/app/shared/components/flat/flat-widget-percentagebar/flat-widget-percentagebar.ts b/ui/src/app/shared/components/flat/flat-widget-percentagebar/flat-widget-percentagebar.ts index f4cadb375fa..668caef9e60 100644 --- a/ui/src/app/shared/components/flat/flat-widget-percentagebar/flat-widget-percentagebar.ts +++ b/ui/src/app/shared/components/flat/flat-widget-percentagebar/flat-widget-percentagebar.ts @@ -2,7 +2,7 @@ import { Component } from "@angular/core"; import { AbstractFlatWidgetLine } from "../abstract-flat-widget-line"; @Component({ - selector: 'oe-flat-widget-percentagebar', - templateUrl: './flat-widget-percentagebar.html', + selector: "oe-flat-widget-percentagebar", + templateUrl: "./flat-widget-percentagebar.html", }) export class FlatWidgetPercentagebarComponent extends AbstractFlatWidgetLine { } diff --git a/ui/src/app/shared/components/flat/flat-widget.component.html b/ui/src/app/shared/components/flat/flat-widget.component.html index 5efe3ab68f3..a969eb76a61 100644 --- a/ui/src/app/shared/components/flat/flat-widget.component.html +++ b/ui/src/app/shared/components/flat/flat-widget.component.html @@ -16,4 +16,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/flat/flat.html b/ui/src/app/shared/components/flat/flat.html index e40a1627541..0e2ae2de349 100644 --- a/ui/src/app/shared/components/flat/flat.html +++ b/ui/src/app/shared/components/flat/flat.html @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/flat/flat.ts b/ui/src/app/shared/components/flat/flat.ts index 5d651dd208f..a2642ad0b75 100644 --- a/ui/src/app/shared/components/flat/flat.ts +++ b/ui/src/app/shared/components/flat/flat.ts @@ -1,10 +1,10 @@ // @ts-strict-ignore -import { Component, Input } from '@angular/core'; -import { Icon } from 'src/app/shared/type/widget'; +import { Component, Input } from "@angular/core"; +import { Icon } from "src/app/shared/type/widget"; @Component({ - selector: 'oe-flat-widget', - templateUrl: './flat.html', + selector: "oe-flat-widget", + templateUrl: "./flat.html", }) export class FlatWidgetComponent { diff --git a/ui/src/app/shared/components/footer/footer.ts b/ui/src/app/shared/components/footer/footer.ts index a285d522f4e..2183f132dea 100644 --- a/ui/src/app/shared/components/footer/footer.ts +++ b/ui/src/app/shared/components/footer/footer.ts @@ -2,13 +2,13 @@ import { Component, HostBinding, OnInit } from "@angular/core"; import { Title } from "@angular/platform-browser"; import { filter } from "rxjs/operators"; -import { environment } from '../../../../environments'; +import { environment } from "../../../../environments"; import { User } from "../../jsonrpc/shared"; import { Edge, Service } from "../../shared"; import { Role } from "../../type/role"; @Component({ - selector: 'oe-footer', + selector: "oe-footer", styles: [` :host[data-isSmartPhone=true] { @@ -31,11 +31,11 @@ import { Role } from "../../type/role"; } } `], - templateUrl: 'footer.html', + templateUrl: "footer.html", }) export class FooterComponent implements OnInit { - @HostBinding('attr.data-isSmartPhone') + @HostBinding("attr.data-isSmartPhone") public isSmartPhone: boolean = this.service.isSmartphoneResolution; protected user: User | null = null; diff --git a/ui/src/app/shared/components/footer/subnavigation/footerNavigation.html b/ui/src/app/shared/components/footer/subnavigation/footerNavigation.html index 1d51d859e10..bfa8f32655c 100644 --- a/ui/src/app/shared/components/footer/subnavigation/footerNavigation.html +++ b/ui/src/app/shared/components/footer/subnavigation/footerNavigation.html @@ -45,4 +45,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/footer/subnavigation/footerNavigation.ts b/ui/src/app/shared/components/footer/subnavigation/footerNavigation.ts index aee0d8a859e..400fa6224f5 100644 --- a/ui/src/app/shared/components/footer/subnavigation/footerNavigation.ts +++ b/ui/src/app/shared/components/footer/subnavigation/footerNavigation.ts @@ -10,16 +10,16 @@ export type NavigationOption = { }; @Component({ - selector: 'oe-footer-subnavigation', - templateUrl: 'footerNavigation.html', + selector: "oe-footer-subnavigation", + templateUrl: "footerNavigation.html", }) export class FooterNavigationComponent implements AfterViewInit { private static readonly INTERVAL: number = 1000; - @ViewChildren('subnavigationbuttons', { read: ElementRef }) + @ViewChildren("subnavigationbuttons", { read: ElementRef }) public subnavigationbuttons!: QueryList; - @ViewChild('container', { read: ElementRef }) public container!: ElementRef; + @ViewChild("container", { read: ElementRef }) public container!: ElementRef; @Input() public backButton: boolean = false; protected areButtonsReadyToShow: boolean = false; @@ -40,7 +40,7 @@ export class FooterNavigationComponent implements AfterViewInit { this._buttons = nodes; this.buttons = nodes; } - @HostListener('window:resize', ['$event.target.innerWidth']) + @HostListener("window:resize", ["$event.target.innerWidth"]) private onResize(width: number) { this.initializeFooterSubnavigation(); } @@ -55,8 +55,6 @@ export class FooterNavigationComponent implements AfterViewInit { this.showPopover = false; } - - /** * Initializes sub-navigation */ diff --git a/ui/src/app/shared/components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper.html b/ui/src/app/shared/components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper.html index a590984e1f7..34a2dbbaa28 100644 --- a/ui/src/app/shared/components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper.html +++ b/ui/src/app/shared/components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper.html @@ -14,4 +14,4 @@
- \ No newline at end of file + diff --git a/ui/src/app/shared/components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper.ts b/ui/src/app/shared/components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper.ts index c923b6718f3..1846f9d4c4d 100644 --- a/ui/src/app/shared/components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper.ts +++ b/ui/src/app/shared/components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper.ts @@ -1,10 +1,10 @@ // @ts-strict-ignore -import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; -import { FieldWrapper } from '@ngx-formly/core'; +import { ChangeDetectionStrategy, Component, OnInit } from "@angular/core"; +import { FieldWrapper } from "@ngx-formly/core"; @Component({ - selector: 'form-field-checkbox-hyperlink', - templateUrl: './form-field-checkbox-hyperlink.wrapper.html', + selector: "form-field-checkbox-hyperlink", + templateUrl: "./form-field-checkbox-hyperlink.wrapper.html", changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormlyCheckBoxHyperlinkWrapperComponent extends FieldWrapper implements OnInit { @@ -20,7 +20,7 @@ export class FormlyCheckBoxHyperlinkWrapperComponent extends FieldWrapper implem // Since its a custom wrapper, we are seperating label with checkbox. // mentioning required to true does not generate (*) to the label, so we are hard coding it. if (this.field.props.required) { - this.secondLabel = this.field.props.description + '*'; + this.secondLabel = this.field.props.description + "*"; } else { this.secondLabel = this.field.props.description; } diff --git a/ui/src/app/shared/components/formly/form-field-default-cases.wrapper.ts b/ui/src/app/shared/components/formly/form-field-default-cases.wrapper.ts index a50d3b32d6d..bd28f9a6023 100644 --- a/ui/src/app/shared/components/formly/form-field-default-cases.wrapper.ts +++ b/ui/src/app/shared/components/formly/form-field-default-cases.wrapper.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { AbstractControl } from '@angular/forms'; -import { FieldWrapper } from '@ngx-formly/core'; +import { Component, OnInit } from "@angular/core"; +import { AbstractControl } from "@angular/forms"; +import { FieldWrapper } from "@ngx-formly/core"; @Component({ - selector: 'formly-wrapper-default-of-cases', - template: ``, + selector: "formly-wrapper-default-of-cases", + template: "", }) export class FormlyWrapperDefaultValueWithCasesComponent extends FieldWrapper implements OnInit { diff --git a/ui/src/app/shared/components/formly/form-field.wrapper.html b/ui/src/app/shared/components/formly/form-field.wrapper.html index 82ad53b779f..18ebda3222c 100644 --- a/ui/src/app/shared/components/formly/form-field.wrapper.html +++ b/ui/src/app/shared/components/formly/form-field.wrapper.html @@ -14,4 +14,4 @@

- \ No newline at end of file + diff --git a/ui/src/app/shared/components/formly/form-field.wrapper.ts b/ui/src/app/shared/components/formly/form-field.wrapper.ts index 785582964ed..15d3c9a1b0d 100644 --- a/ui/src/app/shared/components/formly/form-field.wrapper.ts +++ b/ui/src/app/shared/components/formly/form-field.wrapper.ts @@ -1,9 +1,9 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { FieldWrapper } from '@ngx-formly/core'; +import { ChangeDetectionStrategy, Component } from "@angular/core"; +import { FieldWrapper } from "@ngx-formly/core"; @Component({ - selector: 'formly-wrapper-ion-form-field', - templateUrl: './form-field.wrapper.html', + selector: "formly-wrapper-ion-form-field", + templateUrl: "./form-field.wrapper.html", changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormlyWrapperFormFieldComponent extends FieldWrapper { } diff --git a/ui/src/app/shared/components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image.html b/ui/src/app/shared/components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image.html index e48b0e25839..bd1c0ab4da9 100644 --- a/ui/src/app/shared/components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image.html +++ b/ui/src/app/shared/components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image.html @@ -12,8 +12,8 @@ - - + + diff --git a/ui/src/app/shared/components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image.ts b/ui/src/app/shared/components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image.ts index 55b598c2933..c00fdafb5a2 100644 --- a/ui/src/app/shared/components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image.ts +++ b/ui/src/app/shared/components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image.ts @@ -1,9 +1,9 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; -import { FieldWrapper } from '@ngx-formly/core'; +import { ChangeDetectionStrategy, Component, OnInit } from "@angular/core"; +import { FieldWrapper } from "@ngx-formly/core"; @Component({ - selector: 'formly-field-checkbox-with-image', - templateUrl: './formly-field-checkbox-with-image.html', + selector: "formly-field-checkbox-with-image", + templateUrl: "./formly-field-checkbox-with-image.html", changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormlyFieldCheckboxWithImageComponent extends FieldWrapper implements OnInit { diff --git a/ui/src/app/shared/components/formly/formly-field-modal/formlyfieldmodal.html b/ui/src/app/shared/components/formly/formly-field-modal/formlyfieldmodal.html index 88bfdd9af17..cd59a9539c3 100644 --- a/ui/src/app/shared/components/formly/formly-field-modal/formlyfieldmodal.html +++ b/ui/src/app/shared/components/formly/formly-field-modal/formlyfieldmodal.html @@ -34,4 +34,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/formly/formly-field-modal/formlyfieldmodal.ts b/ui/src/app/shared/components/formly/formly-field-modal/formlyfieldmodal.ts index 9a418fec53b..2d934c9c8fa 100644 --- a/ui/src/app/shared/components/formly/formly-field-modal/formlyfieldmodal.ts +++ b/ui/src/app/shared/components/formly/formly-field-modal/formlyfieldmodal.ts @@ -2,7 +2,7 @@ import { Component } from "@angular/core"; import { FieldWrapper } from "@ngx-formly/core"; @Component({ - selector: 'formly-field-modal', - templateUrl: './formlyfieldmodal.html', + selector: "formly-field-modal", + templateUrl: "./formlyfieldmodal.html", }) export class FormlyFieldModalComponent extends FieldWrapper { } diff --git a/ui/src/app/shared/components/formly/formly-field-modal/template.html b/ui/src/app/shared/components/formly/formly-field-modal/template.html index 51c68cc8d91..1ab0804b0ba 100644 --- a/ui/src/app/shared/components/formly/formly-field-modal/template.html +++ b/ui/src/app/shared/components/formly/formly-field-modal/template.html @@ -1 +1 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/formly/formly-field-radio-with-image/formly-field-radio-with-image.html b/ui/src/app/shared/components/formly/formly-field-radio-with-image/formly-field-radio-with-image.html index 7eb91db5f1f..1c8e08a72cd 100644 --- a/ui/src/app/shared/components/formly/formly-field-radio-with-image/formly-field-radio-with-image.html +++ b/ui/src/app/shared/components/formly/formly-field-radio-with-image/formly-field-radio-with-image.html @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/formly/formly-field-radio-with-image/formly-field-radio-with-image.ts b/ui/src/app/shared/components/formly/formly-field-radio-with-image/formly-field-radio-with-image.ts index 5908a6cd96c..a104e13a949 100644 --- a/ui/src/app/shared/components/formly/formly-field-radio-with-image/formly-field-radio-with-image.ts +++ b/ui/src/app/shared/components/formly/formly-field-radio-with-image/formly-field-radio-with-image.ts @@ -1,9 +1,9 @@ -import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; -import { FieldWrapper } from '@ngx-formly/core'; +import { ChangeDetectionStrategy, Component, OnInit } from "@angular/core"; +import { FieldWrapper } from "@ngx-formly/core"; @Component({ - selector: 'formly-field-radio-with-image', - templateUrl: './formly-field-radio-with-image.html', + selector: "formly-field-radio-with-image", + templateUrl: "./formly-field-radio-with-image.html", changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormlyFieldRadioWithImageComponent extends FieldWrapper implements OnInit { diff --git a/ui/src/app/shared/components/formly/formly-select-field-modal.component.html b/ui/src/app/shared/components/formly/formly-select-field-modal.component.html index 77488ad7fbd..834fbb753d5 100644 --- a/ui/src/app/shared/components/formly/formly-select-field-modal.component.html +++ b/ui/src/app/shared/components/formly/formly-select-field-modal.component.html @@ -51,4 +51,4 @@ -

\ No newline at end of file + diff --git a/ui/src/app/shared/components/formly/formly-select-field-modal.component.ts b/ui/src/app/shared/components/formly/formly-select-field-modal.component.ts index 2ef2314fced..35bef389fd0 100644 --- a/ui/src/app/shared/components/formly/formly-select-field-modal.component.ts +++ b/ui/src/app/shared/components/formly/formly-select-field-modal.component.ts @@ -2,8 +2,8 @@ import { Component, Input, OnInit } from "@angular/core"; import { ModalController } from "@ionic/angular"; @Component({ - selector: 'formly-select-modal', - templateUrl: './formly-select-field-modal.component.html', + selector: "formly-select-modal", + templateUrl: "./formly-select-field-modal.component.html", }) export class FormlySelectFieldModalComponent implements OnInit { diff --git a/ui/src/app/shared/components/formly/formly-select-field.extended.html b/ui/src/app/shared/components/formly/formly-select-field.extended.html index 1409c0b07f6..1313a64eb0c 100644 --- a/ui/src/app/shared/components/formly/formly-select-field.extended.html +++ b/ui/src/app/shared/components/formly/formly-select-field.extended.html @@ -8,4 +8,4 @@ {{ formControl.value }} - \ No newline at end of file + diff --git a/ui/src/app/shared/components/formly/formly-select-field.extended.ts b/ui/src/app/shared/components/formly/formly-select-field.extended.ts index dec0c0037e6..ffcdb6ada79 100644 --- a/ui/src/app/shared/components/formly/formly-select-field.extended.ts +++ b/ui/src/app/shared/components/formly/formly-select-field.extended.ts @@ -4,8 +4,8 @@ import { FieldWrapper } from "@ngx-formly/core"; import { FormlySelectFieldModalComponent } from "./formly-select-field-modal.component"; @Component({ - selector: 'formly-select-extended-wrapper', - templateUrl: './formly-select-field.extended.html', + selector: "formly-select-extended-wrapper", + templateUrl: "./formly-select-field.extended.html", }) export class FormlySelectFieldExtendedWrapperComponent extends FieldWrapper { @@ -33,7 +33,7 @@ export class FormlySelectFieldExtendedWrapperComponent extends FieldWrapper { options: this.props.options, initialSelectedValue: this.formControl.value, }, - cssClass: ['auto-height', 'full-width'], + cssClass: ["auto-height", "full-width"], }); modal.onDidDismiss().then(event => { if (!event.data) { diff --git a/ui/src/app/shared/components/formly/formly-skeleton-wrapper.ts b/ui/src/app/shared/components/formly/formly-skeleton-wrapper.ts index f0c2bb276dd..8dc332dcf29 100644 --- a/ui/src/app/shared/components/formly/formly-skeleton-wrapper.ts +++ b/ui/src/app/shared/components/formly/formly-skeleton-wrapper.ts @@ -1,6 +1,6 @@ -import { Component, Input } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { FormlyFieldConfig } from '@ngx-formly/core'; +import { Component, Input } from "@angular/core"; +import { FormGroup } from "@angular/forms"; +import { FormlyFieldConfig } from "@ngx-formly/core"; /** This wrapper is used to display a loading animation for a line until the async call is finished, the @input show is true, respectively. @@ -10,7 +10,7 @@ import { FormlyFieldConfig } from '@ngx-formly/core'; * @input model the model */ @Component({ - selector: 'formly-skeleton-wrapper', + selector: "formly-skeleton-wrapper", template: `
diff --git a/ui/src/app/shared/components/formly/input-serial-number-wrapper.html b/ui/src/app/shared/components/formly/input-serial-number-wrapper.html index e2401c3aec9..169d30f12e8 100644 --- a/ui/src/app/shared/components/formly/input-serial-number-wrapper.html +++ b/ui/src/app/shared/components/formly/input-serial-number-wrapper.html @@ -29,4 +29,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/formly/input-serial-number-wrapper.ts b/ui/src/app/shared/components/formly/input-serial-number-wrapper.ts index 80d9142a7c7..0df1760de05 100644 --- a/ui/src/app/shared/components/formly/input-serial-number-wrapper.ts +++ b/ui/src/app/shared/components/formly/input-serial-number-wrapper.ts @@ -1,8 +1,8 @@ -import { Component } from '@angular/core'; -import { FieldWrapper } from '@ngx-formly/core'; +import { Component } from "@angular/core"; +import { FieldWrapper } from "@ngx-formly/core"; @Component({ - selector: 'formly-input-serial-number', - templateUrl: './input-serial-number-wrapper.html', + selector: "formly-input-serial-number", + templateUrl: "./input-serial-number-wrapper.html", }) export class FormlyInputSerialNumberWrapperComponent extends FieldWrapper { } diff --git a/ui/src/app/shared/components/formly/input.html b/ui/src/app/shared/components/formly/input.html index abc8b4b0ea0..f85472cc915 100644 --- a/ui/src/app/shared/components/formly/input.html +++ b/ui/src/app/shared/components/formly/input.html @@ -1,6 +1,5 @@ diff --git a/ui/src/app/shared/components/formly/input.ts b/ui/src/app/shared/components/formly/input.ts index a6e218d99d6..3e547670e94 100644 --- a/ui/src/app/shared/components/formly/input.ts +++ b/ui/src/app/shared/components/formly/input.ts @@ -1,8 +1,8 @@ -import { Component } from '@angular/core'; -import { FieldType } from '@ngx-formly/core'; +import { Component } from "@angular/core"; +import { FieldType } from "@ngx-formly/core"; @Component({ - selector: 'formly-input-section', - templateUrl: './input.html', + selector: "formly-input-section", + templateUrl: "./input.html", }) export class InputTypeComponent extends FieldType { } diff --git a/ui/src/app/shared/components/formly/panel-wrapper.component.ts b/ui/src/app/shared/components/formly/panel-wrapper.component.ts index 170d9465cfe..5af73ea9d87 100644 --- a/ui/src/app/shared/components/formly/panel-wrapper.component.ts +++ b/ui/src/app/shared/components/formly/panel-wrapper.component.ts @@ -2,7 +2,7 @@ import { Component } from "@angular/core"; import { FieldWrapper } from "@ngx-formly/core"; @Component({ - selector: 'formly-wrapper-panel', + selector: "formly-wrapper-panel", template: ` diff --git a/ui/src/app/shared/components/formly/repeat.html b/ui/src/app/shared/components/formly/repeat.html index 09aaee84302..ec9a8f1a311 100644 --- a/ui/src/app/shared/components/formly/repeat.html +++ b/ui/src/app/shared/components/formly/repeat.html @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/formly/repeat.ts b/ui/src/app/shared/components/formly/repeat.ts index 5810421a7e3..5ec40c593a7 100644 --- a/ui/src/app/shared/components/formly/repeat.ts +++ b/ui/src/app/shared/components/formly/repeat.ts @@ -1,9 +1,9 @@ -import { Component } from '@angular/core'; -import { FieldArrayType } from '@ngx-formly/core'; +import { Component } from "@angular/core"; +import { FieldArrayType } from "@ngx-formly/core"; @Component({ - selector: 'formly-repeat-section', - templateUrl: './repeat.html', + selector: "formly-repeat-section", + templateUrl: "./repeat.html", }) export class RepeatTypeComponent extends FieldArrayType { // TODO: add explicit constructor diff --git a/ui/src/app/shared/components/header/header.component.html b/ui/src/app/shared/components/header/header.component.html index 875067f79e3..b1e4714c831 100644 --- a/ui/src/app/shared/components/header/header.component.html +++ b/ui/src/app/shared/components/header/header.component.html @@ -68,4 +68,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/header/header.component.ts b/ui/src/app/shared/components/header/header.component.ts index e76040f3175..0c192f21047 100644 --- a/ui/src/app/shared/components/header/header.component.ts +++ b/ui/src/app/shared/components/header/header.component.ts @@ -1,27 +1,27 @@ // @ts-strict-ignore -import { AfterViewChecked, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; -import { MenuController, ModalController } from '@ionic/angular'; -import { Subject } from 'rxjs'; -import { filter, takeUntil } from 'rxjs/operators'; -import { environment } from 'src/environments'; +import { AfterViewChecked, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from "@angular/core"; +import { ActivatedRoute, NavigationEnd, Router } from "@angular/router"; +import { MenuController, ModalController } from "@ionic/angular"; +import { Subject } from "rxjs"; +import { filter, takeUntil } from "rxjs/operators"; +import { environment } from "src/environments"; -import { Edge, Service, Websocket } from '../../shared'; -import { PickDateComponent } from '../pickdate/pickdate.component'; -import { StatusSingleComponent } from '../status/single/status.component'; +import { Edge, Service, Websocket } from "../../shared"; +import { PickDateComponent } from "../pickdate/pickdate.component"; +import { StatusSingleComponent } from "../status/single/status.component"; @Component({ - selector: 'header', - templateUrl: './header.component.html', + selector: "header", + templateUrl: "./header.component.html", }) export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked { @ViewChild(PickDateComponent, { static: false }) public PickDateComponent: PickDateComponent; public environment = environment; - public backUrl: string | boolean = '/'; + public backUrl: string | boolean = "/"; public enableSideMenu: boolean; - public currentPage: 'EdgeSettings' | 'Other' | 'IndexLive' | 'IndexHistory' = 'Other'; + public currentPage: "EdgeSettings" | "Other" | "IndexLive" | "IndexHistory" = "Other"; public isSystemLogEnabled: boolean = false; private ngUnsubscribe: Subject = new Subject(); @@ -60,10 +60,10 @@ export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked { } updateEnableSideMenu(url: string) { - const urlArray = url.split('/'); + const urlArray = url.split("/"); const file = urlArray.pop(); - if (file == 'user' || file == 'settings' || file == 'changelog' || file == 'login' || urlArray.length > 3) { + if (file == "user" || file == "settings" || file == "changelog" || file == "login" || urlArray.length > 3) { // disable side-menu; show back-button instead this.enableSideMenu = false; } else { @@ -75,7 +75,7 @@ export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked { updateBackUrl(url: string) { // disable backUrl & Segment Navigation on initial 'login' page - if (url === '/login' || url === '/overview') { + if (url === "/login" || url === "/overview") { this.backUrl = false; return; } @@ -83,77 +83,77 @@ export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked { // set backUrl for user when an Edge had been selected before const currentEdge: Edge = this.service.currentEdge.value; - if (url === '/user' && currentEdge != null) { - this.backUrl = '/device/' + currentEdge.id + "/live"; + if (url === "/user" && currentEdge != null) { + this.backUrl = "/device/" + currentEdge.id + "/live"; return; } // set backUrl for user if no edge had been selected - if (url === '/user') { - this.backUrl = '/overview'; + if (url === "/user") { + this.backUrl = "/overview"; return; } - if (url === '/changelog' && currentEdge != null) { + if (url === "/changelog" && currentEdge != null) { // TODO this does not work if Changelog was opened from /user - this.backUrl = '/device/' + currentEdge.id + "/settings/profile"; + this.backUrl = "/device/" + currentEdge.id + "/settings/profile"; return; } - const urlArray = url.split('/'); - let backUrl: string | boolean = '/'; + const urlArray = url.split("/"); + let backUrl: string | boolean = "/"; const file = urlArray.pop(); // disable backUrl for History & EdgeIndex Component ++ Enable Segment Navigation - if ((file == 'history' || file == 'live') && urlArray.length == 3) { + if ((file == "history" || file == "live") && urlArray.length == 3) { this.backUrl = false; return; } // disable backUrl to first 'index' page from Edge index if there is only one Edge in the system - if (file === 'live' && urlArray.length == 3 && this.environment.backend === "OpenEMS Edge") { + if (file === "live" && urlArray.length == 3 && this.environment.backend === "OpenEMS Edge") { this.backUrl = false; return; } // remove one part of the url for 'index' - if (file === 'live') { + if (file === "live") { urlArray.pop(); } // fix url for App "settings/app/install" and "settings/app/update" - if (urlArray.slice(-3, -1).join('/') === "settings/app") { + if (urlArray.slice(-3, -1).join("/") === "settings/app") { urlArray.pop(); } // re-join the url - backUrl = urlArray.join('/') || '/'; + backUrl = urlArray.join("/") || "/"; // correct path for '/device/[edgeId]/index' - if (backUrl === '/device') { - backUrl = '/'; + if (backUrl === "/device") { + backUrl = "/"; } this.backUrl = backUrl; } updateCurrentPage(url: string) { - const urlArray = url.split('/'); + const urlArray = url.split("/"); let file = urlArray.pop(); if (urlArray.length >= 4) { file = urlArray[3]; } // Enable Segment Navigation for Edge-Index-Page - if ((file == 'history' || file == 'live') && urlArray.length == 3) { - if (file == 'history') { - this.currentPage = 'IndexHistory'; + if ((file == "history" || file == "live") && urlArray.length == 3) { + if (file == "history") { + this.currentPage = "IndexHistory"; } else { - this.currentPage = 'IndexLive'; + this.currentPage = "IndexLive"; } - } else if (file == 'settings' && urlArray.length > 1) { - this.currentPage = 'EdgeSettings'; + } else if (file == "settings" && urlArray.length > 1) { + this.currentPage = "EdgeSettings"; } else { - this.currentPage = 'Other'; + this.currentPage = "Other"; } } @@ -165,7 +165,7 @@ export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked { if (event.detail.value == "IndexHistory") { /** Creates bug of being infinite forwarded betweeen live and history, if not relatively routed */ - this.router.navigate(['../history'], { relativeTo: this.route }); + this.router.navigate(["../history"], { relativeTo: this.route }); this.cdRef.detectChanges(); } } diff --git a/ui/src/app/shared/components/history-data-error/history-data-error.component.ts b/ui/src/app/shared/components/history-data-error/history-data-error.component.ts index 74df053ac50..de600575ce7 100644 --- a/ui/src/app/shared/components/history-data-error/history-data-error.component.ts +++ b/ui/src/app/shared/components/history-data-error/history-data-error.component.ts @@ -3,7 +3,7 @@ import { Component, Input } from "@angular/core"; import { JsonrpcResponseError } from "src/app/shared/jsonrpc/base"; @Component({ - selector: 'oe-history-data-error', + selector: "oe-history-data-error", template: ` @@ -25,7 +25,7 @@ export class HistoryDataErrorComponent { } } -type ErrorType = 'TEMPORARY' | 'TOO_LONG' | null; +type ErrorType = "TEMPORARY" | "TOO_LONG" | null; function toType(response: JsonrpcResponseError | null): ErrorType { const message = response?.error?.message; @@ -34,8 +34,8 @@ function toType(response: JsonrpcResponseError | null): ErrorType { } switch (message) { case "Die Anzeige und der Export von Daten über einen längeren Zeitraum ist derzeit leider nicht möglich": - return 'TOO_LONG'; + return "TOO_LONG"; default: - return 'TEMPORARY'; + return "TEMPORARY"; } } diff --git a/ui/src/app/shared/components/modal/abstract-modal-line.ts b/ui/src/app/shared/components/modal/abstract-modal-line.ts index 625dac513e5..f16f75a48f8 100644 --- a/ui/src/app/shared/components/modal/abstract-modal-line.ts +++ b/ui/src/app/shared/components/modal/abstract-modal-line.ts @@ -7,7 +7,7 @@ import { TranslateService } from "@ngx-translate/core"; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { ChannelAddress, CurrentData, Edge, EdgeConfig, Service, Utils, Websocket } from "src/app/shared/shared"; -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidv4 } from "uuid"; import { Role } from "../../type/role"; import { Converter } from "../shared/converter"; @@ -83,7 +83,7 @@ export abstract class AbstractModalLine implements OnInit, OnDestroy, OnChanges /** Name for parameter, displayed on the left side*/ @Input() set name(value: string | { channel: ChannelAddress, converter: (value: any) => string }) { - if (typeof value === 'object') { + if (typeof value === "object") { this.subscribe(value.channel); this._name = value.converter; } else { @@ -104,7 +104,7 @@ export abstract class AbstractModalLine implements OnInit, OnDestroy, OnChanges } ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { // store important variables publically this.edge = edge; @@ -113,7 +113,7 @@ export abstract class AbstractModalLine implements OnInit, OnDestroy, OnChanges // get the channel addresses that should be subscribed const channelAddresses: ChannelAddress[] = [...this.getChannelAddresses()]; - if (typeof this.name == 'object') { + if (typeof this.name == "object") { channelAddresses.push(this.name.channel); } @@ -159,7 +159,7 @@ export abstract class AbstractModalLine implements OnInit, OnDestroy, OnChanges this.show = this.filter(value); } - if (typeof this._name == 'function') { + if (typeof this._name == "function") { this.displayName = this._name(value); } else { @@ -172,7 +172,7 @@ export abstract class AbstractModalLine implements OnInit, OnDestroy, OnChanges /** Subscribe on HTML passed Channels */ protected subscribe(channelAddress: ChannelAddress) { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.edge = edge; // Check if user is allowed to see these channel-values diff --git a/ui/src/app/shared/components/modal/abstractModal.ts b/ui/src/app/shared/components/modal/abstractModal.ts index 5c5ca8f55aa..225cf314e76 100644 --- a/ui/src/app/shared/components/modal/abstractModal.ts +++ b/ui/src/app/shared/components/modal/abstractModal.ts @@ -7,11 +7,11 @@ import { TranslateService } from "@ngx-translate/core"; import { Subject, Subscription } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { ChannelAddress, CurrentData, Edge, EdgeConfig, Service, Utils, Websocket } from "src/app/shared/shared"; -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidv4 } from "uuid"; import { Role } from "../../type/role"; -import { TextIndentation } from "./modal-line/modal-line"; import { Converter } from "../shared/converter"; +import { TextIndentation } from "./modal-line/modal-line"; @Directive() export abstract class AbstractModal implements OnInit, OnDestroy { @@ -64,7 +64,7 @@ export abstract class AbstractModal implements OnInit, OnDestroy { } public ngOnInit() { - this.service.setCurrentComponent('', this.route).then(edge => { + this.service.getCurrentEdge().then(edge => { this.service.getConfig().then(config => { // store important variables publically diff --git a/ui/src/app/shared/components/modal/help-button/help-button.html b/ui/src/app/shared/components/modal/help-button/help-button.html index b0e195c58ba..203148b44fe 100644 --- a/ui/src/app/shared/components/modal/help-button/help-button.html +++ b/ui/src/app/shared/components/modal/help-button/help-button.html @@ -3,4 +3,4 @@
-
\ No newline at end of file + diff --git a/ui/src/app/shared/components/modal/help-button/help-button.ts b/ui/src/app/shared/components/modal/help-button/help-button.ts index 38d4a5025e6..86faa04d87f 100644 --- a/ui/src/app/shared/components/modal/help-button/help-button.ts +++ b/ui/src/app/shared/components/modal/help-button/help-button.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore import { Component, Input } from "@angular/core"; import { Service } from "src/app/shared/shared"; -import { environment } from 'src/environments'; +import { environment } from "src/environments"; @Component({ - selector: 'oe-help-button', - templateUrl: './help-button.html', + selector: "oe-help-button", + templateUrl: "./help-button.html", }) export class HelpButtonComponent { diff --git a/ui/src/app/shared/components/modal/modal-button/modal-button.html b/ui/src/app/shared/components/modal/modal-button/modal-button.html index cfe065fc432..77f3b1a88b4 100644 --- a/ui/src/app/shared/components/modal/modal-button/modal-button.html +++ b/ui/src/app/shared/components/modal/modal-button/modal-button.html @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/modal/modal-button/modal-button.ts b/ui/src/app/shared/components/modal/modal-button/modal-button.ts index ffa19945c66..9b72038989c 100644 --- a/ui/src/app/shared/components/modal/modal-button/modal-button.ts +++ b/ui/src/app/shared/components/modal/modal-button/modal-button.ts @@ -3,8 +3,8 @@ import { Icon } from "src/app/shared/type/widget"; import { AbstractModalLine } from "../abstract-modal-line"; @Component({ - selector: 'oe-modal-buttons', - templateUrl: './modal-button.html', + selector: "oe-modal-buttons", + templateUrl: "./modal-button.html", }) export class ModalButtonsComponent extends AbstractModalLine { diff --git a/ui/src/app/shared/components/modal/modal-info-line/modal-info-line.html b/ui/src/app/shared/components/modal/modal-info-line/modal-info-line.html index 6f66261a711..208186bbb6a 100644 --- a/ui/src/app/shared/components/modal/modal-info-line/modal-info-line.html +++ b/ui/src/app/shared/components/modal/modal-info-line/modal-info-line.html @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/modal/modal-info-line/modal-info-line.ts b/ui/src/app/shared/components/modal/modal-info-line/modal-info-line.ts index 985d9c6e693..d19b17030fe 100644 --- a/ui/src/app/shared/components/modal/modal-info-line/modal-info-line.ts +++ b/ui/src/app/shared/components/modal/modal-info-line/modal-info-line.ts @@ -2,8 +2,8 @@ import { Component, Input } from "@angular/core"; import { Icon } from "src/app/shared/type/widget"; @Component({ - selector: 'oe-modal-info-line', - templateUrl: './modal-info-line.html', + selector: "oe-modal-info-line", + templateUrl: "./modal-info-line.html", }) export class ModalInfoLineComponent { diff --git a/ui/src/app/shared/components/modal/modal-line/modal-line-item/modal-line-item.html b/ui/src/app/shared/components/modal/modal-line/modal-line-item/modal-line-item.html index 1d44987f67e..85028091b7a 100644 --- a/ui/src/app/shared/components/modal/modal-line/modal-line-item/modal-line-item.html +++ b/ui/src/app/shared/components/modal/modal-line/modal-line-item/modal-line-item.html @@ -2,4 +2,4 @@ *ngIf="isAllowedToBeSeen && show && displayValue">   {{ displayValue }} - \ No newline at end of file + diff --git a/ui/src/app/shared/components/modal/modal-line/modal-line.html b/ui/src/app/shared/components/modal/modal-line/modal-line.html index 2f795565950..c75997960ec 100644 --- a/ui/src/app/shared/components/modal/modal-line/modal-line.html +++ b/ui/src/app/shared/components/modal/modal-line/modal-line.html @@ -30,7 +30,7 @@ - + diff --git a/ui/src/app/shared/components/modal/modal-line/modal-line.ts b/ui/src/app/shared/components/modal/modal-line/modal-line.ts index 552cf0e0a10..76e9e187946 100644 --- a/ui/src/app/shared/components/modal/modal-line/modal-line.ts +++ b/ui/src/app/shared/components/modal/modal-line/modal-line.ts @@ -3,8 +3,8 @@ import { AbstractModalLine } from "../abstract-modal-line"; import { ButtonLabel } from "../modal-button/modal-button"; @Component({ - selector: 'oe-modal-line', - templateUrl: './modal-line.html', + selector: "oe-modal-line", + templateUrl: "./modal-line.html", }) export class ModalLineComponent extends AbstractModalLine { @@ -17,19 +17,19 @@ export class ModalLineComponent extends AbstractModalLine { @Input() protected button: ButtonLabel | null = null; /** ControlName for Toggle Button */ @Input({ required: true }) protected control!: - { type: 'TOGGLE' } | - { type: 'INPUT', properties?: { unit: 'W' } } | + { type: "TOGGLE" } | + { type: "INPUT", properties?: { unit: "W" } } | /* the available select options*/ - { type: 'SELECT', options: { value: string, name: string }[] } | + { type: "SELECT", options: { value: string, name: string }[] } | /* the properties for range slider*/ - { type: 'RANGE', properties: { min: number, max: number, unit: 'H', step?: number } }; + { type: "RANGE", properties: { min: number, max: number, unit: "H", step?: number } }; /** Fixed indentation of the modal-line */ @Input() protected textIndent: TextIndentation = TextIndentation.NONE; } export enum TextIndentation { - NONE = '0%', - SINGLE = '5%', - DOUBLE = '10%', + NONE = "0%", + SINGLE = "5%", + DOUBLE = "10%", } diff --git a/ui/src/app/shared/components/modal/modal-phases/modal-phases.html b/ui/src/app/shared/components/modal/modal-phases/modal-phases.html index d368f4813cf..49679489ecf 100644 --- a/ui/src/app/shared/components/modal/modal-phases/modal-phases.html +++ b/ui/src/app/shared/components/modal/modal-phases/modal-phases.html @@ -10,4 +10,4 @@ [converter]="CONVERT_TO_POSITIVE_WATT"> - \ No newline at end of file + diff --git a/ui/src/app/shared/components/modal/modal-phases/modal-phases.ts b/ui/src/app/shared/components/modal/modal-phases/modal-phases.ts index 805b9b4ec0e..8dfdd170ea4 100644 --- a/ui/src/app/shared/components/modal/modal-phases/modal-phases.ts +++ b/ui/src/app/shared/components/modal/modal-phases/modal-phases.ts @@ -26,7 +26,7 @@ export class ModalPhasesComponent extends AbstractModalLine { for (const phase of this.phases) { channelAddresses.push( - ChannelAddress.fromString(this.component.id + '/ActivePower' + phase.key), + ChannelAddress.fromString(this.component.id + "/ActivePower" + phase.key), ); } return channelAddresses; @@ -34,8 +34,8 @@ export class ModalPhasesComponent extends AbstractModalLine { protected override onCurrentData(currentData: CurrentData): void { for (const phase of this.phases) { - const powerPerPhase = currentData.allComponents[this.component.id + '/ActivePower' + phase.key]; - phase.name = this.translate.instant('General.phase') + " " + phase.key + this.setTranslatedName(powerPerPhase); + const powerPerPhase = currentData.allComponents[this.component.id + "/ActivePower" + phase.key]; + phase.name = this.translate.instant("General.phase") + " " + phase.key + this.setTranslatedName(powerPerPhase); } } @@ -48,6 +48,6 @@ export class ModalPhasesComponent extends AbstractModalLine { protected CONVERT_TO_POSITIVE_WATT = (value: number | null): string => { value = Utils.absSafely(value) ?? 0; - return formatNumber(value, 'de', '1.0-0') + ' W'; + return formatNumber(value, "de", "1.0-0") + " W"; }; } diff --git a/ui/src/app/shared/components/modal/modal-value-line/modal-value-line.html b/ui/src/app/shared/components/modal/modal-value-line/modal-value-line.html index 311cd8e2246..b8a6d8478f0 100644 --- a/ui/src/app/shared/components/modal/modal-value-line/modal-value-line.html +++ b/ui/src/app/shared/components/modal/modal-value-line/modal-value-line.html @@ -12,4 +12,4 @@ {{ displayValue }} - \ No newline at end of file + diff --git a/ui/src/app/shared/components/modal/modal-value-line/modal-value-line.ts b/ui/src/app/shared/components/modal/modal-value-line/modal-value-line.ts index 16edba720ae..992dd9261de 100644 --- a/ui/src/app/shared/components/modal/modal-value-line/modal-value-line.ts +++ b/ui/src/app/shared/components/modal/modal-value-line/modal-value-line.ts @@ -5,8 +5,8 @@ import { ChannelAddress, CurrentData } from "src/app/shared/shared"; import { AbstractModalLine } from "../abstract-modal-line"; @Component({ - selector: 'oe-modal-value-line', - templateUrl: './modal-value-line.html', + selector: "oe-modal-value-line", + templateUrl: "./modal-value-line.html", }) export class ModalValueLineComponent extends AbstractModalLine { @@ -34,7 +34,7 @@ export class ModalValueLineComponent extends AbstractModalLine { } export enum TextIndentation { - NONE = '0%', - SINGLE = '5%', - DOUBLE = '10%', + NONE = "0%", + SINGLE = "5%", + DOUBLE = "10%", } diff --git a/ui/src/app/shared/components/modal/modal.module.ts b/ui/src/app/shared/components/modal/modal.module.ts index cebaef4736e..57ecf5e89e0 100644 --- a/ui/src/app/shared/components/modal/modal.module.ts +++ b/ui/src/app/shared/components/modal/modal.module.ts @@ -1,20 +1,20 @@ -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { BrowserModule } from '@angular/platform-browser'; -import { RouterModule } from '@angular/router'; -import { IonicModule } from '@ionic/angular'; -import { TranslateModule } from '@ngx-translate/core'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from "@angular/core"; +import { ReactiveFormsModule } from "@angular/forms"; +import { BrowserModule } from "@angular/platform-browser"; +import { RouterModule } from "@angular/router"; +import { IonicModule } from "@ionic/angular"; +import { TranslateModule } from "@ngx-translate/core"; -import { PipeModule } from '../../pipe/pipe'; -import { HelpButtonComponent } from './help-button/help-button'; -import { ModalComponent } from './modal'; -import { ModalButtonsComponent } from './modal-button/modal-button'; -import { ModalInfoLineComponent } from './modal-info-line/modal-info-line'; -import { ModalLineComponent } from './modal-line/modal-line'; -import { ModalLineItemComponent } from './modal-line/modal-line-item/modal-line-item'; -import { ModalPhasesComponent } from './modal-phases/modal-phases'; -import { ModalValueLineComponent } from './modal-value-line/modal-value-line'; -import { ModalHorizontalLineComponent } from './model-horizontal-line/modal-horizontal-line'; +import { PipeModule } from "../../pipe/pipe"; +import { HelpButtonComponent } from "./help-button/help-button"; +import { ModalComponent } from "./modal"; +import { ModalButtonsComponent } from "./modal-button/modal-button"; +import { ModalInfoLineComponent } from "./modal-info-line/modal-info-line"; +import { ModalLineComponent } from "./modal-line/modal-line"; +import { ModalLineItemComponent } from "./modal-line/modal-line-item/modal-line-item"; +import { ModalPhasesComponent } from "./modal-phases/modal-phases"; +import { ModalValueLineComponent } from "./modal-value-line/modal-value-line"; +import { ModalHorizontalLineComponent } from "./model-horizontal-line/modal-horizontal-line"; @NgModule({ imports: [ diff --git a/ui/src/app/shared/components/modal/modal.ts b/ui/src/app/shared/components/modal/modal.ts index d2365497540..601283c75df 100644 --- a/ui/src/app/shared/components/modal/modal.ts +++ b/ui/src/app/shared/components/modal/modal.ts @@ -14,8 +14,8 @@ export enum Status { } @Component({ - selector: 'oe-modal', - templateUrl: './modal.html', + selector: "oe-modal", + templateUrl: "./modal.html", styles: [` :host { height: 100%; @@ -53,7 +53,7 @@ export class ModalComponent { // Changes applied together public applyChanges() { const updateComponentArray: { name: string, value: any }[] = []; - this.service.startSpinner('spinner'); + this.service.startSpinner("spinner"); for (const key in this.formGroup.controls) { const control = this.formGroup.controls[key]; this.formGroup.controls[key]; @@ -72,10 +72,10 @@ export class ModalComponent { if (this.edge) { this.edge.updateComponentConfig(this.websocket, this.component.id, updateComponentArray) .then(() => { - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch(reason => { - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); - }).finally(() => this.service.stopSpinner('spinner')); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); + }).finally(() => this.service.stopSpinner("spinner")); } this.formGroup.markAsPristine(); } diff --git a/ui/src/app/shared/components/modal/model-horizontal-line/modal-horizontal-line.html b/ui/src/app/shared/components/modal/model-horizontal-line/modal-horizontal-line.html index 2af26b6ecc4..2a2f2922aaf 100644 --- a/ui/src/app/shared/components/modal/model-horizontal-line/modal-horizontal-line.html +++ b/ui/src/app/shared/components/modal/model-horizontal-line/modal-horizontal-line.html @@ -11,4 +11,4 @@
- \ No newline at end of file + diff --git a/ui/src/app/shared/components/modal/model-horizontal-line/modal-horizontal-line.ts b/ui/src/app/shared/components/modal/model-horizontal-line/modal-horizontal-line.ts index b6971de84de..98664ae0144 100644 --- a/ui/src/app/shared/components/modal/model-horizontal-line/modal-horizontal-line.ts +++ b/ui/src/app/shared/components/modal/model-horizontal-line/modal-horizontal-line.ts @@ -4,8 +4,8 @@ import { Component, Input } from "@angular/core"; * Shows a Horizontal Line for every but the last component or a simple Line. */ @Component({ - selector: 'oe-modal-horizontal-line', - templateUrl: './modal-horizontal-line.html', + selector: "oe-modal-horizontal-line", + templateUrl: "./modal-horizontal-line.html", }) export class ModalHorizontalLineComponent { diff --git a/ui/src/app/shared/components/percentagebar/percentagebar.component.html b/ui/src/app/shared/components/percentagebar/percentagebar.component.html index 1c7ce71728c..c06ff0ba341 100644 --- a/ui/src/app/shared/components/percentagebar/percentagebar.component.html +++ b/ui/src/app/shared/components/percentagebar/percentagebar.component.html @@ -4,4 +4,4 @@ {{ value | unitvalue:'%' }} - \ No newline at end of file + diff --git a/ui/src/app/shared/components/percentagebar/percentagebar.component.ts b/ui/src/app/shared/components/percentagebar/percentagebar.component.ts index 221c1a837ad..0f636a02eba 100644 --- a/ui/src/app/shared/components/percentagebar/percentagebar.component.ts +++ b/ui/src/app/shared/components/percentagebar/percentagebar.component.ts @@ -1,8 +1,8 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input } from "@angular/core"; @Component({ - selector: 'percentagebar', - templateUrl: './percentagebar.component.html', + selector: "percentagebar", + templateUrl: "./percentagebar.component.html", }) export class PercentageBarComponent { diff --git a/ui/src/app/shared/components/pickdate/pickdate.component.html b/ui/src/app/shared/components/pickdate/pickdate.component.html index ea2c96f7009..a3987add648 100644 --- a/ui/src/app/shared/components/pickdate/pickdate.component.html +++ b/ui/src/app/shared/components/pickdate/pickdate.component.html @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/components/pickdate/pickdate.component.spec.ts b/ui/src/app/shared/components/pickdate/pickdate.component.spec.ts index 4e1201fd647..b2f9e4dec6f 100644 --- a/ui/src/app/shared/components/pickdate/pickdate.component.spec.ts +++ b/ui/src/app/shared/components/pickdate/pickdate.component.spec.ts @@ -12,38 +12,38 @@ export function expectNextPeriod(testContext: TestContext, expectToBe: boolean): expect(PickDateComponent.isNextPeriodAllowed(testContext.service)).toBe(expectToBe); } -describe('Pickdate', () => { +describe("Pickdate", () => { let TEST_CONTEXT: TestContext; beforeEach(async () => TEST_CONTEXT = await sharedSetup(), ); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Day-View: firstSetupProtocol = today', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Day-View: firstSetupProtocol = today", () => { const firstSetupProtocol = new Date(); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, false); expectNextPeriod(TEST_CONTEXT, false); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Day-View: firstSetupProtocol = yesterday', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Day-View: firstSetupProtocol = yesterday", () => { const firstSetupProtocol = startOfDay(subDays(new Date(), 1)); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, true); expectNextPeriod(TEST_CONTEXT, false); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = current week', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = current week", () => { const firstSetupProtocol = new Date(); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, false); expectNextPeriod(TEST_CONTEXT, false); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = Start of previous week, current period = current week', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = Start of previous week, current period = current week", () => { const firstSetupProtocol = startOfWeek(subWeeks(new Date(), 1), { weekStartsOn: 1 }); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, true); expectNextPeriod(TEST_CONTEXT, false); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = Today, current period = previous week', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = Today, current period = previous week", () => { const firstSetupProtocol = new Date(); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, false); expectNextPeriod(TEST_CONTEXT, false); @@ -52,14 +52,14 @@ describe('Pickdate', () => { const previousWeekPeriod = new DefaultTypes.HistoryPeriod(startOfWeek(subWeeks(new Date(), 1), { weekStartsOn: 1 }), endOfWeek(subWeeks(new Date(), 1), { weekStartsOn: 1 })); const currentWeekPeriod = new DefaultTypes.HistoryPeriod(startOfWeek(new Date(), { weekStartsOn: 1 }), endOfWeek(new Date(), { weekStartsOn: 1 })); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = previous week, current period = previous week', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = previous week, current period = previous week", () => { TEST_CONTEXT.service.historyPeriod.next(previousWeekPeriod); const firstSetupProtocol = startOfWeek(subWeeks(new Date(), 1), { weekStartsOn: 1 }); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, false); expectNextPeriod(TEST_CONTEXT, true); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = 2 weeks ago, current period = previous week', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = 2 weeks ago, current period = previous week", () => { TEST_CONTEXT.service.historyPeriod.next(previousWeekPeriod); const firstSetupProtocol = startOfWeek(subWeeks(new Date(), 2), { weekStartsOn: 1 }); @@ -67,7 +67,7 @@ describe('Pickdate', () => { expectNextPeriod(TEST_CONTEXT, true); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = 2 weeks ago, current period = current week', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Week-View: firstSetupProtocol = 2 weeks ago, current period = current week", () => { TEST_CONTEXT.service.historyPeriod.next(currentWeekPeriod); const firstSetupProtocol = startOfWeek(subWeeks(new Date(), 2), { weekStartsOn: 1 }); @@ -78,20 +78,20 @@ describe('Pickdate', () => { const previousMonthPeriod = new DefaultTypes.HistoryPeriod(startOfMonth(subMonths(new Date(), 1)), endOfMonth(subMonths(new Date(), 1))); const currentMonthPeriod = new DefaultTypes.HistoryPeriod(startOfMonth(new Date()), endOfMonth(new Date())); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Month-View: firstSetupProtocol = today, current period = current month', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Month-View: firstSetupProtocol = today, current period = current month", () => { const firstSetupProtocol = new Date(); TEST_CONTEXT.service.historyPeriod.next(currentMonthPeriod); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, false); expectNextPeriod(TEST_CONTEXT, false); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Month-View: firstSetupProtocol = start of current month, current period = previous month', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Month-View: firstSetupProtocol = start of current month, current period = previous month", () => { TEST_CONTEXT.service.historyPeriod.next(previousMonthPeriod); const firstSetupProtocol = startOfMonth(subMonths(new Date(), 1)); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, false); expectNextPeriod(TEST_CONTEXT, true); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Month-View: firstSetupProtocol = 2 months ago, current period = previous month', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Month-View: firstSetupProtocol = 2 months ago, current period = previous month", () => { TEST_CONTEXT.service.historyPeriod.next(previousMonthPeriod); const firstSetupProtocol = startOfMonth(subMonths(new Date(), 2)); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, true); @@ -101,21 +101,21 @@ describe('Pickdate', () => { const previousYearPeriod = new DefaultTypes.HistoryPeriod(startOfYear(subYears(new Date(), 1)), endOfYear(subYears(new Date(), 1))); const currentYearPeriod = new DefaultTypes.HistoryPeriod(startOfYear(new Date()), endOfYear(new Date())); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Year-View: firstSetupProtocol = today, current period = current year', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Year-View: firstSetupProtocol = today, current period = current year", () => { const firstSetupProtocol = new Date(); TEST_CONTEXT.service.historyPeriod.next(currentYearPeriod); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, false); expectNextPeriod(TEST_CONTEXT, false); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Year-View: firstSetupProtocol = previous year, current period = previous year', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Year-View: firstSetupProtocol = previous year, current period = previous year", () => { TEST_CONTEXT.service.historyPeriod.next(previousYearPeriod); const firstSetupProtocol = startOfYear(subYears(new Date(), 1)); expectPreviousPeriod(TEST_CONTEXT, firstSetupProtocol, false); expectNextPeriod(TEST_CONTEXT, true); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Year-View: firstSetupProtocol = 2 years ago, current period = previous year', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Year-View: firstSetupProtocol = 2 years ago, current period = previous year", () => { TEST_CONTEXT.service.historyPeriod.next(previousYearPeriod); const firstSetupProtocol = startOfYear(subYears(new Date(), 2)); @@ -123,7 +123,7 @@ describe('Pickdate', () => { expectNextPeriod(TEST_CONTEXT, true); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Year-View: firstSetupProtocol = 2 years ago, current period = this year', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Year-View: firstSetupProtocol = 2 years ago, current period = this year", () => { TEST_CONTEXT.service.historyPeriod.next(currentYearPeriod); const firstSetupProtocol = startOfYear(subYears(new Date(), 2)); @@ -131,7 +131,7 @@ describe('Pickdate', () => { expectNextPeriod(TEST_CONTEXT, false); }); - it('#isPreviousPeriodAllowed && #isNextPeriodAllowed - Total-View', () => { + it("#isPreviousPeriodAllowed && #isNextPeriodAllowed - Total-View", () => { const firstSetupProtocol = startOfYear(subYears(new Date(), 2)); TEST_CONTEXT.service.historyPeriod.next(new DefaultTypes.HistoryPeriod(firstSetupProtocol, new Date())); TEST_CONTEXT.service.periodString = DefaultTypes.PeriodString.TOTAL; diff --git a/ui/src/app/shared/components/pickdate/pickdate.component.ts b/ui/src/app/shared/components/pickdate/pickdate.component.ts index 885544f107a..9d2e83fd813 100644 --- a/ui/src/app/shared/components/pickdate/pickdate.component.ts +++ b/ui/src/app/shared/components/pickdate/pickdate.component.ts @@ -1,18 +1,18 @@ // @ts-strict-ignore -import { Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { PopoverController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { addMonths, addYears, differenceInDays, differenceInMilliseconds, endOfDay, endOfMonth, endOfYear, isAfter, isBefore, startOfDay, startOfMonth, startOfWeek, startOfYear, subMonths, subYears } from 'date-fns'; -import { addDays, addWeeks, endOfWeek, isFuture, subDays, subWeeks } from 'date-fns/esm'; +import { Component, Input, OnDestroy, OnInit } from "@angular/core"; +import { PopoverController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { addMonths, addYears, differenceInDays, differenceInMilliseconds, endOfDay, endOfMonth, endOfYear, isAfter, isBefore, startOfDay, startOfMonth, startOfWeek, startOfYear, subMonths, subYears } from "date-fns"; +import { addDays, addWeeks, endOfWeek, isFuture, subDays, subWeeks } from "date-fns/esm"; -import { DefaultTypes } from '../../service/defaulttypes'; -import { Edge, Service } from '../../shared'; -import { DateUtils } from '../../utils/date/dateutils'; -import { PickDatePopoverComponent } from './popover/popover.component'; +import { DefaultTypes } from "../../service/defaulttypes"; +import { Edge, Service } from "../../shared"; +import { DateUtils } from "../../utils/date/dateutils"; +import { PickDatePopoverComponent } from "./popover/popover.component"; @Component({ - selector: 'pickdate', - templateUrl: './pickdate.component.html', + selector: "pickdate", + templateUrl: "./pickdate.component.html", }) export class PickDateComponent implements OnInit, OnDestroy { @@ -266,7 +266,7 @@ export class PickDateComponent implements OnInit, OnDestroy { } case DefaultTypes.PeriodString.TOTAL: { - this.setDateRange(new DefaultTypes.HistoryPeriod(this.edge?.firstSetupProtocol ?? DateUtils.stringToDate('03.11.2022 16:04:37'), endOfYear(addYears(this.service.historyPeriod.value.to, 1)))); + this.setDateRange(new DefaultTypes.HistoryPeriod(this.edge?.firstSetupProtocol ?? DateUtils.stringToDate("03.11.2022 16:04:37"), endOfYear(addYears(this.service.historyPeriod.value.to, 1)))); this.disableArrow = true; break; } @@ -329,6 +329,9 @@ export class PickDateComponent implements OnInit, OnDestroy { this.setDateRange(new DefaultTypes.HistoryPeriod(subDays(this.service.historyPeriod.value.from, dateDistance), subDays(this.service.historyPeriod.value.to, dateDistance))); break; } + default: + break; + } } @@ -337,7 +340,7 @@ export class PickDateComponent implements OnInit, OnDestroy { component: PickDatePopoverComponent, event: ev, translucent: false, - cssClass: 'pickdate-popover', + cssClass: "pickdate-popover", componentProps: { setDateRange: this.setDateRange, edge: this.edge, @@ -399,7 +402,7 @@ export class PickDateComponent implements OnInit, OnDestroy { * calculates the milliseconds until next period (Day|Week) will occour * is used to change date period */ - private millisecondsUntilnextPeriod(): number { + private millisecondsUntilnextPeriod(): number | null { // + 1000 to reach the next day switch (this.service.periodString) { case DefaultTypes.PeriodString.DAY: { @@ -422,6 +425,8 @@ export class PickDateComponent implements OnInit, OnDestroy { const endOfYearTime = endOfYear(currentDayTime); return differenceInMilliseconds(endOfYearTime, currentDayTime) + 1000; } + default: + return null; } } diff --git a/ui/src/app/shared/components/pickdate/pickdate.module.ts b/ui/src/app/shared/components/pickdate/pickdate.module.ts index 4cf6632c20b..a094850a04c 100644 --- a/ui/src/app/shared/components/pickdate/pickdate.module.ts +++ b/ui/src/app/shared/components/pickdate/pickdate.module.ts @@ -1,12 +1,11 @@ -import { NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { BrowserModule } from '@angular/platform-browser'; -import { IonicModule } from '@ionic/angular'; -import { TranslateModule } from '@ngx-translate/core'; - -import { PickDateComponent } from './pickdate.component'; -import { PickDatePopoverComponent } from './popover/popover.component'; -import { AngularMyDatePickerModule } from '@nodro7/angular-mydatepicker'; +import { NgModule } from "@angular/core"; +import { ReactiveFormsModule } from "@angular/forms"; +import { BrowserModule } from "@angular/platform-browser"; +import { IonicModule } from "@ionic/angular"; +import { TranslateModule } from "@ngx-translate/core"; +import { AngularMyDatePickerModule } from "@nodro7/angular-mydatepicker"; +import { PickDateComponent } from "./pickdate.component"; +import { PickDatePopoverComponent } from "./popover/popover.component"; @NgModule({ imports: [ @@ -23,6 +22,5 @@ import { AngularMyDatePickerModule } from '@nodro7/angular-mydatepicker'; exports: [ PickDateComponent, ], - }) export class PickdateModule { } diff --git a/ui/src/app/shared/components/pickdate/popover/popover.component.ts b/ui/src/app/shared/components/pickdate/popover/popover.component.ts index e13cf8bc139..a4586947d2f 100644 --- a/ui/src/app/shared/components/pickdate/popover/popover.component.ts +++ b/ui/src/app/shared/components/pickdate/popover/popover.component.ts @@ -1,18 +1,18 @@ // @ts-strict-ignore -import { Component, Input, OnInit } from '@angular/core'; -import { PopoverController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { CalAnimation, IAngularMyDpOptions, IMyDate, IMyDateRangeModel } from '@nodro7/angular-mydatepicker'; -import { endOfMonth, startOfMonth } from 'date-fns'; -import { addDays, endOfWeek, endOfYear, getDate, getMonth, getYear, startOfWeek, startOfYear } from 'date-fns/esm'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { EdgePermission, Service, Utils } from 'src/app/shared/shared'; +import { Component, Input, OnInit } from "@angular/core"; +import { PopoverController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { CalAnimation, IAngularMyDpOptions, IMyDate, IMyDateRangeModel } from "@nodro7/angular-mydatepicker"; +import { endOfMonth, startOfMonth } from "date-fns"; +import { addDays, endOfWeek, endOfYear, getDate, getMonth, getYear, startOfWeek, startOfYear } from "date-fns/esm"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +import { EdgePermission, Service, Utils } from "src/app/shared/shared"; -import { Edge } from '../../edge/edge'; +import { Edge } from "../../edge/edge"; @Component({ - selector: 'pickdatepopover', - templateUrl: './popover.component.html', + selector: "pickdatepopover", + templateUrl: "./popover.component.html", }) export class PickDatePopoverComponent implements OnInit { @@ -20,14 +20,14 @@ export class PickDatePopoverComponent implements OnInit { @Input() public edge: Edge | null = null; @Input() public historyPeriods: DefaultTypes.PeriodStringValues[] = []; - public locale: string = 'de'; + public locale: string = "de"; public showCustomDate: boolean = false; protected periods: string[] = []; protected readonly TOMORROW = addDays(new Date(), 1); protected myDpOptions: IAngularMyDpOptions = { stylesData: { - selector: 'dp1', + selector: "dp1", styles: ` .dp1 .myDpMarkCurrDay, .dp1 .myDpMarkCurrMonth, @@ -38,13 +38,13 @@ export class PickDatePopoverComponent implements OnInit { `, }, calendarAnimation: { in: CalAnimation.FlipDiagonal, out: CalAnimation.ScaleCenter }, - dateFormat: 'dd.mm.yyyy', + dateFormat: "dd.mm.yyyy", dateRange: true, disableSince: this.toIMyDate(this.TOMORROW), disableUntil: { day: 1, month: 1, year: 2013 }, // TODO start with date since the edge is available inline: true, - selectorHeight: '225px', - selectorWidth: '251px', + selectorHeight: "225px", + selectorWidth: "251px", showWeekNumbers: true, }; protected readonly DefaultTypes = DefaultTypes; @@ -111,6 +111,8 @@ export class PickDatePopoverComponent implements OnInit { this.popoverCtrl.dismiss(); break; } + default: + break; } } diff --git a/ui/src/app/shared/components/pickdate/popover/popover.spec.ts b/ui/src/app/shared/components/pickdate/popover/popover.spec.ts index 05806ec3b2f..fd6a8f9463c 100644 --- a/ui/src/app/shared/components/pickdate/popover/popover.spec.ts +++ b/ui/src/app/shared/components/pickdate/popover/popover.spec.ts @@ -10,7 +10,7 @@ import { Language, MyTranslateLoader } from "src/app/shared/type/language"; import { PickdateModule } from "../pickdate.module"; import { PickDatePopoverComponent } from "./popover.component"; -describe('PickdatePopover', () => { +describe("PickdatePopover", () => { let fixture: ComponentFixture; let component: PickDatePopoverComponent; @@ -38,12 +38,12 @@ describe('PickdatePopover', () => { }); }); - it('is AngularMyDatePickerModule calendar opening on "other period" button', () => { + it("is AngularMyDatePickerModule calendar opening on \"other period\" button", () => { const { debugElement } = fixture; - const popoverBtn = debugElement.query(By.css('[testId="popover-button"]')); - popoverBtn.triggerEventHandler('click', null); + const popoverBtn = debugElement.query(By.css("[testId=\"popover-button\"]")); + popoverBtn.triggerEventHandler("click", null); fixture.detectChanges(); expect(component).toBeDefined(); - expect((debugElement?.nativeNode?.children as HTMLCollection)?.item(2)?.localName).toEqual('lib-angular-mydatepicker-calendar'); + expect((debugElement?.nativeNode?.children as HTMLCollection)?.item(2)?.localName).toEqual("lib-angular-mydatepicker-calendar"); }); }); diff --git a/ui/src/app/shared/components/shared/converter.ts b/ui/src/app/shared/components/shared/converter.ts index d1b8a12d21b..136ecff555b 100644 --- a/ui/src/app/shared/components/shared/converter.ts +++ b/ui/src/app/shared/components/shared/converter.ts @@ -1,7 +1,5 @@ // @ts-strict-ignore - import { TranslateService } from "@ngx-translate/core"; - import { CurrentData, EdgeConfig, GridMode, Utils } from "../../shared"; import { TimeUtils } from "../../utils/time/timeutils"; import { Formatter } from "./formatter"; @@ -24,18 +22,26 @@ export namespace Converter { }; export const IF_NUMBER = (value: number | string | null, callback: (number: number) => string) => { - if (typeof value === 'number') { + if (typeof value === "number") { return callback(value); } return "-"; // null or string }; export const IF_STRING = (value: number | string | null, callback: (text: string) => string) => { - if (typeof value === 'string') { + if (typeof value === "string") { return callback(value); } return "-"; // null or number }; + + export const IF_NUMBER_OR_STRING = (value: number | string | null, callback: (value: number | string) => string) => { + if (typeof value === "number" || typeof value === "string") { + return callback(value); + } + return "-"; // null or string + }; + /** * Converter for Grid-Buy-Power. * @@ -147,13 +153,13 @@ export namespace Converter { const limitation = () => { switch (value) { case 1: - return '0'; + return "0"; case 2: - return '30'; + return "30"; case 4: - return '60'; + return "60"; case 8: - return '100'; + return "100"; default: return null; } @@ -174,7 +180,7 @@ export namespace Converter { * @returns always "" */ export const HIDE_VALUE: Converter = (ignore): string => { - return ''; + return ""; }; /** @@ -186,29 +192,29 @@ export namespace Converter { * @returns the otherPower */ export const CALCULATE_CONSUMPTION_OTHER_POWER = (evcss: EdgeConfig.Component[], consumptionMeters: EdgeConfig.Component[], currentData: CurrentData): number => { - const activePowerTotal = currentData.allComponents['_sum/ConsumptionActivePower'] ?? null; - const evcsChargePowerTotal = evcss?.map(evcs => currentData.allComponents[evcs.id + '/ChargePower'])?.reduce((prev, curr) => Utils.addSafely(prev, curr), 0) ?? null; - const consumptionMeterActivePowerTotal = consumptionMeters?.map(meter => currentData.allComponents[meter.id + '/ActivePower'])?.reduce((prev, curr) => Utils.addSafely(prev, curr), 0) ?? null; + const activePowerTotal = currentData.allComponents["_sum/ConsumptionActivePower"] ?? null; + const evcsChargePowerTotal = evcss?.map(evcs => currentData.allComponents[evcs.id + "/ChargePower"])?.reduce((prev, curr) => Utils.addSafely(prev, curr), 0) ?? null; + const consumptionMeterActivePowerTotal = consumptionMeters?.map(meter => currentData.allComponents[meter.id + "/ActivePower"])?.reduce((prev, curr) => Utils.addSafely(prev, curr), 0) ?? null; return Utils.subtractSafely(activePowerTotal, Utils.addSafely(evcsChargePowerTotal, consumptionMeterActivePowerTotal)); }; export const GRID_STATE_TO_MESSAGE = (translate: TranslateService, currentData: CurrentData): string => { - const gridMode = currentData.allComponents['_sum/GridMode']; - const restrictionMode = currentData.allComponents['ctrlEssLimiter14a0/RestrictionMode']; + const gridMode = currentData.allComponents["_sum/GridMode"]; + const restrictionMode = currentData.allComponents["ctrlEssLimiter14a0/RestrictionMode"]; if (gridMode === GridMode.OFF_GRID) { return translate.instant("GRID_STATES.OFF_GRID"); } if (restrictionMode === 1) { - return translate.instant('GRID_STATES.RESTRICTION'); + return translate.instant("GRID_STATES.RESTRICTION"); } return translate.instant("GRID_STATES.NO_EXTERNAL_LIMITATION"); }; export const ON_OFF = (translate: TranslateService) => { return (raw): string => { - return translate.instant(raw == 1 ? 'General.on' : 'General.off'); + return translate.instant(raw == 1 ? "General.on" : "General.off"); }; }; diff --git a/ui/src/app/shared/components/shared/dataservice.ts b/ui/src/app/shared/components/shared/dataservice.ts index 15b1b79600d..b1d7a835af2 100644 --- a/ui/src/app/shared/components/shared/dataservice.ts +++ b/ui/src/app/shared/components/shared/dataservice.ts @@ -1,9 +1,8 @@ // @ts-strict-ignore import { Injectable } from "@angular/core"; +import { RefresherCustomEvent } from "@ionic/angular"; import { BehaviorSubject, Subject } from "rxjs"; - import { ChannelAddress, Edge } from "../../shared"; -import { RefresherCustomEvent } from "@ionic/angular"; @Injectable() export abstract class DataService { diff --git a/ui/src/app/shared/components/shared/formatter.ts b/ui/src/app/shared/components/shared/formatter.ts index bb2e8002a2f..8f2d5df2c8d 100644 --- a/ui/src/app/shared/components/shared/formatter.ts +++ b/ui/src/app/shared/components/shared/formatter.ts @@ -1,28 +1,34 @@ import { formatNumber } from "@angular/common"; +import { Currency } from "../../shared"; export namespace Formatter { export const FORMAT_WATT = (value: number) => { // TODO apply correct locale - return formatNumber(value, 'de', '1.0-0') + " W"; + return formatNumber(value, "de", "1.0-0") + " W"; }; export const FORMAT_VOLT = (value: number) => { // TODO apply correct locale - return formatNumber(value, 'de', '1.0-0') + " V"; + return formatNumber(value, "de", "1.0-0") + " V"; }; export const FORMAT_AMPERE = (value: number) => { // TODO apply correct locale - return formatNumber(value, 'de', '1.1-1') + " A"; + return formatNumber(value, "de", "1.1-1") + " A"; }; export const FORMAT_CELSIUS = (value: number) => { // TODO apply correct locale - return formatNumber(value, 'de', '1.0-0') + " °C"; + return formatNumber(value, "de", "1.0-0") + " °C"; }; export const FORMAT_PERCENT = (value: number) => { // TODO apply correct locale - return formatNumber(value, 'de', '1.0-0') + " %"; + return formatNumber(value, "de", "1.0-0") + " %"; + }; + + export const FORMAT_CURRENCY_PER_KWH = (value: number | string, currency: string = Currency.Unit.CENT) => { + // TODO apply correct locale + return formatNumber(parseInt(value.toString()), "de", "1.0-2") + " " + Currency.getCurrencyLabelByCurrency(currency); }; } diff --git a/ui/src/app/shared/components/shared/name.ts b/ui/src/app/shared/components/shared/name.ts index 036f798d66f..f998a1fbf17 100644 --- a/ui/src/app/shared/components/shared/name.ts +++ b/ui/src/app/shared/components/shared/name.ts @@ -9,9 +9,9 @@ export namespace Name { (value): string => { if (typeof value === "number") { if (value < 0) { - return name + " " + translate.instant('General.gridSellAdvanced'); + return name + " " + translate.instant("General.gridSellAdvanced"); } else { - return name + " " + translate.instant('General.gridBuyAdvanced'); + return name + " " + translate.instant("General.gridBuyAdvanced"); } } return name; diff --git a/ui/src/app/shared/components/shared/notification/notification.ts b/ui/src/app/shared/components/shared/notification/notification.ts index 2c6c420f073..682dd9d33b4 100644 --- a/ui/src/app/shared/components/shared/notification/notification.ts +++ b/ui/src/app/shared/components/shared/notification/notification.ts @@ -2,12 +2,12 @@ import { Component, Input, OnChanges, OnInit } from "@angular/core"; import { ToastController } from "@ionic/angular"; @Component({ - selector: 'oe-notification', - template: '', + selector: "oe-notification", + template: "", }) export class NotificationComponent implements OnInit, OnChanges { - private static readonly PREFIX = 'hide-notification-'; + private static readonly PREFIX = "hide-notification-"; @Input() private text: string | null = null; @Input() private id: string | number | null = null; @@ -18,7 +18,7 @@ export class NotificationComponent implements OnInit, OnChanges { ngOnInit() { const note = localStorage.getItem(NotificationComponent.PREFIX + this.id); - this.hideMessage = note != null ? note === 'true' : false; + this.hideMessage = note != null ? note === "true" : false; this.createToast(); } @@ -47,16 +47,16 @@ export class NotificationComponent implements OnInit, OnChanges { const popover = await this.toastie.create({ translucent: false, message: this.text, - position: 'bottom', + position: "bottom", buttons: [ - { icon: 'close-outline', role: 'cancel' }, + { icon: "close-outline", role: "cancel" }, ], }); popover.present(); await popover.onDidDismiss().then(() => { - localStorage.setItem(NotificationComponent.PREFIX + this.id, 'true'); + localStorage.setItem(NotificationComponent.PREFIX + this.id, "true"); }); } } diff --git a/ui/src/app/shared/components/shared/oe-formly-component.ts b/ui/src/app/shared/components/shared/oe-formly-component.ts index 50516a057d5..c300ea59c69 100644 --- a/ui/src/app/shared/components/shared/oe-formly-component.ts +++ b/ui/src/app/shared/components/shared/oe-formly-component.ts @@ -1,10 +1,8 @@ import { FormGroup } from "@angular/forms"; -import { ActivatedRoute } from "@angular/router"; import { FormlyFieldConfig } from "@ngx-formly/core"; import { TranslateService } from "@ngx-translate/core"; import { filter } from "rxjs/operators"; - -import { CurrentData, ChannelAddress, EdgeConfig, Service } from "../../shared"; +import { ChannelAddress, CurrentData, EdgeConfig, Service } from "../../shared"; import { SharedModule } from "../../shared.module"; import { Role } from "../../type/role"; import { TextIndentation } from "../modal/modal-line/modal-line"; @@ -18,10 +16,9 @@ export abstract class AbstractFormlyComponent { constructor() { const service = SharedModule.injector.get(Service); - const route = SharedModule.injector.get(ActivatedRoute); this.translate = SharedModule.injector.get(TranslateService); - service.setCurrentComponent('', route).then(edge => { + service.getCurrentEdge().then(edge => { edge.getConfig(service.websocket) .pipe(filter(config => !!config)) .subscribe((config) => { @@ -37,7 +34,7 @@ export abstract class AbstractFormlyComponent { required: true, options: [{ lines: view.lines }], }, - wrappers: ['formly-field-modal'], + wrappers: ["formly-field-modal"], }]; }); }); @@ -69,26 +66,26 @@ export type OeFormlyField = export namespace OeFormlyField { export type InfoLine = { - type: 'info-line', + type: "info-line", name: string }; export type Item = { - type: 'item', + type: "item", channel: string, filter?: (value: number | null) => boolean, converter?: (value: number | null) => string }; export type ChildrenLine = { - type: 'children-line', + type: "children-line", name: /* actual name string */ string | /* name string derived from channel value */ { channel: ChannelAddress, converter: Converter }, indentation?: TextIndentation, children: Item[], }; export type ChannelLine = { - type: 'channel-line', + type: "channel-line", name: /* actual name string */ string | /* name string derived from channel value */ Converter, channel: string, filter?: (value: number | null) => boolean, @@ -97,7 +94,7 @@ export namespace OeFormlyField { }; export type ValueFromChannelsLine = { - type: 'value-from-channels-line', + type: "value-from-channels-line", name: string, value: (data: CurrentData) => string, channelsToSubscribe: ChannelAddress[], @@ -106,6 +103,6 @@ export namespace OeFormlyField { }; export type HorizontalLine = { - type: 'horizontal-line', + type: "horizontal-line", }; } diff --git a/ui/src/app/shared/components/shared/phase.ts b/ui/src/app/shared/components/shared/phase.ts index b1c13e10994..6667a67627c 100644 --- a/ui/src/app/shared/components/shared/phase.ts +++ b/ui/src/app/shared/components/shared/phase.ts @@ -1,3 +1,3 @@ export namespace Phase { - export const THREE_PHASE: string[] = ['L1', 'L2', 'L3']; + export const THREE_PHASE: string[] = ["L1", "L2", "L3"]; } diff --git a/ui/src/app/shared/components/shared/testing/common.ts b/ui/src/app/shared/components/shared/testing/common.ts index 858718645b9..62f21fe345a 100644 --- a/ui/src/app/shared/components/shared/testing/common.ts +++ b/ui/src/app/shared/components/shared/testing/common.ts @@ -22,16 +22,19 @@ export namespace OeTester { } export namespace ChartOptions { - export const LINE_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min?: number, max?: number; beginAtZero?: boolean; }, ticks?: { stepSize: number; }; }; }, title?: string): OeChartTester.Dataset.Option => ({ - type: 'option', + export const LINE_CHART_OPTIONS = (period: string, chartType: "line" | "bar", options: { [key: string]: { scale: { min?: number, max?: number, beginAtZero?: boolean }, ticks?: { stepSize: number; }; }; }, title?: string): OeChartTester.Dataset.Option => ({ + type: "option", options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} }, "annotation": { "annotations": {} } }, "scales": { - "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, - "left": { - ...options["left"]?.scale, ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": options["left"]?.scale.beginAtZero ?? false, "title": { "text": "kW", "display": false, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { + "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": "" } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} }, "annotation": { "annotations": {} }, "datalabels": { + display: false, + }, + }, "scales": { + "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { + "beginAtZero": false, ...options["left"]?.scale, ...(chartType === "line" ? { stacked: false } : {}), "title": { "text": "kW", "display": false, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": { ...options["left"]?.ticks, - "color": '', + "color": "", "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, }, @@ -39,16 +42,20 @@ export namespace OeTester { }, }, }); - export const BAR_CHART_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min: number, max: number; }, ticks?: { stepSize: number; }; }; }, title?: string): OeChartTester.Dataset.Option => ({ - type: 'option', + export const BAR_CHART_OPTIONS = (period: string, chartType: "line" | "bar", options: { [key: string]: { scale: { min: number, max: number; }, ticks?: { stepSize: number; }; }; }, title?: string): OeChartTester.Dataset.Option => ({ + type: "option", options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} }, "annotation": { "annotations": {} } }, "scales": { + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { + "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": "" } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} }, "annotation": { "annotations": {} }, "datalabels": { + display: false, + }, + }, "scales": { "x": { "stacked": true, "offset": true, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { - ...options["left"]?.scale, ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "kWh", "display": false, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, + ...options["left"]?.scale, ...(chartType === "line" ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "kWh", "display": false, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": { ...options["left"]?.ticks, - "color": '', + "color": "", "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, }, @@ -56,28 +63,44 @@ export namespace OeTester { }, }, }); - export const MULTI_LINE_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min: number, max: number; }, ticks?: { stepSize: number; }; }; }, title?: string): OeChartTester.Dataset.Option => ({ - type: 'option', + export const MULTI_LINE_OPTIONS = (period: string, chartType: "line" | "bar", options: { [key: string]: { scale: { min: number, max: number; }, ticks?: { stepSize: number; }; }; }, title?: string): OeChartTester.Dataset.Option => ({ + type: "option", options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {} }, "annotation": { "annotations": {} } }, "scales": { + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": {}, "line": {} }, + "plugins": { + "colors": { + "enabled": false, + }, + "legend": { + "display": true, "position": "bottom", "labels": { "color": "" }, + }, "tooltip": { + "intersect": false, "mode": "index", "callbacks": {}, + }, + "annotation": { + "annotations": {}, + }, + "datalabels": { + display: false, + }, + }, "scales": { "x": { "stacked": true, "offset": false, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { - ...options["left"]?.scale, ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": true, + ...options["left"]?.scale, ...(chartType === "line" ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "kW", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": { ...options["left"]?.ticks, - "color": '', + "color": "", "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, }, }, "right": { - ...options["right"]?.scale, ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": true, + ...options["right"]?.scale, ...(chartType === "line" ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "Zustand", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "right", "grid": { "display": false }, "ticks": { ...options["right"]?.ticks, - "color": '', + "color": "", "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, }, @@ -85,26 +108,30 @@ export namespace OeTester { }, }, }); - export const MULTI_BAR_OPTIONS = (period: string, chartType: 'line' | 'bar', options: { [key: string]: { scale: { min?: number, max?: number; }, ticks?: { stepSize: number; }; }; }, title?: string): OeChartTester.Dataset.Option => ({ - type: 'option', + export const MULTI_BAR_OPTIONS = (period: string, chartType: "line" | "bar", options: { [key: string]: { scale: { min?: number, max?: number; }, ticks?: { stepSize: number; }; }; }, title?: string): OeChartTester.Dataset.Option => ({ + type: "option", options: { - "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": '' } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} }, "annotation": { "annotations": {} } }, "scales": { + "responsive": true, "maintainAspectRatio": false, "elements": { "point": { "radius": 0, "hitRadius": 0, "hoverRadius": 0 }, "line": { "stepped": false, "fill": true } }, "datasets": { "bar": { "barPercentage": 1 }, "line": {} }, "plugins": { + "colors": { "enabled": false }, "legend": { "display": true, "position": "bottom", "labels": { "color": "" } }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {} }, "annotation": { "annotations": {} }, "datalabels": { + display: false, + }, + }, "scales": { "x": { "stacked": true, "offset": true, "type": "time", "ticks": { "source": "auto", "maxTicksLimit": 31 }, "bounds": "ticks", "adapters": { "date": { "locale": { "code": "de", "formatLong": {}, "localize": {}, "match": {}, "options": { "weekStartsOn": 1, "firstWeekContainsDate": 4 } } } }, "time": { "unit": period as TimeUnit, "displayFormats": { "datetime": "yyyy-MM-dd HH:mm:ss", "millisecond": "SSS [ms]", "second": "HH:mm:ss a", "minute": "HH:mm", "hour": "HH:00", "day": "dd", "week": "ll", "month": "MM", "quarter": "[Q]Q - YYYY", "year": "yyyy" } } }, "left": { - ...options["left"]?.scale, ...(chartType === 'line' ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "kWh", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, + ...options["left"]?.scale, ...(chartType === "line" ? { stacked: false } : {}), "beginAtZero": true, "title": { "text": "kWh", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "left", "grid": { "display": true }, "ticks": { ...options["left"]?.ticks, - "color": '', + "color": "", "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, }, }, "right": { - ...options["right"]?.scale, ...(chartType === 'line' ? { stacked: false } : { min: 0 }), "beginAtZero": true, + ...options["right"]?.scale, ...(chartType === "line" ? { stacked: false } : { min: 0 }), "beginAtZero": true, "title": { "text": "Aktive Zeit", "display": true, "padding": 5, "font": { "size": 11 } }, "position": "right", "grid": { "display": false }, "ticks": { - "color": '', + "color": "", "padding": 5, "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS, }, diff --git a/ui/src/app/shared/components/shared/testing/tester.ts b/ui/src/app/shared/components/shared/testing/tester.ts index 2414dccd364..2e30117a4fa 100644 --- a/ui/src/app/shared/components/shared/testing/tester.ts +++ b/ui/src/app/shared/components/shared/testing/tester.ts @@ -7,6 +7,7 @@ import { HistoryUtils } from "src/app/shared/service/utils"; import { CurrentData, EdgeConfig } from "src/app/shared/shared"; import { AbstractHistoryChart } from "../../chart/abstracthistorychart"; +import { XAxisType } from "../../chart/chart.constants"; import { TextIndentation } from "../../modal/modal-line/modal-line"; import { Converter } from "../converter"; import { OeFormlyField, OeFormlyView } from "../oe-formly-component"; @@ -29,7 +30,7 @@ export class OeFormlyViewTester { /** * OeFormlyField.Line */ - case 'children-line': { + case "children-line": { const tmp = OeFormlyViewTester.applyLineWithChildren(field, context); // Prepare result @@ -60,7 +61,7 @@ export class OeFormlyViewTester { // Read or generate name let name: string; - if (typeof (field.name) === 'function') { + if (typeof (field.name) === "function") { name = field.name(tmp.rawValue); } else { name = field.name; @@ -205,17 +206,17 @@ export namespace OeChartTester { export namespace Dataset { export type Data = { - type: 'data', + type: "data", label: string | Converter, value: (number | null)[] }; export type LegendLabel = { - type: 'label', + type: "label", timestamps: Date[] }; export type Option = { - type: 'option', + type: "option", options: Chart.ChartOptions }; } @@ -223,7 +224,7 @@ export namespace OeChartTester { export class OeChartTester { - public static apply(chartData: HistoryUtils.ChartData, chartType: 'line' | 'bar', channels: OeTester.Types.Channels, testContext: TestContext, config: EdgeConfig): OeChartTester.View { + public static apply(chartData: HistoryUtils.ChartData, chartType: "line" | "bar", channels: OeTester.Types.Channels, testContext: TestContext, config: EdgeConfig, xAxisScalingType: XAxisType = XAxisType.TIMESERIES): OeChartTester.View { const channelData = OeChartTester.getChannelDataByCharttype(chartType, channels); @@ -238,7 +239,7 @@ export class OeChartTester { const configuration = AbstractHistoryChart.fillChart(chartType, chartData, channelData, channels.energyChannelWithValues); const data: OeChartTester.Dataset.Data[] = OeChartTester.convertChartDatasetsToDatasets(configuration.datasets); const labels: OeChartTester.Dataset.LegendLabel = OeChartTester.convertChartLabelsToLegendLabels(configuration.labels); - const options: OeChartTester.Dataset.Option = OeChartTester.convertChartDataToOptions(chartData, chartType, testContext, channels, testContext.translate.currentLang, config, configuration.datasets); + const options: OeChartTester.Dataset.Option = OeChartTester.convertChartDataToOptions(chartData, chartType, testContext, channels, testContext.translate.currentLang, config, configuration.datasets, xAxisScalingType, configuration.labels); return { datasets: { @@ -257,7 +258,7 @@ export class OeChartTester { */ public static convertChartLabelsToLegendLabels(labels: Date[]): OeChartTester.Dataset.LegendLabel { return { - type: 'label', + type: "label", timestamps: labels, }; } @@ -274,7 +275,7 @@ export class OeChartTester { for (const dataset of datasets) { fields.push( { - type: 'data', + type: "data", label: dataset.label, value: dataset.data as number[], }); @@ -292,29 +293,30 @@ export class OeChartTester { * @param channels the channels * @returns dataset options */ - public static convertChartDataToOptions(chartData: HistoryUtils.ChartData, chartType: 'line' | 'bar', testContext: TestContext, channels: OeTester.Types.Channels, locale: string, config: EdgeConfig, datasets: Chart.ChartDataset[]): OeChartTester.Dataset.Option { + public static convertChartDataToOptions(chartData: HistoryUtils.ChartData, chartType: "line" | "bar", testContext: TestContext, channels: OeTester.Types.Channels, locale: string, config: EdgeConfig, datasets: Chart.ChartDataset[], xAxisType: XAxisType = XAxisType.TIMESERIES, labels: (Date | string)[] = []): OeChartTester.Dataset.Option { const channelData: QueryHistoricTimeseriesDataResponse | QueryHistoricTimeseriesEnergyPerPeriodResponse = OeChartTester.getChannelDataByCharttype(chartType, channels); + const displayValues = chartData.output(channelData.result.data); const legendOptions: any[] = []; displayValues.forEach(displayValue => { const yAxis = chartData.yAxes.find(yaxis => yaxis?.yAxisId == (displayValue?.yAxisId ?? chartData.yAxes[0].yAxisId)); - const label = AbstractHistoryChart.getTooltipsLabelName(displayValue.name, yAxis?.unit, typeof displayValue.nameSuffix == 'function' ? displayValue.nameSuffix(channels.energyChannelWithValues) : null); + const label = AbstractHistoryChart.getTooltipsLabelName(displayValue.name, yAxis?.unit, typeof displayValue.nameSuffix == "function" ? displayValue.nameSuffix(channels.energyChannelWithValues) : null); legendOptions.push(AbstractHistoryChart.getLegendOptions(label, displayValue)); }); return { - type: 'option', - options: AbstractHistoryChart.getOptions(chartData, chartType, testContext.service, testContext.translate, null, legendOptions, channelData.result, locale, config, datasets), + type: "option", + options: AbstractHistoryChart.getOptions(chartData, chartType, testContext.service, testContext.translate, legendOptions, channelData.result, locale, config, datasets, xAxisType, labels), }; } - private static getChannelDataByCharttype(chartType: 'line' | 'bar', channels: OeTester.Types.Channels): QueryHistoricTimeseriesEnergyPerPeriodResponse | QueryHistoricTimeseriesDataResponse { + private static getChannelDataByCharttype(chartType: "line" | "bar", channels: OeTester.Types.Channels): QueryHistoricTimeseriesEnergyPerPeriodResponse | QueryHistoricTimeseriesDataResponse { switch (chartType) { - case 'line': + case "line": return channels.dataChannelWithValues; - case 'bar': + case "bar": return channels.energyPerPeriodChannelWithValues; } } @@ -340,38 +342,38 @@ export namespace OeFormlyViewTester { export namespace Field { export type InfoLine = { - type: 'info-line', + type: "info-line", name: string }; export type Item = { - type: 'item', + type: "item", value: string }; export type ChannelLine = { - type: 'channel-line', + type: "channel-line", name: string, value?: string, indentation?: TextIndentation, }; export type ValueLine = { - type: 'value-from-channels-line', + type: "value-from-channels-line", name: string, value?: string, indentation?: TextIndentation, }; export type ChildrenLine = { - type: 'children-line', + type: "children-line", name: string, indentation?: TextIndentation, children?: Field[] }; export type HorizontalLine = { - type: 'horizontal-line', + type: "horizontal-line", }; } @@ -381,12 +383,12 @@ export namespace OeFormlyViewTester { let value: string | null = null; let rawValue: number | null = null; - if (typeof field.name == 'object') { - rawValue = typeof field.name == 'object' ? (field.name.channel.toString() in context ? context[field.name.channel.toString()] : null) : null; + if (typeof field.name == "object") { + rawValue = typeof field.name == "object" ? (field.name.channel.toString() in context ? context[field.name.channel.toString()] : null) : null; value = field.name.converter(rawValue); } - if (typeof (field.name) === 'string') { + if (typeof (field.name) === "string") { value = field.name; } diff --git a/ui/src/app/shared/components/shared/testing/utils.spec.ts b/ui/src/app/shared/components/shared/testing/utils.spec.ts index b08627e0468..641d93f57cd 100644 --- a/ui/src/app/shared/components/shared/testing/utils.spec.ts +++ b/ui/src/app/shared/components/shared/testing/utils.spec.ts @@ -1,33 +1,43 @@ + import { registerLocaleData } from "@angular/common"; -import localDE from '@angular/common/locales/de'; -import localeDeExtra from '@angular/common/locales/extra/de'; +import localDE from "@angular/common/locales/de"; +import localeDeExtra from "@angular/common/locales/extra/de"; import { LOCALE_ID } from "@angular/core"; -import { TestBed } from "@angular/core/testing"; +import { TestBed, TestModuleMetadata } from "@angular/core/testing"; +import { ActivatedRoute, RouterModule } from "@angular/router"; +import { RouterTestingModule } from "@angular/router/testing"; import { FORMLY_CONFIG } from "@ngx-formly/core"; import { TranslateLoader, TranslateModule, TranslateService } from "@ngx-translate/core"; +import { routes } from "src/app/app-routing.module"; import { Service } from "src/app/shared/shared"; import { registerTranslateExtension } from "src/app/shared/translate.extension"; import { Language, MyTranslateLoader } from "src/app/shared/type/language"; export type TestContext = { translate: TranslateService, service: Service }; +export const BASE_TEST_BED: TestModuleMetadata = { + imports: [ + TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: MyTranslateLoader }, defaultLanguage: Language.DEFAULT.key, useDefaultLang: false }), + ], + providers: [ + TranslateService, + { provide: FORMLY_CONFIG, multi: true, useFactory: registerTranslateExtension, deps: [TranslateService] }, + { provide: LOCALE_ID, useValue: Language.DEFAULT.key }, + Service, + ], +}; + +export function setTranslateParams(): void { + const translateService = TestBed.inject(TranslateService); + translateService.addLangs(["de"]); + translateService.use("de"); + registerLocaleData(localDE, "de", localeDeExtra); +} + export async function sharedSetup(): Promise { - await TestBed.configureTestingModule({ - imports: [ - TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: MyTranslateLoader }, defaultLanguage: Language.DEFAULT.key, useDefaultLang: false }), - ], - providers: [ - TranslateService, - { provide: FORMLY_CONFIG, multi: true, useFactory: registerTranslateExtension, deps: [TranslateService] }, - { provide: LOCALE_ID, useValue: Language.DEFAULT.key }, - Service, - ], - }).compileComponents().then(() => { - const translateService = TestBed.inject(TranslateService); - translateService.addLangs(['de']); - translateService.use('de'); - registerLocaleData(localDE, 'de', localeDeExtra); - }); + await TestBed.configureTestingModule(BASE_TEST_BED) + .compileComponents() + .then(() => setTranslateParams()); return { translate: TestBed.inject(TranslateService), @@ -36,15 +46,44 @@ export async function sharedSetup(): Promise { } export function removeFunctions(obj: any): any { - if (typeof obj !== 'object' || obj === null) { + if (typeof obj !== "object" || obj === null) { return obj; } const result: any = {}; for (const key in obj) { - if (typeof obj[key] !== 'function') { + if (typeof obj[key] !== "function") { result[key] = removeFunctions(obj[key]); } } return result; } + +export async function sharedSetupWithComponentIdRoute(componentId: string): Promise { + await TestBed.configureTestingModule({ + imports: [ + ...(BASE_TEST_BED.imports as any[]), + RouterTestingModule.withRoutes(routes), + RouterModule.forRoot([]), + ], + providers: [ + ...(BASE_TEST_BED.providers as any[]), + { + provide: ActivatedRoute, + useValue: { + snapshot: { + params: { componentId: componentId }, + }, + }, + }, + ], + }) + .compileComponents() + .then(() => setTranslateParams()); + + return { + translate: TestBed.inject(TranslateService), + service: TestBed.inject(Service), + route: TestBed.inject(ActivatedRoute), + }; +} diff --git a/ui/src/app/shared/components/status/single/status.component.spec.ts b/ui/src/app/shared/components/status/single/status.component.spec.ts index 6f4c1868bbc..b6d83233d1b 100644 --- a/ui/src/app/shared/components/status/single/status.component.spec.ts +++ b/ui/src/app/shared/components/status/single/status.component.spec.ts @@ -1,15 +1,14 @@ import { TestBed } from "@angular/core/testing"; import { ModalController } from "@ionic/angular"; - -import { EdgeConfig, PersistencePriority } from "../../edge/edgeconfig"; -import { StatusSingleComponent } from "./status.component"; import { BehaviorSubject } from "rxjs"; import { DummyWebsocket } from "src/app/shared/service/test/dummywebsocket"; -import { Service, Websocket, ChannelAddress } from "src/app/shared/shared"; +import { ChannelAddress, Service, Websocket } from "src/app/shared/shared"; import { Edge } from "../../edge/edge"; +import { EdgeConfig, PersistencePriority } from "../../edge/edgeconfig"; import { DummyModalController } from "../../shared/testing/DummyModalController"; +import { StatusSingleComponent } from "./status.component"; -describe('StatusComponent', () => { +describe("StatusComponent", () => { const testComponent = new EdgeConfig.Component("test", {}, { "testChannel": { accessMode: "RO", @@ -21,12 +20,12 @@ describe('StatusComponent', () => { text: "", }, }); - testComponent.id = 'test0'; + testComponent.id = "test0"; let statusComponent: StatusSingleComponent; - const serviceSpy = jasmine.createSpyObj('Service', ['getConfig'], ['currentEdge']); - const edgeSpy = jasmine.createSpyObj('Edge', ['subscribeChannels', 'isVersionAtLeast', 'unsubscribeChannels']); - const edgeConfigSpy = jasmine.createSpyObj('EdgeConfig', ['listActiveComponents'], ['components']); + const serviceSpy = jasmine.createSpyObj("Service", ["getConfig"], ["currentEdge"]); + const edgeSpy = jasmine.createSpyObj("Edge", ["subscribeChannels", "isVersionAtLeast", "unsubscribeChannels"]); + const edgeConfigSpy = jasmine.createSpyObj("EdgeConfig", ["listActiveComponents"], ["components"]); // initialize variables only in beforeEach, beforeAll beforeEach((() => { TestBed.configureTestingModule({ @@ -45,22 +44,22 @@ describe('StatusComponent', () => { valueEdgeSpy.unsubscribeChannels.and.callThrough(); const valueServiceSpy = TestBed.inject(Service) as jasmine.SpyObj; - spyPropertyGetter(valueServiceSpy, 'currentEdge').and.returnValue(new BehaviorSubject(TestBed.inject(Edge))); + spyPropertyGetter(valueServiceSpy, "currentEdge").and.returnValue(new BehaviorSubject(TestBed.inject(Edge))); const valueEdgeConfigSpy = TestBed.inject(EdgeConfig) as jasmine.SpyObj; - valueEdgeConfigSpy.listActiveComponents.and.returnValue([{ category: { icon: '', title: 'title' }, components: [testComponent] }]); - spyPropertyGetter(valueEdgeConfigSpy, 'components').and.returnValue({ [testComponent.id]: testComponent }); + valueEdgeConfigSpy.listActiveComponents.and.returnValue([{ category: { icon: "", title: "title" }, components: [testComponent] }]); + spyPropertyGetter(valueEdgeConfigSpy, "components").and.returnValue({ [testComponent.id]: testComponent }); valueServiceSpy.getConfig.and.resolveTo(TestBed.inject(EdgeConfig)); statusComponent = TestBed.inject(StatusSingleComponent); })); - it('Test add Channels for subscription', async () => { + it("Test add Channels for subscription", async () => { await statusComponent.ngOnInit(); await statusComponent.subscribeInfoChannels(testComponent); expect(statusComponent.subscribedInfoChannels).toHaveSize(2); - expect(statusComponent.subscribedInfoChannels).toContain(new ChannelAddress(testComponent.id, 'State')); - expect(statusComponent.subscribedInfoChannels).toContain(new ChannelAddress(testComponent.id, 'testChannel')); + expect(statusComponent.subscribedInfoChannels).toContain(new ChannelAddress(testComponent.id, "State")); + expect(statusComponent.subscribedInfoChannels).toContain(new ChannelAddress(testComponent.id, "testChannel")); }); }); diff --git a/ui/src/app/shared/components/status/single/status.component.ts b/ui/src/app/shared/components/status/single/status.component.ts index 6f3343cb5d3..9d269b1ce59 100644 --- a/ui/src/app/shared/components/status/single/status.component.ts +++ b/ui/src/app/shared/components/status/single/status.component.ts @@ -1,19 +1,19 @@ // @ts-strict-ignore -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ModalController } from '@ionic/angular'; -import { Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; -import { ComponentJsonApiRequest } from 'src/app/shared/jsonrpc/request/componentJsonApiRequest'; -import { GetStateChannelsOfComponentRequest } from 'src/app/shared/jsonrpc/request/getStateChannelsOfComponentRequest'; -import { GetChannelsOfComponentResponse } from 'src/app/shared/jsonrpc/response/getChannelsOfComponentResponse'; -import { ChannelAddress, EdgePermission, Service, Websocket } from 'src/app/shared/shared'; +import { Component, OnDestroy, OnInit } from "@angular/core"; +import { ModalController } from "@ionic/angular"; +import { Subject } from "rxjs"; +import { takeUntil } from "rxjs/operators"; +import { ComponentJsonApiRequest } from "src/app/shared/jsonrpc/request/componentJsonApiRequest"; +import { GetStateChannelsOfComponentRequest } from "src/app/shared/jsonrpc/request/getStateChannelsOfComponentRequest"; +import { GetChannelsOfComponentResponse } from "src/app/shared/jsonrpc/response/getChannelsOfComponentResponse"; +import { ChannelAddress, EdgePermission, Service, Websocket } from "src/app/shared/shared"; -import { Edge } from '../../edge/edge'; -import { CategorizedComponents, EdgeConfig } from '../../edge/edgeconfig'; +import { Edge } from "../../edge/edge"; +import { CategorizedComponents, EdgeConfig } from "../../edge/edgeconfig"; @Component({ selector: StatusSingleComponent.SELECTOR, - templateUrl: './status.component.html', + templateUrl: "./status.component.html", }) export class StatusSingleComponent implements OnInit, OnDestroy { private static readonly SELECTOR = "statussingle"; @@ -45,9 +45,9 @@ export class StatusSingleComponent implements OnInit, OnDestroy { this.components.forEach(categorizedComponent => { categorizedComponent.components.forEach(component => { // sets all arrow buttons to standard position (folded) - component['showProperties'] = false; + component["showProperties"] = false; this.subscribedInfoChannels.push( - new ChannelAddress(component.id, 'State'), + new ChannelAddress(component.id, "State"), ); }); }); @@ -84,10 +84,10 @@ export class StatusSingleComponent implements OnInit, OnDestroy { this.edge?.subscribeChannels(this.websocket, StatusSingleComponent.SELECTOR, this.subscribedInfoChannels); } - private getStateChannels(componentId: string): Promise { + private getStateChannels(componentId: string): Promise { return new Promise((resolve, reject) => { if (EdgePermission.hasChannelsInEdgeConfig(this.edge)) { - const channels: typeof this.channels['componentId'] = {}; + const channels: typeof this.channels["componentId"] = {}; for (const [key, value] of Object.entries(this.config.components[componentId].channels)) { // show only state channels @@ -102,10 +102,10 @@ export class StatusSingleComponent implements OnInit, OnDestroy { } this.edge.sendRequest(this.websocket, new ComponentJsonApiRequest({ - componentId: '_componentManager', + componentId: "_componentManager", payload: new GetStateChannelsOfComponentRequest({ componentId: componentId }), })).then((response: GetChannelsOfComponentResponse) => { - const channels: typeof this.channels['componentId'] = {}; + const channels: typeof this.channels["componentId"] = {}; for (const item of response.result.channels) { channels[item.id] = { text: item.text, level: item.level }; } diff --git a/ui/src/app/shared/directive/autofill.ts b/ui/src/app/shared/directive/autofill.ts index 8665630df5b..ef1dfc539f4 100644 --- a/ui/src/app/shared/directive/autofill.ts +++ b/ui/src/app/shared/directive/autofill.ts @@ -1,20 +1,20 @@ // @ts-strict-ignore -import { Directive, ElementRef, OnInit } from '@angular/core'; -import { Capacitor } from '@capacitor/core'; -import { Logger } from '../shared'; +import { Directive, ElementRef, OnInit } from "@angular/core"; +import { Capacitor } from "@capacitor/core"; +import { Logger } from "../shared"; @Directive({ - selector: '[appAutofill]', + selector: "[appAutofill]", }) export class AutofillDirective implements OnInit { constructor(private el: ElementRef, private logger: Logger) { } ngOnInit(): void { - if (Capacitor.getPlatform() !== 'ios') { return; } + if (Capacitor.getPlatform() !== "ios") { return; } setTimeout(() => { try { - this.el.nativeElement.children[0].addEventListener('change', (e) => { + this.el.nativeElement.children[0].addEventListener("change", (e) => { this.el.nativeElement.value = (e.target as any).value; }); } catch { diff --git a/ui/src/app/shared/directive/directive.ts b/ui/src/app/shared/directive/directive.ts index 619719018a9..5dfbcd6368c 100644 --- a/ui/src/app/shared/directive/directive.ts +++ b/ui/src/app/shared/directive/directive.ts @@ -1,7 +1,7 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { VarDirective } from './ngvar'; -import { AutofillDirective } from './autofill'; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { AutofillDirective } from "./autofill"; +import { VarDirective } from "./ngvar"; @NgModule({ imports: [ diff --git a/ui/src/app/shared/directive/ngvar.ts b/ui/src/app/shared/directive/ngvar.ts index a4655449422..01923e9870a 100644 --- a/ui/src/app/shared/directive/ngvar.ts +++ b/ui/src/app/shared/directive/ngvar.ts @@ -1,7 +1,7 @@ -import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core'; +import { Directive, Input, TemplateRef, ViewContainerRef } from "@angular/core"; @Directive({ - selector: '[ngVar]', + selector: "[ngVar]", }) export class VarDirective { private context: { diff --git a/ui/src/app/shared/guards/functional-guards.ts b/ui/src/app/shared/guards/functional-guards.ts new file mode 100644 index 00000000000..ac3db77136f --- /dev/null +++ b/ui/src/app/shared/guards/functional-guards.ts @@ -0,0 +1,35 @@ +// @ts-strict-ignore +import { Location } from "@angular/common"; +import { inject } from "@angular/core"; +import { ActivatedRouteSnapshot, RouterStateSnapshot } from "@angular/router"; +import { filter, take } from "rxjs/operators"; +import { Service } from "../shared"; +import { Role } from "../type/role"; + +/** + * Determines if user is allowed to navigate to route, dependent on edge role + * + * @param route the route snapshot + * @param state the routerStateSnapshot + * @returns true, if edge.role equals requiredTole (provided in {@link Route.data} ) + */ +export const hasEdgeRole = (role: Role) => { + return (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => { + const location = inject(Location); + const service = inject(Service); + service.currentEdge.pipe(filter(edge => !!edge), take(1)).subscribe((edge) => { + if (edge) { + const roleIsAtLeast = Role.isAtLeast(edge.role, role); + + if (!roleIsAtLeast) { + console.warn(`Routing Failed. Reason: User not allowed to access [component:${route?.component["SELECTOR"] ?? state.url}]`); + location.back(); + } + return roleIsAtLeast; + } + return false; + }); + + return true; + }; +}; diff --git a/ui/src/app/shared/jsonrpc/base.ts b/ui/src/app/shared/jsonrpc/base.ts index 8fd40a1af96..709ade30497 100644 --- a/ui/src/app/shared/jsonrpc/base.ts +++ b/ui/src/app/shared/jsonrpc/base.ts @@ -1,4 +1,4 @@ -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidv4 } from "uuid"; export abstract class JsonrpcMessage { public readonly jsonrpc: string = "2.0"; diff --git a/ui/src/app/shared/jsonrpc/notification/edgeConfigNotification.ts b/ui/src/app/shared/jsonrpc/notification/edgeConfigNotification.ts index 5fd4a0da61c..6e86011ebc2 100644 --- a/ui/src/app/shared/jsonrpc/notification/edgeConfigNotification.ts +++ b/ui/src/app/shared/jsonrpc/notification/edgeConfigNotification.ts @@ -1,4 +1,4 @@ -import { EdgeConfig } from '../../components/edge/edgeconfig'; +import { EdgeConfig } from "../../components/edge/edgeconfig"; import { JsonrpcNotification } from "../base"; /** diff --git a/ui/src/app/shared/jsonrpc/notification/systemLogNotification.ts b/ui/src/app/shared/jsonrpc/notification/systemLogNotification.ts index 0c233a75fdd..d7ebcab68be 100644 --- a/ui/src/app/shared/jsonrpc/notification/systemLogNotification.ts +++ b/ui/src/app/shared/jsonrpc/notification/systemLogNotification.ts @@ -1,5 +1,5 @@ -import { JsonrpcNotification } from "../base"; import { SystemLog } from "../../type/systemlog"; +import { JsonrpcNotification } from "../base"; /** * Represents a JSON-RPC Notification for sending the current system log. diff --git a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest.ts b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest.ts index 77146413230..c96f00e5752 100644 --- a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest.ts +++ b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest.ts @@ -1,9 +1,9 @@ // @ts-strict-ignore +import { format } from "date-fns"; +import { Resolution } from "src/app/edge/history/shared"; import { ChannelAddress } from "../../../shared/type/channeladdress"; -import { format } from 'date-fns'; import { JsonrpcRequest } from "../base"; import { JsonRpcUtils } from "../jsonrpcutils"; -import { Resolution } from "src/app/edge/history/shared"; /** * Represents a JSON-RPC Request to query Historic Timeseries Data. @@ -34,8 +34,8 @@ export class QueryHistoricTimeseriesDataRequest extends JsonrpcRequest { ) { super(QueryHistoricTimeseriesDataRequest.METHOD, { timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, - fromDate: format(fromDate, 'yyyy-MM-dd'), - toDate: format(toDate, 'yyyy-MM-dd'), + fromDate: format(fromDate, "yyyy-MM-dd"), + toDate: format(toDate, "yyyy-MM-dd"), channels: JsonRpcUtils.channelsToStringArray(channels), resolution: resolution, }); diff --git a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest.ts b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest.ts index c81fd430687..3c5bbde6911 100644 --- a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest.ts +++ b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest.ts @@ -1,9 +1,9 @@ // @ts-strict-ignore +import { format } from "date-fns"; +import { Resolution } from "src/app/edge/history/shared"; import { ChannelAddress } from "../../type/channeladdress"; -import { format } from 'date-fns'; import { JsonrpcRequest } from "../base"; import { JsonRpcUtils } from "../jsonrpcutils"; -import { Resolution } from "src/app/edge/history/shared"; /** * Represents a JSON-RPC Request to query Timeseries Energy data. @@ -36,8 +36,8 @@ export class QueryHistoricTimeseriesEnergyPerPeriodRequest extends JsonrpcReques ) { super(QueryHistoricTimeseriesEnergyPerPeriodRequest.METHOD, { timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, - fromDate: format(fromDate, 'yyyy-MM-dd'), - toDate: format(toDate, 'yyyy-MM-dd'), + fromDate: format(fromDate, "yyyy-MM-dd"), + toDate: format(toDate, "yyyy-MM-dd"), channels: JsonRpcUtils.channelsToStringArray(channels), resolution: resolution, }); diff --git a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest.ts b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest.ts index cd44298b563..b96874be72a 100644 --- a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest.ts +++ b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest.ts @@ -1,6 +1,6 @@ // @ts-strict-ignore +import { format } from "date-fns"; import { ChannelAddress } from "../../type/channeladdress"; -import { format } from 'date-fns'; import { JsonrpcRequest } from "../base"; import { JsonRpcUtils } from "../jsonrpcutils"; @@ -32,8 +32,8 @@ export class QueryHistoricTimeseriesEnergyRequest extends JsonrpcRequest { ) { super(QueryHistoricTimeseriesEnergyRequest.METHOD, { timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, - fromDate: format(fromDate, 'yyyy-MM-dd'), - toDate: format(toDate, 'yyyy-MM-dd'), + fromDate: format(fromDate, "yyyy-MM-dd"), + toDate: format(toDate, "yyyy-MM-dd"), channels: JsonRpcUtils.channelsToStringArray(channels), }); // delete local fields, otherwise they are sent with the JSON-RPC Request diff --git a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesExportXlxs.ts b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesExportXlxs.ts index eb67e868a7a..5aed2202ec7 100644 --- a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesExportXlxs.ts +++ b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesExportXlxs.ts @@ -1,6 +1,6 @@ // @ts-strict-ignore -import { format } from 'date-fns'; -import { JsonrpcRequest } from '../base'; +import { format } from "date-fns"; +import { JsonrpcRequest } from "../base"; /** * Queries historic timeseries data; exports to Xlsx (Excel) file. @@ -28,8 +28,8 @@ export class QueryHistoricTimeseriesExportXlxsRequest extends JsonrpcRequest { ) { super(QueryHistoricTimeseriesExportXlxsRequest.METHOD, { timezone: new Date().getTimezoneOffset() * 60, - fromDate: format(fromDate, 'yyyy-MM-dd'), - toDate: format(toDate, 'yyyy-MM-dd'), + fromDate: format(fromDate, "yyyy-MM-dd"), + toDate: format(toDate, "yyyy-MM-dd"), }); // delete local fields, otherwise they are sent with the JSON-RPC Request delete this.fromDate; diff --git a/ui/src/app/shared/legacy/chartoptions/chartoptions.component.html b/ui/src/app/shared/legacy/chartoptions/chartoptions.component.html index 33dd2721bb4..02980ba1e0d 100644 --- a/ui/src/app/shared/legacy/chartoptions/chartoptions.component.html +++ b/ui/src/app/shared/legacy/chartoptions/chartoptions.component.html @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/legacy/chartoptions/chartoptions.component.ts b/ui/src/app/shared/legacy/chartoptions/chartoptions.component.ts index b1042ea46e2..bb5399a749b 100644 --- a/ui/src/app/shared/legacy/chartoptions/chartoptions.component.ts +++ b/ui/src/app/shared/legacy/chartoptions/chartoptions.component.ts @@ -1,14 +1,14 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; -import { PopoverController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; +import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { PopoverController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; -import { Service } from '../../shared'; +import { Service } from "../../shared"; // @ts-strict-ignore -import { ChartOptionsPopoverComponent } from './popover/popover.component'; +import { ChartOptionsPopoverComponent } from "./popover/popover.component"; @Component({ - selector: 'chartOptions', - templateUrl: './chartoptions.component.html', + selector: "chartOptions", + templateUrl: "./chartoptions.component.html", }) export class ChartOptionsComponent { @@ -26,10 +26,10 @@ export class ChartOptionsComponent { async presentPopover(ev: any) { const componentProps = {}; if (this.showPhases !== null) { - componentProps['showPhases'] = this.showPhases; + componentProps["showPhases"] = this.showPhases; } if (this.showTotal !== null) { - componentProps['showTotal'] = this.showTotal; + componentProps["showTotal"] = this.showTotal; } const popover = await this.popoverCtrl.create({ component: ChartOptionsPopoverComponent, @@ -39,14 +39,14 @@ export class ChartOptionsComponent { }); await popover.present(); popover.onDidDismiss().then((data) => { - if (data['role'] == "Phases" && data['data'] == true) { + if (data["role"] == "Phases" && data["data"] == true) { this.setShowPhases.emit(true); - } else if (data['role'] == "Phases" && data['data'] == false) { + } else if (data["role"] == "Phases" && data["data"] == false) { this.setShowPhases.emit(false); } - if (data['role'] == "Total" && data['data'] == true) { + if (data["role"] == "Total" && data["data"] == true) { this.setShowTotal.emit(true); - } else if (data['role'] == "Total" && data['data'] == false) { + } else if (data["role"] == "Total" && data["data"] == false) { this.setShowTotal.emit(false); } }); diff --git a/ui/src/app/shared/legacy/chartoptions/popover/popover.component.html b/ui/src/app/shared/legacy/chartoptions/popover/popover.component.html index 82bd75f8572..94793aee035 100644 --- a/ui/src/app/shared/legacy/chartoptions/popover/popover.component.html +++ b/ui/src/app/shared/legacy/chartoptions/popover/popover.component.html @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/shared/legacy/chartoptions/popover/popover.component.ts b/ui/src/app/shared/legacy/chartoptions/popover/popover.component.ts index deb9d9c2e4d..5cddb86fbc6 100644 --- a/ui/src/app/shared/legacy/chartoptions/popover/popover.component.ts +++ b/ui/src/app/shared/legacy/chartoptions/popover/popover.component.ts @@ -1,11 +1,11 @@ -import { Component, Input } from '@angular/core'; -import { PopoverController } from '@ionic/angular'; -import { TranslateService } from '@ngx-translate/core'; -import { Service } from 'src/app/shared/shared'; +import { Component, Input } from "@angular/core"; +import { PopoverController } from "@ionic/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { Service } from "src/app/shared/shared"; @Component({ - selector: 'chartoptionspopover', - templateUrl: './popover.component.html', + selector: "chartoptionspopover", + templateUrl: "./popover.component.html", }) export class ChartOptionsPopoverComponent { @@ -24,7 +24,7 @@ export class ChartOptionsPopoverComponent { } else if (this.showPhases == false) { this.showPhases = true; } - this.popoverCtrl.dismiss(this.showPhases, 'Phases'); + this.popoverCtrl.dismiss(this.showPhases, "Phases"); } public setTotal() { @@ -33,7 +33,7 @@ export class ChartOptionsPopoverComponent { } else if (this.showTotal == false) { this.showTotal = true; } - this.popoverCtrl.dismiss(this.showTotal, 'Total'); + this.popoverCtrl.dismiss(this.showTotal, "Total"); } } diff --git a/ui/src/app/shared/pipe/classname/classname.pipe.ts b/ui/src/app/shared/pipe/classname/classname.pipe.ts index 7b966b8add5..dbc78248e44 100644 --- a/ui/src/app/shared/pipe/classname/classname.pipe.ts +++ b/ui/src/app/shared/pipe/classname/classname.pipe.ts @@ -1,8 +1,8 @@ // @ts-strict-ignore -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform } from "@angular/core"; @Pipe({ - name: 'classname', + name: "classname", }) export class ClassnamePipe implements PipeTransform { transform(value, args: string[]): any { diff --git a/ui/src/app/shared/pipe/formatSecondsToDuration/formatSecondsToDuration.pipe.ts b/ui/src/app/shared/pipe/formatSecondsToDuration/formatSecondsToDuration.pipe.ts index 2e0b760fa81..85dcbb36b85 100644 --- a/ui/src/app/shared/pipe/formatSecondsToDuration/formatSecondsToDuration.pipe.ts +++ b/ui/src/app/shared/pipe/formatSecondsToDuration/formatSecondsToDuration.pipe.ts @@ -1,10 +1,10 @@ -import { DecimalPipe } from '@angular/common'; -import { Pipe, PipeTransform } from '@angular/core'; +import { DecimalPipe } from "@angular/common"; +import { Pipe, PipeTransform } from "@angular/core"; -import { Converter } from '../../components/shared/converter'; +import { Converter } from "../../components/shared/converter"; @Pipe({ - name: 'formatSecondsToDuration', + name: "formatSecondsToDuration", }) export class FormatSecondsToDurationPipe implements PipeTransform { @@ -17,9 +17,9 @@ export class FormatSecondsToDurationPipe implements PipeTransform { const hours = Math.floor(minutes / 60); minutes -= hours * 60; if (hours <= 23) { - return this.decimalPipe.transform(hours, '1.0-0') + 'h' + " " + this.decimalPipe.transform(minutes, '1.0-0') + 'm'; + return this.decimalPipe.transform(hours, "1.0-0") + "h" + " " + this.decimalPipe.transform(minutes, "1.0-0") + "m"; } else { - return this.decimalPipe.transform(hours, '1.0-0') + 'h'; + return this.decimalPipe.transform(hours, "1.0-0") + "h"; } }); } diff --git a/ui/src/app/shared/pipe/isclass/isclass.pipe.ts b/ui/src/app/shared/pipe/isclass/isclass.pipe.ts index 03e6012ae38..878c61e1d53 100644 --- a/ui/src/app/shared/pipe/isclass/isclass.pipe.ts +++ b/ui/src/app/shared/pipe/isclass/isclass.pipe.ts @@ -1,15 +1,15 @@ -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform } from "@angular/core"; /** * Checks if an object has a property "class" and this property has the value of the given parameter. * Use like: *ngIf="bridge | isclass:'io.openems.impl.protocol.simulator.SimulatorBridge'" */ @Pipe({ - name: 'isclass', + name: "isclass", }) export class IsclassPipe implements PipeTransform { transform(object: any, classname: string): boolean { - if (object !== null && typeof object === 'object' && object["class"] && object.class == classname) { + if (object !== null && typeof object === "object" && object["class"] && object.class == classname) { return true; } else { return false; diff --git a/ui/src/app/shared/pipe/keys/keys.pipe.ts b/ui/src/app/shared/pipe/keys/keys.pipe.ts index 3d4eb68073d..41d220c89af 100644 --- a/ui/src/app/shared/pipe/keys/keys.pipe.ts +++ b/ui/src/app/shared/pipe/keys/keys.pipe.ts @@ -1,8 +1,8 @@ // @ts-strict-ignore -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform } from "@angular/core"; @Pipe({ - name: 'keys', + name: "keys", }) export class KeysPipe implements PipeTransform { transform(value, args: string[]): any { diff --git a/ui/src/app/shared/pipe/pipe.ts b/ui/src/app/shared/pipe/pipe.ts index e2fef054ecf..ff8f05002e8 100644 --- a/ui/src/app/shared/pipe/pipe.ts +++ b/ui/src/app/shared/pipe/pipe.ts @@ -1,14 +1,14 @@ -import { DecimalPipe } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { ClassnamePipe } from './classname/classname.pipe'; -import { FormatSecondsToDurationPipe } from './formatSecondsToDuration/formatSecondsToDuration.pipe'; -import { IsclassPipe } from './isclass/isclass.pipe'; -import { KeysPipe } from './keys/keys.pipe'; -import { SignPipe } from './sign/sign.pipe'; -import { TypeofPipe } from './typeof/typeof.pipe'; -import { UnitvaluePipe } from './unitvalue/unitvalue.pipe'; -import { VersionPipe } from './version/version.pipe'; +import { DecimalPipe } from "@angular/common"; +import { NgModule } from "@angular/core"; +import { BrowserModule } from "@angular/platform-browser"; +import { ClassnamePipe } from "./classname/classname.pipe"; +import { FormatSecondsToDurationPipe } from "./formatSecondsToDuration/formatSecondsToDuration.pipe"; +import { IsclassPipe } from "./isclass/isclass.pipe"; +import { KeysPipe } from "./keys/keys.pipe"; +import { SignPipe } from "./sign/sign.pipe"; +import { TypeofPipe } from "./typeof/typeof.pipe"; +import { UnitvaluePipe } from "./unitvalue/unitvalue.pipe"; +import { VersionPipe } from "./version/version.pipe"; @NgModule({ imports: [ diff --git a/ui/src/app/shared/pipe/sign/sign.pipe.ts b/ui/src/app/shared/pipe/sign/sign.pipe.ts index 614ff7c928b..3929ad4997c 100644 --- a/ui/src/app/shared/pipe/sign/sign.pipe.ts +++ b/ui/src/app/shared/pipe/sign/sign.pipe.ts @@ -1,8 +1,8 @@ // @ts-strict-ignore -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform } from "@angular/core"; @Pipe({ - name: 'sign', + name: "sign", }) export class SignPipe implements PipeTransform { transform(value, args: string[]): any { diff --git a/ui/src/app/shared/pipe/typeof/typeof.pipe.ts b/ui/src/app/shared/pipe/typeof/typeof.pipe.ts index 7b5c74d4901..288d771169c 100644 --- a/ui/src/app/shared/pipe/typeof/typeof.pipe.ts +++ b/ui/src/app/shared/pipe/typeof/typeof.pipe.ts @@ -1,7 +1,7 @@ -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform } from "@angular/core"; @Pipe({ - name: 'typeof', + name: "typeof", }) export class TypeofPipe implements PipeTransform { diff --git a/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.spec.ts b/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.spec.ts index bba039ef456..5feee1061e0 100644 --- a/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.spec.ts +++ b/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.spec.ts @@ -1,36 +1,36 @@ import { DecimalPipe, registerLocaleData } from "@angular/common"; -import localDE from '@angular/common/locales/de'; -import { UnitvaluePipe } from "./unitvalue.pipe"; +import localDE from "@angular/common/locales/de"; import { Language } from "../../type/language"; +import { UnitvaluePipe } from "./unitvalue.pipe"; -describe('UnitvaluePipe', () => { +describe("UnitvaluePipe", () => { registerLocaleData(localDE); const pipe = new UnitvaluePipe(new DecimalPipe(Language.EN.key)); // TODO test for more i18n-locales // Note: "locale" value in DecimalPipe sets itself to default locale ('en-US') even though we specify our own locales. - it('transforms "1000 W" to "1.000 W"', () => { - expect(pipe.transform(1000, 'W')).toBe('1.000' + '\u00A0' + 'W'); + it("transforms \"1000 W\" to \"1.000 W\"", () => { + expect(pipe.transform(1000, "W")).toBe("1.000" + "\u00A0" + "W"); }); - it('transforms "null W" to "- "', () => { - expect(pipe.transform(null, 'W')).toBe('-' + '\u00A0'); + it("transforms \"null W\" to \"- \"", () => { + expect(pipe.transform(null, "W")).toBe("-" + "\u00A0"); }); - it('transforms "undefined W" to "- "', () => { - expect(pipe.transform(undefined, 'W')).toBe('-' + '\u00A0'); + it("transforms \"undefined W\" to \"- \"", () => { + expect(pipe.transform(undefined, "W")).toBe("-" + "\u00A0"); }); - it('transforms "abc W" to "- "', () => { - expect(pipe.transform("abc", 'W')).toBe('-' + '\u00A0'); + it("transforms \"abc W\" to \"- \"", () => { + expect(pipe.transform("abc", "W")).toBe("-" + "\u00A0"); }); - it('transforms non number to "-"', () => { - expect(pipe.transform(pipe, 'W')).toBe('-' + '\u00A0'); + it("transforms non number to \"-\"", () => { + expect(pipe.transform(pipe, "W")).toBe("-" + "\u00A0"); }); - it('transforms "100 a" to "100 a"', () => { - expect(pipe.transform(100, 'a')).toBe('100' + '\u00A0' + 'a'); + it("transforms \"100 a\" to \"100 a\"", () => { + expect(pipe.transform(100, "a")).toBe("100" + "\u00A0" + "a"); }); }); diff --git a/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.ts b/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.ts index dbe9bf0bd64..994ae841eaf 100644 --- a/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.ts +++ b/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.ts @@ -1,10 +1,10 @@ -import { DecimalPipe } from '@angular/common'; -import { Pipe, PipeTransform } from '@angular/core'; +import { DecimalPipe } from "@angular/common"; +import { Pipe, PipeTransform } from "@angular/core"; -import { Language } from '../../type/language'; +import { Language } from "../../type/language"; @Pipe({ - name: 'unitvalue', + name: "unitvalue", }) export class UnitvaluePipe implements PipeTransform { @@ -12,17 +12,17 @@ export class UnitvaluePipe implements PipeTransform { transform(value: any, unit: string): any { if (value == null || value == undefined - || (typeof value === 'string' && value.trim() === "") - || typeof value === 'boolean' || isNaN(value)) { - return '-' + '\u00A0'; + || (typeof value === "string" && value.trim() === "") + || typeof value === "boolean" || isNaN(value)) { + return "-" + "\u00A0"; } else { // Changes the number format based on the language selected. const locale: string = (Language.getByKey(localStorage.LANGUAGE) ?? Language.DEFAULT).i18nLocaleKey; - if (unit == 'kWh' || unit == 'kW') { - return this.decimalPipe.transform(value / 1000, '1.0-1', locale) + '\u00A0' + unit; + if (unit == "kWh" || unit == "kW") { + return this.decimalPipe.transform(value / 1000, "1.0-1", locale) + "\u00A0" + unit; } else { - return this.decimalPipe.transform(value, '1.0-0', locale) + '\u00A0' + unit; + return this.decimalPipe.transform(value, "1.0-0", locale) + "\u00A0" + unit; } } } diff --git a/ui/src/app/shared/pipe/version/version.pipe.spec.ts b/ui/src/app/shared/pipe/version/version.pipe.spec.ts index 42f5132b22f..af37851c466 100644 --- a/ui/src/app/shared/pipe/version/version.pipe.spec.ts +++ b/ui/src/app/shared/pipe/version/version.pipe.spec.ts @@ -1,23 +1,23 @@ import { Role } from "../../type/role"; import { VersionPipe } from "./version.pipe"; -describe('VersionPipe', () => { +describe("VersionPipe", () => { const pipe = new VersionPipe(); - it('transforms "2020.1.2-SNAPSHOT" to "2020.1.2" for guest Role', () => { + it("transforms \"2020.1.2-SNAPSHOT\" to \"2020.1.2\" for guest Role", () => { expect(pipe.transform("2020.1.2-SNAPSHOT", Role.GUEST)).toBe("2020.1.2"); }); - it('transforms "2020.1.2-SNAPSHOT" to "2020.1.2" for owner Role', () => { + it("transforms \"2020.1.2-SNAPSHOT\" to \"2020.1.2\" for owner Role", () => { expect(pipe.transform("2020.1.2-SNAPSHOT", "owner")).toBe("2020.1.2"); }); - it('keeps "2020.1.2-SNAPSHOT" for admin Role', () => { + it("keeps \"2020.1.2-SNAPSHOT\" for admin Role", () => { expect(pipe.transform("2020.1.2-SNAPSHOT", Role.ADMIN)).toBe("2020.1.2-SNAPSHOT"); }); - it('keeps "2020.1.2" for any Role', () => { + it("keeps \"2020.1.2\" for any Role", () => { expect(pipe.transform("2020.1.2", Role.GUEST)).toBe("2020.1.2"); expect(pipe.transform("2020.1.2", Role.ADMIN)).toBe("2020.1.2"); }); diff --git a/ui/src/app/shared/pipe/version/version.pipe.ts b/ui/src/app/shared/pipe/version/version.pipe.ts index 43d07019e82..01a7a757398 100644 --- a/ui/src/app/shared/pipe/version/version.pipe.ts +++ b/ui/src/app/shared/pipe/version/version.pipe.ts @@ -1,16 +1,16 @@ -import { Pipe, PipeTransform } from '@angular/core'; +import { Pipe, PipeTransform } from "@angular/core"; -import { Role } from '../../type/role'; +import { Role } from "../../type/role"; @Pipe({ - name: 'version', + name: "version", }) export class VersionPipe implements PipeTransform { constructor() { } transform(version: string, role: Role | string): string { - if (typeof role === 'string') { + if (typeof role === "string") { role = Role.getRole(role); } switch (role) { @@ -18,7 +18,7 @@ export class VersionPipe implements PipeTransform { case Role.GUEST: case Role.INSTALLER: if (version.includes("-")) { - return version.replace(/^(.*)-.*$/, '$1'); + return version.replace(/^(.*)-.*$/, "$1"); } return version; case Role.ADMIN: diff --git a/ui/src/app/shared/service/abstractservice.ts b/ui/src/app/shared/service/abstractservice.ts index 7deaebac604..0db82c0fb92 100644 --- a/ui/src/app/shared/service/abstractservice.ts +++ b/ui/src/app/shared/service/abstractservice.ts @@ -1,13 +1,13 @@ // @ts-strict-ignore -import { ErrorHandler } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { BehaviorSubject } from 'rxjs'; -import { Edge } from '../components/edge/edge'; -import { EdgeConfig } from '../components/edge/edgeconfig'; -import { QueryHistoricTimeseriesEnergyResponse } from '../jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChannelAddress } from '../shared'; -import { Language } from '../type/language'; -import { DefaultTypes } from './defaulttypes'; +import { ErrorHandler } from "@angular/core"; +import { ActivatedRoute } from "@angular/router"; +import { BehaviorSubject } from "rxjs"; +import { Edge } from "../components/edge/edge"; +import { EdgeConfig } from "../components/edge/edgeconfig"; +import { QueryHistoricTimeseriesEnergyResponse } from "../jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChannelAddress } from "../shared"; +import { Language } from "../type/language"; +import { DefaultTypes } from "./defaulttypes"; export abstract class AbstractService extends ErrorHandler { @@ -33,6 +33,8 @@ export abstract class AbstractService extends ErrorHandler { /** * Parses the route params and sets the current edge + * + * @deprecated use the angular routing module to set page title, getCurrentEdge for retrieving the edge */ abstract setCurrentComponent(currentPageTitle: string, activatedRoute: ActivatedRoute): Promise; @@ -98,6 +100,6 @@ export abstract class AbstractService extends ErrorHandler { */ abstract stopSpinner(selector: string); - abstract toast(message: string, level: 'success' | 'warning' | 'danger'); + abstract toast(message: string, level: "success" | "warning" | "danger"); } diff --git a/ui/src/app/shared/service/arrayutils.ts b/ui/src/app/shared/service/arrayutils.ts index f2bb14e9df2..5fc4e31b654 100644 --- a/ui/src/app/shared/service/arrayutils.ts +++ b/ui/src/app/shared/service/arrayutils.ts @@ -21,7 +21,7 @@ export namespace ArrayUtils { } else if (!bVal) { return -1; } - return aVal.localeCompare(bVal, undefined, { sensitivity: 'accent' }); + return aVal.localeCompare(bVal, undefined, { sensitivity: "accent" }); }); } } diff --git a/ui/src/app/shared/service/defaulttypes.ts b/ui/src/app/shared/service/defaulttypes.ts index 0236ae8f309..c2551ff2e0b 100644 --- a/ui/src/app/shared/service/defaulttypes.ts +++ b/ui/src/app/shared/service/defaulttypes.ts @@ -1,9 +1,9 @@ // @ts-strict-ignore -import { TranslateService } from '@ngx-translate/core'; -import { endOfMonth, endOfYear, format, getDay, getMonth, getYear, isSameDay, isSameMonth, isSameYear, startOfMonth, startOfYear, subDays } from 'date-fns'; +import { TranslateService } from "@ngx-translate/core"; +import { endOfMonth, endOfYear, format, getDay, getMonth, getYear, isSameDay, isSameMonth, isSameYear, startOfMonth, startOfYear, subDays } from "date-fns"; -import { QueryHistoricTimeseriesEnergyResponse } from '../jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChannelAddress, Service } from '../shared'; +import { QueryHistoricTimeseriesEnergyResponse } from "../jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChannelAddress, Service } from "../shared"; export module DefaultTypes { @@ -13,7 +13,7 @@ export module DefaultTypes { [componentId: string]: string[]; } - export type ManualOnOff = 'MANUAL_ON' | 'MANUAL_OFF'; + export type ManualOnOff = "MANUAL_ON" | "MANUAL_OFF"; /** * CurrentData Summary @@ -94,14 +94,14 @@ export module DefaultTypes { params?: string[] } - export enum PeriodString { DAY = 'day', WEEK = 'week', MONTH = 'month', YEAR = 'year', TOTAL = 'total', CUSTOM = 'custom' } + export enum PeriodString { DAY = "day", WEEK = "week", MONTH = "month", YEAR = "year", TOTAL = "total", CUSTOM = "custom" } /** Values of {@link DefaultTypes.PeriodString} */ export type PeriodStringValues = Exclude<`${DefaultTypes.PeriodString}`, "custom">; export namespace History { - export enum YAxisTitle { + export enum YAxisType { PERCENTAGE, ENERGY, } @@ -146,7 +146,7 @@ export module DefaultTypes { afterTitle?: string }, /** Name to be displayed on the left y-axis, also the unit to be displayed in tooltips and legend */ - unit: YAxisTitle, + unit: YAxisType, }; } @@ -165,13 +165,13 @@ export module DefaultTypes { */ private static getTranslatedDayString(translate: TranslateService, date: Date): string { switch (getDay(date)) { - case 0: return translate.instant('General.Week.sunday'); - case 1: return translate.instant('General.Week.monday'); - case 2: return translate.instant('General.Week.tuesday'); - case 3: return translate.instant('General.Week.wednesday'); - case 4: return translate.instant('General.Week.thursday'); - case 5: return translate.instant('General.Week.friday'); - case 6: return translate.instant('General.Week.saturday'); + case 0: return translate.instant("General.Week.sunday"); + case 1: return translate.instant("General.Week.monday"); + case 2: return translate.instant("General.Week.tuesday"); + case 3: return translate.instant("General.Week.wednesday"); + case 4: return translate.instant("General.Week.thursday"); + case 5: return translate.instant("General.Week.friday"); + case 6: return translate.instant("General.Week.saturday"); } } @@ -183,40 +183,40 @@ export module DefaultTypes { */ private static getTranslatedMonthString(translate: TranslateService, date: Date): string { switch (getMonth(date) + 1) { - case 1: return translate.instant('General.Month.january'); - case 2: return translate.instant('General.Month.february'); - case 3: return translate.instant('General.Month.march'); - case 4: return translate.instant('General.Month.april'); - case 5: return translate.instant('General.Month.may'); - case 6: return translate.instant('General.Month.june'); - case 7: return translate.instant('General.Month.july'); - case 8: return translate.instant('General.Month.august'); - case 9: return translate.instant('General.Month.september'); - case 10: return translate.instant('General.Month.october'); - case 11: return translate.instant('General.Month.november'); - case 12: return translate.instant('General.Month.december'); + case 1: return translate.instant("General.Month.january"); + case 2: return translate.instant("General.Month.february"); + case 3: return translate.instant("General.Month.march"); + case 4: return translate.instant("General.Month.april"); + case 5: return translate.instant("General.Month.may"); + case 6: return translate.instant("General.Month.june"); + case 7: return translate.instant("General.Month.july"); + case 8: return translate.instant("General.Month.august"); + case 9: return translate.instant("General.Month.september"); + case 10: return translate.instant("General.Month.october"); + case 11: return translate.instant("General.Month.november"); + case 12: return translate.instant("General.Month.december"); } } public getText(translate: TranslateService, service: Service): string { if (service.periodString === DefaultTypes.PeriodString.TOTAL) { - return translate.instant('Edge.History.TOTAL'); + return translate.instant("Edge.History.TOTAL"); } if (isSameDay(this.from, this.to)) { if (isSameDay(this.from, new Date())) { // Selected TODAY - return translate.instant('Edge.History.today') + ", " + format(new Date(), translate.instant('General.dateFormat')); + return translate.instant("Edge.History.today") + ", " + format(new Date(), translate.instant("General.dateFormat")); } else if (isSameDay(this.from, subDays(new Date(), 1))) { // Selected YESTERDAY - return translate.instant('Edge.History.yesterday') + ", " + format(this.from, translate.instant('General.dateFormat')); + return translate.instant("Edge.History.yesterday") + ", " + format(this.from, translate.instant("General.dateFormat")); } else { // Selected one single day - return HistoryPeriod.getTranslatedDayString(translate, this.from) + ", " + translate.instant('Edge.History.selectedDay', { - value: format(this.from, translate.instant('General.dateFormat')), + return HistoryPeriod.getTranslatedDayString(translate, this.from) + ", " + translate.instant("Edge.History.selectedDay", { + value: format(this.from, translate.instant("General.dateFormat")), }); } } else if (isSameMonth(this.from, this.to) && isSameDay(this.from, startOfMonth(this.from)) && isSameDay(this.to, endOfMonth(this.to))) { @@ -230,9 +230,9 @@ export module DefaultTypes { else { return translate.instant( - 'General.periodFromTo', { - value1: format(this.from, translate.instant('General.dateFormat')), - value2: format(this.to, translate.instant('General.dateFormat')), + "General.periodFromTo", { + value1: format(this.from, translate.instant("General.dateFormat")), + value2: format(this.to, translate.instant("General.dateFormat")), }); } } @@ -244,3 +244,5 @@ export type TKeyValue = { key: string, value: T }; +/** */ +export type PropType = TObj[TProp]; diff --git a/ui/src/app/shared/service/globalRouteChangeHandler.ts b/ui/src/app/shared/service/globalRouteChangeHandler.ts index af6db888e34..17d628c4fa7 100644 --- a/ui/src/app/shared/service/globalRouteChangeHandler.ts +++ b/ui/src/app/shared/service/globalRouteChangeHandler.ts @@ -2,12 +2,12 @@ import { Injectable } from "@angular/core"; import { Router, RoutesRecognized } from "@angular/router"; import { TranslateService } from "@ngx-translate/core"; -import { filter, map } from 'rxjs/operators'; +import { filter, map } from "rxjs/operators"; import { Service } from "./service"; @Injectable({ - providedIn: 'root', + providedIn: "root", }) export class GlobalRouteChangeHandler { @@ -21,19 +21,18 @@ export class GlobalRouteChangeHandler { filter(event => event instanceof RoutesRecognized), map(event => { let data = null; - let route = event['state'].root; + let route = event["state"].root; while (route) { data = route.data || data; route = route.firstChild; } - return data; }), ).subscribe(e => { if (e.navbarTitle != null && e.navbarTitleToBeTranslated != null) { - throw new Error('Either use navbarTitle or navbarTitleToBeTranslated'); + throw new Error("Either use navbarTitle or navbarTitleToBeTranslated"); } this.service.currentPageTitle = e.navbarTitle ?? (e.navbarTitleToBeTranslated ? translate.instant(e.navbarTitleToBeTranslated) : null) ?? this.service.currentPageTitle; diff --git a/ui/src/app/shared/service/pagination.ts b/ui/src/app/shared/service/pagination.ts index 61d1f1aea1c..ed549837116 100644 --- a/ui/src/app/shared/service/pagination.ts +++ b/ui/src/app/shared/service/pagination.ts @@ -1,9 +1,9 @@ // @ts-strict-ignore -import { Directive } from '@angular/core'; -import { Router } from '@angular/router'; -import { SubscribeEdgesRequest } from '../jsonrpc/request/subscribeEdgesRequest'; -import { ChannelAddress, Edge } from '../shared'; -import { Service } from './service'; +import { Directive } from "@angular/core"; +import { Router } from "@angular/router"; +import { SubscribeEdgesRequest } from "../jsonrpc/request/subscribeEdgesRequest"; +import { ChannelAddress, Edge } from "../shared"; +import { Service } from "./service"; @Directive() export class Pagination { @@ -22,13 +22,13 @@ export class Pagination { this.edge = edge; this.service.websocket.sendRequest(new SubscribeEdgesRequest({ edges: [edge.id] })); }).then(() => { - this.edge.subscribeChannels(this.service.websocket, '', [ - new ChannelAddress('_sum', 'State'), + this.edge.subscribeChannels(this.service.websocket, "", [ + new ChannelAddress("_sum", "State"), ]); }) .finally(resolve) .catch(() => { - this.router.navigate(['index']); + this.router.navigate(["index"]); }); }); } diff --git a/ui/src/app/shared/service/service.ts b/ui/src/app/shared/service/service.ts index a0efd655628..67ce8b1a64f 100644 --- a/ui/src/app/shared/service/service.ts +++ b/ui/src/app/shared/service/service.ts @@ -1,32 +1,32 @@ // @ts-strict-ignore -import { registerLocaleData } from '@angular/common'; -import { Injectable } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ToastController } from '@ionic/angular'; -import { LangChangeEvent, TranslateService } from '@ngx-translate/core'; -import { NgxSpinnerService } from 'ngx-spinner'; -import { BehaviorSubject, Subject } from 'rxjs'; -import { filter, first, take } from 'rxjs/operators'; -import { ChosenFilter } from 'src/app/index/filter/filter.component'; -import { environment } from 'src/environments'; - -import { Edge } from '../components/edge/edge'; -import { EdgeConfig } from '../components/edge/edgeconfig'; -import { JsonrpcResponseError } from '../jsonrpc/base'; -import { GetEdgeRequest } from '../jsonrpc/request/getEdgeRequest'; -import { GetEdgesRequest } from '../jsonrpc/request/getEdgesRequest'; -import { QueryHistoricTimeseriesEnergyRequest } from '../jsonrpc/request/queryHistoricTimeseriesEnergyRequest'; -import { GetEdgeResponse } from '../jsonrpc/response/getEdgeResponse'; -import { GetEdgesResponse } from '../jsonrpc/response/getEdgesResponse'; -import { QueryHistoricTimeseriesEnergyResponse } from '../jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { User } from '../jsonrpc/shared'; -import { ChannelAddress } from '../shared'; -import { Language } from '../type/language'; -import { Role } from '../type/role'; -import { DateUtils } from '../utils/date/dateutils'; -import { AbstractService } from './abstractservice'; -import { DefaultTypes } from './defaulttypes'; -import { Websocket } from './websocket'; +import { registerLocaleData } from "@angular/common"; +import { Injectable } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; +import { ToastController } from "@ionic/angular"; +import { LangChangeEvent, TranslateService } from "@ngx-translate/core"; +import { NgxSpinnerService } from "ngx-spinner"; +import { BehaviorSubject, Subject } from "rxjs"; +import { filter, first, take } from "rxjs/operators"; +import { ChosenFilter } from "src/app/index/filter/filter.component"; +import { environment } from "src/environments"; +import { ChartConstants } from "../components/chart/chart.constants"; +import { Edge } from "../components/edge/edge"; +import { EdgeConfig } from "../components/edge/edgeconfig"; +import { JsonrpcResponseError } from "../jsonrpc/base"; +import { GetEdgeRequest } from "../jsonrpc/request/getEdgeRequest"; +import { GetEdgesRequest } from "../jsonrpc/request/getEdgesRequest"; +import { QueryHistoricTimeseriesEnergyRequest } from "../jsonrpc/request/queryHistoricTimeseriesEnergyRequest"; +import { GetEdgeResponse } from "../jsonrpc/response/getEdgeResponse"; +import { GetEdgesResponse } from "../jsonrpc/response/getEdgesResponse"; +import { QueryHistoricTimeseriesEnergyResponse } from "../jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { User } from "../jsonrpc/shared"; +import { ChannelAddress } from "../shared"; +import { Language } from "../type/language"; +import { Role } from "../type/role"; +import { DateUtils } from "../utils/date/dateutils"; +import { AbstractService } from "./abstractservice"; +import { DefaultTypes } from "./defaulttypes"; +import { Websocket } from "./websocket"; @Injectable() export class Service extends AbstractService { @@ -55,6 +55,7 @@ export class Service extends AbstractService { public deviceWidth: number = 0; public isSmartphoneResolution: boolean = false; public isSmartphoneResolutionSubject: Subject = new Subject(); + public activeQueryData: string; /** * Holds the currenty selected Page Title. @@ -148,9 +149,9 @@ export class Service extends AbstractService { return new Promise((resolve, reject) => { // Set the currentPageTitle only once per ActivatedRoute if (this.currentActivatedRoute != activatedRoute) { - if (typeof currentPageTitle === 'string') { + if (typeof currentPageTitle === "string") { // Use given page title directly - if (currentPageTitle == null || currentPageTitle.trim() === '') { + if (currentPageTitle == null || currentPageTitle.trim() === "") { this.currentPageTitle = environment.uiTitle; } else { this.currentPageTitle = currentPageTitle; @@ -197,7 +198,7 @@ export class Service extends AbstractService { public onLogout() { this.currentEdge.next(null); this.metadata.next(null); - this.router.navigate(['/login']); + this.router.navigate(["/login"]); } public getChannelAddresses(edge: Edge, channels: ChannelAddress[]): Promise { @@ -215,22 +216,27 @@ export class Service extends AbstractService { promise.resolve = resolve; promise.reject = reject; }); - this.queryEnergyQueue.push( - { fromDate: fromDate, toDate: toDate, channels: channels, promises: [promise] }, - ); - // try to merge requests within 100 ms + this.queryEnergyQueue.push({ + fromDate: fromDate, + toDate: toDate, + channels: channels, + promises: [promise], + }); + if (this.queryEnergyTimeout == null) { this.queryEnergyTimeout = setTimeout(() => { - this.queryEnergyTimeout = null; - // merge requests const mergedRequests: { - fromDate: Date, toDate: Date, channels: ChannelAddress[], promises: { resolve, reject }[]; + fromDate: Date, + toDate: Date, + channels: ChannelAddress[], + promises: { resolve, reject }[]; }[] = []; + let request; while ((request = this.queryEnergyQueue.pop())) { - if (mergedRequests.length == 0) { + if (mergedRequests.length === 0) { mergedRequests.push(request); } else { let merged = false; @@ -240,14 +246,9 @@ export class Service extends AbstractService { // same date -> merge mergedRequest.promises = mergedRequest.promises.concat(request.promises); for (const newChannel of request.channels) { - let isAlreadyThere = false; - for (const existingChannel of mergedRequest.channels) { - if (existingChannel.channelId == newChannel.channelId && existingChannel.componentId == newChannel.componentId) { - isAlreadyThere = true; - break; - } - } - if (!isAlreadyThere) { + if (!mergedRequest.channels.some(existingChannel => + existingChannel.channelId === newChannel.channelId && + existingChannel.componentId === newChannel.componentId)) { mergedRequest.channels.push(newChannel); } } @@ -265,30 +266,44 @@ export class Service extends AbstractService { for (const source of mergedRequests) { // Jump to next request for empty channelAddresses - if (source.channels.length == 0) { + if (source.channels.length === 0) { continue; } - const request = new QueryHistoricTimeseriesEnergyRequest(DateUtils.maxDate(source.fromDate, edge?.firstSetupProtocol), source.toDate, source.channels); - edge.sendRequest(this.websocket, request).then(response => { - const result = (response as QueryHistoricTimeseriesEnergyResponse).result; - if (Object.keys(result.data).length != 0) { + const request = new QueryHistoricTimeseriesEnergyRequest( + DateUtils.maxDate(source.fromDate, edge?.firstSetupProtocol), + source.toDate, + source.channels, + ); + + this.activeQueryData = request.id; + edge.sendRequest(this.websocket, request) + .then(response => { + if (this.activeQueryData !== response.id) { + return; + } + + const result = (response as QueryHistoricTimeseriesEnergyResponse).result; + + if (Object.keys(result.data).length === 0) { + for (const promise of source.promises) { + promise.reject(new JsonrpcResponseError(response.id, { code: 0, message: "Result was empty" })); + } + return; + } + for (const promise of source.promises) { promise.resolve(response as QueryHistoricTimeseriesEnergyResponse); } - } else { + }) + .catch(async reason => { for (const promise of source.promises) { - promise.reject(new JsonrpcResponseError(response.id, { code: 0, message: "Result was empty" })); + promise.reject(new JsonrpcResponseError((await response).id, { code: 0, message: "Result was empty" })); } - } - }).catch(reason => { - for (const promise of source.promises) { - promise.reject(reason); - } - }); + }); } }); - }, 100); + }, ChartConstants.REQUEST_TIMEOUT); } return response; } @@ -301,7 +316,7 @@ export class Service extends AbstractService { * @param limit the number of edges to be retrieved * @returns a Promise */ - public getEdges(page: number, query?: string, limit?: number, searchParamsObj?: { [id: string]: ChosenFilter['value'] }): Promise { + public getEdges(page: number, query?: string, limit?: number, searchParamsObj?: { [id: string]: ChosenFilter["value"] }): Promise { return new Promise((resolve, reject) => { this.websocket.sendSafeRequest( new GetEdgesRequest({ @@ -399,12 +414,12 @@ export class Service extends AbstractService { this.spinner.hide(selector); } - public async toast(message: string, level: 'success' | 'warning' | 'danger', duration?: number) { + public async toast(message: string, level: "success" | "warning" | "danger", duration?: number) { const toast = await this.toaster.create({ message: message, color: level, duration: duration ?? 2000, - cssClass: 'container', + cssClass: "container", }); toast.present(); } diff --git a/ui/src/app/shared/service/test/dummyservice.ts b/ui/src/app/shared/service/test/dummyservice.ts index e8b9cdc102f..58101b949a1 100644 --- a/ui/src/app/shared/service/test/dummyservice.ts +++ b/ui/src/app/shared/service/test/dummyservice.ts @@ -1,7 +1,6 @@ import { ActivatedRoute } from "@angular/router"; import { BehaviorSubject } from "rxjs"; import { SumState } from "src/app/index/shared/sumState"; - import { QueryHistoricTimeseriesEnergyResponse } from "../../jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; import { ChannelAddress, Edge, EdgeConfig } from "../../shared"; import { Language } from "../../type/language"; @@ -62,8 +61,8 @@ export class DummyService extends AbstractService { isPartnerAllowed(edge: Edge): boolean { throw new Error("Method not implemented."); } - // https://v16.angular.io/api/core/ErrorHandler#errorhandler - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // https://v16.angular.io/api/core/ErrorHandler#errorhandler + // eslint-disable-next-line @typescript-eslint/no-explicit-any override handleError(error: any): void { throw new Error("Method not implemented."); } diff --git a/ui/src/app/shared/service/test/dummywebsocket.ts b/ui/src/app/shared/service/test/dummywebsocket.ts index 04f579818f3..56d91ec80f1 100644 --- a/ui/src/app/shared/service/test/dummywebsocket.ts +++ b/ui/src/app/shared/service/test/dummywebsocket.ts @@ -1,4 +1,4 @@ -import { JsonrpcRequest, JsonrpcResponseSuccess, JsonrpcNotification } from "../../jsonrpc/base"; +import { JsonrpcNotification, JsonrpcRequest, JsonrpcResponseSuccess } from "../../jsonrpc/base"; import { AuthenticateWithPasswordRequest } from "../../jsonrpc/request/authenticateWithPasswordRequest"; import { AuthenticateWithTokenRequest } from "../../jsonrpc/request/authenticateWithTokenRequest"; import { WebsocketInterface } from "../websocketInterface"; diff --git a/ui/src/app/shared/service/utils.spec.ts b/ui/src/app/shared/service/utils.spec.ts index c42d551b244..3034ab95019 100644 --- a/ui/src/app/shared/service/utils.spec.ts +++ b/ui/src/app/shared/service/utils.spec.ts @@ -3,9 +3,9 @@ import { DummyConfig } from "../components/edge/edgeconfig.spec"; import { EdgeConfig } from "../shared"; import { HistoryUtils, Utils } from "./utils"; -describe('Utils', () => { +describe("Utils", () => { - it('#subtractSafely', () => { + it("#subtractSafely", () => { expect(Utils.subtractSafely(null, null)).toEqual(null); expect(Utils.subtractSafely(null, undefined)).toEqual(null); expect(Utils.subtractSafely(0, null)).toEqual(0); @@ -22,35 +22,35 @@ describe('Utils', () => { ); const channelData: HistoryUtils.ChannelData = { - 'ConsumptionActivePower': [null, null, null, 565, 560, 561, 573], - 'evcs0/ChargePower': [null, null, null, 0, 0, 0, 100], - 'evcs1/ChargePower': [null, null, null, 0, 0, 0, 0], - 'meter0/ActivePower': [124, 0, null, 0, 173, 0, 100], - 'meter1/ActivePower': [124, 0, null, 0, 173, 0, 0], + "ConsumptionActivePower": [null, null, null, 565, 560, 561, 573], + "evcs0/ChargePower": [null, null, null, 0, 0, 0, 100], + "evcs1/ChargePower": [null, null, null, 0, 0, 0, 0], + "meter0/ActivePower": [124, 0, null, 0, 173, 0, 100], + "meter1/ActivePower": [124, 0, null, 0, 173, 0, 0], }; const evcsComponents: EdgeConfig.Component[] = dummyConfig.getComponentsImplementingNature("io.openems.edge.evcs.api.Evcs") .filter(component => !( - component.factoryId == 'Evcs.Cluster' || - component.factoryId == 'Evcs.Cluster.PeakShaving' || - component.factoryId == 'Evcs.Cluster.SelfConsumption')); + component.factoryId == "Evcs.Cluster" || + component.factoryId == "Evcs.Cluster.PeakShaving" || + component.factoryId == "Evcs.Cluster.SelfConsumption")); const consumptionMeterComponents: EdgeConfig.Component[] = dummyConfig.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && dummyConfig.isTypeConsumptionMetered(component)); - it('+calculateOtherConsumption - evcs + consumptionMeters', () => { + it("+calculateOtherConsumption - evcs + consumptionMeters", () => { const expectedResult = [null, null, null, 565, 214, 561, 373]; expect(Utils.calculateOtherConsumption(channelData, evcsComponents, consumptionMeterComponents)).toEqual(expectedResult); }); - it('+calculateOtherConsumption - only consumptionMeters', () => { + it("+calculateOtherConsumption - only consumptionMeters", () => { const expectedResult2 = [null, null, null, 565, 214, 561, 473]; expect(Utils.calculateOtherConsumption(channelData, [], consumptionMeterComponents)).toEqual(expectedResult2); }); - it('+calculateOtherConsumption - only evcs', () => { + it("+calculateOtherConsumption - only evcs", () => { const expectedResult3 = [null, null, null, 565, 560, 561, 473]; expect(Utils.calculateOtherConsumption(channelData, evcsComponents, [])).toEqual(expectedResult3); }); - it('+calculateOtherConsumption - no evcs + no consumptionMeters', () => { + it("+calculateOtherConsumption - no evcs + no consumptionMeters", () => { const expectedResult4 = [null, null, null, 565, 560, 561, 573]; expect(Utils.calculateOtherConsumption(channelData, [], [])).toEqual(expectedResult4); }); diff --git a/ui/src/app/shared/service/utils.ts b/ui/src/app/shared/service/utils.ts index 67a0376141f..36f44a37d47 100644 --- a/ui/src/app/shared/service/utils.ts +++ b/ui/src/app/shared/service/utils.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore -import { formatNumber } from '@angular/common'; -import { TranslateService } from '@ngx-translate/core'; -import { ChartDataset } from 'chart.js'; -import { saveAs } from 'file-saver-es'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; +import { formatNumber } from "@angular/common"; +import { TranslateService } from "@ngx-translate/core"; +import { ChartDataset } from "chart.js"; +import { saveAs } from "file-saver-es"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; -import { JsonrpcResponseSuccess } from '../jsonrpc/base'; -import { Base64PayloadResponse } from '../jsonrpc/response/base64PayloadResponse'; -import { QueryHistoricTimeseriesEnergyResponse } from '../jsonrpc/response/queryHistoricTimeseriesEnergyResponse'; -import { ChannelAddress, Currency, EdgeConfig } from '../shared'; +import { JsonrpcResponseSuccess } from "../jsonrpc/base"; +import { Base64PayloadResponse } from "../jsonrpc/response/base64PayloadResponse"; +import { QueryHistoricTimeseriesEnergyResponse } from "../jsonrpc/response/queryHistoricTimeseriesEnergyResponse"; +import { ChannelAddress, Currency, EdgeConfig } from "../shared"; export class Utils { @@ -111,7 +111,7 @@ export class Utils { * @param values the values * @returns a number, if at least one value is not null, else null */ - public static subtractSafely(...values: (number | null)[]): number { + public static subtractSafely(...values: (number | null)[]): number | null { return values .filter(value => value !== null && value !== undefined) .reduce((sum, curr) => { @@ -131,7 +131,7 @@ export class Utils { * @param v1 * @param v2 */ - public static divideSafely(v1: number, v2: number): number | null { + public static divideSafely(v1: number | null, v2: number | null): number | null { if (v1 == null || v2 == null) { return null; } else if (v2 == 0) { @@ -184,15 +184,30 @@ export class Utils { * Safely rounds a - possibly 'null' - value: Math.round(v) * * @param v + * @returns the rounded value, null if value is invalid */ - public static roundSafely(v: number): number { + public static roundSafely(v: number | null): number | null { if (v == null) { - return v; + return null; } else { return Math.round(v); } } + /** + * Safely floors a - possibly 'null' - value: Math.floor(v) + * + * @param v + * @returns the floored value, null if value is invalid + */ + public static floorSafely(v: number | null): number | null { + if (v == null) { + return null; + } else { + return Math.floor(v); + } + } + /** * Gets the value; or if it is null, gets the 'orElse' value * @@ -238,11 +253,11 @@ export class Utils { */ public static CONVERT_TO_WATT = (value: number | null): string => { if (value == null) { - return '-'; + return "-"; } else if (value >= 0) { - return formatNumber(value, 'de', '1.0-0') + ' W'; + return formatNumber(value, "de", "1.0-0") + " W"; } else { - return '0 W'; + return "0 W"; } }; @@ -254,14 +269,14 @@ export class Utils { */ public static CONVERT_WATT_TO_KILOWATT = (value: number | null): string => { if (value == null) { - return '-'; + return "-"; } const thisValue: number = (value / 1000); if (thisValue >= 0) { - return formatNumber(thisValue, 'de', '1.0-1') + ' kW'; + return formatNumber(thisValue, "de", "1.0-1") + " kW"; } else { - return '0 kW'; + return "0 kW"; } }; @@ -282,7 +297,7 @@ export class Utils { * @returns converted value */ public static CONVERT_TO_PERCENT = (value: any): string => { - return value + ' %'; + return value + " %"; }; /** @@ -292,7 +307,7 @@ export class Utils { * @returns converted value */ public static CONVERT_TO_WATTHOURS = (value: number): string => { - return formatNumber(value, 'de', '1.0-1') + ' Wh'; + return formatNumber(value, "de", "1.0-1") + " Wh"; }; /** @@ -302,7 +317,7 @@ export class Utils { * @returns converted value */ public static CONVERT_TO_KILO_WATTHOURS = (value: number): string => { - return formatNumber(Utils.divideSafely(value, 1000), 'de', '1.0-1') + ' kWh'; + return formatNumber(Utils.divideSafely(value, 1000), "de", "1.0-1") + " kWh"; }; /** @@ -313,12 +328,12 @@ export class Utils { */ public static CONVERT_MANUAL_ON_OFF = (translate: TranslateService) => { return (value: DefaultTypes.ManualOnOff): string => { - if (value === 'MANUAL_ON') { - return translate.instant('General.on'); - } else if (value === 'MANUAL_OFF') { - return translate.instant('General.off'); + if (value === "MANUAL_ON") { + return translate.instant("General.on"); + } else if (value === "MANUAL_OFF") { + return translate.instant("General.off"); } else { - return '-'; + return "-"; } }; }; @@ -332,9 +347,9 @@ export class Utils { */ public static convertChargeDischargePower(translate: TranslateService, power: number): { name: string, value: number } { if (power >= 0) { - return { name: translate.instant('General.dischargePower'), value: power }; + return { name: translate.instant("General.dischargePower"), value: power }; } else { - return { name: translate.instant('General.chargePower'), value: power * -1 }; + return { name: translate.instant("General.chargePower"), value: power * -1 }; } } @@ -347,14 +362,14 @@ export class Utils { */ public static CONVERT_MODE_TO_MANUAL_OFF_AUTOMATIC = (translate: TranslateService) => { return (value: any): string => { - if (value === 'MANUAL') { - return translate.instant('General.manually'); - } else if (value === 'OFF') { - return translate.instant('General.off'); - } else if (value === 'AUTOMATIC') { - return translate.instant('General.automatic'); + if (value === "MANUAL") { + return translate.instant("General.manually"); + } else if (value === "OFF") { + return translate.instant("General.off"); + } else if (value === "AUTOMATIC") { + return translate.instant("General.automatic"); } else { - return '-'; + return "-"; } }; }; @@ -369,7 +384,7 @@ export class Utils { const date: Date = new Date(); date.setHours(0, 0, 0, 0); date.setMinutes(value); - return date.toLocaleTimeString(translate.getBrowserCultureLang(), { hour: '2-digit', minute: '2-digit' }); + return date.toLocaleTimeString(translate.getBrowserCultureLang(), { hour: "2-digit", minute: "2-digit" }); }; }; @@ -382,7 +397,7 @@ export class Utils { */ public static CONVERT_PRICE_TO_CENT_PER_KWH = (decimal: number, label: string) => { return (value: number | null): string => - (!value ? "-" : formatNumber(value / 10, 'de', '1.0-' + decimal)) + ' ' + label; + (!value ? "-" : formatNumber(value / 10, "de", "1.0-" + decimal)) + " " + label; }; /** @@ -395,11 +410,11 @@ export class Utils { return (value: any): string => { switch (Math.round(value)) { case 0: - return translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE'); + return translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE"); case 3: - return translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID'); + return translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID"); default: // Usually "1" - return translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING'); + return translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING"); } }; }; @@ -412,17 +427,17 @@ export class Utils { */ public static getStorageSocSegment(soc: number | null): string { if (!soc || soc < 10) { - return '0'; + return "0"; } else if (soc < 30) { - return '20'; + return "20"; } else if (soc < 50) { - return '40'; + return "40"; } else if (soc < 70) { - return '60'; + return "60"; } else if (soc < 90) { - return '80'; + return "80"; } else { - return '100'; + return "100"; } } @@ -435,7 +450,7 @@ export class Utils { public static downloadXlsx(response: Base64PayloadResponse, filename: string) { // decode base64 string, remove space for IE compatibility // source: https://stackoverflow.com/questions/36036280/base64-representing-pdf-to-blob-javascript/45872086 - const binary = atob(response.result.payload.replace(/\s/g, '')); + const binary = atob(response.result.payload.replace(/\s/g, "")); const len = binary.length; const buffer = new ArrayBuffer(len); const view = new Uint8Array(buffer); @@ -443,10 +458,10 @@ export class Utils { view[i] = binary.charCodeAt(i); } const data: Blob = new Blob([view], { - type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8', + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8", }); - saveAs(data, filename + '.xlsx'); + saveAs(data, filename + ".xlsx"); } /* @@ -538,7 +553,7 @@ export class Utils { } public static isDataEmpty(arg: JsonrpcResponseSuccess): boolean { - return Object.values(arg.result['data'])?.map(element => element as number[])?.every(element => element?.every(elem => elem == null) ?? true); + return Object.values(arg.result["data"])?.map(element => element as number[])?.every(element => element?.every(elem => elem == null) ?? true); } /** @@ -555,17 +570,17 @@ export class Utils { let totalEvcsConsumption: number = 0; let totalMeteredConsumption: number = 0; evcsComponents.forEach(component => { - totalEvcsConsumption = this.addSafely(totalEvcsConsumption, energyValues.result.data[component.id + '/ActiveConsumptionEnergy']); + totalEvcsConsumption = this.addSafely(totalEvcsConsumption, energyValues.result.data[component.id + "/ActiveConsumptionEnergy"]); }); consumptionMeterComponents.forEach(meter => { - totalMeteredConsumption = this.addSafely(totalMeteredConsumption, energyValues.result.data[meter.id + '/ActiveProductionEnergy']); + totalMeteredConsumption = this.addSafely(totalMeteredConsumption, energyValues.result.data[meter.id + "/ActiveProductionEnergy"]); }); return Utils.roundSlightlyNegativeValues( Utils.subtractSafely( Utils.subtractSafely( - energyValues.result.data['_sum/ConsumptionActiveEnergy'], totalEvcsConsumption), + energyValues.result.data["_sum/ConsumptionActiveEnergy"], totalEvcsConsumption), totalMeteredConsumption)); } @@ -585,18 +600,18 @@ export class Utils { const totalMeteredConsumption: number[] = []; evcsComponents.forEach(component => { - channelData[component.id + '/ChargePower']?.forEach((value, index) => { + channelData[component.id + "/ChargePower"]?.forEach((value, index) => { totalMeteredConsumption[index] = Utils.addSafely(totalMeteredConsumption[index], value); }); }); consumptionMeterComponents.forEach(meter => { - channelData[meter.id + '/ActivePower']?.forEach((value, index) => { + channelData[meter.id + "/ActivePower"]?.forEach((value, index) => { totalMeteredConsumption[index] = Utils.addSafely(totalMeteredConsumption[index], value); }); }); - return channelData['ConsumptionActivePower']?.map((value, index) => { + return channelData["ConsumptionActivePower"]?.map((value, index) => { if (value == null) { return null; @@ -610,7 +625,7 @@ export class Utils { } } -export enum YAxisTitle { +export enum YAxisType { NONE, POWER, PERCENTAGE, @@ -623,9 +638,9 @@ export enum YAxisTitle { } export enum ChartAxis { - LEFT = 'left', - RIGHT = 'right', - RIGHT_2 = 'right2', + LEFT = "left", + RIGHT = "right", + RIGHT_2 = "right2", } export namespace HistoryUtils { @@ -671,7 +686,9 @@ export namespace HistoryUtils { noStrokeThroughLegendIfHidden?: boolean, /** color in rgb-Format */ color: string, - /** the stack for barChart, if not provided datasets are not stacked but overlaying each other */ + /** + * The stack/stacks for this dataset to be displayed, if not provided datasets are not stacked but overlaying each other + */ stack?: number | number[], /** False per default */ hideLabelInLegend?: boolean, @@ -695,9 +712,9 @@ export namespace HistoryUtils { }; export interface CustomOptions { - unit?: YAxisTitle, + unit?: YAxisType, /** overrides global charttype */ - type?: 'line' | 'bar', + type?: "line" | "bar", /** overrides global formatNumber */ formatNumber?: string, } @@ -707,7 +724,7 @@ export namespace HistoryUtils { } export interface BoxCustomOptions extends PluginCustomOptions { - pluginType: 'box', + pluginType: "box", annotations: { /** Start date string in ISO-format */ xMin: string | number, @@ -720,6 +737,13 @@ export namespace HistoryUtils { }[]; } + export interface DataLabelsCustomOptions extends PluginCustomOptions { + pluginType: "datalabels", + datalabels: { + displayUnit: string, + }, + } + /** * Data from a subscription to Channel or from a historic data query. * @@ -744,10 +768,11 @@ export namespace HistoryUtils { export type yAxes = { /** Name to be displayed on the left y-axis, also the unit to be displayed in tooltips and legend */ - unit: YAxisTitle, - customTitle?: string, - position: 'left' | 'right' | 'bottom' | 'top', + unit: YAxisType, + position: "left" | "right" | "bottom" | "top", yAxisId: ChartAxis, + /** YAxis title -> {@link https://www.chartjs.org/docs/latest/samples/scale-options/titles.html Chartjs Title} */ + customTitle?: string /** Default: true */ displayGrid?: boolean }; @@ -835,27 +860,27 @@ export namespace TimeOfUseTariffUtils { return; } - const socLabel = translate.instant('General.soc'); - const dischargeLabel = translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE'); - const chargeConsumptionLabel = translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID'); - const balancingLabel = translate.instant('Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING'); - const gridBuyLabel = translate.instant('General.gridBuy'); + const socLabel = translate.instant("General.soc"); + const dischargeLabel = translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.DELAY_DISCHARGE"); + const chargeConsumptionLabel = translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.CHARGE_GRID"); + const balancingLabel = translate.instant("Edge.Index.Widgets.TIME_OF_USE_TARIFF.STATE.BALANCING"); + const gridBuyLabel = translate.instant("General.gridBuy"); // Switch case to handle different labels switch (label) { case socLabel: - return label + ": " + formatNumber(value, 'de', '1.0-0') + " %"; + return label + ": " + formatNumber(value, "de", "1.0-0") + " %"; case dischargeLabel: case chargeConsumptionLabel: case balancingLabel: // Show floating point number for values between 0 and 1 - return label + ": " + formatNumber(value, 'de', '1.0-4') + " " + currencyLabel; + return label + ": " + formatNumber(value, "de", "1.0-4") + " " + currencyLabel; default: case gridBuyLabel: // Power values - return label + ": " + formatNumber(value, 'de', '1.0-2') + " kW"; + return label + ": " + formatNumber(value, "de", "1.0-2") + " kW"; } } diff --git a/ui/src/app/shared/service/websocket.ts b/ui/src/app/shared/service/websocket.ts index 4c6fc1424ce..a79deefeb77 100644 --- a/ui/src/app/shared/service/websocket.ts +++ b/ui/src/app/shared/service/websocket.ts @@ -1,42 +1,44 @@ // @ts-strict-ignore -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { CookieService } from 'ngx-cookie-service'; -import { delay, retryWhen } from 'rxjs/operators'; -import { webSocket, WebSocketSubject } from 'rxjs/webSocket'; +import { Injectable } from "@angular/core"; +import { Router } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { CookieService } from "ngx-cookie-service"; +import { delay, retryWhen } from "rxjs/operators"; +import { WebSocketSubject, webSocket } from "rxjs/webSocket"; import { environment } from "src/environments"; -import { JsonrpcMessage, JsonrpcNotification, JsonrpcRequest, JsonrpcResponse, JsonrpcResponseError, JsonrpcResponseSuccess } from '../jsonrpc/base'; -import { CurrentDataNotification } from '../jsonrpc/notification/currentDataNotification'; -import { EdgeConfigNotification } from '../jsonrpc/notification/edgeConfigNotification'; -import { EdgeRpcNotification } from '../jsonrpc/notification/edgeRpcNotification'; -import { SystemLogNotification } from '../jsonrpc/notification/systemLogNotification'; -import { AuthenticateWithPasswordRequest } from '../jsonrpc/request/authenticateWithPasswordRequest'; -import { AuthenticateWithTokenRequest } from '../jsonrpc/request/authenticateWithTokenRequest'; -import { EdgeRpcRequest } from '../jsonrpc/request/edgeRpcRequest'; -import { LogoutRequest } from '../jsonrpc/request/logoutRequest'; -import { RegisterUserRequest } from '../jsonrpc/request/registerUserRequest'; -import { AuthenticateResponse } from '../jsonrpc/response/authenticateResponse'; -import { Language } from '../type/language'; -import { Pagination } from './pagination'; -import { Service } from './service'; -import { WebsocketInterface } from './websocketInterface'; -import { WsData } from './wsdata'; +import { JsonrpcMessage, JsonrpcNotification, JsonrpcRequest, JsonrpcResponse, JsonrpcResponseError, JsonrpcResponseSuccess } from "../jsonrpc/base"; +import { CurrentDataNotification } from "../jsonrpc/notification/currentDataNotification"; +import { EdgeConfigNotification } from "../jsonrpc/notification/edgeConfigNotification"; +import { EdgeRpcNotification } from "../jsonrpc/notification/edgeRpcNotification"; +import { SystemLogNotification } from "../jsonrpc/notification/systemLogNotification"; +import { AuthenticateWithPasswordRequest } from "../jsonrpc/request/authenticateWithPasswordRequest"; +import { AuthenticateWithTokenRequest } from "../jsonrpc/request/authenticateWithTokenRequest"; +import { EdgeRpcRequest } from "../jsonrpc/request/edgeRpcRequest"; +import { LogoutRequest } from "../jsonrpc/request/logoutRequest"; +import { RegisterUserRequest } from "../jsonrpc/request/registerUserRequest"; +import { AuthenticateResponse } from "../jsonrpc/response/authenticateResponse"; +import { Language } from "../type/language"; +import { Pagination } from "./pagination"; +import { Service } from "./service"; +import { WebsocketInterface } from "./websocketInterface"; +import { WsData } from "./wsdata"; @Injectable() export class Websocket implements WebsocketInterface { + public static readonly REQUEST_TIMEOUT = 500; + private static readonly DEFAULT_EDGEID = 0; public status: - 'initial' // before first connection attempt - | 'connecting' // trying to connect to backend - | 'authenticating' // sent authentication request; waiting for response - | 'waiting for credentials' // login is required. Waiting for credentials input - | 'online' // logged in + normal operation - | 'failed' // connection failed - = 'initial'; + "initial" // before first connection attempt + | "connecting" // trying to connect to backend + | "authenticating" // sent authentication request; waiting for response + | "waiting for credentials" // login is required. Waiting for credentials input + | "online" // logged in + normal operation + | "failed" // connection failed + = "initial"; private readonly wsdata = new WsData(); @@ -71,10 +73,10 @@ export class Websocket implements WebsocketInterface { const language = Language.getByKey(localStorage.DEMO_LANGUAGE ?? authenticateResponse.user.language.toLocaleLowerCase()); localStorage.LANGUAGE = language.key; this.service.setLang(language); - this.status = 'online'; + this.status = "online"; // received login token -> save in cookie - this.cookieService.set('token', authenticateResponse.token, { expires: 365, path: '/', sameSite: 'Strict', secure: location.protocol === 'https:' }); + this.cookieService.set("token", authenticateResponse.token, { expires: 365, path: "/", sameSite: "Strict", secure: location.protocol === "https:" }); this.service.currentUser = authenticateResponse.user; @@ -123,7 +125,7 @@ export class Websocket implements WebsocketInterface { public sendRequest(request: JsonrpcRequest): Promise { if ( // logged in + normal operation - this.status == 'online' + this.status == "online" // otherwise only authentication request allowed || (request instanceof AuthenticateWithPasswordRequest || request instanceof AuthenticateWithTokenRequest || request instanceof RegisterUserRequest)) { @@ -131,7 +133,7 @@ export class Websocket implements WebsocketInterface { this.wsdata.sendRequest(this.socket, request).then(response => { if (environment.debugMode) { if (request instanceof EdgeRpcRequest) { - console.info("Response [" + request.params.payload.method + ":" + request.params.edgeId + "]", response.result['payload']['result']); + console.info("Response [" + request.params.payload.method + ":" + request.params.edgeId + "]", response.result["payload"]["result"]); } else { console.info("Response [" + request.method + "]", response.result); } @@ -174,13 +176,13 @@ export class Websocket implements WebsocketInterface { const interval = setInterval(() => { // TODO: Status should be Observable, furthermore status should be like state-machine - if (this.status == 'online') { + if (this.status == "online") { clearInterval(interval); this.sendRequest(request) .then((response) => resolve(response)) .catch((err) => reject(err)); } - }, 500); + }, Websocket.REQUEST_TIMEOUT); }); } @@ -190,7 +192,7 @@ export class Websocket implements WebsocketInterface { * @param notification the JSON-RPC Notification */ public sendNotification(notification: JsonrpcNotification): void { - if (this.status != 'online') { + if (this.status != "online") { console.warn("Websocket is not connected! Unable to send Notification", notification); } this.wsdata.sendNotification(this.socket, notification); @@ -200,11 +202,11 @@ export class Websocket implements WebsocketInterface { * Opens a connection using a stored token. Called once by constructor */ private connect() { - if (this.status != 'initial') { + if (this.status != "initial") { return; } // trying to connect - this.status = 'connecting'; + this.status = "connecting"; if (environment.debugMode) { console.info("Websocket connecting to URL [" + environment.url + "]"); @@ -222,17 +224,17 @@ export class Websocket implements WebsocketInterface { console.info("Websocket connection opened"); } - const token = this.cookieService.get('token'); + const token = this.cookieService.get("token"); if (token) { // Login with Session Token this.login(new AuthenticateWithTokenRequest({ token: token })); - this.status = 'authenticating'; + this.status = "authenticating"; } else { // No Token -> directly ask for Login credentials - this.status = 'waiting for credentials'; - this.router.navigate(['login']); + this.status = "waiting for credentials"; + this.router.navigate(["login"]); } }, }, @@ -243,7 +245,7 @@ export class Websocket implements WebsocketInterface { console.info("Websocket connection closed"); } // trying to connect - this.status = 'connecting'; + this.status = "connecting"; }, }, }); @@ -274,10 +276,10 @@ export class Websocket implements WebsocketInterface { } else if (message instanceof JsonrpcNotification) { // handle JSON-RPC Notification if (environment.debugMode) { - if (message.method == EdgeRpcNotification.METHOD && 'payload' in message.params) { + if (message.method == EdgeRpcNotification.METHOD && "payload" in message.params) { const m = message as EdgeRpcNotification; const payload = m.params.payload; - console.info("Notification [" + m.params.edgeId + "] [" + payload["method"] + "]", payload['params']); + console.info("Notification [" + m.params.edgeId + "] [" + payload["method"] + "]", payload["params"]); } else { console.info("Notification [" + message.method + "]", message.params); } @@ -289,7 +291,7 @@ export class Websocket implements WebsocketInterface { this.onError(error); }, () => { - this.status = 'failed'; + this.status = "failed"; this.onClose(); }); } @@ -299,12 +301,12 @@ export class Websocket implements WebsocketInterface { // TODO create global Errorhandler for any type of error switch (reason.error.code) { case 1003: - this.service.toast(this.translate.instant('Login.authenticationFailed'), 'danger'); + this.service.toast(this.translate.instant("Login.authenticationFailed"), "danger"); this.onLoggedOut(); break; case 1: this.service.toast(this.translate.instant("Login.REQUEST_TIMEOUT"), "danger"); - this.status = 'waiting for credentials'; + this.status = "waiting for credentials"; this.service.onLogout(); break; default: @@ -313,8 +315,8 @@ export class Websocket implements WebsocketInterface { } private onLoggedOut(): void { - this.status = 'waiting for credentials'; - this.cookieService.delete('token', '/'); + this.status = "waiting for credentials"; + this.cookieService.delete("token", "/"); this.service.onLogout(); } diff --git a/ui/src/app/shared/service/websocketInterface.ts b/ui/src/app/shared/service/websocketInterface.ts index 517799b1eb9..c4894b1cca6 100644 --- a/ui/src/app/shared/service/websocketInterface.ts +++ b/ui/src/app/shared/service/websocketInterface.ts @@ -1,7 +1,7 @@ // @ts-strict-ignore -import { JsonrpcNotification, JsonrpcRequest, JsonrpcResponseSuccess } from '../jsonrpc/base'; -import { AuthenticateWithPasswordRequest } from '../jsonrpc/request/authenticateWithPasswordRequest'; -import { AuthenticateWithTokenRequest } from '../jsonrpc/request/authenticateWithTokenRequest'; +import { JsonrpcNotification, JsonrpcRequest, JsonrpcResponseSuccess } from "../jsonrpc/base"; +import { AuthenticateWithPasswordRequest } from "../jsonrpc/request/authenticateWithPasswordRequest"; +import { AuthenticateWithTokenRequest } from "../jsonrpc/request/authenticateWithTokenRequest"; export interface WebsocketInterface { diff --git a/ui/src/app/shared/shared.module.ts b/ui/src/app/shared/shared.module.ts index d29072a2480..1bf1507d696 100644 --- a/ui/src/app/shared/shared.module.ts +++ b/ui/src/app/shared/shared.module.ts @@ -1,49 +1,48 @@ // @ts-strict-ignore -import { CommonModule } from '@angular/common'; -import { Injector, NgModule } from '@angular/core'; -import { FormControl, FormsModule, ReactiveFormsModule, ValidationErrors } from '@angular/forms'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterModule } from '@angular/router'; -import { IonicModule } from '@ionic/angular'; -import { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core'; -import { FormlyIonicModule } from '@ngx-formly/ionic'; -import { TranslateModule } from '@ngx-translate/core'; -import { NgChartsModule } from 'ng2-charts'; +import { CommonModule } from "@angular/common"; +import { Injector, NgModule } from "@angular/core"; +import { FormControl, FormsModule, ReactiveFormsModule, ValidationErrors } from "@angular/forms"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { RouterModule } from "@angular/router"; +import { IonicModule } from "@ionic/angular"; +import { FormlyFieldConfig, FormlyModule } from "@ngx-formly/core"; +import { FormlyIonicModule } from "@ngx-formly/ionic"; +import { TranslateModule } from "@ngx-translate/core"; +import { NgChartsModule } from "ng2-charts"; import { NgxSpinnerModule } from "ngx-spinner"; - -import { appRoutingProviders } from './../app-routing.module'; -import { ComponentsModule } from './components/components.module'; -import { MeterModule } from './components/edge/meter/meter.module'; -import { FormlyCheckBoxHyperlinkWrapperComponent } from './components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper'; -import { FormlyWrapperDefaultValueWithCasesComponent } from './components/formly/form-field-default-cases.wrapper'; -import { FormlyWrapperFormFieldComponent } from './components/formly/form-field.wrapper'; -import { FormlyFieldCheckboxWithImageComponent } from './components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image'; -import { FormlyFieldModalComponent } from './components/formly/formly-field-modal/formlyfieldmodal'; -import { FormlyFieldRadioWithImageComponent } from './components/formly/formly-field-radio-with-image/formly-field-radio-with-image'; -import { FormlySelectFieldModalComponent } from './components/formly/formly-select-field-modal.component'; -import { FormlySelectFieldExtendedWrapperComponent } from './components/formly/formly-select-field.extended'; -import { FormlyFieldWithLoadingAnimationComponent } from './components/formly/formly-skeleton-wrapper'; -import { InputTypeComponent } from './components/formly/input'; -import { FormlyInputSerialNumberWrapperComponent as FormlyWrapperInputSerialNumber } from './components/formly/input-serial-number-wrapper'; -import { PanelWrapperComponent } from './components/formly/panel-wrapper.component'; -import { RepeatTypeComponent } from './components/formly/repeat'; -import { HeaderComponent } from './components/header/header.component'; -import { HistoryDataErrorModule } from './components/history-data-error/history-data-error.module'; -import { PercentageBarComponent } from './components/percentagebar/percentagebar.component'; -import { DirectiveModule } from './directive/directive'; -import { ChartOptionsComponent } from './legacy/chartoptions/chartoptions.component'; -import { PipeModule } from './pipe/pipe'; -import { Logger } from './service/logger'; -import { Service } from './service/service'; -import { Utils } from './service/utils'; -import { Websocket } from './shared'; +import { appRoutingProviders } from "../app-routing.module"; +import { ComponentsModule } from "./components/components.module"; +import { MeterModule } from "./components/edge/meter/meter.module"; +import { FormlyCheckBoxHyperlinkWrapperComponent } from "./components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper"; +import { FormlyWrapperDefaultValueWithCasesComponent } from "./components/formly/form-field-default-cases.wrapper"; +import { FormlyWrapperFormFieldComponent } from "./components/formly/form-field.wrapper"; +import { FormlyFieldCheckboxWithImageComponent } from "./components/formly/formly-field-checkbox-image/formly-field-checkbox-with-image"; +import { FormlyFieldModalComponent } from "./components/formly/formly-field-modal/formlyfieldmodal"; +import { FormlyFieldRadioWithImageComponent } from "./components/formly/formly-field-radio-with-image/formly-field-radio-with-image"; +import { FormlySelectFieldModalComponent } from "./components/formly/formly-select-field-modal.component"; +import { FormlySelectFieldExtendedWrapperComponent } from "./components/formly/formly-select-field.extended"; +import { FormlyFieldWithLoadingAnimationComponent } from "./components/formly/formly-skeleton-wrapper"; +import { InputTypeComponent } from "./components/formly/input"; +import { FormlyInputSerialNumberWrapperComponent as FormlyWrapperInputSerialNumber } from "./components/formly/input-serial-number-wrapper"; +import { PanelWrapperComponent } from "./components/formly/panel-wrapper.component"; +import { RepeatTypeComponent } from "./components/formly/repeat"; +import { HeaderComponent } from "./components/header/header.component"; +import { HistoryDataErrorModule } from "./components/history-data-error/history-data-error.module"; +import { PercentageBarComponent } from "./components/percentagebar/percentagebar.component"; +import { DirectiveModule } from "./directive/directive"; +import { ChartOptionsComponent } from "./legacy/chartoptions/chartoptions.component"; +import { PipeModule } from "./pipe/pipe"; +import { Logger } from "./service/logger"; +import { Service } from "./service/service"; +import { Utils } from "./service/utils"; +import { Websocket } from "./shared"; export function IpValidator(control: FormControl): ValidationErrors { - return /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(control.value) ? null : { 'ip': true }; + return /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(control.value) ? null : { "ip": true }; } export function SubnetmaskValidator(control: FormControl): ValidationErrors { - return /^(255)\.(0|128|192|224|240|248|252|254|255)\.(0|128|192|224|240|248|252|254|255)\.(0|128|192|224|240|248|252|254|255)/.test(control.value) ? null : { 'subnetmask': true }; + return /^(255)\.(0|128|192|224|240|248|252|254|255)\.(0|128|192|224|240|248|252|254|255)\.(0|128|192|224|240|248|252|254|255)/.test(control.value) ? null : { "subnetmask": true }; } export function IpValidatorMessage(err, field: FormlyFieldConfig) { @@ -64,33 +63,33 @@ export function SubnetmaskValidatorMessage(err, field: FormlyFieldConfig) { FormsModule, IonicModule, NgxSpinnerModule.forRoot({ - type: 'ball-clip-rotate-multiple', + type: "ball-clip-rotate-multiple", }), ReactiveFormsModule, RouterModule, FormlyModule.forRoot({ wrappers: [ - { name: 'form-field', component: FormlyWrapperFormFieldComponent }, + { name: "form-field", component: FormlyWrapperFormFieldComponent }, { name: "input-serial-number", component: FormlyWrapperInputSerialNumber }, - { name: 'formly-select-extended-wrapper', component: FormlySelectFieldExtendedWrapperComponent }, - { name: 'formly-field-radio-with-image', component: FormlyFieldRadioWithImageComponent }, - { name: 'form-field-checkbox-hyperlink', component: FormlyCheckBoxHyperlinkWrapperComponent }, - { name: 'formly-wrapper-default-of-cases', component: FormlyWrapperDefaultValueWithCasesComponent }, - { name: 'panel', component: PanelWrapperComponent }, - { name: 'formly-field-modal', component: FormlyFieldModalComponent }, - { name: 'formly-field-checkbox-with-image', component: FormlyFieldCheckboxWithImageComponent }, + { name: "formly-select-extended-wrapper", component: FormlySelectFieldExtendedWrapperComponent }, + { name: "formly-field-radio-with-image", component: FormlyFieldRadioWithImageComponent }, + { name: "form-field-checkbox-hyperlink", component: FormlyCheckBoxHyperlinkWrapperComponent }, + { name: "formly-wrapper-default-of-cases", component: FormlyWrapperDefaultValueWithCasesComponent }, + { name: "panel", component: PanelWrapperComponent }, + { name: "formly-field-modal", component: FormlyFieldModalComponent }, + { name: "formly-field-checkbox-with-image", component: FormlyFieldCheckboxWithImageComponent }, ], types: [ - { name: 'input', component: InputTypeComponent }, - { name: 'repeat', component: RepeatTypeComponent }, + { name: "input", component: InputTypeComponent }, + { name: "repeat", component: RepeatTypeComponent }, ], validators: [ - { name: 'ip', validation: IpValidator }, - { name: 'subnetmask', validation: SubnetmaskValidator }, + { name: "ip", validation: IpValidator }, + { name: "subnetmask", validation: SubnetmaskValidator }, ], validationMessages: [ - { name: 'ip', message: IpValidatorMessage }, - { name: 'subnetmask', message: SubnetmaskValidatorMessage }, + { name: "ip", message: IpValidatorMessage }, + { name: "subnetmask", message: SubnetmaskValidatorMessage }, ], }), PipeModule, diff --git a/ui/src/app/shared/shared.spec.ts b/ui/src/app/shared/shared.spec.ts index 82662b2ea1f..c9ea351e2b4 100644 --- a/ui/src/app/shared/shared.spec.ts +++ b/ui/src/app/shared/shared.spec.ts @@ -3,33 +3,33 @@ import { SumState } from "../index/shared/sumState"; import { Edge, EdgePermission } from "./shared"; import { Role } from "./type/role"; -describe('EdgePermission', () => { +describe("EdgePermission", () => { const edge = new Edge("", "", "", "2024.2.2", Role.ADMIN, true, new Date(), SumState.OK, null); - it('#getAllowedHistoryPeriods - no first ibn date', () => { - expect(EdgePermission.getAllowedHistoryPeriods(edge, ['day', 'week', 'month', 'year'])).toEqual(['day', 'week', 'month', 'year']); + it("#getAllowedHistoryPeriods - no first ibn date", () => { + expect(EdgePermission.getAllowedHistoryPeriods(edge, ["day", "week", "month", "year"])).toEqual(["day", "week", "month", "year"]); }); const edgeWithFirstIbnDate = new Edge("", "", "", "", Role.ADMIN, true, new Date(), SumState.OK, new Date()); - it('#getAllowedHistoryPeriods - first ibn date', () => { - expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, ['day', 'week', 'month', 'year', 'total'])).toEqual(['day', 'week', 'month', 'year', 'total']); + it("#getAllowedHistoryPeriods - first ibn date", () => { + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, ["day", "week", "month", "year", "total"])).toEqual(["day", "week", "month", "year", "total"]); }); - it('#getAllowedHistoryPeriods - historyPeriods: []', () => { - expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, [])).toEqual(['day', 'week', 'month', 'year', 'total', 'custom']); + it("#getAllowedHistoryPeriods - historyPeriods: []", () => { + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, [])).toEqual(["day", "week", "month", "year", "total", "custom"]); }); - it('#getAllowedHistoryPeriods - historyPeriod: null', () => { - expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, null)).toEqual(['day', 'week', 'month', 'year', 'total', 'custom']); + it("#getAllowedHistoryPeriods - historyPeriod: null", () => { + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, null)).toEqual(["day", "week", "month", "year", "total", "custom"]); }); - it('#getAllowedHistoryPeriods - historyPeriod: undefined', () => { - expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, undefined)).toEqual(['day', 'week', 'month', 'year', 'total', 'custom']); + it("#getAllowedHistoryPeriods - historyPeriod: undefined", () => { + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithFirstIbnDate, undefined)).toEqual(["day", "week", "month", "year", "total", "custom"]); }); const edgeWithoutFirstIbnDate = new Edge("", "", "", "", Role.ADMIN, true, new Date(), SumState.OK, null); - it('#getAllowedHistoryPeriods - no first ibn date', () => { - expect(EdgePermission.getAllowedHistoryPeriods(edgeWithoutFirstIbnDate)).toEqual(['day', 'week', 'month', 'year', 'custom']); + it("#getAllowedHistoryPeriods - no first ibn date", () => { + expect(EdgePermission.getAllowedHistoryPeriods(edgeWithoutFirstIbnDate)).toEqual(["day", "week", "month", "year", "custom"]); }); }); diff --git a/ui/src/app/shared/shared.ts b/ui/src/app/shared/shared.ts index f2bf0f04fed..4175e96134d 100644 --- a/ui/src/app/shared/shared.ts +++ b/ui/src/app/shared/shared.ts @@ -13,21 +13,21 @@ export { Widget, WidgetFactory, WidgetNature, Widgets } from "./type/widget"; import { AlertController, AlertOptions } from "@ionic/angular"; import { TranslateService } from "@ngx-translate/core"; -import { addIcons } from 'ionicons'; +import { addIcons } from "ionicons"; import { Edge } from "./components/edge/edge"; import { User } from "./jsonrpc/shared"; import { DefaultTypes } from "./service/defaulttypes"; import { Role } from "./type/role"; addIcons({ - 'oe-consumption': 'assets/img/icon/consumption.svg', - 'oe-evcs': 'assets/img/icon/evcs.svg', - 'oe-grid': 'assets/img/icon/grid.svg', - 'oe-grid-storage': 'assets/img/icon/gridStorage.svg', - 'oe-grid-restriction': 'assets/img/icon/gridRestriction.svg', - 'oe-offgrid': 'assets/img/icon/offgrid.svg', - 'oe-production': 'assets/img/icon/production.svg', - 'oe-storage': 'assets/img/icon/storage.svg', + "oe-consumption": "assets/img/icon/consumption.svg", + "oe-evcs": "assets/img/icon/evcs.svg", + "oe-grid": "assets/img/icon/grid.svg", + "oe-grid-storage": "assets/img/icon/gridStorage.svg", + "oe-grid-restriction": "assets/img/icon/gridRestriction.svg", + "oe-offgrid": "assets/img/icon/offgrid.svg", + "oe-production": "assets/img/icon/production.svg", + "oe-storage": "assets/img/icon/storage.svg", }); export class EdgePermission { @@ -68,7 +68,7 @@ export class EdgePermission { * @returns true if the channels are included in the edgeconfig */ public static hasChannelsInEdgeConfig(edge: Edge): boolean { - return !edge.isVersionAtLeast('2024.6.1'); + return !edge.isVersionAtLeast("2024.6.1"); } /** @@ -81,9 +81,8 @@ export class EdgePermission { * @returns true if only the factories of the used components are in the edgeconfig */ public static hasReducedFactories(edge: Edge): boolean { - return edge.isVersionAtLeast('2024.6.1'); + return edge.isVersionAtLeast("2024.6.1"); } - } export class UserPermission { @@ -114,7 +113,7 @@ export class UserPermission { * @returns true, if user is at least {@link Role.ADMIN} and edge version is at least 2024.2.2 */ public static isAllowedToSeeSystemRestart(user: User, edge: Edge) { - const isAllowed = edge?.isVersionAtLeast('2024.2.2'); + const isAllowed = edge?.isVersionAtLeast("2024.2.2"); return Role.isAtLeast(user?.globalRole, Role.OWNER) && isAllowed; } } @@ -142,7 +141,7 @@ export namespace Currency { */ export function getCurrencyLabelByCurrency(currency: string): Label { switch (currency) { - case 'SEK': + case "SEK": return Label.OERE_PER_KWH; default: return Label.CENT_PER_KWH; @@ -153,6 +152,10 @@ export namespace Currency { OERE_PER_KWH = "Öre/kWh", CENT_PER_KWH = "Cent/kWh", } + + export enum Unit { + CENT = "Cent", + } } export enum EssStateMachine { @@ -178,12 +181,12 @@ export async function presentAlert(alertController: AlertController, translate: const alert = alertController.create({ ...alertOptions, buttons: [{ - text: translate.instant('General.cancel'), - role: 'cancel', + text: translate.instant("General.cancel"), + role: "cancel", }, ...(alertOptions?.buttons ?? []), ], - cssClass: 'alertController', + cssClass: "alertController", }); (await alert).present(); } diff --git a/ui/src/app/shared/translate.extension.ts b/ui/src/app/shared/translate.extension.ts index e0d7675b9af..0b9bce010b0 100644 --- a/ui/src/app/shared/translate.extension.ts +++ b/ui/src/app/shared/translate.extension.ts @@ -1,6 +1,6 @@ // @ts-strict-ignore -import { FormlyExtension, FormlyFieldConfig } from '@ngx-formly/core'; -import { TranslateService } from '@ngx-translate/core'; +import { FormlyExtension, FormlyFieldConfig } from "@ngx-formly/core"; +import { TranslateService } from "@ngx-translate/core"; export class TranslateExtension implements FormlyExtension { constructor(private translate: TranslateService) { } @@ -13,7 +13,7 @@ export class TranslateExtension implements FormlyExtension { props._translated = true; field.expressions = { ...(field.expressions || {}), - 'props.label': this.translate.stream(props.label), + "props.label": this.translate.stream(props.label), }; } } @@ -23,7 +23,7 @@ export function registerTranslateExtension(translate: TranslateService) { validationMessages: [], extensions: [ { - name: 'translate', + name: "translate", extension: new TranslateExtension(translate), }, ], @@ -39,5 +39,5 @@ export function registerTranslateExtension(translate: TranslateService) { * @returns the validation error message. */ export function serialNumber(translate: TranslateService, field: FormlyFieldConfig, length: number) { - return translate.stream('INSTALLATION.FORM.BATTERY_SERIAL_NUMBER', { serialNumber: ((field.props.prefix ?? "") + field.formControl.value), length: length }); + return translate.stream("INSTALLATION.FORM.BATTERY_SERIAL_NUMBER", { serialNumber: ((field.props.prefix ?? "") + field.formControl.value), length: length }); } diff --git a/ui/src/app/shared/type/channeladdress.ts b/ui/src/app/shared/type/channeladdress.ts index ae633707993..e8ddbeb302a 100644 --- a/ui/src/app/shared/type/channeladdress.ts +++ b/ui/src/app/shared/type/channeladdress.ts @@ -11,7 +11,7 @@ export class ChannelAddress { * @param address in the form 'Component-ID/Channel-ID' */ public static fromString(address: string): ChannelAddress { - const array = address.split('/', 2); + const array = address.split("/", 2); return new ChannelAddress(array[0], array[1]); } diff --git a/ui/src/app/shared/type/country.ts b/ui/src/app/shared/type/country.ts index ce388ed2835..f69f28c850a 100644 --- a/ui/src/app/shared/type/country.ts +++ b/ui/src/app/shared/type/country.ts @@ -1,21 +1,21 @@ import { TranslateService } from "@ngx-translate/core"; export enum Country { - GERMANY = 'de', - AUSTRIA = 'at', - SWITZERLAND = 'ch', - SWEDEN = 'se', - CZECH_REPUBLIK = 'cz', - NETHERLANDS = 'nl', + GERMANY = "de", + AUSTRIA = "at", + SWITZERLAND = "ch", + SWEDEN = "se", + CZECH_REPUBLIK = "cz", + NETHERLANDS = "nl", } export const COUNTRY_OPTIONS = (translate: TranslateService) => { return [ - { value: Country.GERMANY, label: translate.instant('General.Country.germany') }, - { value: Country.AUSTRIA, label: translate.instant('General.Country.austria') }, - { value: Country.SWITZERLAND, label: translate.instant('General.Country.switzerland') }, - { value: Country.SWEDEN, label: translate.instant('General.Country.sweden') }, - { value: Country.NETHERLANDS, label: translate.instant('General.Country.netherlands') }, - { value: Country.CZECH_REPUBLIK, label: translate.instant('General.Country.czech') }, + { value: Country.GERMANY, label: translate.instant("General.Country.germany") }, + { value: Country.AUSTRIA, label: translate.instant("General.Country.austria") }, + { value: Country.SWITZERLAND, label: translate.instant("General.Country.switzerland") }, + { value: Country.SWEDEN, label: translate.instant("General.Country.sweden") }, + { value: Country.NETHERLANDS, label: translate.instant("General.Country.netherlands") }, + { value: Country.CZECH_REPUBLIK, label: translate.instant("General.Country.czech") }, ]; }; diff --git a/ui/src/app/shared/type/general.ts b/ui/src/app/shared/type/general.ts index c33d4e88d22..8394178bfce 100644 --- a/ui/src/app/shared/type/general.ts +++ b/ui/src/app/shared/type/general.ts @@ -4,9 +4,9 @@ export enum GridMode { OFF_GRID = 2, } export enum Mode { - MANUAL_ON = 'MANUAL_ON', - MANUAL_OFF = 'MANUAL_OFF', - AUTOMATIC = 'AUTOMATIC', + MANUAL_ON = "MANUAL_ON", + MANUAL_OFF = "MANUAL_OFF", + AUTOMATIC = "AUTOMATIC", } export const ChartAnnotationState = { ON: 1, @@ -14,6 +14,6 @@ export const ChartAnnotationState = { OFF_HIDDEN: null, }; export enum WorkMode { - TIME = 'TIME', - NONE = 'NONE', + TIME = "TIME", + NONE = "NONE", } diff --git a/ui/src/app/shared/type/language.spec.ts b/ui/src/app/shared/type/language.spec.ts index d3b078be851..177daccbb97 100644 --- a/ui/src/app/shared/type/language.spec.ts +++ b/ui/src/app/shared/type/language.spec.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore import { Language } from "./language"; -describe('Language', () => { +describe("Language", () => { - it('#geti18nLocaleByKey', () => { - expect(Language.geti18nLocaleByKey('DE')).toBe('de'); - expect(Language.geti18nLocaleByKey('Zz')).toBe(Language.DEFAULT.i18nLocaleKey); + it("#geti18nLocaleByKey", () => { + expect(Language.geti18nLocaleByKey("DE")).toBe("de"); + expect(Language.geti18nLocaleByKey("Zz")).toBe(Language.DEFAULT.i18nLocaleKey); expect(Language.geti18nLocaleByKey(null)).toBe(Language.DEFAULT.i18nLocaleKey); expect(Language.geti18nLocaleByKey(undefined)).toBe(Language.DEFAULT.i18nLocaleKey); }); diff --git a/ui/src/app/shared/type/language.ts b/ui/src/app/shared/type/language.ts index 4737bf4510a..79a88549ab3 100644 --- a/ui/src/app/shared/type/language.ts +++ b/ui/src/app/shared/type/language.ts @@ -1,18 +1,18 @@ -import localDE from '@angular/common/locales/de'; -import localEN from '@angular/common/locales/en'; -import localES from '@angular/common/locales/es'; -import localFR from '@angular/common/locales/fr'; -import localNL from '@angular/common/locales/nl'; -import localJA from '@angular/common/locales/ja'; +import localDE from "@angular/common/locales/de"; +import localEN from "@angular/common/locales/en"; +import localES from "@angular/common/locales/es"; +import localFR from "@angular/common/locales/fr"; +import localJA from "@angular/common/locales/ja"; +import localNL from "@angular/common/locales/nl"; import { TranslateLoader } from "@ngx-translate/core"; -import { Observable, of } from 'rxjs'; -import cz from 'src/assets/i18n/cz.json'; -import de from 'src/assets/i18n/de.json'; -import en from 'src/assets/i18n/en.json'; -import es from 'src/assets/i18n/es.json'; -import fr from 'src/assets/i18n/fr.json'; -import nl from 'src/assets/i18n/nl.json'; -import ja from 'src/assets/i18n/ja.json'; +import { Observable, of } from "rxjs"; +import cz from "src/assets/i18n/cz.json"; +import de from "src/assets/i18n/de.json"; +import en from "src/assets/i18n/en.json"; +import es from "src/assets/i18n/es.json"; +import fr from "src/assets/i18n/fr.json"; +import ja from "src/assets/i18n/ja.json"; +import nl from "src/assets/i18n/nl.json"; interface Translation { [key: string]: string | Translation; diff --git a/ui/src/app/shared/type/role.ts b/ui/src/app/shared/type/role.ts index cf927a34f7d..5c985cb750a 100644 --- a/ui/src/app/shared/type/role.ts +++ b/ui/src/app/shared/type/role.ts @@ -35,10 +35,10 @@ export namespace Role { * @return true if "Role 1" is equal or more privileged than "Role 2" */ export function isAtLeast(role1: Role | string, role2: Role | string): boolean { - if (typeof role1 === 'string') { + if (typeof role1 === "string") { role1 = Role.getRole(role1); } - if (typeof role2 === 'string') { + if (typeof role2 === "string") { role2 = Role.getRole(role2); } return role1 <= role2; diff --git a/ui/src/app/shared/type/systemlog.ts b/ui/src/app/shared/type/systemlog.ts index d5a53572cf5..fa4a0a18734 100644 --- a/ui/src/app/shared/type/systemlog.ts +++ b/ui/src/app/shared/type/systemlog.ts @@ -1,6 +1,6 @@ export interface SystemLog { time: string, - level: 'ERROR' | 'WARN' | 'INFO', + level: "ERROR" | "WARN" | "INFO", source: string, message: string } diff --git a/ui/src/app/shared/type/widget.ts b/ui/src/app/shared/type/widget.ts index f91e01905fd..bd838e1641b 100644 --- a/ui/src/app/shared/type/widget.ts +++ b/ui/src/app/shared/type/widget.ts @@ -1,41 +1,42 @@ // @ts-strict-ignore -import { Edge } from '../components/edge/edge'; -import { EdgeConfig } from '../components/edge/edgeconfig'; +import { Edge } from "../components/edge/edge"; +import { EdgeConfig } from "../components/edge/edgeconfig"; export enum WidgetClass { - 'Energymonitor', - 'Common_Autarchy', - 'Common_Selfconsumption', - 'Storage', - 'Grid', - 'Common_Production', - 'Consumption', - 'Controller_ChannelThreshold', + "Energymonitor", + "Common_Autarchy", + "Common_Selfconsumption", + "Storage", + "Grid", + "Common_Production", + "Consumption", + "Controller_ChannelThreshold", + "Controller_Io_Digital_Outputs", } export enum WidgetNature { - 'io.openems.edge.evcs.api.Evcs', - 'io.openems.impl.controller.channelthreshold.ChannelThresholdController', // TODO deprecated - 'io.openems.edge.io.api.DigitalInput', + "io.openems.edge.evcs.api.Evcs", + "io.openems.impl.controller.channelthreshold.ChannelThresholdController", // TODO deprecated + "io.openems.edge.io.api.DigitalInput", } export enum WidgetFactory { - 'Controller.Asymmetric.PeakShaving', - 'Controller.ChannelThreshold', - 'Controller.CHP.SoC', - 'Controller.Ess.DelayedSellToGrid', - 'Controller.Ess.FixActivePower', - 'Controller.Ess.GridOptimizedCharge', - 'Controller.Ess.Time-Of-Use-Tariff.Discharge', - 'Controller.Ess.Time-Of-Use-Tariff', - 'Controller.IO.ChannelSingleThreshold', - 'Controller.Io.FixDigitalOutput', - 'Controller.IO.HeatingElement', - 'Controller.Io.HeatPump.SgReady', - 'Controller.Symmetric.PeakShaving', - 'Controller.TimeslotPeakshaving', - 'Evcs.Cluster.PeakShaving', - 'Evcs.Cluster.SelfConsumption', + "Controller.Asymmetric.PeakShaving", + "Controller.ChannelThreshold", + "Controller.CHP.SoC", + "Controller.Ess.DelayedSellToGrid", + "Controller.Ess.FixActivePower", + "Controller.Ess.GridOptimizedCharge", + "Controller.Ess.Time-Of-Use-Tariff.Discharge", + "Controller.Ess.Time-Of-Use-Tariff", + "Controller.IO.ChannelSingleThreshold", + "Controller.Io.FixDigitalOutput", + "Controller.IO.HeatingElement", + "Controller.Io.HeatPump.SgReady", + "Controller.Symmetric.PeakShaving", + "Controller.TimeslotPeakshaving", + "Evcs.Cluster.PeakShaving", + "Evcs.Cluster.SelfConsumption", } export type Icon = { @@ -75,41 +76,43 @@ export class Widgets { } public static parseWidgets(edge: Edge, config: EdgeConfig): Widgets { - const classes: string[] = Object.values(WidgetClass) // - .filter(v => typeof v === 'string') + .filter(v => typeof v === "string") .filter(clazz => { - if (!edge.isVersionAtLeast('2018.8')) { + if (!edge.isVersionAtLeast("2018.8")) { // no filter for deprecated versions return true; } switch (clazz) { - case 'Common_Autarchy': - case 'Grid': + case "Common_Autarchy": + case "Grid": return config.hasMeter(); - case 'Energymonitor': - case 'Consumption': + case "Energymonitor": + case "Consumption": if (config.hasMeter() == true || config.hasProducer() == true || config.hasStorage() == true) { return true; } else { return false; } - case 'Storage': + case "Storage": return config.hasStorage(); - case 'Common_Production': - case 'Common_Selfconsumption': + case "Common_Production": + case "Common_Selfconsumption": return config.hasProducer(); - case 'Controller_ChannelThreshold': - return config.getComponentIdsByFactory('Controller.ChannelThreshold')?.length > 0; + case "Controller_ChannelThreshold": + return config.getComponentIdsByFactory("Controller.ChannelThreshold")?.length > 0; + case "Controller_Io_Digital_Outputs": + return config.getComponentIdsByFactories("Controller.Io.FixDigitalOutput", "Controller.IO.ChannelSingleThreshold")?.length > 0; + default: + return false; } - return false; }).map(clazz => clazz.toString()); const list: Widget[] = []; - for (const nature of Object.values(WidgetNature).filter(v => typeof v === 'string')) { + for (const nature of Object.values(WidgetNature).filter(v => typeof v === "string")) { for (const componentId of config.getComponentIdsImplementingNature(nature.toString())) { - if (nature === 'io.openems.edge.io.api.DigitalInput' && list.some(e => e.name === 'io.openems.edge.io.api.DigitalInput')) { + if (nature === "io.openems.edge.io.api.DigitalInput" && list.some(e => e.name === "io.openems.edge.io.api.DigitalInput")) { continue; } if (config.getComponent(componentId).isEnabled) { @@ -117,7 +120,7 @@ export class Widgets { } } } - for (const factory of Object.values(WidgetFactory).filter(v => typeof v === 'string')) { + for (const factory of Object.values(WidgetFactory).filter(v => typeof v === "string")) { for (const componentId of config.getComponentIdsByFactory(factory.toString())) { if (config.getComponent(componentId).isEnabled) { list.push({ name: factory, componentId: componentId }); @@ -127,14 +130,14 @@ export class Widgets { // explicitely sort ChannelThresholdControllers by their outputChannelAddress list.sort((w1, w2) => { - if (w1.name === 'Controller.IO.ChannelSingleThreshold' && w2.name === 'Controller.IO.ChannelSingleThreshold') { - let outputChannelAddress1: string | string[] = config.getComponentProperties(w1.componentId)['outputChannelAddress']; - if (typeof outputChannelAddress1 !== 'string') { + if (w1.name === "Controller.IO.ChannelSingleThreshold" && w2.name === "Controller.IO.ChannelSingleThreshold") { + let outputChannelAddress1: string | string[] = config.getComponentProperties(w1.componentId)["outputChannelAddress"]; + if (typeof outputChannelAddress1 !== "string") { // Takes only the first output for simplicity reasons outputChannelAddress1 = outputChannelAddress1[0]; } - let outputChannelAddress2: string | string[] = config.getComponentProperties(w2.componentId)['outputChannelAddress']; - if (typeof outputChannelAddress2 !== 'string') { + let outputChannelAddress2: string | string[] = config.getComponentProperties(w2.componentId)["outputChannelAddress"]; + if (typeof outputChannelAddress2 !== "string") { // Takes only the first output for simplicity reasons outputChannelAddress2 = outputChannelAddress2[0]; } diff --git a/ui/src/app/shared/utils/array/array.utils.spec.ts b/ui/src/app/shared/utils/array/array.utils.spec.ts index aab90e1edaa..a9298c0c205 100644 --- a/ui/src/app/shared/utils/array/array.utils.spec.ts +++ b/ui/src/app/shared/utils/array/array.utils.spec.ts @@ -1,23 +1,23 @@ // @ts-strict-ignore import { ArrayUtils } from "./array.utils"; -describe('Array-Utils', () => { - it('#findSmallestNumber', () => { +describe("Array-Utils", () => { + it("#findSmallestNumber", () => { expect(ArrayUtils.findSmallestNumber([])).toEqual(null); expect(ArrayUtils.findSmallestNumber([null, null])).toEqual(null); expect(ArrayUtils.findSmallestNumber([0, -1])).toEqual(-1); expect(ArrayUtils.findSmallestNumber([null, undefined])).toEqual(null); }); - it('#findBiggestNumber', () => { + it("#findBiggestNumber", () => { expect(ArrayUtils.findBiggestNumber([])).toEqual(null); expect(ArrayUtils.findBiggestNumber([null, null])).toEqual(null); expect(ArrayUtils.findBiggestNumber([0, -1])).toEqual(0); expect(ArrayUtils.findBiggestNumber([null, undefined])).toEqual(null); }); - it('#sortAlphabeticaly', () => { - const inputArr = ['A', null, 'C', undefined, 'B', 'a', '1']; - const sortedArr = ['1', 'A', 'a', 'B', 'C', null, undefined]; + it("#sortAlphabeticaly", () => { + const inputArr = ["A", null, "C", undefined, "B", "a", "1"]; + const sortedArr = ["1", "A", "a", "B", "C", null, undefined]; expect(ArrayUtils.sortedAlphabetically(inputArr, a => a)).toEqual(sortedArr); expect(ArrayUtils.sortedAlphabetically(inputArr, _a => null)).toEqual(inputArr); diff --git a/ui/src/app/shared/utils/array/array.utils.ts b/ui/src/app/shared/utils/array/array.utils.ts index d5403948bb5..6026afa4579 100644 --- a/ui/src/app/shared/utils/array/array.utils.ts +++ b/ui/src/app/shared/utils/array/array.utils.ts @@ -45,7 +45,7 @@ export namespace ArrayUtils { } else if (!bVal) { return -1; } - return aVal.localeCompare(bVal, undefined, { sensitivity: 'accent' }); + return aVal.localeCompare(bVal, undefined, { sensitivity: "accent" }); }); } } diff --git a/ui/src/app/shared/utils/color/color.utils.spec.ts b/ui/src/app/shared/utils/color/color.utils.spec.ts index d9ee75dd2a8..4ba93b95ff9 100644 --- a/ui/src/app/shared/utils/color/color.utils.spec.ts +++ b/ui/src/app/shared/utils/color/color.utils.spec.ts @@ -1,17 +1,17 @@ // @ts-strict-ignore import { ColorUtils } from "./color.utils"; -describe('Color-Utils', () => { - it('#rgbStringToRgba', () => { - expect(ColorUtils.rgbStringToRGBA('rgb(0,0,0)', 1)).toBe('rgba(0,0,0,1)'); - expect(ColorUtils.rgbStringToRGBA('rgb(0,0,0)', null)).toEqual('rgba(0,0,0,0)'); +describe("Color-Utils", () => { + it("#rgbStringToRgba", () => { + expect(ColorUtils.rgbStringToRGBA("rgb(0,0,0)", 1)).toBe("rgba(0,0,0,1)"); + expect(ColorUtils.rgbStringToRGBA("rgb(0,0,0)", null)).toEqual("rgba(0,0,0,0)"); expect(ColorUtils.rgbStringToRGBA(null, 1)).toEqual(null); expect(ColorUtils.rgbStringToRGBA(null, null)).toEqual(null); }); - it('#changeOpacityFromRGBA', () => { - expect(ColorUtils.changeOpacityFromRGBA('rgba(0,0,0,0.05)', 1)).toBe('rgba(0,0,0,1)'); - expect(ColorUtils.changeOpacityFromRGBA('rgba(0,0,0,0.05)', null)).toBe('rgba(0,0,0,0)'); + it("#changeOpacityFromRGBA", () => { + expect(ColorUtils.changeOpacityFromRGBA("rgba(0,0,0,0.05)", 1)).toBe("rgba(0,0,0,1)"); + expect(ColorUtils.changeOpacityFromRGBA("rgba(0,0,0,0.05)", null)).toBe("rgba(0,0,0,0)"); expect(ColorUtils.changeOpacityFromRGBA(null, 1)).toBe(null); expect(ColorUtils.changeOpacityFromRGBA(null, null)).toBe(null); }); diff --git a/ui/src/app/shared/utils/color/color.utils.ts b/ui/src/app/shared/utils/color/color.utils.ts index e8408861359..a561dc53eca 100644 --- a/ui/src/app/shared/utils/color/color.utils.ts +++ b/ui/src/app/shared/utils/color/color.utils.ts @@ -14,7 +14,7 @@ export namespace ColorUtils { return null; } - return 'rgba(' + color.split('(').pop().split(')')[0] + ',' + (opacity ?? 0) + ')'; + return "rgba(" + color.split("(").pop().split(")")[0] + "," + (opacity ?? 0) + ")"; } /** @@ -30,9 +30,9 @@ export namespace ColorUtils { return null; } - const rgba = color.split('(').pop().split(')')[0]; - const rgb = rgba.split(',').slice(0, -1).join(','); + const rgba = color.split("(").pop().split(")")[0]; + const rgb = rgba.split(",").slice(0, -1).join(","); - return 'rgba(' + rgb + ',' + (opacity ?? 0) + ')'; + return "rgba(" + rgb + "," + (opacity ?? 0) + ")"; } } diff --git a/ui/src/app/shared/utils/date/dateutils.spec.ts b/ui/src/app/shared/utils/date/dateutils.spec.ts index 05916c3bfdb..83e03852083 100644 --- a/ui/src/app/shared/utils/date/dateutils.spec.ts +++ b/ui/src/app/shared/utils/date/dateutils.spec.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore import { DateUtils } from "./dateutils"; -describe('DateUtils', () => { +describe("DateUtils", () => { const dates: Date[] = [ new Date(Date.parse("2023-01-01")), new Date(Date.parse("2023-01-02")), ]; - it('#minDate - smallest date', () => { + it("#minDate - smallest date", () => { // valid params expect(DateUtils.minDate(...dates)).toEqual(dates[0]); @@ -20,7 +20,7 @@ describe('DateUtils', () => { expect(isNaN(DateUtils.minDate(null, null)?.getTime())).toBe(true); }); - it('#maxDate - biggest date', () => { + it("#maxDate - biggest date", () => { // valid params expect(DateUtils.maxDate(...dates)).toEqual(dates[1]); @@ -31,13 +31,13 @@ describe('DateUtils', () => { expect(isNaN(DateUtils.maxDate(null, null)?.getTime())).toBe(true); }); - it('#stringToDate - converts string to date', () => { - expect(DateUtils.stringToDate('2023-01-02')).toEqual(new Date(Date.parse('2023-01-02'))); - expect(DateUtils.stringToDate('wrong format')).toEqual(null); + it("#stringToDate - converts string to date", () => { + expect(DateUtils.stringToDate("2023-01-02")).toEqual(new Date(Date.parse("2023-01-02"))); + expect(DateUtils.stringToDate("wrong format")).toEqual(null); }); - it('#isDateBefore - checks if given date is before date to be compared to', () => { - const date: Date = DateUtils.stringToDate('2023-01-01') as Date; + it("#isDateBefore - checks if given date is before date to be compared to", () => { + const date: Date = DateUtils.stringToDate("2023-01-01") as Date; expect(DateUtils.isDateBefore(date, DateUtils.stringToDate("2023-01-31"))).toEqual(true); expect(DateUtils.isDateBefore(date, DateUtils.stringToDate("2022-12-31"))).toEqual(false); expect(DateUtils.isDateBefore(date, DateUtils.stringToDate("2023-01-01"))).toEqual(false); diff --git a/ui/src/app/shared/utils/date/dateutils.ts b/ui/src/app/shared/utils/date/dateutils.ts index ff97467488a..253e06cda38 100644 --- a/ui/src/app/shared/utils/date/dateutils.ts +++ b/ui/src/app/shared/utils/date/dateutils.ts @@ -1,4 +1,5 @@ -import { isBefore } from "date-fns"; +import { TranslateService } from "@ngx-translate/core"; +import { format, isBefore } from "date-fns"; export namespace DateUtils { @@ -91,4 +92,20 @@ export namespace DateUtils { } return false; } + + /** + * Checks if passed date is before a certain date, e.g. "01.08.2024 - 02.08.2024" + * + * @param fromDate the date + * @param toDate the date to compare it to + * @param translate the translate service + * @returns a dateRange, or null if either fromDate or toDate invalid + */ + export function toDateRange(fromDate: Date, toDate: Date, translate: TranslateService): string | null { + + if (!fromDate || !toDate) { + return null; + } + return format(fromDate, translate.instant("General.dateFormat")) + " - " + format(toDate, translate.instant("General.dateFormat")); + } } diff --git a/ui/src/app/shared/utils/datetime/datetime-utils.ts b/ui/src/app/shared/utils/datetime/datetime-utils.ts index aec8bad6a21..70bb0b7cc58 100644 --- a/ui/src/app/shared/utils/datetime/datetime-utils.ts +++ b/ui/src/app/shared/utils/datetime/datetime-utils.ts @@ -23,7 +23,7 @@ export class DateTimeUtils { // Change first timestamp to start of month const formattedDate = startOfMonth(DateUtils.stringToDate(energyPerPeriodResponse.result.timestamps[0])); - energyPerPeriodResponse.result.timestamps[0] = format(formattedDate, 'yyyy-MM-dd HH:mm:ss', { locale: de })?.toString() ?? energyPerPeriodResponse.result.timestamps[0]; + energyPerPeriodResponse.result.timestamps[0] = format(formattedDate, "yyyy-MM-dd HH:mm:ss", { locale: de })?.toString() ?? energyPerPeriodResponse.result.timestamps[0]; // show 12 stacks, even if no data and timestamps const newTimestamps: string[] = []; @@ -40,7 +40,7 @@ export class DateTimeUtils { } energyPerPeriodResponse.result.timestamps = newTimestamps.concat(energyPerPeriodResponse.result.timestamps); - break; + return energyPerPeriodResponse; } case ChronoUnit.Type.YEARS: { @@ -48,11 +48,12 @@ export class DateTimeUtils { // Change dates to be first day of year const formattedDates = energyPerPeriodResponse.result.timestamps.map((timestamp) => startOfYear(DateUtils.stringToDate(timestamp))); - energyPerPeriodResponse.result.timestamps = formattedDates.map(date => format(date, 'yyyy-MM-dd HH:mm:ss', { locale: de })?.toString()); - break; + energyPerPeriodResponse.result.timestamps = formattedDates.map(date => format(date, "yyyy-MM-dd HH:mm:ss", { locale: de })?.toString()); + return energyPerPeriodResponse; } + default: + return energyPerPeriodResponse; } - return energyPerPeriodResponse; } } diff --git a/ui/src/app/shared/utils/time/timeutils.spec.ts b/ui/src/app/shared/utils/time/timeutils.spec.ts index 0916acd4b76..4286ef47110 100644 --- a/ui/src/app/shared/utils/time/timeutils.spec.ts +++ b/ui/src/app/shared/utils/time/timeutils.spec.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore import { TimeUtils } from "./timeutils"; -describe('TimeUtils', () => { - it('#formatSecondsToDuration', () => { - expect(TimeUtils.formatSecondsToDuration(12000, 'de')).toEqual("3h 20m"); - expect(TimeUtils.formatSecondsToDuration(null, 'de')).toEqual(null); - expect(TimeUtils.formatSecondsToDuration(undefined, 'de')).toEqual(null); +describe("TimeUtils", () => { + it("#formatSecondsToDuration", () => { + expect(TimeUtils.formatSecondsToDuration(12000, "de")).toEqual("3h 20m"); + expect(TimeUtils.formatSecondsToDuration(null, "de")).toEqual(null); + expect(TimeUtils.formatSecondsToDuration(undefined, "de")).toEqual(null); expect(TimeUtils.formatSecondsToDuration(12000, null)).toEqual("3h 20m"); }); }); diff --git a/ui/src/app/shared/utils/time/timeutils.ts b/ui/src/app/shared/utils/time/timeutils.ts index 905f2128402..2998327d2ab 100644 --- a/ui/src/app/shared/utils/time/timeutils.ts +++ b/ui/src/app/shared/utils/time/timeutils.ts @@ -23,9 +23,9 @@ export class TimeUtils { minutes -= hours * 60; if (hours <= 23 && minutes > 0) { - return decimalPipe.transform(hours, '1.0-0') + 'h' + " " + decimalPipe.transform(minutes, '1.0-0') + 'm'; + return decimalPipe.transform(hours, "1.0-0") + "h" + " " + decimalPipe.transform(minutes, "1.0-0") + "m"; } else { - return decimalPipe.transform(hours, '1.0-0') + 'h'; + return decimalPipe.transform(hours, "1.0-0") + "h"; } } @@ -49,9 +49,9 @@ export class TimeUtils { const minutes = Math.floor(seconds / 60); if (minutes > 0) { - return decimalPipe.transform(minutes, '1.0-0') + ' min'; + return decimalPipe.transform(minutes, "1.0-0") + " min"; } else { - return decimalPipe.transform(seconds, '1.0-0') + ' s'; + return decimalPipe.transform(seconds, "1.0-0") + " s"; } } } diff --git a/ui/src/app/user/user.component.html b/ui/src/app/user/user.component.html index 1f3f7407448..bc5370ebca3 100644 --- a/ui/src/app/user/user.component.html +++ b/ui/src/app/user/user.component.html @@ -17,9 +17,11 @@ Menu.name - {{ this.form?.model ? ((this.form?.model?.firstname ?? '') + ' ' + (this.form?.model?.lastname ?? '')).trim() : user.name }} - + {{ + this.form?.model + ? ((this.form?.model?.firstname ?? '') + ' ' + (this.form?.model?.lastname ?? '')).trim() + : user.name + }} diff --git a/ui/src/app/user/user.component.ts b/ui/src/app/user/user.component.ts index ee2ee865b0b..b42945d1521 100644 --- a/ui/src/app/user/user.component.ts +++ b/ui/src/app/user/user.component.ts @@ -1,19 +1,18 @@ // @ts-strict-ignore -import { Component, OnInit } from '@angular/core'; -import { FormGroup, Validators } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { Changelog } from 'src/app/changelog/view/component/changelog.constants'; - -import { FormlyFieldConfig } from '@ngx-formly/core'; -import { environment } from '../../environments'; -import { GetUserInformationRequest } from '../shared/jsonrpc/request/getUserInformationRequest'; -import { SetUserInformationRequest } from '../shared/jsonrpc/request/setUserInformationRequest'; -import { UpdateUserLanguageRequest } from '../shared/jsonrpc/request/updateUserLanguageRequest'; -import { GetUserInformationResponse } from '../shared/jsonrpc/response/getUserInformationResponse'; -import { Service, Websocket } from '../shared/shared'; -import { COUNTRY_OPTIONS } from '../shared/type/country'; -import { Language } from '../shared/type/language'; +import { Component, OnInit } from "@angular/core"; +import { FormGroup, Validators } from "@angular/forms"; +import { ActivatedRoute } from "@angular/router"; +import { FormlyFieldConfig } from "@ngx-formly/core"; +import { TranslateService } from "@ngx-translate/core"; +import { Changelog } from "src/app/changelog/view/component/changelog.constants"; +import { environment } from "../../environments"; +import { GetUserInformationRequest } from "../shared/jsonrpc/request/getUserInformationRequest"; +import { SetUserInformationRequest } from "../shared/jsonrpc/request/setUserInformationRequest"; +import { UpdateUserLanguageRequest } from "../shared/jsonrpc/request/updateUserLanguageRequest"; +import { GetUserInformationResponse } from "../shared/jsonrpc/response/getUserInformationResponse"; +import { Service, Websocket } from "../shared/shared"; +import { COUNTRY_OPTIONS } from "../shared/type/country"; +import { Language } from "../shared/type/language"; type CompanyUserInformation = UserInformation & { companyName: string }; @@ -29,7 +28,7 @@ type UserInformation = { }; @Component({ - templateUrl: './user.component.html', + templateUrl: "./user.component.html", }) export class UserComponent implements OnInit { @@ -68,7 +67,6 @@ export class UserComponent implements OnInit { ngOnInit() { // Set currentLanguage to this.currentLanguage = Language.getByKey(localStorage.LANGUAGE) ?? Language.DEFAULT; - this.service.setCurrentComponent({ languageKey: 'Menu.user' }, this.route); this.getUserInformation().then((userInformation) => { this.form = { formGroup: new FormGroup({}), @@ -128,13 +126,13 @@ export class UserComponent implements OnInit { }, }]; - if (Object.prototype.hasOwnProperty.call(userInformation, 'companyName')) { + if (Object.prototype.hasOwnProperty.call(userInformation, "companyName")) { this.companyInformationFields.push( { key: "companyName", type: "input", props: { - label: this.translate.instant('Register.Form.companyName'), + label: this.translate.instant("Register.Form.companyName"), disabled: true, }, }, @@ -153,7 +151,7 @@ export class UserComponent implements OnInit { public applyChanges() { - const params: SetUserInformationRequest['params'] = { + const params: SetUserInformationRequest["params"] = { user: { lastname: this.form.model.lastname, firstname: this.form.model.firstname, @@ -169,9 +167,9 @@ export class UserComponent implements OnInit { }; this.service.websocket.sendRequest(new SetUserInformationRequest(params)).then(() => { - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch((reason) => { - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); }); this.enableAndDisableFormFields(); this.form.formGroup.markAsPristine(); @@ -204,7 +202,7 @@ export class UserComponent implements OnInit { return new Promise(resolve => { const interval = setInterval(() => { - if (this.websocket.status == 'online') { + if (this.websocket.status == "online") { this.service.websocket.sendRequest(new GetUserInformationRequest()).then((response: GetUserInformationResponse) => { const user = response.result.user; @@ -247,8 +245,8 @@ export class UserComponent implements OnInit { } public toggleDebugMode(event: CustomEvent) { - localStorage.setItem("DEBUGMODE", event.detail['checked']); - this.environment.debugMode = event.detail['checked']; + localStorage.setItem("DEBUGMODE", event.detail["checked"]); + this.environment.debugMode = event.detail["checked"]; } public setLanguage(language: Language): void { @@ -257,9 +255,9 @@ export class UserComponent implements OnInit { this.service.setLang(language); this.websocket.sendRequest(new UpdateUserLanguageRequest({ language: language.key })).then(() => { - this.service.toast(this.translate.instant('General.changeAccepted'), 'success'); + this.service.toast(this.translate.instant("General.changeAccepted"), "success"); }).catch((reason) => { - this.service.toast(this.translate.instant('General.changeFailed') + '\n' + reason.error.message, 'danger'); + this.service.toast(this.translate.instant("General.changeFailed") + "\n" + reason.error.message, "danger"); }); this.currentLanguage = language; diff --git a/ui/src/app/user/user.module.ts b/ui/src/app/user/user.module.ts index 71081adaf79..a0352848700 100644 --- a/ui/src/app/user/user.module.ts +++ b/ui/src/app/user/user.module.ts @@ -1,6 +1,6 @@ -import { NgModule } from '@angular/core'; -import { SharedModule } from './../shared/shared.module'; -import { UserComponent } from './user.component'; +import { NgModule } from "@angular/core"; +import { SharedModule } from "./../shared/shared.module"; +import { UserComponent } from "./user.component"; @NgModule({ imports: [ diff --git a/ui/src/assets/i18n/de.json b/ui/src/assets/i18n/de.json index 30cbdd745b0..5e45735b3cf 100644 --- a/ui/src/assets/i18n/de.json +++ b/ui/src/assets/i18n/de.json @@ -245,7 +245,14 @@ "CHART_TITLE": "Aktueller Fahrplan (BETA-Test)", "CHART_WARNING_NOTE": "Die Grafik zeigt die vergangenen drei Stunden, sowie die zukünftig geplante Betriebsweise für den Zeitraum, für den die dynamischen Netzbezugspreise zur Verfügung stehen. Bitte beachten Sie, dass der Fahrplan kontinuierlich neu berechnet wird und sich somit im Tagesverlauf ändern kann.", "POWER_SOC_CHART_TITLE": "Vorhersagen (Nur für Admins)" - } + }, + "SYSTEM": { + "INDUSTRIAL": { + "NOTE": "Startet oder stoppt das Gesamtsystem, inklusive Batteriewechselrichter und Batterien." + }, + "OVERALL_SYSTEM": "Gesamtsystem" + }, + "FIX_DIGITAL_OUTPUT": "Digitale Ausgangscontroller" }, "RETROFITTING": { "UPDATE_TO_NEW_VERSION": "Um die Kapazitätserweiterung nutzen zu können, ist ein Update auf die neueste Version erforderlich.", @@ -947,6 +954,11 @@ "WARNING": "Im Rahmen des Systemupdates wird {{system}} neu gestartet und dabei die Kommunikation unterbrochen. In dieser Zeit werden keine Daten aufgezeichnet oder Komponenten angesteuert. Bitte stellen Sie sicher, dass sich das Gesamtsystem in einem sicheren Zustand befindet.", "UPDATE_EXECUTE": "Systemupdate durchführen", "SUB_HEADER": "Möchten Sie ein Systemupdate durchführen?" + }, + "ENERGY_JOURNEY": { + "TO_THE_ANALYSIS": "Zur Analyse", + "CURRENT_NUMBER_OF_MODULES": "Aktuell", + "SIMULATION_NOT_STARTED": "Simulation nicht gestartet" } }, "CHANNELS": { diff --git a/ui/src/assets/i18n/en.json b/ui/src/assets/i18n/en.json index 7e19b725d7d..3c555925b24 100644 --- a/ui/src/assets/i18n/en.json +++ b/ui/src/assets/i18n/en.json @@ -246,7 +246,14 @@ "CHART_TITLE": "Planned Schedule (BETA test)", "CHART_WARNING_NOTE": "The graphic shows the past three hours as well as the future planned operating mode for the period for which the dynamic grid purchase prices are available. Please note that the planned schedule is subject to continuous recalculation and may change throughout the day.", "POWER_SOC_CHART_TITLE": "Forecasts (Only for Admins)" - } + }, + "SYSTEM": { + "INDUSTRIAL": { + "NOTE": "Starts or stops the entire system, including battery inverter and batteries." + }, + "OVERALL_SYSTEM": "Overall system" + }, + "FIX_DIGITAL_OUTPUT": "Digital Outputcontroller" }, "RETROFITTING": { "OPTIMAL": "Capacity expansion", @@ -950,6 +957,11 @@ "WARNING": "The software will restart after the system update. No data is recorded or components controlled during this time. Please ensure that the entire system is in a safe state.", "UPDATE_EXECUTE": "Execute system update", "SUB_HEADER": "Would you like to execute a system update?" + }, + "ENERGY_JOURNEY": { + "TO_THE_ANALYSIS": "To the analysis", + "CURRENT_NUMBER_OF_MODULES": "Current", + "SIMULATION_NOT_STARTED": "Simulation not started" } }, "CHANNELS": { @@ -972,4 +984,4 @@ "APP": { "FUNCTIONALITY_TEMPORARILY_NOT_AVAILABLE": "This function is temporarily not available in the app, please use the web app instead." } -} \ No newline at end of file +} diff --git a/ui/src/environments/index.ts b/ui/src/environments/index.ts index 0515cc35d5d..e10181d51ce 100644 --- a/ui/src/environments/index.ts +++ b/ui/src/environments/index.ts @@ -1,9 +1,9 @@ -import { TranslateService } from '@ngx-translate/core'; -import { Filter } from 'src/app/index/filter/filter.component'; -import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -export { environment } from './dummy'; +import { TranslateService } from "@ngx-translate/core"; +import { Filter } from "src/app/index/filter/filter.component"; +import { DefaultTypes } from "src/app/shared/service/defaulttypes"; +export { environment } from "./dummy"; -export type Theme = 'OpenEMS'; +export type Theme = "OpenEMS"; export interface Environment { readonly theme: Theme; diff --git a/ui/src/global.scss b/ui/src/global.scss index f29dac900c2..59a24c31264 100644 --- a/ui/src/global.scss +++ b/ui/src/global.scss @@ -26,6 +26,13 @@ @import "node_modules/ngx-spinner/animations/ball-clip-rotate-multiple.css"; @import "variables"; +/* Live- and HistoryComponent*/ +ion-refresher-content { + ion-spinner { + left: 0 !important; + } +} + .custom-ion-popover { white-space: inherit; @@ -250,6 +257,7 @@ formly-input-section { .alert-button-group { justify-content: space-between; + .alert-button { color: $primary-color; font-size: small; @@ -395,4 +403,4 @@ ion-modal.full-width { --storage-segment-2: block; --storage-segment-3: block; --storage-segment-4: block; -} +} \ No newline at end of file diff --git a/ui/src/main.ts b/ui/src/main.ts index 43c16a32c32..cb2219c75a6 100644 --- a/ui/src/main.ts +++ b/ui/src/main.ts @@ -1,7 +1,7 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { environment } from 'src/environments'; -import { AppModule } from 'src/app/app.module'; +import { enableProdMode } from "@angular/core"; +import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; +import { AppModule } from "src/app/app.module"; +import { environment } from "src/environments"; if (environment.production) { enableProdMode(); diff --git a/ui/src/polyfills.ts b/ui/src/polyfills.ts index 5aacd21714a..1f1d0cedfd1 100644 --- a/ui/src/polyfills.ts +++ b/ui/src/polyfills.ts @@ -19,7 +19,7 @@ */ /** IE11 requires the following for NgClass support on SVG elements */ -import 'classlist.js'; // Run `npm install --save classlist.js`. +import "classlist.js"; // Run `npm install --save classlist.js`. /** * Web Animations `@angular/platform-browser/animations` @@ -52,12 +52,14 @@ import 'classlist.js'; // Run `npm install --save classlist.js`. * */ -import './zone-flags'; +import "./zone-flags"; /*************************************************************************************************** * Zone JS is required by default for Angular itself. */ -import 'zone.js/dist/zone'; // Included with Angular CLI. +import "zone.js"; + +// Included with Angular CLI. /*************************************************************************************************** diff --git a/ui/src/test.ts b/ui/src/test.ts index d8e68564e1b..31342e27233 100644 --- a/ui/src/test.ts +++ b/ui/src/test.ts @@ -7,12 +7,13 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files -import 'zone.js/testing'; -import { getTestBed } from '@angular/core/testing'; +import "zone.js/testing"; + +import { getTestBed } from "@angular/core/testing"; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, -} from '@angular/platform-browser-dynamic/testing'; +} from "@angular/platform-browser-dynamic/testing"; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( diff --git a/ui/src/themes/openems/environments/backend-dev.ts b/ui/src/themes/openems/environments/backend-dev.ts index f48b00c5e42..a6726d2b8c5 100644 --- a/ui/src/themes/openems/environments/backend-dev.ts +++ b/ui/src/themes/openems/environments/backend-dev.ts @@ -4,7 +4,7 @@ import { theme } from "./theme"; export const environment: Environment = { ...theme, ...{ - backend: 'OpenEMS Backend', + backend: "OpenEMS Backend", url: "ws://" + location.hostname + ":8082", production: false, diff --git a/ui/src/themes/openems/environments/backend-docker.ts b/ui/src/themes/openems/environments/backend-docker.ts index f49468be729..078845ad97c 100644 --- a/ui/src/themes/openems/environments/backend-docker.ts +++ b/ui/src/themes/openems/environments/backend-docker.ts @@ -11,7 +11,7 @@ const window_env = (window as any).env as { [key: string]: string }; export const environment: Environment = { ...theme, ...{ - backend: 'OpenEMS Backend', + backend: "OpenEMS Backend", url: window_env.websocket, production: true, diff --git a/ui/src/themes/openems/environments/backend-prod.ts b/ui/src/themes/openems/environments/backend-prod.ts index ae5bb5eb32f..ebfe2b1ecf2 100644 --- a/ui/src/themes/openems/environments/backend-prod.ts +++ b/ui/src/themes/openems/environments/backend-prod.ts @@ -4,7 +4,7 @@ import { theme } from "./theme"; export const environment: Environment = { ...theme, ...{ - backend: 'OpenEMS Backend', + backend: "OpenEMS Backend", url: "ws://" + location.hostname + ":8082", production: true, diff --git a/ui/src/themes/openems/environments/edge-dev.ts b/ui/src/themes/openems/environments/edge-dev.ts index 164dd04f34e..b36d202ef27 100644 --- a/ui/src/themes/openems/environments/edge-dev.ts +++ b/ui/src/themes/openems/environments/edge-dev.ts @@ -4,7 +4,7 @@ import { theme } from "./theme"; export const environment: Environment = { ...theme, ...{ - backend: 'OpenEMS Edge', + backend: "OpenEMS Edge", url: "ws://" + location.hostname + ":8085", production: false, diff --git a/ui/src/themes/openems/environments/edge-docker.ts b/ui/src/themes/openems/environments/edge-docker.ts index 810acf2717a..59371199cdd 100644 --- a/ui/src/themes/openems/environments/edge-docker.ts +++ b/ui/src/themes/openems/environments/edge-docker.ts @@ -11,7 +11,7 @@ const window_env = (window as any).env as { [key: string]: string }; export const environment: Environment = { ...theme, ...{ - backend: 'OpenEMS Edge', + backend: "OpenEMS Edge", url: window_env.websocket, production: true, diff --git a/ui/src/themes/openems/environments/edge-prod.ts b/ui/src/themes/openems/environments/edge-prod.ts index bcaf40f6901..183a4f0fef9 100644 --- a/ui/src/themes/openems/environments/edge-prod.ts +++ b/ui/src/themes/openems/environments/edge-prod.ts @@ -4,7 +4,7 @@ import { theme } from "./theme"; export const environment: Environment = { ...theme, ...{ - backend: 'OpenEMS Edge', + backend: "OpenEMS Edge", url: "ws://" + location.hostname + ":8075", production: true, diff --git a/ui/src/themes/openems/environments/gitpod.ts b/ui/src/themes/openems/environments/gitpod.ts index 1ef2f8ca499..88de7c57cdc 100644 --- a/ui/src/themes/openems/environments/gitpod.ts +++ b/ui/src/themes/openems/environments/gitpod.ts @@ -4,7 +4,7 @@ import { theme } from "./theme"; export const environment: Environment = { ...theme, ...{ - backend: 'OpenEMS Backend', + backend: "OpenEMS Backend", // gitpod puts the port number in front of the hostname url: "wss://8082-" + location.hostname.substring(location.hostname.indexOf("-") + 1), diff --git a/ui/src/themes/openems/environments/theme.ts b/ui/src/themes/openems/environments/theme.ts index bf94176f4f7..d771eb259d7 100644 --- a/ui/src/themes/openems/environments/theme.ts +++ b/ui/src/themes/openems/environments/theme.ts @@ -1,4 +1,4 @@ -import { Theme } from 'src/environments'; +import { Theme } from "src/environments"; export const theme = { theme: "OpenEMS" as Theme, diff --git a/ui/src/themes/openems/root/site.webmanifest b/ui/src/themes/openems/root/site.webmanifest index 58e369e755e..b4bc8f030b2 100644 --- a/ui/src/themes/openems/root/site.webmanifest +++ b/ui/src/themes/openems/root/site.webmanifest @@ -16,4 +16,4 @@ "theme_color": "#f4a942", "background_color": "#f4a942", "display": "standalone" -} \ No newline at end of file +} diff --git a/ui/tsconfig.app.json b/ui/tsconfig.app.json index da9cb8b9de2..82d91dc4a4d 100644 --- a/ui/tsconfig.app.json +++ b/ui/tsconfig.app.json @@ -12,4 +12,4 @@ "include": [ "src/**/*.d.ts" ] -} \ No newline at end of file +} diff --git a/ui/tsconfig.spec.json b/ui/tsconfig.spec.json index 87be9d5b3f1..092345b02e8 100644 --- a/ui/tsconfig.spec.json +++ b/ui/tsconfig.spec.json @@ -15,4 +15,4 @@ "src/**/*.spec.ts", "src/**/*.d.ts" ] -} \ No newline at end of file +}