From 78c46a2bccd0bc4c5ef1b36e810456ffdde40612 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Thu, 1 Aug 2024 22:45:22 +0200 Subject: [PATCH 01/28] Start development of version 2024.9.0-SNAPSHOT --- io.openems.common/src/io/openems/common/OpenemsConstants.java | 4 ++-- ui/android/app/build.gradle | 4 ++-- ui/package-lock.json | 4 ++-- ui/package.json | 2 +- ui/src/app/changelog/view/component/changelog.constants.ts | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/io.openems.common/src/io/openems/common/OpenemsConstants.java b/io.openems.common/src/io/openems/common/OpenemsConstants.java index 14f7bd4db52..001ac36ce1c 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. @@ -36,7 +36,7 @@ public class OpenemsConstants { /** * The additional version string. */ - public static final String VERSION_STRING = ""; + public static final String VERSION_STRING = "SNAPSHOT"; /** * The complete version as a SemanticVersion. diff --git a/ui/android/app/build.gradle b/ui/android/app/build.gradle index 9a70a646b25..222c575a476 100644 --- a/ui/android/app/build.gradle +++ b/ui/android/app/build.gradle @@ -9,8 +9,8 @@ android { defaultConfig { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 20240800 - versionName "2024.8.0" + versionCode 20240900 + versionName "2024.9.0-SNAPSHOT" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/ui/package-lock.json b/ui/package-lock.json index ce222429275..9c4df8ded37 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "openems-ui", - "version": "2024.8.0", + "version": "2024.9.0-SNAPSHOT", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "openems-ui", - "version": "2024.8.0", + "version": "2024.9.0-SNAPSHOT", "license": "AGPL-3.0", "dependencies": { "@angular/animations": "~16.2.12", diff --git a/ui/package.json b/ui/package.json index a5194f5d6bc..5fc269997c0 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "openems-ui", - "version": "2024.8.0", + "version": "2024.9.0-SNAPSHOT", "license": "AGPL-3.0", "private": true, "dependencies": { diff --git a/ui/src/app/changelog/view/component/changelog.constants.ts b/ui/src/app/changelog/view/component/changelog.constants.ts index e2c21860448..fbd3bed9b24 100644 --- a/ui/src/app/changelog/view/component/changelog.constants.ts +++ b/ui/src/app/changelog/view/component/changelog.constants.ts @@ -2,7 +2,7 @@ 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-SNAPSHOT"; public static product(...products: Product[]) { return products.map(product => Changelog.link(product.name, product.url)).join(", ") + '. '; From 953b9d2275d1940aeed1334f7b83b42d820c80fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:07:01 +0200 Subject: [PATCH 02/28] Build(deps): Bump swiper from 11.1.8 to 11.1.9 in /ui (#2734) Bumps [swiper](https://github.com/nolimits4web/Swiper) from 11.1.8 to 11.1.9. - [Release notes](https://github.com/nolimits4web/Swiper/releases) - [Changelog](https://github.com/nolimits4web/swiper/blob/master/CHANGELOG.md) - [Commits](https://github.com/nolimits4web/Swiper/compare/v11.1.8...v11.1.9) --- updated-dependencies: - dependency-name: swiper dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 8 ++++---- ui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index 9c4df8ded37..72d21692add 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -51,7 +51,7 @@ "ngx-spinner": "^16.0.2", "roboto-fontface": "^0.10.0", "rxjs": "~6.6.7", - "swiper": "11.1.8", + "swiper": "11.1.9", "tslib": "^2.6.2", "uuid": "^10.0.0", "zone.js": "~0.13.3" @@ -20391,9 +20391,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.9", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.9.tgz", + "integrity": "sha512-rflu8zvfGa3x1v/aeSufk4zRJffhOQowyvtJlp46sUBnOqAuk1Rdv5Ldj0AWWBV595iZ+ZMk7VB35ZRtRUomtA==", "funding": [ { "type": "patreon", diff --git a/ui/package.json b/ui/package.json index 5fc269997c0..ce8e9fd2933 100644 --- a/ui/package.json +++ b/ui/package.json @@ -46,7 +46,7 @@ "ngx-spinner": "^16.0.2", "roboto-fontface": "^0.10.0", "rxjs": "~6.6.7", - "swiper": "11.1.8", + "swiper": "11.1.9", "tslib": "^2.6.2", "uuid": "^10.0.0", "zone.js": "~0.13.3" From 7df96dc373f12530949658b538e642c01363db28 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Mon, 12 Aug 2024 00:09:23 +0200 Subject: [PATCH 03/28] FEMS-Backports 2024-08 (#2740) * UI: Fix wrong displayed unit in energy chart for ```Soc``` * BatteryProtection: actually apply soc-limit * UI: code improvements * UI: Extend subnavigation for consumption, production and grid history - Add total phases to subnavigation in consumption and production history - split charts * UI: add lastMessage to offline information * UI: fix "prod" build * UI: fix unit in asymmetric voltagecurrent chart - Fix wrong displayed unit for current in voltage/current chart * UI: realign xAxisLabels - Fixing xAxis labels in all not refactored charts * UI: fix channels error while on same dashboard - /channels: If you want to see the same dashboard for another fems and just replace the femsNumber in url, creates Errors --------- Co-authored-by: Lukas Rieger <73471197+lukasrgr@users.noreply.github.com> Co-authored-by: Stefan Feilmeier <3515268+sfeilmeier@users.noreply.github.com> Co-authored-by: Saeid Nikoubin Boroujeni <118315460+saeedniko@users.noreply.github.com> --- .../AbstractMaxCurrentHandler.java | 2 +- ui/package-lock.json | 3232 ++++++++++++++++- ui/package.json | 1 + ui/src/app/app-routing.module.ts | 9 +- .../app/edge/history/abstracthistorychart.ts | 7 +- .../history/common/consumption/Consumption.ts | 14 +- .../details/chart/channels.spec.ts | 62 + .../common/consumption/details/chart/chart.ts | 93 - .../details/chart/consumptionMeter.spec.ts | 64 + .../details/chart/consumptionMeter.ts | 63 + .../consumption/details/chart/evcs.spec.ts | 58 + .../common/consumption/details/chart/evcs.ts | 47 + .../consumption/details/chart/sum.spec.ts | 61 + .../common/consumption/details/chart/sum.ts | 62 + .../consumption/details/details.overview.html | 13 +- .../consumption/details/details.overview.ts | 37 +- .../common/consumption/overview/overview.ts | 7 +- .../common/energy/chart/channels.spec.ts | 36 +- .../history/common/grid/chart/chart.spec.ts | 4 +- .../grid/details/chart/channels.spec.ts | 41 + .../common/grid/details/chart/chart.spec.ts | 58 + .../common/grid/details/chart/chart.ts | 65 + .../common/grid/details/details.overview.html | 7 + .../common/grid/details/details.overview.ts | 40 + ui/src/app/edge/history/common/grid/grid.ts | 10 + .../common/grid/overview/overview.html | 3 +- .../history/common/grid/overview/overview.ts | 42 +- .../common/production/chart/chargerChart.ts | 45 - .../production/chart/productionMeterChart.ts | 1 + .../common/production/chart/totalAcChart.ts | 77 - .../common/production/chart/totalChart.ts | 1 - .../common/production/chart/totalDcChart.ts | 49 - .../production/details/chart/channels.spec.ts | 59 + .../production/details/chart/charger.spec.ts | 58 + .../production/details/chart/charger.ts | 50 + .../details/chart/productionMeter.spec.ts | 68 + .../chart/{chart.ts => productionMeter.ts} | 53 +- .../production/details/chart/sum.spec.ts | 125 + .../common/production/details/chart/sum.ts | 93 + .../production/details/details.overview.html | 10 +- .../production/details/details.overview.ts | 29 + .../common/production/overview/overview.html | 37 +- .../common/production/overview/overview.ts | 7 +- .../history/common/production/production.ts | 28 +- ui/src/app/edge/history/historydataservice.ts | 10 +- ui/src/app/edge/history/shared.ts | 74 +- .../edge/live/offline/offline.component.html | 4 +- .../edge/live/offline/offline.component.ts | 34 +- .../settings/channels/channels.component.html | 26 +- .../settings/channels/channels.component.ts | 22 +- .../app/edge/settings/settings.component.ts | 2 + ui/src/app/edge/settings/settings.spec.ts | 33 +- ui/src/app/index/login.spec.ts | 7 + .../components/chart/abstracthistorychart.ts | 497 +-- .../components/chart/chart.constants.ts | 68 +- .../shared/components/components.module.ts | 11 +- .../shared/components/edge/edgeconfig.spec.ts | 44 + .../currentVoltage/chart/asymmetricMeter.ts | 67 + .../chart/{chart.ts => symmetricMeter.ts} | 20 +- .../currentVoltage.overview.html | 12 +- .../currentVoltage/currentVoltage.overview.ts | 10 +- .../currentVoltage/currentVoltageModule.ts | 9 +- .../components/flat/abstract-flat-widget.ts | 21 +- .../flat-widget-line-divider.html | 1 + .../flat-widget-line-divider.ts | 26 + .../app/shared/components/shared/converter.ts | 8 + .../app/shared/components/shared/formatter.ts | 6 + .../components/shared/testing/common.ts | 43 +- .../components/shared/testing/tester.ts | 10 +- .../components/shared/testing/utils.spec.ts | 73 +- ui/src/app/shared/service/defaulttypes.ts | 2 + .../service/globalRouteChangeHandler.ts | 1 - ui/src/app/shared/service/utils.ts | 38 +- ui/src/app/shared/shared.module.ts | 2 +- ui/src/app/shared/shared.ts | 5 +- ui/src/app/shared/utils/date/dateutils.ts | 19 +- ui/src/assets/i18n/de.json | 7 +- ui/src/assets/i18n/en.json | 5 + 78 files changed, 5376 insertions(+), 769 deletions(-) create mode 100644 ui/src/app/edge/history/common/consumption/details/chart/channels.spec.ts delete mode 100644 ui/src/app/edge/history/common/consumption/details/chart/chart.ts create mode 100644 ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.spec.ts create mode 100644 ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.ts create mode 100644 ui/src/app/edge/history/common/consumption/details/chart/evcs.spec.ts create mode 100644 ui/src/app/edge/history/common/consumption/details/chart/evcs.ts create mode 100644 ui/src/app/edge/history/common/consumption/details/chart/sum.spec.ts create mode 100644 ui/src/app/edge/history/common/consumption/details/chart/sum.ts create mode 100644 ui/src/app/edge/history/common/grid/details/chart/channels.spec.ts create mode 100644 ui/src/app/edge/history/common/grid/details/chart/chart.spec.ts create mode 100644 ui/src/app/edge/history/common/grid/details/chart/chart.ts create mode 100644 ui/src/app/edge/history/common/grid/details/details.overview.html create mode 100644 ui/src/app/edge/history/common/grid/details/details.overview.ts delete mode 100644 ui/src/app/edge/history/common/production/chart/chargerChart.ts delete mode 100644 ui/src/app/edge/history/common/production/chart/totalAcChart.ts delete mode 100644 ui/src/app/edge/history/common/production/chart/totalDcChart.ts create mode 100644 ui/src/app/edge/history/common/production/details/chart/channels.spec.ts create mode 100644 ui/src/app/edge/history/common/production/details/chart/charger.spec.ts create mode 100644 ui/src/app/edge/history/common/production/details/chart/charger.ts create mode 100644 ui/src/app/edge/history/common/production/details/chart/productionMeter.spec.ts rename ui/src/app/edge/history/common/production/details/chart/{chart.ts => productionMeter.ts} (58%) create mode 100644 ui/src/app/edge/history/common/production/details/chart/sum.spec.ts create mode 100644 ui/src/app/edge/history/common/production/details/chart/sum.ts create mode 100644 ui/src/app/shared/components/edge/meter/currentVoltage/chart/asymmetricMeter.ts rename ui/src/app/shared/components/edge/meter/currentVoltage/chart/{chart.ts => symmetricMeter.ts} (81%) create mode 100644 ui/src/app/shared/components/flat/flat-widget-line-divider/flat-widget-line-divider.html create mode 100644 ui/src/app/shared/components/flat/flat-widget-line-divider/flat-widget-line-divider.ts 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/ui/package-lock.json b/ui/package-lock.json index 72d21692add..43a20ab0945 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -39,6 +39,7 @@ "chart.js": "^4.4.3", "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", @@ -97,6 +98,8 @@ }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, "license": "MIT", "engines": { @@ -105,6 +108,8 @@ }, "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": { @@ -117,6 +122,8 @@ }, "node_modules/@angular-devkit/architect": { "version": "0.1602.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.13.tgz", + "integrity": "sha512-ejrOYoXgbhDYjdaW4B2SyWeb6AqR8vqqzMyvCq2JX7fo08IhLnVu1fcl0fwr161l37TuzgPNWrHSciOzzmZDkw==", "dev": true, "license": "MIT", "dependencies": { @@ -131,6 +138,8 @@ }, "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": { @@ -139,6 +148,8 @@ }, "node_modules/@angular-devkit/build-angular": { "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.14.tgz", + "integrity": "sha512-bXQ6i7QPhwmYHuh+DSNkBhjTIHQF0C6fqZEg2ApJA3NmnzE98oQnmJ9AnGnAkdf1Mjn3xi2gxoZWPDDxGEINMw==", "dev": true, "license": "MIT", "dependencies": { @@ -260,6 +271,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@ampproject/remapping": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -272,6 +285,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", + "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", "dev": true, "license": "MIT", "dependencies": { @@ -286,6 +301,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", + "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", "dev": true, "license": "MIT", "dependencies": { @@ -312,6 +329,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/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": { @@ -327,11 +346,15 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/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": { @@ -340,6 +363,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -369,6 +394,8 @@ }, "node_modules/@angular-devkit/build-angular/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": { @@ -377,6 +404,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/runtime": { "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "license": "MIT", "dependencies": { @@ -388,6 +417,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/template": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "license": "MIT", "dependencies": { @@ -401,6 +432,8 @@ }, "node_modules/@angular-devkit/build-angular/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": { @@ -416,6 +449,8 @@ }, "node_modules/@angular-devkit/build-angular/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": { @@ -424,11 +459,15 @@ }, "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/fast-glob": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "license": "MIT", "dependencies": { @@ -444,16 +483,22 @@ }, "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/jsonc-parser": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true, "license": "MIT" }, "node_modules/@angular-devkit/build-angular/node_modules/less": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -479,6 +524,8 @@ }, "node_modules/@angular-devkit/build-angular/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": { @@ -490,6 +537,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/postcss": { "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -517,11 +566,15 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/regenerator-runtime": { "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true, "license": "MIT" }, "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": { @@ -530,6 +583,8 @@ }, "node_modules/@angular-devkit/build-angular/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": { @@ -547,6 +602,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/semver": { "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "license": "ISC", "dependencies": { @@ -561,6 +618,8 @@ }, "node_modules/@angular-devkit/build-angular/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, @@ -570,6 +629,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/terser": { "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -587,11 +648,15 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", "dev": true, "license": "0BSD" }, "node_modules/@angular-devkit/build-angular/node_modules/webpack": { "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "license": "MIT", "dependencies": { @@ -638,11 +703,15 @@ }, "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-webpack": { "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.14.tgz", + "integrity": "sha512-f+ZTCjOoA1SCQEaX3L/63ubqr/vlHkwDXAtKjBsQgyz6srnETcjy96Us5k/LoK7/hPc85zFneqLinfqOMVWHJQ==", "dev": true, "license": "MIT", "dependencies": { @@ -661,6 +730,8 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", + "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", "dev": true, "license": "MIT", "dependencies": { @@ -675,6 +746,8 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", + "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", "dev": true, "license": "MIT", "dependencies": { @@ -701,11 +774,15 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/jsonc-parser": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "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": { @@ -714,6 +791,8 @@ }, "node_modules/@angular-devkit/core": { "version": "16.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.13.tgz", + "integrity": "sha512-6jTlYOIeYsOF/Vw/hBNusjoCmKJBByoyGS1Fu2Yav8ltxYK04aDtI73l9JJB/5Cpzhc4YELrMqBMH7in5Vowaw==", "dev": true, "license": "MIT", "dependencies": { @@ -740,11 +819,15 @@ }, "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "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": { @@ -753,6 +836,8 @@ }, "node_modules/@angular-devkit/schematics": { "version": "16.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.13.tgz", + "integrity": "sha512-uhhJZpppaeuT/2V6RiCheJKzS4bAZADL+Gw59VJaojqS8ssdG1UzvqRJokIzFzP7+MhHWylZBWUvWLQxuUvtsA==", "dev": true, "license": "MIT", "dependencies": { @@ -770,11 +855,15 @@ }, "node_modules/@angular-devkit/schematics/node_modules/jsonc-parser": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true, "license": "MIT" }, "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": { @@ -783,6 +872,8 @@ }, "node_modules/@angular-eslint/builder": { "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.3.1.tgz", + "integrity": "sha512-PmIOnRwqdOW1bvZtpTGBTDcOq/Czm3D+IPC/k90yIMs1VsAtcxqUmUtELje+ylJeb2LPeEZavekSnEpcatM4HQ==", "dev": true, "license": "MIT", "dependencies": { @@ -796,11 +887,15 @@ }, "node_modules/@angular-eslint/bundled-angular-compiler": { "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", "dev": true, "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.3.1.tgz", + "integrity": "sha512-kSc8ESfoy8TUSthbq0Lpq9e17I+3Smy4rHoNpKCFEGuJgPs0+OssZMxB6a5EawGbv2EKTPEtrxzFm1WsLR0U9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -814,6 +909,8 @@ }, "node_modules/@angular-eslint/eslint-plugin-template": { "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.3.1.tgz", + "integrity": "sha512-+RcFEWqNiRt3+5jXvmlIDlXtP9+vjdmgmVL6tt8yDbqdjBOewtyMu4pE4YaR4sFboyxgME9PbO2WrOyPXh6xjg==", "dev": true, "license": "MIT", "dependencies": { @@ -831,6 +928,8 @@ }, "node_modules/@angular-eslint/template-parser": { "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-16.3.1.tgz", + "integrity": "sha512-9+SxUtxB2iOnm0ldS2ow0stMxe02rB/TxeMIe8fxsLFHZdw8RQvs/p3HLvVHXzv6gUblMHebIb/ubUmwEVb2SA==", "dev": true, "license": "MIT", "dependencies": { @@ -844,6 +943,8 @@ }, "node_modules/@angular-eslint/template-parser/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": { @@ -859,6 +960,8 @@ }, "node_modules/@angular-eslint/template-parser/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, "license": "BSD-2-Clause", "engines": { @@ -867,6 +970,8 @@ }, "node_modules/@angular-eslint/utils": { "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.3.1.tgz", + "integrity": "sha512-tEBcce0rG+DmcPO8jhRffUFDioGw3G4cUAE15XlRctY1J3QzOBH9HdUOTDt0mMjBgpWCzh0YVT1Moh2bPXU9Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -880,6 +985,8 @@ }, "node_modules/@angular/animations": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -921,6 +1028,8 @@ }, "node_modules/@angular/cli": { "version": "16.2.13", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.13.tgz", + "integrity": "sha512-Zs/IHV0qeQBlRYp3XTJP96KKMFrOVd4gFWEXyt8xVbma9W7UCWr/0C6D8HRFjheiT40TSa2Suwpk6Hppm+9ESA==", "dev": true, "license": "MIT", "dependencies": { @@ -954,11 +1063,15 @@ }, "node_modules/@angular/cli/node_modules/jsonc-parser": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true, "license": "MIT" }, "node_modules/@angular/cli/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": { @@ -970,6 +1083,8 @@ }, "node_modules/@angular/cli/node_modules/resolve": { "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "license": "MIT", "dependencies": { @@ -986,6 +1101,8 @@ }, "node_modules/@angular/cli/node_modules/semver": { "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "license": "ISC", "dependencies": { @@ -1000,11 +1117,15 @@ }, "node_modules/@angular/cli/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/@angular/common": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1019,6 +1140,8 @@ }, "node_modules/@angular/compiler": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1037,6 +1160,8 @@ }, "node_modules/@angular/compiler-cli": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, "license": "MIT", "dependencies": { @@ -1064,6 +1189,8 @@ }, "node_modules/@angular/core": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1078,6 +1205,8 @@ }, "node_modules/@angular/forms": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1094,6 +1223,8 @@ }, "node_modules/@angular/language-service": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", + "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", "dev": true, "license": "MIT", "engines": { @@ -1102,6 +1233,8 @@ }, "node_modules/@angular/platform-browser": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1122,6 +1255,8 @@ }, "node_modules/@angular/platform-browser-dynamic": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1154,6 +1289,8 @@ }, "node_modules/@angular/service-worker": { "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.2.12.tgz", + "integrity": "sha512-o0z0s4c76NmRASa+mUHn/q6vUKQNa06mGmLBDKm84vRQ1sQ2TJv+R1p8K9WkiM5mGy6tjQCDOgaz13TcxMFWOQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1171,11 +1308,15 @@ }, "node_modules/@assemblyscript/loader": { "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", "dev": true, "license": "Apache-2.0" }, "node_modules/@babel/code-frame": { "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1188,6 +1329,8 @@ }, "node_modules/@babel/compat-data": { "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "license": "MIT", "engines": { @@ -1196,6 +1339,8 @@ }, "node_modules/@babel/core": { "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1225,6 +1370,8 @@ }, "node_modules/@babel/core/node_modules/@babel/generator": { "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, "license": "MIT", "dependencies": { @@ -1239,11 +1386,15 @@ }, "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": { @@ -1252,6 +1403,8 @@ }, "node_modules/@babel/generator": { "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "license": "MIT", "dependencies": { @@ -1266,6 +1419,8 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "license": "MIT", "dependencies": { @@ -1277,6 +1432,8 @@ }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "license": "MIT", "dependencies": { @@ -1288,6 +1445,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1303,6 +1462,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": { @@ -1311,6 +1472,8 @@ }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", + "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1333,6 +1496,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": { @@ -1341,6 +1506,8 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "license": "MIT", "dependencies": { @@ -1357,6 +1524,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": { @@ -1365,6 +1534,8 @@ }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dev": true, "license": "MIT", "dependencies": { @@ -1380,6 +1551,8 @@ }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "license": "MIT", "engines": { @@ -1388,6 +1561,8 @@ }, "node_modules/@babel/helper-function-name": { "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "license": "MIT", "dependencies": { @@ -1400,6 +1575,8 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "license": "MIT", "dependencies": { @@ -1411,6 +1588,8 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "license": "MIT", "dependencies": { @@ -1422,6 +1601,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "license": "MIT", "dependencies": { @@ -1433,6 +1614,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1451,6 +1634,8 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "license": "MIT", "dependencies": { @@ -1462,6 +1647,8 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "license": "MIT", "engines": { @@ -1470,6 +1657,8 @@ }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "license": "MIT", "dependencies": { @@ -1486,6 +1675,8 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1502,6 +1693,8 @@ }, "node_modules/@babel/helper-simple-access": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "license": "MIT", "dependencies": { @@ -1513,6 +1706,8 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1524,6 +1719,8 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "license": "MIT", "dependencies": { @@ -1535,6 +1732,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "license": "MIT", "engines": { @@ -1543,6 +1742,8 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "license": "MIT", "engines": { @@ -1551,6 +1752,8 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "license": "MIT", "engines": { @@ -1559,6 +1762,8 @@ }, "node_modules/@babel/helper-wrap-function": { "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "license": "MIT", "dependencies": { @@ -1572,6 +1777,8 @@ }, "node_modules/@babel/helpers": { "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dev": true, "license": "MIT", "dependencies": { @@ -1585,6 +1792,8 @@ }, "node_modules/@babel/highlight": { "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "license": "MIT", "dependencies": { @@ -1599,6 +1808,8 @@ }, "node_modules/@babel/parser": { "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "dev": true, "license": "MIT", "bin": { @@ -1610,6 +1821,8 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.24.1", + "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.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dev": true, "license": "MIT", "dependencies": { @@ -1624,6 +1837,8 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1640,6 +1855,8 @@ }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "license": "MIT", "dependencies": { @@ -1657,6 +1874,8 @@ }, "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": { @@ -1668,6 +1887,8 @@ }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "license": "MIT", "dependencies": { @@ -1683,6 +1904,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 +1917,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 +1930,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 +1946,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 +1959,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": { @@ -1741,6 +1972,8 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1755,6 +1988,8 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dev": true, "license": "MIT", "dependencies": { @@ -1769,6 +2004,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 +2017,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 +2030,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 +2043,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 +2056,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 +2069,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 +2082,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 +2095,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 +2108,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 +2124,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 +2140,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": { @@ -1900,6 +2157,8 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dev": true, "license": "MIT", "dependencies": { @@ -1914,6 +2173,8 @@ }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dev": true, "license": "MIT", "dependencies": { @@ -1931,6 +2192,8 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1947,6 +2210,8 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dev": true, "license": "MIT", "dependencies": { @@ -1961,6 +2226,8 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", + "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", "dev": true, "license": "MIT", "dependencies": { @@ -1975,6 +2242,8 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dev": true, "license": "MIT", "dependencies": { @@ -1990,6 +2259,8 @@ }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dev": true, "license": "MIT", "dependencies": { @@ -2006,6 +2277,8 @@ }, "node_modules/@babel/plugin-transform-classes": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2027,6 +2300,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dev": true, "license": "MIT", "dependencies": { @@ -2042,6 +2317,8 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dev": true, "license": "MIT", "dependencies": { @@ -2056,6 +2333,8 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dev": true, "license": "MIT", "dependencies": { @@ -2071,6 +2350,8 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dev": true, "license": "MIT", "dependencies": { @@ -2085,6 +2366,8 @@ }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dev": true, "license": "MIT", "dependencies": { @@ -2100,6 +2383,8 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dev": true, "license": "MIT", "dependencies": { @@ -2115,6 +2400,8 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2130,6 +2417,8 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dev": true, "license": "MIT", "dependencies": { @@ -2145,6 +2434,8 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dev": true, "license": "MIT", "dependencies": { @@ -2161,6 +2452,8 @@ }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2176,6 +2469,8 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dev": true, "license": "MIT", "dependencies": { @@ -2190,6 +2485,8 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dev": true, "license": "MIT", "dependencies": { @@ -2205,6 +2502,8 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dev": true, "license": "MIT", "dependencies": { @@ -2219,6 +2518,8 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2234,6 +2535,8 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dev": true, "license": "MIT", "dependencies": { @@ -2250,6 +2553,8 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dev": true, "license": "MIT", "dependencies": { @@ -2267,6 +2572,8 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dev": true, "license": "MIT", "dependencies": { @@ -2282,6 +2589,8 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2297,6 +2606,8 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dev": true, "license": "MIT", "dependencies": { @@ -2311,6 +2622,8 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dev": true, "license": "MIT", "dependencies": { @@ -2326,6 +2639,8 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dev": true, "license": "MIT", "dependencies": { @@ -2341,6 +2656,8 @@ }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", "dev": true, "license": "MIT", "dependencies": { @@ -2358,6 +2675,8 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2373,6 +2692,8 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dev": true, "license": "MIT", "dependencies": { @@ -2388,6 +2709,8 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dev": true, "license": "MIT", "dependencies": { @@ -2404,6 +2727,8 @@ }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dev": true, "license": "MIT", "dependencies": { @@ -2418,6 +2743,8 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dev": true, "license": "MIT", "dependencies": { @@ -2433,6 +2760,8 @@ }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dev": true, "license": "MIT", "dependencies": { @@ -2450,6 +2779,8 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2464,6 +2795,8 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dev": true, "license": "MIT", "dependencies": { @@ -2479,6 +2812,8 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dev": true, "license": "MIT", "dependencies": { @@ -2493,6 +2828,8 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2512,6 +2849,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": { @@ -2520,6 +2859,8 @@ }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dev": true, "license": "MIT", "dependencies": { @@ -2534,6 +2875,8 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dev": true, "license": "MIT", "dependencies": { @@ -2549,6 +2892,8 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dev": true, "license": "MIT", "dependencies": { @@ -2563,6 +2908,8 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dev": true, "license": "MIT", "dependencies": { @@ -2577,6 +2924,8 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dev": true, "license": "MIT", "dependencies": { @@ -2591,6 +2940,8 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dev": true, "license": "MIT", "dependencies": { @@ -2605,6 +2956,8 @@ }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dev": true, "license": "MIT", "dependencies": { @@ -2620,6 +2973,8 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dev": true, "license": "MIT", "dependencies": { @@ -2635,6 +2990,8 @@ }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dev": true, "license": "MIT", "dependencies": { @@ -2650,6 +3007,8 @@ }, "node_modules/@babel/preset-env": { "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", "dev": true, "license": "MIT", "dependencies": { @@ -2743,6 +3102,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": { @@ -2751,6 +3112,8 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dev": true, "license": "MIT", "dependencies": { @@ -2766,11 +3129,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", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2781,6 +3148,8 @@ }, "node_modules/@babel/template": { "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "license": "MIT", "dependencies": { @@ -2794,6 +3163,8 @@ }, "node_modules/@babel/traverse": { "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2814,6 +3185,8 @@ }, "node_modules/@babel/traverse/node_modules/@babel/generator": { "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, "license": "MIT", "dependencies": { @@ -2828,6 +3201,8 @@ }, "node_modules/@babel/types": { "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "license": "MIT", "dependencies": { @@ -2856,6 +3231,7 @@ "version": "5.7.7", "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.7.7.tgz", "integrity": "sha512-gkc8p0jjbRHu5oxKvWQV1d6zRHNeK7/GQUHOL9J6yQqnnttLDf1tSZ4BVjicMdyKlxUailuBcboWvng+KYilvQ==", + "license": "MIT", "peerDependencies": { "@capacitor/core": "^5.7.0" } @@ -3080,6 +3456,7 @@ "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-6.1.1.tgz", "integrity": "sha512-rsRqEadfnBSUX90RZj59oXvi30bpSusLMfIcgbOIArOloTgfaaWr9R471F6m3gGWF7BhNoskJpZcCgSUsfywwA==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/cli-framework-output": "^2.2.5", "@ionic/utils-fs": "^3.1.6", @@ -3113,6 +3490,7 @@ "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3126,6 +3504,7 @@ "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", @@ -3141,6 +3520,7 @@ "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3154,6 +3534,7 @@ "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" @@ -3167,6 +3548,7 @@ "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.5", "@ionic/utils-fs": "3.1.6", @@ -3186,6 +3568,7 @@ "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", @@ -3203,6 +3586,7 @@ "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", "debug": "^4.0.0", @@ -3243,6 +3627,7 @@ "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", @@ -3277,6 +3662,7 @@ "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" }, @@ -3334,6 +3720,7 @@ "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" } @@ -3356,6 +3743,7 @@ "version": "5.7.7", "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.7.7.tgz", "integrity": "sha512-LeV1ljAihl/1lFGHZERNY2DtD1fbPBF3rNOSHFPMXIluK4Cq4nK4a4z/dLPX+Cv4F0TyCIzX3+/t79PMbhDwrg==", + "license": "MIT", "dependencies": { "tslib": "^2.1.0" } @@ -3373,6 +3761,7 @@ "version": "5.7.7", "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.7.7.tgz", "integrity": "sha512-bgvSJGia5C5Klfd7t/qlqlRAWzGGAwlIlzkOJYsxpJiYuz6OXVgeesuXRxMNOaUZQ9fmL7OWukmhcv03t9Up+w==", + "license": "MIT", "peerDependencies": { "@capacitor/core": "^5.7.0" } @@ -3388,6 +3777,8 @@ }, "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": { @@ -3396,6 +3787,8 @@ }, "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": { @@ -3407,6 +3800,8 @@ }, "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": { @@ -3416,6 +3811,8 @@ }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "license": "MIT", "engines": { @@ -3424,6 +3821,8 @@ }, "node_modules/@es-joy/jsdoccomment": { "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz", + "integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==", "dev": true, "license": "MIT", "dependencies": { @@ -3435,8 +3834,27 @@ "node": ">=16" } }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "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": { @@ -3451,6 +3869,8 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "license": "MIT", "engines": { @@ -3459,6 +3879,8 @@ }, "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": { @@ -3481,6 +3903,8 @@ }, "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": { @@ -3496,11 +3920,15 @@ }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "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": { @@ -3515,6 +3943,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -3526,11 +3956,15 @@ }, "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/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,6 +3976,8 @@ }, "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": { @@ -3550,11 +3986,15 @@ }, "node_modules/@gar/promisify": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "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==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3568,6 +4008,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3580,6 +4022,8 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true, "license": "BSD-3-Clause" }, @@ -3620,6 +4064,8 @@ }, "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", @@ -3637,6 +4083,8 @@ }, "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": { @@ -3647,6 +4095,8 @@ }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/core": { "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.3.tgz", + "integrity": "sha512-J22Sh3M7rj8Ar3iEs20ko5wgC3DE7vWfYZNdimt2IJiS4J7BEX8R3Awf+TRt+6AN3NFm3/xe1Sz4yvDh3FvNFg==", "dev": true, "license": "MIT", "dependencies": { @@ -3673,6 +4123,8 @@ }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/schematics": { "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.3.tgz", + "integrity": "sha512-SABqTtj2im4PJhQjNaAsSypbNkpZFW8YozJ3P748tlh5a9XoHpgiqXv5JhRbyKElLDAyk5i9fe2++JmSudPG/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3690,6 +4142,8 @@ }, "node_modules/@ionic/angular-toolkit/node_modules/@schematics/angular": { "version": "17.3.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.3.tgz", + "integrity": "sha512-kNlyjIKTBhfi8Jab3MCkxNRbbpErbzdu0lZNSL8Nidmqs6Tk23Dc1bZe4t/gPNOCkCvQlwYa6X88SjC/ntyVng==", "dev": true, "license": "MIT", "dependencies": { @@ -3705,6 +4159,8 @@ }, "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 +4172,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 +4185,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": { @@ -4100,6 +4560,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", @@ -4322,6 +4784,8 @@ }, "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": { @@ -4338,6 +4802,8 @@ }, "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": { @@ -4349,6 +4815,8 @@ }, "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": { @@ -4360,11 +4828,15 @@ }, "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 +4853,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 +4869,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": { @@ -4411,6 +4887,8 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4426,6 +4904,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 +4914,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": { @@ -4447,6 +4929,8 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "license": "MIT", "engines": { @@ -4455,6 +4939,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": { @@ -4463,6 +4949,8 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4472,11 +4960,15 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "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": { @@ -4486,15 +4978,21 @@ }, "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/@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/@ngtools/webpack": { "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", + "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", "dev": true, "license": "MIT", "engines": { @@ -4512,6 +5010,7 @@ "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" }, @@ -4524,6 +5023,7 @@ "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" }, @@ -4534,6 +5034,8 @@ }, "node_modules/@ngx-formly/schematics": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-6.3.0.tgz", + "integrity": "sha512-XSzOvrZ1NoUhmd733bcgUFkl+26pSw8eyXChi9LwrS26nEPweR8RA/JxN+lFvIb92MWzLShLd1DY2oBz/0r0ZQ==", "license": "MIT", "dependencies": { "@angular-devkit/core": "^13.0.3", @@ -4543,6 +5045,8 @@ }, "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", @@ -4568,6 +5072,8 @@ }, "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", @@ -4584,6 +5090,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 +5106,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", @@ -4612,10 +5122,14 @@ }, "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 +5137,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 +5146,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 +5160,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 +5174,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 +5184,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,6 +5198,8 @@ }, "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" @@ -4681,6 +5207,8 @@ }, "node_modules/@npmcli/fs": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dev": true, "license": "ISC", "dependencies": { @@ -4692,6 +5220,8 @@ }, "node_modules/@npmcli/git": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4710,6 +5240,8 @@ }, "node_modules/@npmcli/git/node_modules/lru-cache": { "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": { @@ -4718,6 +5250,8 @@ }, "node_modules/@npmcli/git/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "license": "ISC", "dependencies": { @@ -4732,6 +5266,8 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4747,6 +5283,8 @@ }, "node_modules/@npmcli/move-file": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4759,6 +5297,8 @@ }, "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": { @@ -4767,6 +5307,8 @@ }, "node_modules/@npmcli/promise-spawn": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dev": true, "license": "ISC", "dependencies": { @@ -4778,6 +5320,8 @@ }, "node_modules/@npmcli/promise-spawn/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "license": "ISC", "dependencies": { @@ -4792,6 +5336,8 @@ }, "node_modules/@npmcli/run-script": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dev": true, "license": "ISC", "dependencies": { @@ -4807,6 +5353,8 @@ }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "license": "ISC", "dependencies": { @@ -4821,6 +5369,8 @@ }, "node_modules/@nrwl/devkit": { "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", "dev": true, "license": "MIT", "dependencies": { @@ -4829,6 +5379,8 @@ }, "node_modules/@nrwl/tao": { "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", + "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", "dev": true, "license": "MIT", "dependencies": { @@ -4840,6 +5392,8 @@ }, "node_modules/@nx/devkit": { "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", "dev": true, "license": "MIT", "dependencies": { @@ -4856,6 +5410,8 @@ }, "node_modules/@nx/devkit/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": { @@ -4867,6 +5423,8 @@ }, "node_modules/@nx/devkit/node_modules/semver": { "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4881,6 +5439,8 @@ }, "node_modules/@nx/devkit/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": { @@ -4889,11 +5449,32 @@ }, "node_modules/@nx/devkit/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/@nx/nx-win32-x64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", + "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@parcel/watcher": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4911,6 +5492,8 @@ }, "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, @@ -4931,6 +5514,8 @@ }, "node_modules/@schematics/angular": { "version": "16.2.13", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.13.tgz", + "integrity": "sha512-SFE9e7X/CEtzwGEqHUqXriAm4J4uTjcfoRXslc7BuqOKABM8RXPphGQsVG4xOt3n25kXXGkFO2dvDRHuLTP1fQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4946,11 +5531,15 @@ }, "node_modules/@schematics/angular/node_modules/jsonc-parser": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true, "license": "MIT" }, "node_modules/@sigstore/bundle": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4962,6 +5551,8 @@ }, "node_modules/@sigstore/protobuf-specs": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4970,6 +5561,8 @@ }, "node_modules/@sigstore/sign": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4983,6 +5576,8 @@ }, "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "license": "MIT", "engines": { @@ -4991,6 +5586,8 @@ }, "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "license": "MIT", "dependencies": { @@ -5004,6 +5601,8 @@ }, "node_modules/@sigstore/sign/node_modules/lru-cache": { "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": { @@ -5012,6 +5611,8 @@ }, "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "license": "ISC", "dependencies": { @@ -5037,6 +5638,8 @@ }, "node_modules/@sigstore/sign/node_modules/minipass-fetch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "license": "MIT", "dependencies": { @@ -5053,6 +5656,8 @@ }, "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "license": "ISC", "engines": { @@ -5061,6 +5666,8 @@ }, "node_modules/@sigstore/tuf": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5073,11 +5680,15 @@ }, "node_modules/@socket.io/component-emitter": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "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,15 +5699,16 @@ } }, "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.6.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.6.2.tgz", + "integrity": "sha512-Ic5oFNM/25iuagob6LiIBkSI/A2y45TsyKtDtODXHRZDy52WfPfeexI6r+OH5+aWN9QGob2Bw+4JRM9/4areWw==", "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", + "@stylistic/eslint-plugin-js": "2.6.2", + "@stylistic/eslint-plugin-jsx": "2.6.2", + "@stylistic/eslint-plugin-plus": "2.6.2", + "@stylistic/eslint-plugin-ts": "2.6.2", "@types/eslint": "^9.6.0" }, "engines": { @@ -5107,10 +5719,11 @@ } }, "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==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.2.tgz", + "integrity": "sha512-wCr/kVctAPayMU3pcOI1MKR7MoKIh6VKZU89lPklAqtJoxT+Em6RueiiARbpznUYG5eg3LymiU+aMD+aIZXdqA==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "^9.6.0", "acorn": "^8.12.1", @@ -5129,6 +5742,7 @@ "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": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5141,6 +5755,7 @@ "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.12.0", "acorn-jsx": "^5.3.2", @@ -5154,12 +5769,13 @@ } }, "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==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-2.6.2.tgz", + "integrity": "sha512-dSXK/fSPA938J1fBi10QmhzLKtZ/2TuyVNHQMk8jUhWfKJDleAogaSqcWNAbN8fwcoe9UWmt/3StiIf2oYC1aQ==", "dev": true, + "license": "MIT", "dependencies": { - "@stylistic/eslint-plugin-js": "^2.4.0", + "@stylistic/eslint-plugin-js": "^2.6.2", "@types/eslint": "^9.6.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" @@ -5176,6 +5792,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -5185,6 +5802,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5193,29 +5811,31 @@ } }, "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==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-2.6.2.tgz", + "integrity": "sha512-cANcPASfRvq3VTbbQCrSIXq+2AI0IW68PNYaZoXXS0ENlp7HDB8dmrsJnOgWCcoEvdCB8z/eWcG/eq/v5Qcl+Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "^9.6.0", - "@typescript-eslint/utils": "^7.17.0" + "@typescript-eslint/utils": "^8.0.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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", + "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5223,12 +5843,13 @@ } }, "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", + "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5236,13 +5857,14 @@ } }, "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", + "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5251,7 +5873,7 @@ "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5264,38 +5886,40 @@ } }, "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz", + "integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==", "dev": true, + "license": "MIT", "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" + "@typescript-eslint/scope-manager": "8.0.1", + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/typescript-estree": "8.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", + "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/types": "8.0.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5307,6 +5931,7 @@ "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" } @@ -5316,6 +5941,7 @@ "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", @@ -5336,6 +5962,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5351,19 +5978,21 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "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==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.6.2.tgz", + "integrity": "sha512-6OEN3VtUNxjgOvWPavnC10MByr1H4zsgwNND3rQXr5lDFv93MLUnTsH+/SH15OkuqdyJgrQILI6b9lYecb1vIg==", "dev": true, + "license": "MIT", "dependencies": { - "@stylistic/eslint-plugin-js": "2.4.0", + "@stylistic/eslint-plugin-js": "2.6.2", "@types/eslint": "^9.6.0", - "@typescript-eslint/utils": "^7.17.0" + "@typescript-eslint/utils": "^8.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5373,16 +6002,17 @@ } }, "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", + "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5390,12 +6020,13 @@ } }, "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", + "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5403,13 +6034,14 @@ } }, "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", + "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5418,7 +6050,7 @@ "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5431,38 +6063,40 @@ } }, "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz", + "integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==", "dev": true, + "license": "MIT", "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" + "@typescript-eslint/scope-manager": "8.0.1", + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/typescript-estree": "8.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", + "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/types": "8.0.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5474,6 +6108,7 @@ "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" } @@ -5483,6 +6118,7 @@ "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", @@ -5503,6 +6139,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5518,12 +6155,15 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@tootallnate/once": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, "license": "MIT", "engines": { @@ -5624,26 +6264,36 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true, "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", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", "dev": true, "license": "MIT", "engines": { @@ -5652,6 +6302,8 @@ }, "node_modules/@tufjs/models": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", "dev": true, "license": "MIT", "dependencies": { @@ -5664,6 +6316,8 @@ }, "node_modules/@tufjs/models/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, "license": "MIT", "dependencies": { @@ -5672,6 +6326,8 @@ }, "node_modules/@tufjs/models/node_modules/minimatch": { "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "license": "ISC", "dependencies": { @@ -5686,6 +6342,8 @@ }, "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 +6353,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 +6363,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 +6373,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 +6384,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 +6397,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": { @@ -5742,6 +6410,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -5749,6 +6418,8 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "license": "MIT", "dependencies": { @@ -5758,11 +6429,15 @@ }, "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,7 +6448,7 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.0", + "version": "4.19.3", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", "dev": true, @@ -5796,11 +6471,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", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "license": "MIT", "dependencies": { @@ -5809,11 +6488,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 +6505,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" }, @@ -5844,6 +6533,8 @@ }, "node_modules/@types/node": { "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -5851,6 +6542,8 @@ }, "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 +6559,50 @@ }, "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", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true, "license": "MIT" }, "node_modules/@types/selenium-webdriver": { "version": "3.0.26", + "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/semver": { "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "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 +6612,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 +6622,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": { @@ -5929,6 +6640,8 @@ }, "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": { @@ -5944,6 +6657,8 @@ }, "node_modules/@types/ws": { "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "license": "MIT", "dependencies": { @@ -5952,6 +6667,8 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "license": "MIT", "dependencies": { @@ -5986,6 +6703,8 @@ }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "license": "MIT", "dependencies": { @@ -6012,6 +6731,8 @@ }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6036,6 +6757,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6063,6 +6786,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "license": "MIT", "dependencies": { @@ -6079,6 +6804,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "license": "MIT", "dependencies": { @@ -6105,6 +6832,8 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "license": "MIT", "engines": { @@ -6117,6 +6846,8 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6143,6 +6874,8 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "license": "MIT", "dependencies": { @@ -6159,6 +6892,8 @@ }, "node_modules/@typescript-eslint/type-utils/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": { @@ -6178,6 +6913,8 @@ }, "node_modules/@typescript-eslint/type-utils/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", "engines": { @@ -6186,6 +6923,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "license": "MIT", "engines": { @@ -6198,6 +6937,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6225,6 +6966,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/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, "license": "MIT", "dependencies": { @@ -6233,6 +6976,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/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": { @@ -6252,6 +6997,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "license": "ISC", "dependencies": { @@ -6266,6 +7013,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/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", "engines": { @@ -6274,6 +7023,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6299,6 +7050,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "license": "MIT", "dependencies": { @@ -6315,6 +7068,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "license": "MIT", "engines": { @@ -6327,6 +7082,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6353,6 +7110,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "license": "MIT", "dependencies": { @@ -6369,6 +7128,8 @@ }, "node_modules/@typescript-eslint/utils/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": { @@ -6388,6 +7149,8 @@ }, "node_modules/@typescript-eslint/utils/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", "engines": { @@ -6396,6 +7159,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "license": "MIT", "dependencies": { @@ -6412,11 +7177,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", "dev": true, "license": "MIT", "engines": { @@ -6428,6 +7197,8 @@ }, "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 +7208,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 +7241,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 +7261,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 +7271,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 +7281,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 +7305,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 +7319,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 +7332,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 +7347,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": { @@ -6559,6 +7358,8 @@ }, "node_modules/@wessberg/ts-evaluator": { "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", "dev": true, "license": "MIT", "dependencies": { @@ -6580,6 +7381,8 @@ }, "node_modules/@wessberg/ts-evaluator/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": { @@ -6594,6 +7397,8 @@ }, "node_modules/@wessberg/ts-evaluator/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": { @@ -6609,6 +7414,8 @@ }, "node_modules/@wessberg/ts-evaluator/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": { @@ -6620,6 +7427,8 @@ }, "node_modules/@wessberg/ts-evaluator/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": { @@ -6628,6 +7437,8 @@ }, "node_modules/@wessberg/ts-evaluator/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": { @@ -6659,21 +7470,29 @@ }, "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", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6686,6 +7505,8 @@ }, "node_modules/@zkochan/js-yaml": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", "dev": true, "license": "MIT", "dependencies": { @@ -6697,21 +7518,29 @@ }, "node_modules/@zkochan/js-yaml/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/abab": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "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,6 +7556,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -6736,6 +7566,8 @@ }, "node_modules/acorn-globals": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "license": "MIT", "dependencies": { @@ -6745,6 +7577,8 @@ }, "node_modules/acorn-globals/node_modules/acorn": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, "license": "MIT", "bin": { @@ -6756,6 +7590,8 @@ }, "node_modules/acorn-globals/node_modules/acorn-walk": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, "license": "MIT", "engines": { @@ -6764,6 +7600,8 @@ }, "node_modules/acorn-import-assertions": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6772,6 +7610,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": { @@ -6780,6 +7620,8 @@ }, "node_modules/acorn-walk": { "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", "dev": true, "license": "MIT", "engines": { @@ -6795,6 +7637,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 +7651,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": { @@ -6820,6 +7666,8 @@ }, "node_modules/adm-zip": { "version": "0.5.12", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz", + "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==", "dev": true, "license": "MIT", "engines": { @@ -6828,6 +7676,8 @@ }, "node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6839,6 +7689,8 @@ }, "node_modules/agentkeepalive": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "license": "MIT", "dependencies": { @@ -6850,6 +7702,8 @@ }, "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": { @@ -6862,6 +7716,8 @@ }, "node_modules/ajv": { "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6876,6 +7732,8 @@ }, "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" @@ -6891,6 +7749,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 +7762,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 +7772,8 @@ }, "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==", "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -6923,6 +7787,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 +7800,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 +7809,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 +7822,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": { @@ -6964,11 +7836,15 @@ }, "node_modules/aproba": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true, "license": "ISC" }, "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": { @@ -6977,6 +7853,8 @@ }, "node_modules/are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, "license": "ISC", "dependencies": { @@ -6989,11 +7867,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { @@ -7002,6 +7884,8 @@ }, "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 +7894,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 +7911,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" }, @@ -7037,6 +7925,8 @@ }, "node_modules/array-includes": { "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7055,6 +7945,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 +7955,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 +7965,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 +7986,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 +8005,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 +8024,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 +8047,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": { @@ -7159,6 +8063,8 @@ }, "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 +8073,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": { @@ -7196,11 +8104,15 @@ }, "node_modules/async": { "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true, "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==", "license": "MIT" }, "node_modules/at-least-node": { @@ -7214,6 +8126,8 @@ }, "node_modules/autoprefixer": { "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "funding": [ { @@ -7246,6 +8160,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 +8176,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": { @@ -7268,11 +8186,15 @@ }, "node_modules/aws4": { "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true, "license": "MIT" }, "node_modules/axios": { "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7283,6 +8205,8 @@ }, "node_modules/axios/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==", "dev": true, "license": "MIT", "dependencies": { @@ -7296,6 +8220,8 @@ }, "node_modules/axobject-query": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7311,6 +8237,8 @@ }, "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": { @@ -7327,6 +8255,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7342,6 +8272,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7355,6 +8287,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": { @@ -7363,6 +8297,8 @@ }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "license": "MIT", "dependencies": { @@ -7375,6 +8311,8 @@ }, "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dev": true, "license": "MIT", "dependencies": { @@ -7390,6 +8328,8 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, "license": "MIT", "dependencies": { @@ -7401,6 +8341,8 @@ }, "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7416,6 +8358,8 @@ }, "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==", "license": "MIT" }, "node_modules/bare-events": { @@ -7471,6 +8415,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 +8435,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": { @@ -7506,11 +8454,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 +8481,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": { @@ -7537,6 +8491,8 @@ }, "node_modules/binary-extensions": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "devOptional": true, "license": "MIT", "engines": { @@ -7545,6 +8501,8 @@ }, "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 +8512,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 +8528,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": { @@ -7591,6 +8553,8 @@ }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { @@ -7599,6 +8563,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 +8573,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 +8586,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 +8604,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" }, @@ -7660,6 +8634,8 @@ }, "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==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -7681,11 +8657,15 @@ }, "node_modules/browser-process-hrtime": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/browserslist": { "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -7717,6 +8697,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 +8707,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 +8720,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 +8730,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 +8744,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,11 +8778,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "license": "MIT", "engines": { @@ -7804,6 +8798,8 @@ }, "node_modules/builtins": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7812,6 +8808,8 @@ }, "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": { @@ -7820,6 +8818,8 @@ }, "node_modules/cacache": { "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "license": "ISC", "dependencies": { @@ -7842,6 +8842,8 @@ }, "node_modules/cacache/node_modules/lru-cache": { "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": { @@ -7850,6 +8852,8 @@ }, "node_modules/cacache/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "license": "ISC", "engines": { @@ -7858,6 +8862,8 @@ }, "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==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -7875,6 +8881,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 +8891,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": { @@ -7909,6 +8919,8 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001606", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz", + "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==", "dev": true, "funding": [ { @@ -7930,6 +8942,7 @@ "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" @@ -7955,11 +8968,15 @@ }, "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,6 +8990,8 @@ }, "node_modules/chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, "node_modules/chart.js": { @@ -7989,6 +9008,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", @@ -7999,13 +9020,22 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-3.0.1.tgz", "integrity": "sha512-hlIrXXKqSDgb+ZjVYHefmlZUXK8KbkCPiynSVrTb/HjTMkT62cOInaT1NTQCKtxKKOm9oHp958DY3RTAFKtkHg==", - "license": "MIT", "peerDependencies": { "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==", + "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" @@ -8026,6 +9056,8 @@ }, "node_modules/chokidar": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "devOptional": true, "funding": [ { @@ -8052,6 +9084,8 @@ }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "license": "ISC", "engines": { "node": ">=10" @@ -8059,6 +9093,8 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, "license": "MIT", "engines": { @@ -8067,10 +9103,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 +9119,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 +9131,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" @@ -8099,6 +9143,8 @@ }, "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==", "license": "ISC", "engines": { "node": ">= 10" @@ -8106,6 +9152,8 @@ }, "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": { @@ -8119,6 +9167,8 @@ }, "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 +9176,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,6 +9205,8 @@ }, "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": { @@ -8161,11 +9215,15 @@ }, "node_modules/color-convert/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", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/color-string": { @@ -8181,6 +9239,8 @@ }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, "license": "ISC", "bin": { @@ -8202,11 +9262,15 @@ }, "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 +9279,8 @@ }, "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==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -8225,6 +9291,8 @@ }, "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" @@ -8232,6 +9300,8 @@ }, "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 +9310,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" }, @@ -8271,6 +9343,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 +9356,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": { @@ -8299,6 +9375,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 +9385,28 @@ }, "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==", "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 +9421,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,6 +9431,8 @@ }, "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": { @@ -8351,6 +9441,8 @@ }, "node_modules/connect/node_modules/finalhandler": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "license": "MIT", "dependencies": { @@ -8368,11 +9460,15 @@ }, "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", + "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": { @@ -8384,6 +9480,8 @@ }, "node_modules/connect/node_modules/statuses": { "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": { @@ -8392,11 +9490,15 @@ }, "node_modules/console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "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 +9510,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": { @@ -8834,11 +9938,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", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, "license": "MIT", "engines": { @@ -8847,6 +9955,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" }, @@ -8858,6 +9968,8 @@ }, "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": { @@ -8869,6 +9981,8 @@ }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8892,6 +10006,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": { @@ -8903,6 +10019,8 @@ }, "node_modules/core-js-compat": { "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dev": true, "license": "MIT", "dependencies": { @@ -8915,10 +10033,14 @@ }, "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==", "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": { @@ -8931,6 +10053,8 @@ }, "node_modules/cosmiconfig": { "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "license": "MIT", "dependencies": { @@ -8956,11 +10080,15 @@ }, "node_modules/cosmiconfig/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/cosmiconfig/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -8972,11 +10100,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8991,6 +10123,8 @@ }, "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 +10139,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 +10156,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": { @@ -9031,6 +10169,8 @@ }, "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 +10179,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 +10202,8 @@ }, "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==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -9082,6 +10226,8 @@ }, "node_modules/css-loader": { "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "license": "MIT", "dependencies": { @@ -9107,6 +10253,8 @@ }, "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 +10270,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 +10283,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": { @@ -9144,11 +10296,15 @@ }, "node_modules/cssom": { "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true, "license": "MIT" }, "node_modules/cssstyle": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "license": "MIT", "dependencies": { @@ -9160,16 +10316,22 @@ }, "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "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 +10371,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 +10383,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 +10392,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 +10408,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 +10420,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 +10429,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 +10441,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 +10453,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 +10462,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 +10475,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", @@ -9318,6 +10500,8 @@ }, "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 +10509,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 +10521,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,6 +10535,8 @@ }, "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" @@ -9354,6 +10544,8 @@ }, "node_modules/d3-geo": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" @@ -9364,6 +10556,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 +10565,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 +10577,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 +10586,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 +10595,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 +10604,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 +10613,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", @@ -9423,6 +10629,8 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "license": "ISC", "dependencies": { "d3-color": "1 - 3", @@ -9434,6 +10642,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 +10651,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 +10663,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 +10675,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 +10687,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 +10696,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 +10715,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 +10741,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": { @@ -9539,6 +10763,8 @@ }, "node_modules/data-urls": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9552,6 +10778,8 @@ }, "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 +10796,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 +10814,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 +10832,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 +10848,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": { @@ -9632,6 +10868,8 @@ }, "node_modules/debug": { "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -9647,6 +10885,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": { @@ -9682,6 +10922,8 @@ }, "node_modules/decimal.js": { "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true, "license": "MIT" }, @@ -9713,11 +10955,15 @@ }, "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-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": { @@ -9729,6 +10975,8 @@ }, "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 +10987,8 @@ }, "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==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -9754,6 +11004,8 @@ }, "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": { @@ -9762,6 +11014,8 @@ }, "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": { @@ -9792,6 +11046,8 @@ }, "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": "MIT", "dependencies": { @@ -9809,6 +11065,8 @@ }, "node_modules/del/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": { @@ -9820,6 +11078,8 @@ }, "node_modules/del/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -9839,6 +11099,8 @@ }, "node_modules/del/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": { @@ -9855,6 +11117,8 @@ }, "node_modules/del/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": { @@ -9863,6 +11127,8 @@ }, "node_modules/del/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "license": "ISC", "dependencies": { @@ -9874,6 +11140,8 @@ }, "node_modules/delaunator": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", "license": "ISC", "dependencies": { "robust-predicates": "^3.0.0" @@ -9881,6 +11149,8 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -9888,11 +11158,15 @@ }, "node_modules/delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "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 +11175,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 +11185,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 +11206,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" }, @@ -9943,11 +11223,15 @@ }, "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==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -9955,6 +11239,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 +11252,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 +11265,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 +11278,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 +11291,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 +11306,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": [ { @@ -10023,6 +11319,8 @@ }, "node_modules/domexception": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, "license": "MIT", "dependencies": { @@ -10034,6 +11332,8 @@ }, "node_modules/domexception/node_modules/webidl-conversions": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -10042,6 +11342,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 +11358,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": { @@ -10082,6 +11386,8 @@ }, "node_modules/dotenv": { "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -10090,6 +11396,8 @@ }, "node_modules/duplexer": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true, "license": "MIT" }, @@ -10134,11 +11442,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": { @@ -10148,11 +11460,15 @@ }, "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": "MIT" }, "node_modules/ejs": { "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10167,6 +11483,8 @@ }, "node_modules/electron-to-chromium": { "version": "1.4.728", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.728.tgz", + "integrity": "sha512-Ud1v7hJJYIqehlUJGqR6PF1Ek8l80zWwxA6nGxigBsGJ9f9M2fciHyrIiNMerSHSH3p+0/Ia7jIlnDkt41h5cw==", "dev": true, "license": "ISC" }, @@ -10190,10 +11508,14 @@ }, "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==", "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 +11524,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 +11534,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 +11545,8 @@ }, "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==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -10248,6 +11576,8 @@ }, "node_modules/engine.io-parser": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", "dev": true, "license": "MIT", "engines": { @@ -10256,6 +11586,8 @@ }, "node_modules/engine.io/node_modules/cookie": { "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, "license": "MIT", "engines": { @@ -10286,6 +11618,8 @@ }, "node_modules/enhanced-resolve": { "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "license": "MIT", "dependencies": { @@ -10298,6 +11632,8 @@ }, "node_modules/enquirer": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "license": "MIT", "dependencies": { @@ -10309,11 +11645,15 @@ }, "node_modules/ent": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", "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,6 +11665,8 @@ }, "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": { @@ -10333,11 +11675,15 @@ }, "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 +11696,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 +11706,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 +11767,8 @@ }, "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==", "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" @@ -10427,6 +11779,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -10434,11 +11788,15 @@ }, "node_modules/es-module-lexer": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", "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 +11808,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 +11823,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 +11833,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 +11851,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": { @@ -10500,6 +11868,8 @@ }, "node_modules/esbuild": { "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10536,6 +11906,8 @@ }, "node_modules/esbuild-wasm": { "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true, "license": "MIT", "bin": { @@ -10547,6 +11919,8 @@ }, "node_modules/escalade": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "license": "MIT", "engines": { @@ -10555,11 +11929,15 @@ }, "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==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -10567,6 +11945,8 @@ }, "node_modules/escodegen": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -10586,6 +11966,8 @@ }, "node_modules/escodegen/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -10593,6 +11975,8 @@ }, "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==", "license": "BSD-3-Clause", "optional": true, "engines": { @@ -10601,6 +11985,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 +12041,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 +12053,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": { @@ -10673,6 +12063,8 @@ }, "node_modules/eslint-module-utils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "license": "MIT", "dependencies": { @@ -10689,6 +12081,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 +12091,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": { @@ -10727,6 +12123,8 @@ }, "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 +12133,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": { @@ -10746,6 +12146,8 @@ }, "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": { @@ -10754,6 +12156,8 @@ }, "node_modules/eslint-plugin-jsdoc": { "version": "48.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.3.tgz", + "integrity": "sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10776,6 +12180,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": { @@ -10787,6 +12193,8 @@ }, "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { "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": { @@ -10796,6 +12204,8 @@ }, "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": { @@ -10804,6 +12214,8 @@ }, "node_modules/eslint-plugin-unused-imports": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz", + "integrity": "sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10824,6 +12236,8 @@ }, "node_modules/eslint-rule-composer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", "dev": true, "license": "MIT", "engines": { @@ -10832,6 +12246,8 @@ }, "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": { @@ -10844,6 +12260,8 @@ }, "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": { @@ -10855,6 +12273,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 +12290,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": { @@ -10884,11 +12306,15 @@ }, "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "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 +12330,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": { @@ -10915,6 +12343,8 @@ }, "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 +12356,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": { @@ -10941,6 +12373,8 @@ }, "node_modules/eslint/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, "license": "BSD-2-Clause", "engines": { @@ -10949,6 +12383,8 @@ }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -10964,6 +12400,8 @@ }, "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 +12413,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,6 +12429,8 @@ }, "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": { @@ -10997,6 +12439,8 @@ }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -11008,11 +12452,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -11027,6 +12475,8 @@ }, "node_modules/eslint/node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11041,6 +12491,8 @@ }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -11055,6 +12507,8 @@ }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -11066,6 +12520,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": { @@ -11077,6 +12533,8 @@ }, "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": { @@ -11093,6 +12551,8 @@ }, "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==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -11104,6 +12564,8 @@ }, "node_modules/esquery": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11115,6 +12577,8 @@ }, "node_modules/esquery/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, "license": "BSD-2-Clause", "engines": { @@ -11123,6 +12587,8 @@ }, "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": { @@ -11134,6 +12600,8 @@ }, "node_modules/esrecurse/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, "license": "BSD-2-Clause", "engines": { @@ -11142,6 +12610,8 @@ }, "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": { @@ -11150,6 +12620,8 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -11157,6 +12629,8 @@ }, "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": { @@ -11165,16 +12639,22 @@ }, "node_modules/eventemitter-asyncresource": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", "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": { @@ -11183,6 +12663,8 @@ }, "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": { @@ -11205,6 +12687,8 @@ }, "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 +12706,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": { @@ -11268,6 +12756,8 @@ }, "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": { @@ -11276,16 +12766,22 @@ }, "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/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==", "license": "MIT", "dependencies": { "chardet": "^0.7.0", @@ -11298,6 +12794,8 @@ }, "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==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -11308,6 +12806,8 @@ }, "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 +12816,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 +12829,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 +12846,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" }, @@ -11357,6 +12865,8 @@ }, "node_modules/fastq": { "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "license": "ISC", "dependencies": { @@ -11365,6 +12875,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 +12898,8 @@ }, "node_modules/figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" @@ -11399,6 +12913,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,10 +12926,14 @@ }, "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", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -11422,6 +12942,8 @@ }, "node_modules/filelist/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, "license": "MIT", "dependencies": { @@ -11430,6 +12952,8 @@ }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -11454,6 +12978,8 @@ }, "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": { @@ -11471,6 +12997,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 +13007,15 @@ }, "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/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": { @@ -11499,6 +13031,8 @@ }, "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": { @@ -11511,6 +13045,8 @@ }, "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 +13055,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": { @@ -11532,11 +13070,15 @@ }, "node_modules/flatted": { "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "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 +13098,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": { @@ -11564,6 +13108,8 @@ }, "node_modules/foreground-child": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, "license": "ISC", "dependencies": { @@ -11579,6 +13125,8 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "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": { @@ -11590,6 +13138,8 @@ }, "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": { @@ -11598,6 +13148,8 @@ }, "node_modules/form-data": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "license": "MIT", "dependencies": { @@ -11626,6 +13178,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 +13188,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 +13202,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,11 +13212,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { @@ -11672,6 +13234,8 @@ }, "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": { @@ -11683,6 +13247,8 @@ }, "node_modules/fs-minipass/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "license": "ISC", "engines": { @@ -11691,15 +13257,21 @@ }, "node_modules/fs-monkey": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", "dev": true, "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==", "license": "ISC" }, "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==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11707,6 +13279,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,6 +13298,8 @@ }, "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": { @@ -11732,6 +13308,8 @@ }, "node_modules/gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "license": "ISC", "dependencies": { @@ -11750,6 +13328,8 @@ }, "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,6 +13338,8 @@ }, "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": { @@ -11766,6 +13348,8 @@ }, "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==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -11783,6 +13367,8 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -11928,6 +13514,8 @@ }, "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": { @@ -11939,6 +13527,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": { @@ -12005,6 +13595,8 @@ }, "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": { @@ -12108,6 +13700,8 @@ }, "node_modules/glob": { "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, "license": "ISC", "dependencies": { @@ -12129,6 +13723,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,11 +13736,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -12153,6 +13753,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "license": "ISC", "dependencies": { @@ -12167,6 +13769,8 @@ }, "node_modules/glob/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "license": "ISC", "engines": { @@ -12175,6 +13779,8 @@ }, "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": { @@ -12183,6 +13789,8 @@ }, "node_modules/globalthis": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "license": "MIT", "dependencies": { @@ -12197,6 +13805,8 @@ }, "node_modules/globby": { "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "license": "MIT", "dependencies": { @@ -12215,6 +13825,8 @@ }, "node_modules/gopd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" @@ -12225,6 +13837,8 @@ }, "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==", "license": "ISC" }, "node_modules/gradle-to-js": { @@ -12242,11 +13856,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", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", "dev": true, "license": "MIT", "dependencies": { @@ -12258,6 +13876,8 @@ }, "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 +13885,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 +13924,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 +13934,8 @@ }, "node_modules/har-validator": { "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "license": "MIT", "dependencies": { @@ -12322,6 +13948,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 +13965,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 +13982,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 +13995,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 +14005,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 +14015,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 +14025,8 @@ }, "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==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -12397,6 +14037,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -12407,6 +14049,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -12417,6 +14061,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": { @@ -12431,11 +14077,15 @@ }, "node_modules/has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "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==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -12446,6 +14096,8 @@ }, "node_modules/hdr-histogram-js": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "dev": true, "license": "BSD", "dependencies": { @@ -12456,6 +14108,8 @@ }, "node_modules/hdr-histogram-percentiles-obj": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "dev": true, "license": "MIT" }, @@ -12480,6 +14134,8 @@ }, "node_modules/hosted-git-info": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "license": "ISC", "dependencies": { @@ -12491,6 +14147,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "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": { @@ -12499,6 +14157,8 @@ }, "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": { @@ -12510,6 +14170,8 @@ }, "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,11 +14186,15 @@ }, "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": { @@ -12537,6 +14203,8 @@ }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12548,6 +14216,8 @@ }, "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 +14233,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 +14260,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": { @@ -12611,11 +14291,15 @@ }, "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": { @@ -12629,6 +14313,8 @@ }, "node_modules/http-proxy-agent": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "license": "MIT", "dependencies": { @@ -12642,6 +14328,8 @@ }, "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": { @@ -12665,6 +14353,8 @@ }, "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": { @@ -12679,6 +14369,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "license": "MIT", "dependencies": { @@ -12691,6 +14383,8 @@ }, "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": { @@ -12699,6 +14393,8 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12707,6 +14403,8 @@ }, "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 +14415,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 +14428,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", @@ -12746,6 +14448,8 @@ }, "node_modules/ignore": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "license": "MIT", "engines": { @@ -12761,6 +14465,8 @@ }, "node_modules/ignore-walk": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", "dev": true, "license": "ISC", "dependencies": { @@ -12772,6 +14478,8 @@ }, "node_modules/ignore-walk/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, "license": "MIT", "dependencies": { @@ -12780,6 +14488,8 @@ }, "node_modules/ignore-walk/node_modules/minimatch": { "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "license": "ISC", "dependencies": { @@ -12794,6 +14504,8 @@ }, "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 +14518,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", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "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": { @@ -12831,6 +14549,8 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -12839,6 +14559,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -12846,6 +14568,8 @@ }, "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": { @@ -12854,11 +14578,15 @@ }, "node_modules/infer-owner": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "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==", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -12867,10 +14595,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", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, "license": "ISC", "engines": { @@ -12879,6 +14611,8 @@ }, "node_modules/inquirer": { "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "license": "MIT", "dependencies": { @@ -12904,6 +14638,8 @@ }, "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 +14654,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": { @@ -12933,6 +14671,8 @@ }, "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": { @@ -12944,6 +14684,8 @@ }, "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": { @@ -12952,6 +14694,8 @@ }, "node_modules/inquirer/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": { @@ -12960,6 +14704,8 @@ }, "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 +14717,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 +14732,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 +14741,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 +14750,8 @@ }, "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==", "license": "MIT", "dependencies": { "jsbn": "1.1.0", @@ -13009,14 +14763,20 @@ }, "node_modules/ip-address/node_modules/jsbn": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "license": "MIT" }, "node_modules/ip-address/node_modules/sprintf-js": { "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==", "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 +14785,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 +14802,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 +14822,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 +14835,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": { @@ -13082,6 +14852,8 @@ }, "node_modules/is-builtin-module": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "license": "MIT", "dependencies": { @@ -13096,6 +14868,8 @@ }, "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": { @@ -13107,6 +14881,8 @@ }, "node_modules/is-core-module": { "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "license": "MIT", "dependencies": { @@ -13118,6 +14894,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 +14910,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": { @@ -13146,6 +14926,8 @@ }, "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==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -13159,6 +14941,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 +14951,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -13174,6 +14960,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": { @@ -13185,6 +14973,8 @@ }, "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 +14982,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": { @@ -13218,6 +15012,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": { @@ -13242,6 +15038,8 @@ }, "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": { @@ -13250,6 +15048,8 @@ }, "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 +15061,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 +15074,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 +15084,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 +15097,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": { @@ -13302,11 +15110,15 @@ }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "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 +15134,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 +15150,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -13346,6 +15162,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 +15178,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 +15207,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 +15223,14 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "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 +15241,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,11 +15254,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0" @@ -13441,10 +15273,14 @@ }, "node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "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 +15292,14 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "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 +15308,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": { @@ -13481,6 +15325,8 @@ }, "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": { @@ -13496,6 +15342,8 @@ }, "node_modules/istanbul-lib-instrument/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": { @@ -13504,6 +15352,8 @@ }, "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,6 +15367,8 @@ }, "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": { @@ -13525,6 +15377,8 @@ }, "node_modules/istanbul-lib-report/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": { @@ -13539,6 +15393,8 @@ }, "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 +15406,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 +15421,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": { @@ -13571,6 +15431,8 @@ }, "node_modules/istanbul-reports": { "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -13583,6 +15445,8 @@ }, "node_modules/jackspeak": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -13600,6 +15464,8 @@ }, "node_modules/jake": { "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -13617,6 +15483,8 @@ }, "node_modules/jake/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": { @@ -13631,6 +15499,8 @@ }, "node_modules/jake/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": { @@ -13646,6 +15516,8 @@ }, "node_modules/jake/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": { @@ -13657,6 +15529,8 @@ }, "node_modules/jake/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": { @@ -13665,6 +15539,8 @@ }, "node_modules/jake/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": { @@ -13676,6 +15552,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,11 +15567,15 @@ }, "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": { @@ -13702,6 +15584,8 @@ }, "node_modules/jasmine/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -13721,11 +15605,15 @@ }, "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 +15622,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 +15637,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 +15647,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": { @@ -13769,6 +15663,8 @@ }, "node_modules/jiti": { "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, "license": "MIT", "bin": { @@ -13777,11 +15673,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { @@ -13794,11 +15694,15 @@ }, "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/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": { @@ -13807,6 +15711,8 @@ }, "node_modules/jsdom": { "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, "license": "MIT", "dependencies": { @@ -13852,6 +15758,8 @@ }, "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 +15771,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" }, @@ -13875,30 +15785,42 @@ }, "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/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": { @@ -13910,10 +15832,14 @@ }, "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==", "license": "MIT" }, "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": { @@ -13922,6 +15848,8 @@ }, "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 +15875,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 +15891,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": { @@ -13972,6 +15904,8 @@ }, "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 +15920,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": { @@ -13999,6 +15937,8 @@ }, "node_modules/karma": { "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14036,6 +15976,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 +15986,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 +15999,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 +16017,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": { @@ -14086,6 +16034,8 @@ }, "node_modules/karma-coverage-istanbul-reporter/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -14105,6 +16055,8 @@ }, "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,6 +16072,8 @@ }, "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": { @@ -14128,6 +16082,8 @@ }, "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==", "dev": true, "license": "ISC", "dependencies": { @@ -14139,6 +16095,8 @@ }, "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": { @@ -14147,6 +16105,8 @@ }, "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 +16121,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,6 +16133,8 @@ }, "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": { @@ -14179,6 +16143,8 @@ }, "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": { @@ -14189,6 +16155,8 @@ }, "node_modules/karma/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -14208,6 +16176,8 @@ }, "node_modules/karma/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": "MIT", "bin": { @@ -14219,6 +16189,8 @@ }, "node_modules/karma/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": { @@ -14230,6 +16202,8 @@ }, "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": { @@ -14249,6 +16223,8 @@ }, "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": { @@ -14266,6 +16242,8 @@ }, "node_modules/karma/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": { @@ -14274,6 +16252,8 @@ }, "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 +16262,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": { @@ -14300,6 +16282,8 @@ }, "node_modules/klona": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, "license": "MIT", "engines": { @@ -14308,6 +16292,8 @@ }, "node_modules/launch-editor": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, "license": "MIT", "dependencies": { @@ -14369,6 +16355,8 @@ }, "node_modules/less-loader": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, "license": "MIT", "dependencies": { @@ -14388,6 +16376,8 @@ }, "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, @@ -14398,6 +16388,8 @@ }, "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 +16402,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": { @@ -14426,6 +16420,8 @@ }, "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": { @@ -14434,6 +16430,8 @@ }, "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" }, @@ -14479,6 +16477,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": { @@ -14487,6 +16487,8 @@ }, "node_modules/loader-utils": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true, "license": "MIT", "engines": { @@ -14495,6 +16497,8 @@ }, "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": { @@ -14506,10 +16510,14 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "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": { @@ -14570,6 +16578,8 @@ }, "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": "MIT" }, @@ -14605,6 +16615,8 @@ }, "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": "MIT" }, @@ -14616,6 +16628,8 @@ }, "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": { "chalk": "^4.1.0", @@ -14630,6 +16644,8 @@ }, "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": { "color-convert": "^2.0.1" @@ -14643,6 +16659,8 @@ }, "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": { "ansi-styles": "^4.1.0", @@ -14657,6 +16675,8 @@ }, "node_modules/log-symbols/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" @@ -14667,6 +16687,8 @@ }, "node_modules/log-symbols/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" @@ -14674,6 +16696,8 @@ }, "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" @@ -14684,6 +16708,8 @@ }, "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": "Apache-2.0", "dependencies": { @@ -14699,6 +16725,8 @@ }, "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": { @@ -14719,6 +16747,8 @@ }, "node_modules/magic-string": { "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "dev": true, "license": "MIT", "dependencies": { @@ -14730,6 +16760,8 @@ }, "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": { @@ -14742,6 +16774,8 @@ }, "node_modules/make-dir/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": { @@ -14750,11 +16784,15 @@ }, "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": "ISC" }, "node_modules/make-fetch-happen": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "license": "ISC", "dependencies": { @@ -14781,6 +16819,8 @@ }, "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "license": "ISC", "dependencies": { @@ -14793,6 +16833,8 @@ }, "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "license": "MIT", "engines": { @@ -14801,6 +16843,8 @@ }, "node_modules/make-fetch-happen/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, "license": "MIT", "dependencies": { @@ -14809,6 +16853,8 @@ }, "node_modules/make-fetch-happen/node_modules/cacache": { "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "license": "ISC", "dependencies": { @@ -14837,6 +16883,8 @@ }, "node_modules/make-fetch-happen/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": { @@ -14848,6 +16896,8 @@ }, "node_modules/make-fetch-happen/node_modules/glob": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "license": "ISC", "dependencies": { @@ -14866,6 +16916,8 @@ }, "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "license": "MIT", "dependencies": { @@ -14879,6 +16931,8 @@ }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "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": { @@ -14887,6 +16941,8 @@ }, "node_modules/make-fetch-happen/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -14898,6 +16954,8 @@ }, "node_modules/make-fetch-happen/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": { @@ -14909,6 +16967,8 @@ }, "node_modules/make-fetch-happen/node_modules/ssri": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "license": "ISC", "dependencies": { @@ -14920,6 +16980,8 @@ }, "node_modules/make-fetch-happen/node_modules/unique-filename": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "license": "ISC", "dependencies": { @@ -14931,6 +16993,8 @@ }, "node_modules/make-fetch-happen/node_modules/unique-slug": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "license": "ISC", "dependencies": { @@ -14942,6 +17006,8 @@ }, "node_modules/make-fetch-happen/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" }, @@ -14960,6 +17026,8 @@ }, "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": { @@ -14968,6 +17036,8 @@ }, "node_modules/memfs": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "license": "Unlicense", "dependencies": { @@ -15161,15 +17231,21 @@ }, "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": "MIT" }, "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==", "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", "engines": { @@ -15200,6 +17276,8 @@ }, "node_modules/methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -15207,6 +17285,8 @@ }, "node_modules/micromatch": { "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "license": "MIT", "dependencies": { @@ -15219,6 +17299,8 @@ }, "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": { @@ -15230,6 +17312,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -15237,6 +17321,8 @@ }, "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==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -15247,6 +17333,8 @@ }, "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", "engines": { "node": ">=6" @@ -15277,6 +17365,8 @@ }, "node_modules/mini-css-extract-plugin": { "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "license": "MIT", "dependencies": { @@ -15295,11 +17385,15 @@ }, "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/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -15310,6 +17404,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15342,6 +17438,8 @@ }, "node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "license": "ISC", "engines": { "node": ">=8" @@ -15349,6 +17447,8 @@ }, "node_modules/minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "license": "ISC", "dependencies": { @@ -15360,6 +17460,8 @@ }, "node_modules/minipass-collect/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": { @@ -15371,11 +17473,15 @@ }, "node_modules/minipass-collect/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-fetch": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "license": "MIT", "dependencies": { @@ -15392,6 +17498,8 @@ }, "node_modules/minipass-fetch/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": { @@ -15403,11 +17511,15 @@ }, "node_modules/minipass-fetch/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-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": "ISC", "dependencies": { @@ -15419,6 +17531,8 @@ }, "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": { @@ -15430,11 +17544,15 @@ }, "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-json-stream": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "dev": true, "license": "MIT", "dependencies": { @@ -15444,6 +17562,8 @@ }, "node_modules/minipass-json-stream/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": { @@ -15455,11 +17575,15 @@ }, "node_modules/minipass-json-stream/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": { @@ -15471,6 +17595,8 @@ }, "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": { @@ -15482,11 +17608,15 @@ }, "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": { @@ -15498,6 +17628,8 @@ }, "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": "ISC", "dependencies": { @@ -15509,11 +17641,15 @@ }, "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": "ISC" }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", "dependencies": { "minipass": "^3.0.0", @@ -15525,6 +17661,8 @@ }, "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==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -15535,10 +17673,14 @@ }, "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==", "license": "ISC" }, "node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -15566,6 +17708,8 @@ }, "node_modules/mrmime": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, "license": "MIT", "engines": { @@ -15574,10 +17718,14 @@ }, "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==", "license": "MIT" }, "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": { @@ -15590,10 +17738,14 @@ }, "node_modules/mute-stream": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "license": "ISC" }, "node_modules/nanoid": { "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -15621,6 +17773,7 @@ "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/utils-fs": "^3.1.7", "@ionic/utils-terminal": "^2.3.4", @@ -15646,17 +17799,22 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 10.x" } }, "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": "MIT" }, "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": "MIT", "optional": true, @@ -15673,6 +17831,8 @@ }, "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": { @@ -15681,6 +17841,8 @@ }, "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" }, @@ -15695,6 +17857,8 @@ }, "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": { "lodash-es": "^4.17.15", @@ -15710,6 +17874,8 @@ }, "node_modules/ngx-cookie-service": { "version": "16.1.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-16.1.0.tgz", + "integrity": "sha512-FrzMjsGCHZCd2sEucigMaGyzImBL0l6gwWn6jmLBhcNVx0D7P8Yvtgk9aUptlqBrVKy4c2upglSa3Ogv3679bw==", "license": "MIT", "dependencies": { "tslib": "^2.0.0" @@ -15723,7 +17889,6 @@ "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", "dependencies": { "tslib": "^2.0.0" }, @@ -15734,6 +17899,8 @@ }, "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" @@ -15759,6 +17926,8 @@ }, "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": "MIT" }, @@ -15810,6 +17979,8 @@ }, "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": "(BSD-3-Clause OR GPL-2.0)", "engines": { @@ -15818,6 +17989,8 @@ }, "node_modules/node-gyp": { "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15842,6 +18015,8 @@ }, "node_modules/node-gyp-build": { "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", "dev": true, "license": "MIT", "bin": { @@ -15852,6 +18027,8 @@ }, "node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -15955,6 +18132,8 @@ }, "node_modules/node-releases": { "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true, "license": "MIT" }, @@ -16009,6 +18188,8 @@ }, "node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "license": "ISC", "dependencies": { @@ -16023,6 +18204,8 @@ }, "node_modules/normalize-package-data": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -16037,6 +18220,8 @@ }, "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": { @@ -16045,6 +18230,8 @@ }, "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": { @@ -16053,6 +18240,8 @@ }, "node_modules/npm-bundled": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "dev": true, "license": "ISC", "dependencies": { @@ -16064,6 +18253,8 @@ }, "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": "BSD-2-Clause", "dependencies": { @@ -16075,6 +18266,8 @@ }, "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": "ISC", "engines": { @@ -16083,6 +18276,8 @@ }, "node_modules/npm-package-arg": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dev": true, "license": "ISC", "dependencies": { @@ -16097,6 +18292,8 @@ }, "node_modules/npm-packlist": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "dev": true, "license": "ISC", "dependencies": { @@ -16108,6 +18305,8 @@ }, "node_modules/npm-pick-manifest": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "dev": true, "license": "ISC", "dependencies": { @@ -16122,6 +18321,8 @@ }, "node_modules/npm-registry-fetch": { "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, "license": "ISC", "dependencies": { @@ -16139,6 +18340,8 @@ }, "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "license": "MIT", "engines": { @@ -16147,6 +18350,8 @@ }, "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "license": "MIT", "dependencies": { @@ -16160,6 +18365,8 @@ }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "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": { @@ -16168,6 +18375,8 @@ }, "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "license": "ISC", "dependencies": { @@ -16193,6 +18402,8 @@ }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "license": "MIT", "dependencies": { @@ -16209,6 +18420,8 @@ }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "license": "ISC", "engines": { @@ -16217,6 +18430,8 @@ }, "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==", "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -16241,6 +18456,8 @@ }, "node_modules/npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, "license": "ISC", "dependencies": { @@ -16255,6 +18472,8 @@ }, "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": "BSD-2-Clause", "dependencies": { @@ -16266,11 +18485,15 @@ }, "node_modules/nwsapi": { "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true, "license": "MIT" }, "node_modules/nx": { "version": "16.5.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-16.5.1.tgz", + "integrity": "sha512-I3hJRE4hG7JWAtncWwDEO3GVeGPpN0TtM8xH5ArZXyDuVeTth/i3TtJzdDzqXO1HHtIoAQN0xeq4n9cLuMil5g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -16340,6 +18563,8 @@ }, "node_modules/nx/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": { @@ -16354,11 +18579,15 @@ }, "node_modules/nx/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/nx/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": { @@ -16374,6 +18603,8 @@ }, "node_modules/nx/node_modules/cli-spinners": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, "license": "MIT", "engines": { @@ -16385,6 +18616,8 @@ }, "node_modules/nx/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": { @@ -16395,6 +18628,8 @@ }, "node_modules/nx/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": { @@ -16406,6 +18641,8 @@ }, "node_modules/nx/node_modules/fast-glob": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -16421,6 +18658,8 @@ }, "node_modules/nx/node_modules/fs-extra": { "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": { @@ -16434,6 +18673,8 @@ }, "node_modules/nx/node_modules/glob": { "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "license": "ISC", "dependencies": { @@ -16450,6 +18691,8 @@ }, "node_modules/nx/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": { @@ -16458,6 +18701,8 @@ }, "node_modules/nx/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -16469,11 +18714,15 @@ }, "node_modules/nx/node_modules/jsonc-parser": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true, "license": "MIT" }, "node_modules/nx/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16485,6 +18734,8 @@ }, "node_modules/nx/node_modules/lines-and-columns": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, "license": "MIT", "engines": { @@ -16493,6 +18744,8 @@ }, "node_modules/nx/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": { @@ -16504,6 +18757,8 @@ }, "node_modules/nx/node_modules/minimatch": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, "license": "ISC", "dependencies": { @@ -16515,6 +18770,8 @@ }, "node_modules/nx/node_modules/semver": { "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "license": "ISC", "dependencies": { @@ -16529,6 +18786,8 @@ }, "node_modules/nx/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": { @@ -16540,6 +18799,8 @@ }, "node_modules/nx/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": { @@ -16548,6 +18809,8 @@ }, "node_modules/nx/node_modules/tsconfig-paths": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", "dependencies": { @@ -16561,6 +18824,8 @@ }, "node_modules/nx/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": { @@ -16569,11 +18834,15 @@ }, "node_modules/nx/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/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 +18851,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": { @@ -16590,6 +18861,8 @@ }, "node_modules/object-inspect": { "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16597,6 +18870,8 @@ }, "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": { @@ -16605,6 +18880,8 @@ }, "node_modules/object-path": { "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", "dev": true, "license": "MIT", "engines": { @@ -16613,6 +18890,8 @@ }, "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 +18909,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 +18928,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": { @@ -16660,6 +18943,8 @@ }, "node_modules/object.values": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "license": "MIT", "dependencies": { @@ -16676,11 +18961,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 +18981,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 +18991,8 @@ }, "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==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -16707,6 +19000,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" @@ -16720,6 +19015,8 @@ }, "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": { @@ -16736,6 +19033,8 @@ }, "node_modules/optionator": { "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "license": "MIT", "dependencies": { @@ -16752,6 +19051,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 +19074,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 +19089,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 +19105,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" @@ -16810,6 +19117,8 @@ }, "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 +19126,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" @@ -16843,6 +19154,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -16850,6 +19163,8 @@ }, "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": { @@ -16864,6 +19179,8 @@ }, "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": { @@ -16875,6 +19192,8 @@ }, "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": { @@ -16889,6 +19208,8 @@ }, "node_modules/p-retry": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16901,6 +19222,8 @@ }, "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 +19232,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": { @@ -17001,6 +19326,8 @@ }, "node_modules/pacote": { "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dev": true, "license": "ISC", "dependencies": { @@ -17032,11 +19359,15 @@ }, "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": { @@ -17048,6 +19379,8 @@ }, "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": { @@ -17065,6 +19398,8 @@ }, "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", "engines": { @@ -17073,11 +19408,15 @@ }, "node_modules/parse5": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true, "license": "MIT" }, "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": { @@ -17091,6 +19430,8 @@ }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "license": "MIT", "dependencies": { @@ -17102,6 +19443,8 @@ }, "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": { @@ -17113,6 +19456,8 @@ }, "node_modules/parse5-sax-parser/node_modules/parse5": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "license": "MIT", "dependencies": { @@ -17124,6 +19469,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 +19479,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 +19489,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17147,11 +19498,15 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -17159,11 +19514,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", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -17179,6 +19538,8 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "license": "ISC", "engines": { @@ -17187,11 +19548,15 @@ }, "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,16 +19572,22 @@ }, "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", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true, "license": "ISC" }, "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": { @@ -17228,6 +19599,8 @@ }, "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": { @@ -17236,6 +19609,8 @@ }, "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 +19619,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": { @@ -17255,6 +19632,8 @@ }, "node_modules/piscina": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, "license": "MIT", "dependencies": { @@ -17268,6 +19647,8 @@ }, "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 +19663,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 +19680,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 +19696,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 +19712,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 +19728,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": { @@ -17347,6 +19738,8 @@ }, "node_modules/pkg-dir/node_modules/yocto-queue": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, "license": "MIT", "engines": { @@ -17393,6 +19786,8 @@ }, "node_modules/possible-typed-array-names": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, "license": "MIT", "engines": { @@ -17401,6 +19796,8 @@ }, "node_modules/postcss": { "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -17428,6 +19825,8 @@ }, "node_modules/postcss-loader": { "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "license": "MIT", "dependencies": { @@ -17449,6 +19848,8 @@ }, "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 +19861,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 +19879,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 +19895,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": { @@ -17504,6 +19911,8 @@ }, "node_modules/postcss-selector-parser": { "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "license": "MIT", "dependencies": { @@ -17516,6 +19925,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" }, @@ -17568,6 +19979,8 @@ }, "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": { @@ -17592,6 +20005,8 @@ }, "node_modules/pretty-bytes": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", "engines": { @@ -17603,6 +20018,8 @@ }, "node_modules/proc-log": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "dev": true, "license": "ISC", "engines": { @@ -17611,15 +20028,21 @@ }, "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==", "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 +20079,8 @@ }, "node_modules/protractor": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", + "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", "dev": true, "license": "MIT", "dependencies": { @@ -17685,6 +20110,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 +20120,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 +20130,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 +20147,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 +20159,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 +20169,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": { @@ -17745,6 +20182,8 @@ }, "node_modules/protractor/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": { @@ -17756,6 +20195,8 @@ }, "node_modules/protractor/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -17775,6 +20216,8 @@ }, "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": "BSD-3-Clause", "engines": { @@ -17783,6 +20226,8 @@ }, "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", "dependencies": { @@ -17791,6 +20236,8 @@ }, "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": { @@ -17802,6 +20249,8 @@ }, "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", "engines": { @@ -17810,6 +20259,8 @@ }, "node_modules/protractor/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==", "dev": true, "license": "MIT", "dependencies": { @@ -17823,6 +20274,8 @@ }, "node_modules/protractor/node_modules/wrap-ansi/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": { @@ -17831,6 +20284,8 @@ }, "node_modules/protractor/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": { @@ -17845,6 +20300,8 @@ }, "node_modules/protractor/node_modules/wrap-ansi/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": { @@ -17856,11 +20313,15 @@ }, "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 +20343,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 +20357,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,6 +20371,8 @@ }, "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": { @@ -17994,16 +20461,22 @@ }, "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==", "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 +20489,8 @@ }, "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==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -18024,6 +20499,8 @@ }, "node_modules/punycode": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "license": "MIT", "engines": { "node": ">=6" @@ -18031,6 +20508,8 @@ }, "node_modules/q": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", "dev": true, "license": "MIT", "engines": { @@ -18040,6 +20519,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 +20529,8 @@ }, "node_modules/qs": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" @@ -18061,11 +20544,15 @@ }, "node_modules/querystringify": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "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 +20589,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 +20599,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 +20609,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": { @@ -18132,6 +20625,8 @@ }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { @@ -18140,6 +20635,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": { @@ -18184,6 +20681,8 @@ }, "node_modules/read-package-json": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dev": true, "license": "ISC", "dependencies": { @@ -18198,6 +20697,8 @@ }, "node_modules/read-package-json-fast": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "license": "ISC", "dependencies": { @@ -18210,6 +20711,8 @@ }, "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", "dev": true, "license": "MIT", "engines": { @@ -18218,6 +20721,8 @@ }, "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", "dev": true, "license": "MIT", "engines": { @@ -18381,6 +20886,8 @@ }, "node_modules/readable-stream": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -18393,6 +20900,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": { @@ -18418,16 +20927,22 @@ }, "node_modules/reflect-metadata": { "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", "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 +20954,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 +20970,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 +20984,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 +21003,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 +21021,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 +21034,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" @@ -18646,6 +21175,8 @@ }, "node_modules/request": { "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -18676,6 +21207,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,6 +21222,8 @@ }, "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": { @@ -18697,6 +21232,8 @@ }, "node_modules/request/node_modules/tough-cookie": { "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": { @@ -18709,6 +21246,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==", "dev": true, "license": "MIT", "bin": { @@ -18717,6 +21256,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 +21266,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 +21275,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": { @@ -18758,6 +21307,8 @@ }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -18766,6 +21317,8 @@ }, "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 +21334,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 +21349,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 +21359,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", @@ -18813,6 +21372,8 @@ }, "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 +21382,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": { @@ -18830,11 +21393,15 @@ }, "node_modules/rfdc": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true, "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -18848,6 +21415,8 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -18866,14 +21435,20 @@ }, "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", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "license": "MIT", "bin": { @@ -18898,6 +21473,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -18905,6 +21482,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 +21506,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 +21524,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": { @@ -18962,11 +21549,15 @@ }, "node_modules/safe-array-concat/node_modules/isarray": { "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/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 +21576,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 +21594,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", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19021,6 +21618,8 @@ }, "node_modules/sass-loader": { "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "license": "MIT", "dependencies": { @@ -19057,6 +21656,8 @@ }, "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 +21668,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 +21681,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 +21691,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": { @@ -19098,11 +21705,15 @@ }, "node_modules/sax": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", "dev": true, "license": "ISC" }, "node_modules/saxes": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, "license": "ISC", "dependencies": { @@ -19114,6 +21725,8 @@ }, "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": { @@ -19132,11 +21745,15 @@ }, "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": { @@ -19151,6 +21768,8 @@ }, "node_modules/selenium-webdriver/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -19170,6 +21789,8 @@ }, "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==", "dev": true, "license": "ISC", "dependencies": { @@ -19181,6 +21802,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": { @@ -19192,6 +21815,8 @@ }, "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": { @@ -19204,6 +21829,8 @@ }, "node_modules/semver": { "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" @@ -19217,6 +21844,8 @@ }, "node_modules/semver/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==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -19227,10 +21856,14 @@ }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "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 +21887,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 +21897,22 @@ }, "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/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/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 +21921,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 +21940,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 +21950,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 +21960,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,21 +21976,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", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", "engines": { @@ -19350,6 +22007,8 @@ }, "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 +22023,15 @@ }, "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==", "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -19384,6 +22047,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 +22063,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 +22121,8 @@ }, "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==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -19460,6 +22133,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -19467,6 +22142,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": { @@ -19475,6 +22152,8 @@ }, "node_modules/side-channel": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "license": "MIT", "dependencies": { "call-bind": "^1.0.0", @@ -19487,10 +22166,14 @@ }, "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/sigstore": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -19509,6 +22192,8 @@ }, "node_modules/sigstore/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "license": "MIT", "engines": { @@ -19517,6 +22202,8 @@ }, "node_modules/sigstore/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "license": "MIT", "dependencies": { @@ -19530,6 +22217,8 @@ }, "node_modules/sigstore/node_modules/lru-cache": { "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": { @@ -19538,6 +22227,8 @@ }, "node_modules/sigstore/node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "license": "ISC", "dependencies": { @@ -19563,6 +22254,8 @@ }, "node_modules/sigstore/node_modules/minipass-fetch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "license": "MIT", "dependencies": { @@ -19579,6 +22272,8 @@ }, "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "license": "ISC", "engines": { @@ -19706,6 +22401,8 @@ }, "node_modules/slash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "license": "MIT", "engines": { @@ -19761,6 +22458,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -19769,6 +22468,8 @@ }, "node_modules/socket.io": { "version": "4.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.3.tgz", + "integrity": "sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==", "dev": true, "license": "MIT", "dependencies": { @@ -19819,6 +22520,8 @@ }, "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 +22534,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 +22546,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": { @@ -19863,6 +22570,8 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "license": "MIT", "dependencies": { @@ -19876,6 +22585,8 @@ }, "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": { @@ -19884,6 +22595,8 @@ }, "node_modules/source-map-js": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -19892,6 +22605,8 @@ }, "node_modules/source-map-loader": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "dev": true, "license": "MIT", "dependencies": { @@ -19912,6 +22627,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 +22638,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 +22648,14 @@ }, "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==", "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": { @@ -19942,11 +22665,15 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true, "license": "CC-BY-3.0" }, "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": { @@ -19956,11 +22683,15 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "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 +22707,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": { @@ -20011,6 +22744,8 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, "license": "BSD-3-Clause" }, @@ -20022,6 +22757,8 @@ }, "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": { @@ -20046,6 +22783,8 @@ }, "node_modules/ssri": { "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, "license": "ISC", "dependencies": { @@ -20057,6 +22796,8 @@ }, "node_modules/ssri/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "license": "ISC", "engines": { @@ -20065,6 +22806,8 @@ }, "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": { @@ -20123,6 +22866,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": { @@ -20151,6 +22896,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 +22905,8 @@ }, "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==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -20171,6 +22920,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 +22935,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 +22954,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 +22969,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 +22987,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 +23000,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 +23013,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 +23023,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=6" @@ -20280,6 +23045,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": { @@ -20291,6 +23058,8 @@ }, "node_modules/strong-log-transformer": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -20370,6 +23139,8 @@ }, "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 +23152,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": { @@ -20404,12 +23177,15 @@ "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": { @@ -20418,11 +23194,15 @@ }, "node_modules/symbol-tree": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true, "license": "MIT" }, "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 +23211,8 @@ }, "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==", "license": "ISC", "dependencies": { "chownr": "^2.0.0", @@ -20473,6 +23255,8 @@ }, "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": { @@ -20488,6 +23272,8 @@ }, "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==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -20498,6 +23284,8 @@ }, "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==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -20508,6 +23296,8 @@ }, "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==", "license": "ISC" }, "node_modules/temp-dir": { @@ -20619,6 +23409,8 @@ }, "node_modules/terser": { "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -20636,6 +23428,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 +23463,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 +23480,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 +23490,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,11 +23516,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", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", "dependencies": { @@ -20732,6 +23538,8 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -20771,11 +23579,15 @@ }, "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/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, "node_modules/through2": { @@ -20790,11 +23602,15 @@ }, "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", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" @@ -20805,6 +23621,8 @@ }, "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 +23644,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": { @@ -20844,6 +23664,8 @@ }, "node_modules/tough-cookie": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -20858,6 +23680,8 @@ }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "license": "MIT", "engines": { @@ -20866,6 +23690,8 @@ }, "node_modules/tr46": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, "license": "MIT", "dependencies": { @@ -20877,6 +23703,8 @@ }, "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==", "license": "MIT", "bin": { "tree-kill": "cli.js" @@ -20907,6 +23735,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 +23779,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 +23792,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": { @@ -20971,10 +23805,14 @@ }, "node_modules/tslib": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", "dependencies": { @@ -20989,11 +23827,15 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tuf-js": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dev": true, "license": "MIT", "dependencies": { @@ -21007,6 +23849,8 @@ }, "node_modules/tuf-js/node_modules/@tootallnate/once": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, "license": "MIT", "engines": { @@ -21015,6 +23859,8 @@ }, "node_modules/tuf-js/node_modules/http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "license": "MIT", "dependencies": { @@ -21028,6 +23874,8 @@ }, "node_modules/tuf-js/node_modules/lru-cache": { "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": { @@ -21036,6 +23884,8 @@ }, "node_modules/tuf-js/node_modules/make-fetch-happen": { "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "license": "ISC", "dependencies": { @@ -21061,6 +23911,8 @@ }, "node_modules/tuf-js/node_modules/minipass-fetch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "license": "MIT", "dependencies": { @@ -21077,6 +23929,8 @@ }, "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "license": "ISC", "engines": { @@ -21085,6 +23939,8 @@ }, "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 +23952,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 +23972,8 @@ }, "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==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -21122,6 +23984,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 +23998,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 +24013,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 +24033,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 +24054,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 +24075,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" }, @@ -21217,6 +24091,8 @@ }, "node_modules/typescript": { "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "license": "Apache-2.0", "bin": { @@ -21247,6 +24123,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": { @@ -21261,6 +24139,8 @@ }, "node_modules/typescript-strict-plugin/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, "license": "MIT", "dependencies": { @@ -21269,6 +24149,8 @@ }, "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 +24163,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 +24175,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": { @@ -21302,6 +24188,8 @@ }, "node_modules/typescript-strict-plugin/node_modules/execa": { "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": { @@ -21324,6 +24212,8 @@ }, "node_modules/typescript-strict-plugin/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==", "dev": true, "license": "MIT", "dependencies": { @@ -21338,6 +24228,8 @@ }, "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": { @@ -21346,6 +24238,8 @@ }, "node_modules/typescript-strict-plugin/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==", "dev": true, "license": "Apache-2.0", "engines": { @@ -21354,6 +24248,8 @@ }, "node_modules/typescript-strict-plugin/node_modules/minimatch": { "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "license": "ISC", "dependencies": { @@ -21368,6 +24264,8 @@ }, "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": "MIT", "dependencies": { @@ -21379,6 +24277,8 @@ }, "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": { @@ -21396,6 +24296,8 @@ }, "node_modules/typescript-strict-plugin/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": { @@ -21404,6 +24306,8 @@ }, "node_modules/ua-parser-js": { "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", "dev": true, "funding": [ { @@ -21440,6 +24344,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": { @@ -21461,10 +24367,14 @@ }, "node_modules/undici-types": { "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "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 +24383,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 +24397,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,6 +24407,8 @@ }, "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": { @@ -21501,6 +24417,8 @@ }, "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 +24430,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": { @@ -21536,6 +24456,8 @@ }, "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": { @@ -21544,6 +24466,8 @@ }, "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": { @@ -21561,6 +24485,8 @@ }, "node_modules/update-browserslist-db": { "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -21590,6 +24516,8 @@ }, "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" @@ -21597,6 +24525,8 @@ }, "node_modules/url-parse": { "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21606,10 +24536,14 @@ }, "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": { @@ -21631,16 +24565,22 @@ }, "node_modules/v8-compile-cache": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true, "license": "MIT" }, "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": { @@ -21650,6 +24590,8 @@ }, "node_modules/validate-npm-package-name": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, "license": "ISC", "dependencies": { @@ -21661,6 +24603,8 @@ }, "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": { @@ -21669,6 +24613,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" @@ -21682,6 +24628,8 @@ }, "node_modules/vite": { "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", "dev": true, "license": "MIT", "dependencies": { @@ -21736,6 +24684,8 @@ }, "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": { @@ -21744,6 +24694,8 @@ }, "node_modules/w3c-hr-time": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21752,6 +24704,8 @@ }, "node_modules/w3c-xmlserializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, "license": "MIT", "dependencies": { @@ -21763,6 +24717,8 @@ }, "node_modules/watchpack": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "license": "MIT", "dependencies": { @@ -21775,6 +24731,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,6 +24741,8 @@ }, "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" @@ -21790,6 +24750,8 @@ }, "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 +24764,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 +24790,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,6 +24800,8 @@ }, "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": { @@ -21842,6 +24810,8 @@ }, "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": { @@ -21857,6 +24827,8 @@ }, "node_modules/webdriver-manager/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -21876,11 +24848,15 @@ }, "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/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "license": "ISC", "dependencies": { @@ -21892,6 +24868,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 +24878,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,6 +24891,8 @@ }, "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": { @@ -21919,6 +24901,8 @@ }, "node_modules/webidl-conversions": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -21974,6 +24958,8 @@ }, "node_modules/webpack-dev-middleware": { "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22001,6 +24987,8 @@ }, "node_modules/webpack-dev-server": { "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "license": "MIT", "dependencies": { @@ -22059,6 +25047,8 @@ }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -22103,6 +25093,8 @@ }, "node_modules/webpack-merge": { "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "license": "MIT", "dependencies": { @@ -22115,6 +25107,8 @@ }, "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 +25117,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,6 +25139,8 @@ }, "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, @@ -22159,6 +25157,8 @@ }, "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, @@ -22168,12 +25168,16 @@ }, "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 }, "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, @@ -22192,6 +25196,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,6 +25211,8 @@ }, "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": { @@ -22213,6 +25221,8 @@ }, "node_modules/whatwg-encoding": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, "license": "MIT", "dependencies": { @@ -22221,6 +25231,8 @@ }, "node_modules/whatwg-encoding/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": { @@ -22232,11 +25244,15 @@ }, "node_modules/whatwg-mimetype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true, "license": "MIT" }, "node_modules/whatwg-url": { "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "license": "MIT", "dependencies": { @@ -22250,6 +25266,8 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -22263,6 +25281,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 +25298,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": { @@ -22301,6 +25325,8 @@ }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "license": "ISC", "dependencies": { @@ -22309,6 +25335,8 @@ }, "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" }, @@ -22383,6 +25411,8 @@ }, "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==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -22399,6 +25429,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 +25447,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 +25463,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": { @@ -22440,6 +25476,8 @@ }, "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==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -22453,6 +25491,8 @@ }, "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==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -22463,6 +25503,8 @@ }, "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==", "license": "ISC" }, "node_modules/write-file-atomic": { @@ -22538,11 +25580,15 @@ }, "node_modules/xml-name-validator": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true, "license": "Apache-2.0" }, "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": { @@ -22555,6 +25601,8 @@ }, "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": { @@ -22563,6 +25611,8 @@ }, "node_modules/xmlchars": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, "license": "MIT" }, @@ -22588,6 +25638,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 +25648,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": { @@ -22618,6 +25674,8 @@ }, "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 +25695,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 +25705,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": { @@ -22656,6 +25718,8 @@ }, "node_modules/zone.js": { "version": "0.13.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" diff --git a/ui/package.json b/ui/package.json index ce8e9fd2933..667c971c560 100644 --- a/ui/package.json +++ b/ui/package.json @@ -34,6 +34,7 @@ "chart.js": "^4.4.3", "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", diff --git a/ui/src/app/app-routing.module.ts b/ui/src/app/app-routing.module.ts index cee2a75e5c7..38a1dd97ae3 100644 --- a/ui/src/app/app-routing.module.ts +++ b/ui/src/app/app-routing.module.ts @@ -7,13 +7,14 @@ 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 { 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 { OverviewComponent as TimeOfUseTariffOverviewComponent } from './edge/history/Controller/Ess/TimeOfUseTariff/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'; @@ -50,11 +51,11 @@ import { SystemLogComponent as EdgeSettingsSystemLogComponent } from './edge/set import { LoginComponent } from './index/login.component'; import { OverViewComponent } from './index/overview/overview.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 { 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' }, @@ -98,6 +99,8 @@ const routes: Routes = [ { 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 }, diff --git a/ui/src/app/edge/history/abstracthistorychart.ts b/ui/src/app/edge/history/abstracthistorychart.ts index ded3ceb8226..ed316c5f7b0 100644 --- a/ui/src/app/edge/history/abstracthistorychart.ts +++ b/ui/src/app/edge/history/abstracthistorychart.ts @@ -13,7 +13,7 @@ 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 { ChartConstants, XAxisType } from 'src/app/shared/components/chart/chart.constants'; // NOTE: Auto-refresh of widgets is currently disabled to reduce server load export abstract class AbstractHistoryChart { @@ -41,6 +41,8 @@ export abstract class AbstractHistoryChart { protected unit: YAxisTitle = YAxisTitle.ENERGY; /** @deprecated*/ protected formatNumber: string = '1.0-2'; + /** @deprecated*/ + protected xAxisType: XAxisType = XAxisType.TIMESERIES; // Colors for Phase 1-3 protected phase1Color = { @@ -129,7 +131,8 @@ 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'] = { diff --git a/ui/src/app/edge/history/common/consumption/Consumption.ts b/ui/src/app/edge/history/common/consumption/Consumption.ts index e6ce25df02b..4cc05a0454f 100644 --- a/ui/src/app/edge/history/common/consumption/Consumption.ts +++ b/ui/src/app/edge/history/common/consumption/Consumption.ts @@ -3,12 +3,14 @@ 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 { CurrentVoltageModule } from 'src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule'; import { ChartComponent } from './chart/chart'; -import { ChartComponent as DetailsChartComponent } from './details/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'; -import { CurrentVoltageModule } from 'src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule'; @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/details/chart/channels.spec.ts b/ui/src/app/edge/history/common/consumption/details/chart/channels.spec.ts new file mode 100644 index 00000000000..20defa63495 --- /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..27ef1645867 --- /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..fd696ec5368 --- /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, YAxisTitle } 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: YAxisTitle.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..9a45e639dee --- /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..637343afb09 --- /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, YAxisTitle } 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: YAxisTitle.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..a7e61affa4e --- /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..273263dab12 --- /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, YAxisTitle } 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: YAxisTitle.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..c85fcf170b3 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,8 @@ - - + + + + + + - + 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..f89f7186c13 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 @@ -12,6 +12,7 @@ import { Role } from 'src/app/shared/type/role'; }) export class DetailsOverviewComponent extends AbstractHistoryChartOverview { protected navigationButtons: NavigationOption[] = []; + protected componentType: 'sum' | 'consumptionMeter' | 'evcs' | null = null; constructor( public override service: Service, @@ -24,9 +25,19 @@ 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; } @@ -34,4 +45,28 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { { 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/overview/overview.ts b/ui/src/app/edge/history/common/consumption/overview/overview.ts index 87fab1299e0..b67018fc4fb 100644 --- a/ui/src/app/edge/history/common/consumption/overview/overview.ts +++ b/ui/src/app/edge/history/common/consumption/overview/overview.ts @@ -1,6 +1,7 @@ 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'; @@ -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); } @@ -34,7 +36,10 @@ export class OverviewComponent extends AbstractHistoryChartOverview { 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 => ( + 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 }); } } )); 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..c6cf681d16e 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 @@ -11,7 +11,23 @@ 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', 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 }, @@ -32,7 +48,23 @@ 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', 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 }, 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..f2bf6848a0a 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,12 +1,12 @@ // @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', () => { 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..1d89d965adf --- /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..5866fa9f23d --- /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..8368db9f96a --- /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, YAxisTitle } 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: YAxisTitle.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..b85fb0f5970 --- /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/grid.ts b/ui/src/app/edge/history/common/grid/grid.ts index 85814e76c9f..5b70f8b4edb 100644 --- a/ui/src/app/edge/history/common/grid/grid.ts +++ b/ui/src/app/edge/history/common/grid/grid.ts @@ -3,23 +3,33 @@ import { BrowserModule } from '@angular/platform-browser'; import { SharedModule } from 'src/app/shared/shared.module'; import { ChartComponent } from './chart/chart'; +import { ChartComponent as DetailsChartComponent } from './details/chart/chart'; import { FlatComponent } from './flat/flat'; import { OverviewComponent } from './overview/overview'; +import { FooterNavigationModule } from 'src/app/shared/components/footer/subnavigation/footerNavigation.module'; +import { DetailsOverviewComponent } from './details/details.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..736028491fc 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 { 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', }) -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..e4a1cfa5a17 100644 --- a/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts +++ b/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts @@ -70,3 +70,4 @@ export class ProductionMeterChartComponent extends AbstractHistoryChart { }; } } + 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..6b7c04b5277 100644 --- a/ui/src/app/edge/history/common/production/chart/totalChart.ts +++ b/ui/src/app/edge/history/common/production/chart/totalChart.ts @@ -169,5 +169,4 @@ export class TotalChartComponent extends AbstractHistoryChart { 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..e12a4af205f --- /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..717ef36a8b0 --- /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..a6b44d794c5 --- /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, YAxisTitle } 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: YAxisTitle.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/productionMeter.spec.ts b/ui/src/app/edge/history/common/production/details/chart/productionMeter.spec.ts new file mode 100644 index 00000000000..32c970e8387 --- /dev/null +++ b/ui/src/app/edge/history/common/production/details/chart/productionMeter.spec.ts @@ -0,0 +1,68 @@ +// @ts-strict-ignore +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"; +import { ActivatedRoute } from "@angular/router"; + +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/chart.ts b/ui/src/app/edge/history/common/production/details/chart/productionMeter.ts similarity index 58% rename from ui/src/app/edge/history/common/production/details/chart/chart.ts rename to ui/src/app/edge/history/common/production/details/chart/productionMeter.ts index a8a11e836b9..f7c7e682b3b 100644 --- a/ui/src/app/edge/history/common/production/details/chart/chart.ts +++ b/ui/src/app/edge/history/common/production/details/chart/productionMeter.ts @@ -1,54 +1,37 @@ 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, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress } from 'src/app/shared/shared'; +import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; @Component({ - selector: 'meterChart', + selector: 'productionMeterChart', templateUrl: '../../../../../../shared/components/chart/abstracthistorychart.html', }) -export class ChartComponent extends AbstractHistoryChart { +export class ProductionMeterChartDetailsComponent 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({ + 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'), - }); - - channels.push(...Phase.THREE_PHASE.map(phase => ({ + }, + ...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']; + return energyQueryResponse.result.data[component.id + '/ActiveProductionEnergy']; }, converter: () => { return data[component.id]; @@ -58,10 +41,6 @@ export class ChartComponent extends AbstractHistoryChart { stack: 2, }); - if (!isProductionMeter) { - return datasets; - } - datasets.push(...Phase.THREE_PHASE.map((phase, i) => ({ name: "Phase " + phase, converter: () => @@ -74,7 +53,7 @@ export class ChartComponent extends AbstractHistoryChart { }, tooltip: { formatNumber: '1.1-2', - afterTitle: this.translate.instant('General.TOTAL'), + afterTitle: translate.instant('General.TOTAL'), }, yAxes: [{ unit: YAxisTitle.ENERGY, @@ -82,7 +61,9 @@ export class ChartComponent extends AbstractHistoryChart { yAxisId: ChartAxis.LEFT, }], }; + } - return chartObject; + 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..511011732fd --- /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..e3d09200f9d --- /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, YAxisTitle } 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: YAxisTitle.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..e2a0122de97 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..f9470110124 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 @@ -13,6 +13,8 @@ import { Role } from 'src/app/shared/type/role'; 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 }); } }]; }); } + + 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/overview/overview.html b/ui/src/app/edge/history/common/production/overview/overview.html index d02fe0a1f66..e80f256eba4 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..745d6ac0f81 100644 --- a/ui/src/app/edge/history/common/production/overview/overview.ts +++ b/ui/src/app/edge/history/common/production/overview/overview.ts @@ -5,6 +5,7 @@ import { NavigationOption } from 'src/app/shared/components/footer/subnavigation import { AbstractHistoryChartOverview } from '../../../../../shared/components/chart/abstractHistoryChartOverview'; import { ChannelAddress, EdgeConfig, Service } from '../../../../../shared/shared'; +import { TranslateService } from '@ngx-translate/core'; @Component({ templateUrl: './overview.html', @@ -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); } @@ -34,7 +36,10 @@ 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 => ( + 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..fbd0f922279 100644 --- a/ui/src/app/edge/history/common/production/production.ts +++ b/ui/src/app/edge/history/common/production/production.ts @@ -3,16 +3,14 @@ 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 { CurrentVoltageModule } from 'src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule'; import { TotalChartComponent } from './chart/totalChart'; -import { TotalDcChartComponent } from './chart/totalDcChart'; -import { ChartComponent } from './details/chart/chart'; +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'; -import { CurrentVoltageModule } from 'src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule'; @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/historydataservice.ts b/ui/src/app/edge/history/historydataservice.ts index bf64a942674..97ac3e1f53b 100644 --- a/ui/src/app/edge/history/historydataservice.ts +++ b/ui/src/app/edge/history/historydataservice.ts @@ -1,14 +1,14 @@ // @ts-strict-ignore import { Inject, Injectable } from "@angular/core"; +import { RefresherCustomEvent } from "@ionic/angular"; +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 { diff --git a/ui/src/app/edge/history/shared.ts b/ui/src/app/edge/history/shared.ts index 8ff93006ca0..ce039d3e05a 100644 --- a/ui/src/app/edge/history/shared.ts +++ b/ui/src/app/edge/history/shared.ts @@ -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,6 +168,9 @@ export const DEFAULT_TIME_CHART_OPTIONS: Chart.ChartOptions = { annotation: { annotations: [], }, + datalabels: { + display: false, + }, colors: { enabled: false, }, @@ -229,7 +232,7 @@ export const DEFAULT_TIME_CHART_OPTIONS: Chart.ChartOptions = { }, }, }, -}; +}); export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions = { plugins: { @@ -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/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..b168aabffe6 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 { 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', }) 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/channels/channels.component.html b/ui/src/app/edge/settings/channels/channels.component.html index 90d4834506c..fd240402020 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! + + + + + + + + \ No newline at end of file diff --git a/ui/src/app/edge/settings/channels/channels.component.ts b/ui/src/app/edge/settings/channels/channels.component.ts index 2cf0ec77779..f911ef9520f 100644 --- a/ui/src/app/edge/settings/channels/channels.component.ts +++ b/ui/src/app/edge/settings/channels/channels.component.ts @@ -22,6 +22,8 @@ export class ChannelsComponent { public customAlertOptions: any = { cssClass: 'wide-alert', }; + + protected isAtLeastOneChannelExistingInEdgeConfig: boolean = false; protected readonly spinnerId = ChannelsComponent.SELECTOR; protected readonly environment = environment; protected edge: Edge | null = null; @@ -40,6 +42,8 @@ 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.edge = edge; @@ -54,6 +58,8 @@ export class ChannelsComponent { } }).catch(reason => { this.service.toast(reason, 'danger'); + this.selectedComponentChannels = new Map(); + this.isAtLeastOneChannelExistingInEdgeConfig = true; }).finally(() => { this.service.stopSpinner(this.spinnerId); }); @@ -163,6 +169,7 @@ export class ChannelsComponent { const selectedChannels = this.getSelectedChannelStrings(); if (selectedChannels && selectedChannels.length > 0) { 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/']); } @@ -187,6 +194,13 @@ export class ChannelsComponent { if (address) { 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'; } catch (reason) { @@ -206,7 +220,6 @@ export class ChannelsComponent { } } - private getChannel(componentId: string, channelId: string): Promise { return new Promise((resolve, reject) => { // check if channels of component are already loaded @@ -251,6 +264,13 @@ 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', payload: new GetChannelsOfComponentRequest({ componentId: componentId }), diff --git a/ui/src/app/edge/settings/settings.component.ts b/ui/src/app/edge/settings/settings.component.ts index 3caf8138939..58f3666e896 100644 --- a/ui/src/app/edge/settings/settings.component.ts +++ b/ui/src/app/edge/settings/settings.component.ts @@ -1,4 +1,5 @@ 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'; @@ -23,6 +24,7 @@ export class SettingsComponent implements OnInit { constructor( protected utils: Utils, private service: Service, + private translate: TranslateService, ) { } diff --git a/ui/src/app/edge/settings/settings.spec.ts b/ui/src/app/edge/settings/settings.spec.ts index da8089ca1c9..d46eb0e7ca5 100644 --- a/ui/src/app/edge/settings/settings.spec.ts +++ b/ui/src/app/edge/settings/settings.spec.ts @@ -1,12 +1,18 @@ // @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'], { @@ -16,15 +22,28 @@ describe('Edge', () => { }), }); - 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 () => { const result = await expectNgOnInit(serviceSypObject, Role.ADMIN, settingsComponent); @@ -50,10 +69,8 @@ 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); diff --git a/ui/src/app/index/login.spec.ts b/ui/src/app/index/login.spec.ts index 47f64346695..06d83b9a264 100644 --- a/ui/src/app/index/login.spec.ts +++ b/ui/src/app/index/login.spec.ts @@ -1,10 +1,17 @@ // @ts-strict-ignore +import { TestBed } from "@angular/core/testing"; import { LoginComponent } from "./login.component"; describe('Login', () => { const password = " password "; const username = " username "; + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [LoginComponent], + }).compileComponents(); + }); + it('#trimCredentials should trim password and username', () => { { // Username and password - OpenEMS Backend diff --git a/ui/src/app/shared/components/chart/abstracthistorychart.ts b/ui/src/app/shared/components/chart/abstracthistorychart.ts index 4a2a61fadbf..e0e569d889a 100644 --- a/ui/src/app/shared/components/chart/abstracthistorychart.ts +++ b/ui/src/app/shared/components/chart/abstracthistorychart.ts @@ -1,11 +1,11 @@ // @ts-strict-ignore import { DecimalPipe, formatNumber } from '@angular/common'; -import { ChangeDetectorRef, Directive, Input, OnInit } from '@angular/core'; +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, { BoxAnnotationOptions } from 'chartjs-plugin-annotation'; -import { calculateResolution, ChronoUnit, DEFAULT_TIME_CHART_OPTIONS, isLabelVisible, Resolution, setLabelVisible } from 'src/app/edge/history/shared'; +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'; @@ -25,7 +25,7 @@ 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 { ChartConstants, XAxisType } from './chart.constants'; import 'chartjs-adapter-date-fns'; @@ -34,7 +34,7 @@ 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)']; @@ -46,12 +46,13 @@ 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; @@ -85,11 +86,14 @@ export abstract class AbstractHistoryChart implements OnInit { 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) { @@ -180,12 +184,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, @@ -207,33 +211,6 @@ export abstract class AbstractHistoryChart implements OnInit { }; } - /** - * 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, - }; - return dataset; - } - /** * Change ChartOptions dependent on chartType * @@ -293,26 +270,88 @@ 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 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'; + } + case YAxisTitle.VOLTAGE: + return translate.instant('Edge.History.VOLTAGE'); + case YAxisTitle.CURRENT: + return translate.instant('Edge.History.CURRENT'); + case YAxisTitle.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, + 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; chartObject.yAxes.forEach((element) => { @@ -323,11 +362,9 @@ export abstract class AbstractHistoryChart implements OnInit { 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 +375,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 +389,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,6 +397,7 @@ 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) => { @@ -390,6 +426,7 @@ export abstract class AbstractHistoryChart implements OnInit { }; options.plugins.tooltip.callbacks.afterTitle = function (items: Chart.TooltipItem[]) { + if (items?.length === 0) { return null; } @@ -444,8 +481,9 @@ export abstract class AbstractHistoryChart implements OnInit { options.scales.x.ticks['source'] = 'auto'; options.scales.x.ticks.maxTicksLimit = 31; 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; } @@ -460,8 +498,11 @@ export abstract class AbstractHistoryChart implements OnInit { * @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); + switch (element.unit) { + case YAxisTitle.RELAY: options.scales[element.yAxisId] = { ...baseConfig, @@ -494,6 +535,7 @@ export abstract class AbstractHistoryChart implements OnInit { }, }; break; + case YAxisTitle.TIME: options.scales[element.yAxisId] = { ...baseConfig, @@ -512,6 +554,7 @@ export abstract class AbstractHistoryChart implements OnInit { case YAxisTitle.POWER: case YAxisTitle.ENERGY: case YAxisTitle.VOLTAGE: + case YAxisTitle.CURRENT: case YAxisTitle.NONE: options.scales[element.yAxisId] = baseConfig; break; @@ -528,38 +571,40 @@ 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: YAxisTitle, suffix?: number | string): string { + if (suffix != null) { + if (typeof suffix === 'string') { + return 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); + } } - 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 * * @param title the YAxisTitle - * @returns + * @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 { let tooltipsLabel: string | null = null; @@ -582,6 +627,9 @@ export abstract class AbstractHistoryChart implements OnInit { case YAxisTitle.VOLTAGE: tooltipsLabel = 'V'; break; + case YAxisTitle.CURRENT: + tooltipsLabel = 'A'; + break; case YAxisTitle.POWER: tooltipsLabel = 'W'; break; @@ -600,33 +648,21 @@ export abstract class AbstractHistoryChart implements OnInit { 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: + default: + 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,8 +673,15 @@ 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' }); @@ -651,11 +694,19 @@ export abstract class AbstractHistoryChart implements OnInit { } } + 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 * * @param title the YAxisTitle - * @returns + * @returns the tooltips title with the corresponding unit */ protected static getToolTipsAfterTitleLabel(title: YAxisTitle | null, chartType: 'bar' | 'line', value: number | string | null, translate: TranslateService): string { switch (title) { @@ -667,6 +718,8 @@ export abstract class AbstractHistoryChart implements OnInit { return '%'; case YAxisTitle.VOLTAGE: return 'V'; + case YAxisTitle.CURRENT: + return 'A'; case YAxisTitle.ENERGY: if (chartType == 'bar') { return 'kWh'; @@ -686,29 +739,56 @@ 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 => { @@ -725,25 +805,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 +816,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,6 +881,7 @@ 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; @@ -787,6 +907,7 @@ export abstract class AbstractHistoryChart implements OnInit { }); }); }).then((response) => { + // Check if channelAddresses are empty if (Utils.isDataEmpty(response)) { @@ -807,6 +928,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 +960,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 +974,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 +983,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 +1012,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 +1021,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(); } @@ -958,14 +1037,26 @@ export abstract class AbstractHistoryChart implements OnInit { 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.ts b/ui/src/app/shared/components/chart/chart.constants.ts index 1223a86218b..67f26bc778e 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"; @@ -10,6 +12,44 @@ export class ChartConstants { public static readonly NUMBER_OF_Y_AXIS_TICKS: number = 6; public static readonly EMPTY_DATASETS: ChartDataset[] = []; + 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 * @@ -74,12 +114,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 +134,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/components.module.ts b/ui/src/app/shared/components/components.module.ts index 27e6ab6e12f..70140d5549a 100644 --- a/ui/src/app/shared/components/components.module.ts +++ b/ui/src/app/shared/components/components.module.ts @@ -9,6 +9,7 @@ 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'; @@ -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/edgeconfig.spec.ts b/ui/src/app/shared/components/edge/edgeconfig.spec.ts index 1c2daecc25f..9e9545fb627 100644 --- a/ui/src/app/shared/components/edge/edgeconfig.spec.ts +++ b/ui/src/app/shared/components/edge/edgeconfig.spec.ts @@ -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,6 +176,16 @@ 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, @@ -203,6 +234,19 @@ 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, 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..d83646812eb --- /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, YAxisTitle } 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: 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/chart.ts b/ui/src/app/shared/components/edge/meter/currentVoltage/chart/symmetricMeter.ts similarity index 81% rename from ui/src/app/shared/components/edge/meter/currentVoltage/chart/chart.ts rename to ui/src/app/shared/components/edge/meter/currentVoltage/chart/symmetricMeter.ts index 917ecd79649..24914ca30c1 100644 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/chart/chart.ts +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/chart/symmetricMeter.ts @@ -7,21 +7,22 @@ import { ChannelAddress } from 'src/app/shared/shared'; selector: 'currentVoltageChart', templateUrl: '../../../../../components/chart/abstracthistorychart.html', }) -export class CurrentVoltageChartComponent extends AbstractHistoryChart { +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'), + input: [ + { + name: component.id + 'Current', + powerChannel: ChannelAddress.fromString(component.id + '/Current'), - }, - { - name: component.id + 'Voltage', - powerChannel: ChannelAddress.fromString(component.id + '/Voltage'), - }, + }, + { + name: component.id + 'Voltage', + powerChannel: ChannelAddress.fromString(component.id + '/Voltage'), + }, ], output: (data: HistoryUtils.ChannelData) => [ @@ -33,6 +34,7 @@ export class CurrentVoltageChartComponent extends AbstractHistoryChart { color: 'rgb(253,197,7)', hiddenOnInit: false, stack: 1, + yAxisId: ChartAxis.RIGHT, }, { 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..4db1a8ebaba 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 @@ - - + + + - + \ No newline at end of file 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..7cd86d20236 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 @@ -4,4 +4,12 @@ import { AbstractHistoryChartOverview } from 'src/app/shared/components/chart/ab @Component({ 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..91fbe244d4b 100644 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts @@ -9,8 +9,9 @@ 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 { CurrentVoltageSymmetricChartComponent } from "./chart/symmetricMeter"; import { CurrentAndVoltageOverviewComponent } from "./currentVoltage.overview"; +import { CurrentVoltageAsymmetricChartComponent } from "./chart/asymmetricMeter"; @NgModule({ imports: [ @@ -29,11 +30,13 @@ import { CurrentAndVoltageOverviewComponent } from "./currentVoltage.overview"; ], declarations: [ CurrentAndVoltageOverviewComponent, - CurrentVoltageChartComponent, + CurrentVoltageAsymmetricChartComponent, + CurrentVoltageSymmetricChartComponent, ], exports: [ CurrentAndVoltageOverviewComponent, - CurrentVoltageChartComponent, + CurrentVoltageAsymmetricChartComponent, + CurrentVoltageSymmetricChartComponent, ], }) export class CurrentVoltageModule { } 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..1f0e6f2c2ce 100644 --- a/ui/src/app/shared/components/flat/abstract-flat-widget.ts +++ b/ui/src/app/shared/components/flat/abstract-flat-widget.ts @@ -1,6 +1,6 @@ // @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"; @@ -8,10 +8,11 @@ import { takeUntil } from "rxjs/operators"; import { ChannelAddress, CurrentData, Edge, EdgeConfig, Utils } from "src/app/shared/shared"; 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-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..6250b551b85 --- /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/shared/converter.ts b/ui/src/app/shared/components/shared/converter.ts index d1b8a12d21b..bb3318e2621 100644 --- a/ui/src/app/shared/components/shared/converter.ts +++ b/ui/src/app/shared/components/shared/converter.ts @@ -36,6 +36,14 @@ export namespace Converter { } 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. * diff --git a/ui/src/app/shared/components/shared/formatter.ts b/ui/src/app/shared/components/shared/formatter.ts index bb2e8002a2f..e3bc42073fb 100644 --- a/ui/src/app/shared/components/shared/formatter.ts +++ b/ui/src/app/shared/components/shared/formatter.ts @@ -1,4 +1,5 @@ import { formatNumber } from "@angular/common"; +import { Currency } from "../../shared"; export namespace Formatter { export const FORMAT_WATT = (value: number) => { @@ -25,4 +26,9 @@ export namespace Formatter { // TODO apply correct locale 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/testing/common.ts b/ui/src/app/shared/components/shared/testing/common.ts index 858718645b9..f8104a42887 100644 --- a/ui/src/app/shared/components/shared/testing/common.ts +++ b/ui/src/app/shared/components/shared/testing/common.ts @@ -22,13 +22,16 @@ 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 => ({ + 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": '', @@ -42,7 +45,11 @@ 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', 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 }, @@ -59,7 +66,23 @@ 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', 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 } }, @@ -88,7 +111,11 @@ 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', 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 }, diff --git a/ui/src/app/shared/components/shared/testing/tester.ts b/ui/src/app/shared/components/shared/testing/tester.ts index 2414dccd364..b9e29d6e3af 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"; @@ -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: { @@ -292,9 +293,10 @@ 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[] = []; @@ -306,7 +308,7 @@ export class OeChartTester { return { type: 'option', - options: AbstractHistoryChart.getOptions(chartData, chartType, testContext.service, testContext.translate, null, legendOptions, channelData.result, locale, config, datasets), + options: AbstractHistoryChart.getOptions(chartData, chartType, testContext.service, testContext.translate, legendOptions, channelData.result, locale, config, datasets, xAxisType, labels), }; } 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..65444f5db9f 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 { 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), @@ -48,3 +58,32 @@ export function removeFunctions(obj: any): any { } 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/service/defaulttypes.ts b/ui/src/app/shared/service/defaulttypes.ts index 0236ae8f309..a8edd55a54c 100644 --- a/ui/src/app/shared/service/defaulttypes.ts +++ b/ui/src/app/shared/service/defaulttypes.ts @@ -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..2aa282842a4 100644 --- a/ui/src/app/shared/service/globalRouteChangeHandler.ts +++ b/ui/src/app/shared/service/globalRouteChangeHandler.ts @@ -27,7 +27,6 @@ export class GlobalRouteChangeHandler { data = route.data || data; route = route.firstChild; } - return data; }), ).subscribe(e => { diff --git a/ui/src/app/shared/service/utils.ts b/ui/src/app/shared/service/utils.ts index 67a0376141f..a5fc752c5fc 100644 --- a/ui/src/app/shared/service/utils.ts +++ b/ui/src/app/shared/service/utils.ts @@ -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 * @@ -620,6 +635,7 @@ export enum YAxisTitle { CURRENT, TIME, CURRENCY, + NUMBER, } export enum ChartAxis { @@ -671,7 +687,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, @@ -720,6 +738,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. * @@ -745,9 +770,10 @@ 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', yAxisId: ChartAxis, + /** YAxis title -> {@link https://www.chartjs.org/docs/latest/samples/scale-options/titles.html Chartjs Title} */ + customTitle?: string /** Default: true */ displayGrid?: boolean }; diff --git a/ui/src/app/shared/shared.module.ts b/ui/src/app/shared/shared.module.ts index d29072a2480..7d6fc9ccbd2 100644 --- a/ui/src/app/shared/shared.module.ts +++ b/ui/src/app/shared/shared.module.ts @@ -11,7 +11,7 @@ import { TranslateModule } from '@ngx-translate/core'; import { NgChartsModule } from 'ng2-charts'; import { NgxSpinnerModule } from "ngx-spinner"; -import { appRoutingProviders } from './../app-routing.module'; +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'; diff --git a/ui/src/app/shared/shared.ts b/ui/src/app/shared/shared.ts index f2bf0f04fed..178fe40332f 100644 --- a/ui/src/app/shared/shared.ts +++ b/ui/src/app/shared/shared.ts @@ -83,7 +83,6 @@ export class EdgePermission { public static hasReducedFactories(edge: Edge): boolean { return edge.isVersionAtLeast('2024.6.1'); } - } export class UserPermission { @@ -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 { diff --git a/ui/src/app/shared/utils/date/dateutils.ts b/ui/src/app/shared/utils/date/dateutils.ts index ff97467488a..52de4321ed7 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/assets/i18n/de.json b/ui/src/assets/i18n/de.json index 30cbdd745b0..6f0d3426a53 100644 --- a/ui/src/assets/i18n/de.json +++ b/ui/src/assets/i18n/de.json @@ -947,6 +947,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": { @@ -969,4 +974,4 @@ "APP": { "FUNCTIONALITY_TEMPORARILY_NOT_AVAILABLE": "Diese Funktion ist vorübergehend in der App nicht verfügbar, verwenden Sie bitte dafür die Web-App." } -} +} \ No newline at end of file diff --git a/ui/src/assets/i18n/en.json b/ui/src/assets/i18n/en.json index 7e19b725d7d..99aa7e38184 100644 --- a/ui/src/assets/i18n/en.json +++ b/ui/src/assets/i18n/en.json @@ -950,6 +950,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": { From a96c720293623679c0db8e2db449b9867b7dc4b6 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Mon, 12 Aug 2024 14:13:26 +0200 Subject: [PATCH 04/28] UI: apply standard formatting & cleanup (#2742) --- ui/.vscode/settings.json | 39 +++++++++++++------ ui/README.md | 2 +- ui/android/app/build.gradle | 4 +- ui/android/keystore.properties | 2 +- ui/android/settings.gradle | 2 +- ui/android/variables.gradle | 2 +- ui/angular.json | 2 +- ui/e2e/tsconfig.json | 2 +- ui/karma.conf.js | 2 +- ui/ngsw-config.json | 2 +- ui/src/app/app-routing.module.ts | 1 - ui/src/app/app.component.ts | 5 +-- ui/src/app/app.module.ts | 3 +- ui/src/app/appupdateservice.ts | 10 ----- ui/src/app/changelog/view/view.html | 2 +- ui/src/app/edge/edge.component.ts | 1 - ui/src/app/edge/edge.module.ts | 4 +- .../ChannelThreshold/flat/flat.html | 2 +- .../ChannelThreshold/overview/overview.html | 2 +- .../overview/overview.html | 3 +- .../TimeOfUseTariff/timeOfUseTariff.module.ts | 2 +- .../edge/history/abstracthistorychart.html | 2 +- .../app/edge/history/abstracthistorychart.ts | 3 +- .../app/edge/history/abstracthistorywidget.ts | 2 +- .../edge/history/chpsoc/chart.component.ts | 3 +- .../chpsocchartoverview.component.html | 2 +- .../edge/history/common/autarchy/Autarchy.ts | 2 +- .../history/common/autarchy/flat/flat.html | 2 +- .../common/autarchy/overview/overview.html | 2 +- ui/src/app/edge/history/common/common.ts | 3 +- .../consumption/chart/chart.constants.spec.ts | 3 +- .../consumption/details/details.overview.html | 9 +++-- .../consumption/details/details.overview.ts | 4 +- .../history/common/consumption/flat/flat.html | 2 +- .../common/consumption/overview/overview.html | 2 +- .../energy/chart/chart.constants.spec.ts | 3 +- .../edge/history/common/energy/flat/flat.html | 2 +- .../edge/history/common/energy/flat/flat.ts | 10 ++--- .../edge/history/common/grid/flat/flat.html | 18 ++++----- ui/src/app/edge/history/common/grid/grid.ts | 5 +-- .../details/chart/productionMeter.spec.ts | 2 +- .../production/details/details.overview.html | 4 +- .../history/common/production/flat/flat.html | 2 +- .../common/production/overview/overview.html | 8 ++-- .../common/production/overview/overview.ts | 3 +- .../common/selfconsumption/SelfConsumption.ts | 4 +- .../common/selfconsumption/flat/flat.html | 2 +- .../common/selfconsumption/flat/flat.ts | 2 +- .../selfconsumption/overview/overview.html | 2 +- ...ayedselltogridchartoverview.component.html | 2 +- .../delayedselltogrid/widget.component.html | 2 +- .../delayedselltogrid/widget.component.ts | 4 +- ...xdigitaloutputchartoverview.component.html | 2 +- .../fixdigitaloutput/widget.component.html | 2 +- ...heatingelementchartoverview.component.html | 2 +- .../heatingelement/widget.component.html | 2 +- .../heatpumpchartoverview.component.html | 2 +- .../history/heatpump/widget.component.html | 2 +- ...ricpeakshavingchartoverview.component.html | 2 +- .../asymmetric/widget.component.html | 2 +- .../asymmetric/widget.component.ts | 5 +-- ...ricpeakshavingchartoverview.component.html | 2 +- .../symmetric/widget.component.html | 2 +- .../peakshaving/symmetric/widget.component.ts | 1 - ...lotpeakshavingchartoverview.component.html | 2 +- .../timeslot/widget.component.html | 2 +- .../peakshaving/timeslot/widget.component.ts | 1 - .../singlethreshold/widget.component.html | 2 +- .../storagechartoverview.component.html | 2 +- .../history/storage/widget.component.html | 2 +- .../Channelthreshold/Channelthreshold.html | 2 +- .../edge/live/Controller/ChpSoc/ChpSoc.html | 2 +- .../ChpSoc/modal/modal.component.html | 2 +- .../Ess/FixActivePower/flat/flat.html | 2 +- .../Ess/FixActivePower/modal/modal.html | 2 +- .../Ess/GridOptimizedCharge/flat/flat.html | 2 +- .../TimeOfUseTariff/Ess_TimeOfUseTariff.ts | 30 +++++++------- .../Ess/TimeOfUseTariff/flat/flat.html | 2 +- .../TimeOfUseTariff/modal/powerSocChart.ts | 3 +- .../TimeOfUseTariff/modal/statePriceChart.ts | 2 +- .../administration.component.html | 2 +- .../live/Controller/Evcs/modal/modal.html | 2 +- .../live/Controller/Evcs/popover/popover.html | 2 +- .../FixDigitalOutput/Io_FixDigitalOutput.html | 2 +- .../modal/modal.component.html | 2 +- .../Io/HeatingElement/flat/flat.html | 2 +- .../Io/HeatingElement/modal/modal.html | 2 +- .../Controller/Io/Heatpump/Io_Heatpump.html | 2 +- .../Io/Heatpump/modal/modal.component.html | 2 +- .../PeakShaving/Asymmetric/Asymmetric.html | 2 +- .../Asymmetric/modal/modal.component.html | 2 +- .../PeakShaving/Symmetric/Symmetric.html | 2 +- .../Symmetric/modal/modal.component.html | 2 +- .../Symmetric_TimeSlot.html | 2 +- .../modal/modal.component.html | 2 +- .../Api_DigitalInput/Io_Api_DigitalInput.html | 2 +- .../Api_DigitalInput/modal/modal.component.ts | 6 +-- .../Evcs_Api_Cluster/Evcs_Api_Cluster.html | 2 +- .../modal/evcs-chart/evcs.chart.html | 2 +- .../modal/evcs-chart/evcs.chart.ts | 10 ++--- .../modal/evcsCluster-modal.page.html | 2 +- .../modal/evcsCluster-modal.page.ts | 4 +- .../edge/live/common/autarchy/flat/flat.html | 2 +- .../live/common/consumption/flat/flat.html | 2 +- .../app/edge/live/common/grid/flat/flat.html | 2 +- .../live/common/production/flat/flat.html | 2 +- .../edge/live/common/production/flat/flat.ts | 2 +- .../live/common/production/modal/modal.html | 2 +- .../common/selfconsumption/flat/flat.html | 2 +- .../common/storage/storage.component.html | 2 +- .../delayedselltogrid.component.html | 2 +- .../modal/modal.component.html | 2 +- .../energymonitor/chart/chart.component.html | 2 +- .../section/abstractsection.component.ts | 4 +- .../chart/section/consumption.component.html | 2 +- .../chart/section/grid.component.html | 2 +- .../chart/section/production.component.html | 2 +- .../chart/section/storage.component.html | 2 +- .../energymonitor.component.html | 2 +- .../energymonitor/energymonitor.module.ts | 9 ++--- ui/src/app/edge/live/info/info.component.html | 2 +- ui/src/app/edge/live/live.component.html | 4 +- ui/src/app/edge/live/live.module.ts | 2 +- ui/src/app/edge/live/livedataservice.ts | 3 +- ui/src/app/edge/settings/app/app.module.ts | 18 ++++----- .../edge/settings/app/formly/formly-text.ts | 2 +- .../formly-option-group-picker.component.html | 2 +- .../formly-option-group-picker.component.ts | 2 +- .../formly-reorder-array.component.html | 2 +- .../formly-safe-input-modal.component.html | 2 +- .../formly-safe-input.extended.html | 2 +- .../safe-input/formly-safe-input.extended.ts | 2 +- .../app/edge/settings/app/index.component.ts | 8 ++-- .../edge/settings/app/install.component.html | 2 +- .../app/jsonrpc/getAppAssistant.spec.ts | 2 +- .../app/keypopup/modal.component.html | 2 +- .../settings/app/keypopup/modal.component.ts | 4 +- .../edge/settings/app/single.component.html | 2 +- .../app/edge/settings/app/single.component.ts | 6 +-- .../edge/settings/app/update.component.html | 3 +- .../app/edge/settings/app/update.component.ts | 2 +- .../settings/channels/channels.component.html | 2 +- .../settings/channels/channels.component.ts | 4 +- .../component/install/index.component.html | 2 +- .../component/install/index.component.ts | 4 +- .../component/install/install.component.html | 2 +- .../component/install/install.component.ts | 4 +- .../component/update/index.component.html | 2 +- .../component/update/update.component.html | 2 +- .../component/update/update.component.ts | 4 +- .../settings/jsonrpctest/jsonrpctest.html | 4 +- .../jsonrpctest/jsonrpctest.permission.ts | 2 +- .../settings/powerassistant/powerassistant.ts | 7 ++-- .../profile/aliasupdate.component.html | 2 +- .../app/edge/settings/settings.component.html | 9 +++-- .../settings/system/executeSystemUpdate.ts | 2 +- .../system/executesystemupdate.component.html | 2 +- .../systemexecute.component.html | 2 +- .../settings/systemlog/systemlog.component.ts | 7 ++-- ui/src/app/index/filter/filter.component.html | 2 +- ui/src/app/index/filter/filter.component.ts | 2 +- ui/src/app/index/index.module.ts | 5 +-- .../index/overview/overview.component.html | 2 +- ui/src/app/index/shared/loading-screen.html | 2 +- ui/src/app/index/shared/sumState.ts | 4 +- .../registration/modal/modal.component.html | 2 +- .../registration/registration.component.html | 2 +- .../components/chart/abstracthistorychart.ts | 4 +- ui/src/app/shared/components/edge/edge.ts | 15 ++++--- .../currentVoltage.overview.html | 2 +- .../currentVoltage/currentVoltageModule.ts | 3 +- .../meter/electricity/modal.component.html | 2 +- .../meter/esscharger/modal.component.html | 2 +- .../flat-widget-horizontal-line.html | 2 +- .../flat-widget-line-item.html | 2 +- .../flat-widget-line/flat-widget-line.html | 2 +- .../flat-widget-percentagebar.html | 2 +- .../flat/flat-widget.component.html | 2 +- ui/src/app/shared/components/flat/flat.html | 2 +- .../subnavigation/footerNavigation.html | 2 +- ...form-field-checkbox-hyperlink.wrapper.html | 2 +- .../form-field-checkbox-hyperlink.wrapper.ts | 2 +- .../components/formly/form-field.wrapper.html | 2 +- .../components/formly/form-field.wrapper.ts | 2 +- .../formly-field-checkbox-with-image.html | 4 +- .../formly-field-modal/formlyfieldmodal.html | 2 +- .../formly/formly-field-modal/template.html | 2 +- .../formly-field-radio-with-image.html | 2 +- .../formly-field-radio-with-image.ts | 2 +- .../formly-select-field-modal.component.html | 2 +- .../formly/formly-select-field.extended.html | 2 +- .../formly/input-serial-number-wrapper.html | 2 +- .../app/shared/components/formly/input.html | 3 +- .../app/shared/components/formly/repeat.html | 2 +- .../components/header/header.component.html | 2 +- .../shared/components/modal/abstractModal.ts | 2 +- .../modal/help-button/help-button.html | 2 +- .../modal/modal-button/modal-button.html | 2 +- .../modal-info-line/modal-info-line.html | 2 +- .../modal-line-item/modal-line-item.html | 2 +- .../modal/modal-line/modal-line.html | 2 +- .../modal/modal-phases/modal-phases.html | 2 +- .../modal-value-line/modal-value-line.html | 2 +- .../modal-horizontal-line.html | 2 +- .../percentagebar.component.html | 2 +- .../pickdate/pickdate.component.html | 2 +- .../components/pickdate/pickdate.module.ts | 4 +- .../app/shared/components/shared/converter.ts | 2 - .../shared/components/shared/dataservice.ts | 3 +- .../components/shared/oe-formly-component.ts | 3 +- .../status/single/status.component.spec.ts | 7 ++-- ui/src/app/shared/directive/directive.ts | 2 +- .../notification/systemLogNotification.ts | 2 +- .../queryHistoricTimeseriesDataRequest.ts | 4 +- ...istoricTimeseriesEnergyPerPeriodRequest.ts | 4 +- .../queryHistoricTimeseriesEnergyRequest.ts | 2 +- .../chartoptions/chartoptions.component.html | 2 +- .../popover/popover.component.html | 2 +- .../pipe/unitvalue/unitvalue.pipe.spec.ts | 2 +- ui/src/app/shared/service/service.ts | 1 - .../app/shared/service/test/dummyservice.ts | 5 +-- .../app/shared/service/test/dummywebsocket.ts | 2 +- ui/src/app/shared/shared.module.ts | 1 - ui/src/app/shared/type/language.ts | 4 +- ui/src/app/shared/type/widget.ts | 1 - ui/src/app/user/user.component.html | 8 ++-- ui/src/app/user/user.component.ts | 3 +- ui/src/assets/i18n/de.json | 2 +- ui/src/assets/i18n/en.json | 2 +- ui/src/global.scss | 1 + ui/src/main.ts | 2 +- ui/src/polyfills.ts | 4 +- ui/src/test.ts | 1 + ui/src/themes/openems/root/site.webmanifest | 2 +- ui/tsconfig.app.json | 2 +- ui/tsconfig.spec.json | 2 +- 236 files changed, 356 insertions(+), 380 deletions(-) diff --git a/ui/.vscode/settings.json b/ui/.vscode/settings.json index ca17a9ba2dd..953439f6918 100644 --- a/ui/.vscode/settings.json +++ b/ui/.vscode/settings.json @@ -5,16 +5,6 @@ "i18n-ally.localesPaths": "src/assets/i18n", "i18n-ally.dirStructure": "file", "i18n-ally.keystyle": "nested", - "formatFiles.excludedFolders": [ - "node_modules", - ".vscode", - ".git", - "dist", - ".chrome", - ".angular", - "target" - ], - "formatFiles.excludePattern": "**/{*.svg,*.png,*.ico,package-lock.json}", "files.watcherExclude": { "**/.git/objects/**": true, "**/node_modules/**": true @@ -24,12 +14,37 @@ "editor.defaultFormatter": "dbaeumer.vscode-eslint", "eslint.format.enable": true, "[typescript]": { - "editor.defaultFormatter": "vscode.typescript-language-features" + "editor.defaultFormatter": "vscode.typescript-language-features", + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit", + "source.removeUnusedImports": "explicit" + } }, "[jsonc]": { "editor.defaultFormatter": "vscode.json-language-features" }, "[json]": { "editor.defaultFormatter": "vscode.json-language-features" - } + }, + "[javascript]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + }, + "[html]": { + "editor.defaultFormatter": "vscode.html-language-features" + }, + "[scss]": { + "editor.defaultFormatter": "vscode.css-language-features" + }, + "Workspace_Formatter.excludePattern": [ + "**/build", + "**/.*", + "**/.vscode", + "**/target", + "*.js", + "*.xml", + "*.js.map", + "**/node_modules", + "*.svg", + "*.scss" + ] } diff --git a/ui/README.md b/ui/README.md index 7464899feaf..96ef2800acb 100644 --- a/ui/README.md +++ b/ui/README.md @@ -114,4 +114,4 @@ ngOnDestroy() { ``` #### Debugging Angular PWA Via USB-Connection -Please follow this: https://medium.com/nerd-for-tech/google-chrome-how-to-inspect-websites-on-mobile-devices-804677f863ce \ No newline at end of file +Please follow this: https://medium.com/nerd-for-tech/google-chrome-how-to-inspect-websites-on-mobile-devices-804677f863ce diff --git a/ui/android/app/build.gradle b/ui/android/app/build.gradle index 222c575a476..49bae4cfcb6 100644 --- a/ui/android/app/build.gradle +++ b/ui/android/app/build.gradle @@ -9,7 +9,7 @@ android { defaultConfig { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 20240900 + versionCode 2024090000 versionName "2024.9.0-SNAPSHOT" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { @@ -85,4 +85,4 @@ try { } } catch(Exception e) { logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") -} \ No newline at end of file +} 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..232bd9dd0c5 100644 --- a/ui/android/variables.gradle +++ b/ui/android/variables.gradle @@ -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/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/src/app/app-routing.module.ts b/ui/src/app/app-routing.module.ts index 38a1dd97ae3..40394041c80 100644 --- a/ui/src/app/app-routing.module.ts +++ b/ui/src/app/app-routing.module.ts @@ -1,7 +1,6 @@ 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'; diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts index 033478c4795..d4c4c458a00 100644 --- a/ui/src/app/app.component.ts +++ b/ui/src/app/app.component.ts @@ -2,16 +2,15 @@ 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'; -import { SplashScreen } from '@capacitor/splash-screen'; -import { AppService } from './app.service'; @Component({ selector: 'app-root', diff --git a/ui/src/app/app.module.ts b/ui/src/app/app.module.ts index 79a367d56af..3a7db60566a 100644 --- a/ui/src/app/app.module.ts +++ b/ui/src/app/app.module.ts @@ -10,7 +10,7 @@ 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'; @@ -29,7 +29,6 @@ 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'; @NgModule({ declarations: [ diff --git a/ui/src/app/appupdateservice.ts b/ui/src/app/appupdateservice.ts index 7029043c8fa..943f7fd254c 100644 --- a/ui/src/app/appupdateservice.ts +++ b/ui/src/app/appupdateservice.ts @@ -11,16 +11,6 @@ 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() 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/edge/edge.component.ts b/ui/src/app/edge/edge.component.ts index 8f6f8c7e965..6cc3aabb469 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", diff --git a/ui/src/app/edge/edge.module.ts b/ui/src/app/edge/edge.module.ts index 14c27cb4243..e88789f32af 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 { HistoryModule } from './history/history.module'; +import { LiveModule } from './live/live.module'; @NgModule({ declarations: [ 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/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/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/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/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 ed316c5f7b0..f1587b43962 100644 --- a/ui/src/app/edge/history/abstracthistorychart.ts +++ b/ui/src/app/edge/history/abstracthistorychart.ts @@ -2,6 +2,7 @@ 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'; @@ -11,9 +12,7 @@ import { ChartAxis, HistoryUtils, Utils, YAxisTitle } from 'src/app/shared/servi 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, XAxisType } from 'src/app/shared/components/chart/chart.constants'; // NOTE: Auto-refresh of widgets is currently disabled to reduce server load export abstract class AbstractHistoryChart { diff --git a/ui/src/app/edge/history/abstracthistorywidget.ts b/ui/src/app/edge/history/abstracthistorywidget.ts index 8f07ccf5cc4..22459c5a240 100644 --- a/ui/src/app/edge/history/abstracthistorywidget.ts +++ b/ui/src/app/edge/history/abstracthistorywidget.ts @@ -3,8 +3,8 @@ 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 { calculateResolution } from './shared'; // NOTE: Auto-refresh of widgets is currently disabled to reduce server load export abstract class AbstractHistoryWidget { diff --git a/ui/src/app/edge/history/chpsoc/chart.component.ts b/ui/src/app/edge/history/chpsoc/chart.component.ts index 3be26bf6160..56cf7403401 100644 --- a/ui/src/app/edge/history/chpsoc/chart.component.ts +++ b/ui/src/app/edge/history/chpsoc/chart.component.ts @@ -3,10 +3,9 @@ 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 { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; import { AbstractHistoryChart } from '../abstracthistorychart'; -import { YAxisTitle } from 'src/app/shared/service/utils'; @Component({ selector: 'chpsocchart', 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/common/autarchy/Autarchy.ts b/ui/src/app/edge/history/common/autarchy/Autarchy.ts index 1407ff291e6..6b01e6b18fa 100644 --- a/ui/src/app/edge/history/common/autarchy/Autarchy.ts +++ b/ui/src/app/edge/history/common/autarchy/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 { ChartComponent } from './chart/chart'; +import { FlatComponent } from './flat/flat'; import { OverviewComponent } from './overview/overview'; @NgModule({ 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/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/common.ts b/ui/src/app/edge/history/common/common.ts index 2dad8182fd7..c21e92b1a78 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 { 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'; -import { Common_Consumption } from './consumption/Consumption'; @NgModule({ imports: [ 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..4793ffc4ded 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,9 +1,8 @@ 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 { 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 c85fcf170b3..80ddb738d14 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,8 +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 f89f7186c13..74647b30812 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 @@ -28,7 +28,7 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { this.componentType = this.getComponentType(); this.service.getCurrentEdge().then(edge => { - if(!this.component) { + if (!this.component) { return; } @@ -47,7 +47,7 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { } private getComponentType(): typeof this.componentType { - if(!this.component) { + if (!this.component) { 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/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/energy/chart/chart.constants.spec.ts b/ui/src/app/edge/history/common/energy/chart/chart.constants.spec.ts index b5d7a8fdae7..abaa914fefe 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,8 +1,7 @@ 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"; 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..3e500cdd718 100644 --- a/ui/src/app/edge/history/common/energy/flat/flat.ts +++ b/ui/src/app/edge/history/common/energy/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 '../../../../../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 { 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', 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/grid.ts b/ui/src/app/edge/history/common/grid/grid.ts index 5b70f8b4edb..8e7d54bca35 100644 --- a/ui/src/app/edge/history/common/grid/grid.ts +++ b/ui/src/app/edge/history/common/grid/grid.ts @@ -1,13 +1,12 @@ 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 { FooterNavigationModule } from 'src/app/shared/components/footer/subnavigation/footerNavigation.module'; -import { DetailsOverviewComponent } from './details/details.overview'; @NgModule({ imports: [ 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 index 32c970e8387..5a4ab2d5393 100644 --- 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 @@ -1,4 +1,5 @@ // @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"; @@ -7,7 +8,6 @@ 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"; -import { ActivatedRoute } from "@angular/router"; describe('History Production Details - productionMeters', () => { const defaultEMS = DummyConfig.from( 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 e2a0122de97..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 @@ -3,8 +3,8 @@ - - + + - \ No newline at end of file + 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 e80f256eba4..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,6 +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 745d6ac0f81..7b6f24fff11 100644 --- a/ui/src/app/edge/history/common/production/overview/overview.ts +++ b/ui/src/app/edge/history/common/production/overview/overview.ts @@ -1,11 +1,10 @@ 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'; -import { TranslateService } from '@ngx-translate/core'; @Component({ templateUrl: './overview.html', 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/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..6d617da7808 100644 --- a/ui/src/app/edge/history/common/selfconsumption/flat/flat.ts +++ b/ui/src/app/edge/history/common/selfconsumption/flat/flat.ts @@ -1,7 +1,7 @@ // @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 { ChannelAddress, CurrentData, Utils } from 'src/app/shared/shared'; @Component({ selector: 'selfconsumptionWidget', 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/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/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..a31ec5da133 100644 --- a/ui/src/app/edge/history/delayedselltogrid/widget.component.ts +++ b/ui/src/app/edge/history/delayedselltogrid/widget.component.ts @@ -1,7 +1,7 @@ -import { ActivatedRoute } from '@angular/router'; import { Component, Input, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { Edge, Service, EdgeConfig } from 'src/app/shared/shared'; +import { Edge, EdgeConfig, Service } from 'src/app/shared/shared'; @Component({ selector: DelayedSellToGridWidgetComponent.SELECTOR, diff --git a/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.html b/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.html index 887b62548da..e516087b8b3 100644 --- a/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.html +++ b/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.html @@ -41,4 +41,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/history/fixdigitaloutput/widget.component.html b/ui/src/app/edge/history/fixdigitaloutput/widget.component.html index 6a243ca093c..fb8bf4bc466 100644 --- a/ui/src/app/edge/history/fixdigitaloutput/widget.component.html +++ b/ui/src/app/edge/history/fixdigitaloutput/widget.component.html @@ -14,4 +14,4 @@ - \ No newline at end of file + 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/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/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/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/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/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..befb0fa19ef 100644 --- a/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.ts +++ b/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.ts @@ -1,7 +1,7 @@ -import { ActivatedRoute } from '@angular/router'; import { Component, Input, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { DefaultTypes } from 'src/app/shared/service/defaulttypes'; -import { Edge, Service, EdgeConfig } from 'src/app/shared/shared'; +import { Edge, EdgeConfig, Service } from 'src/app/shared/shared'; @Component({ selector: AsymmetricPeakshavingWidgetComponent.SELECTOR, @@ -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; 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/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..2a4a3720976 100644 --- a/ui/src/app/edge/history/peakshaving/symmetric/widget.component.ts +++ b/ui/src/app/edge/history/peakshaving/symmetric/widget.component.ts @@ -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; 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/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..a8748d264b0 100644 --- a/ui/src/app/edge/history/peakshaving/timeslot/widget.component.ts +++ b/ui/src/app/edge/history/peakshaving/timeslot/widget.component.ts @@ -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; diff --git a/ui/src/app/edge/history/singlethreshold/widget.component.html b/ui/src/app/edge/history/singlethreshold/widget.component.html index 53e0a2d3687..a0d04bc95ca 100644 --- a/ui/src/app/edge/history/singlethreshold/widget.component.html +++ b/ui/src/app/edge/history/singlethreshold/widget.component.html @@ -15,4 +15,4 @@ - \ No newline at end of file + 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/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/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/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/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/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/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/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/TimeOfUseTariff/Ess_TimeOfUseTariff.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/Ess_TimeOfUseTariff.ts index bb6eda0caa8..34ad15b24e1 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 { @@ -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/modal/powerSocChart.ts b/ui/src/app/edge/live/Controller/Ess/TimeOfUseTariff/modal/powerSocChart.ts index 1c646bf9601..f28a7ee3b36 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 @@ -5,11 +5,10 @@ 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, 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'; 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..a11644b8445 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 @@ -10,11 +10,11 @@ import { ChartAxis, HistoryUtils, TimeOfUseTariffUtils, YAxisTitle } from 'src/a 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'; -import { ChartConstants } from 'src/app/shared/components/chart/chart.constants'; @Component({ selector: 'statePriceChart', 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/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/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/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/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/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/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/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/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/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/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/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/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_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/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/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/modal/modal.component.ts b/ui/src/app/edge/live/Io/Api_DigitalInput/modal/modal.component.ts index 5169a6f4ae5..fe0490cb871 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,10 +1,10 @@ // @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 { 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', 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/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..426c5ad9ec5 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,11 +1,11 @@ // @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 { 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, 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..219e685ada7 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,9 +1,9 @@ // @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 { 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'; 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/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/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/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..8141104ce0c 100644 --- a/ui/src/app/edge/live/common/production/flat/flat.ts +++ b/ui/src/app/edge/live/common/production/flat/flat.ts @@ -1,6 +1,6 @@ -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 { EdgeConfig, Utils } from 'src/app/shared/shared'; import { ModalComponent } from '../modal/modal'; @Component({ 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/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/storage/storage.component.html b/ui/src/app/edge/live/common/storage/storage.component.html index 13715f5e0ca..ad219c8d17f 100644 --- a/ui/src/app/edge/live/common/storage/storage.component.html +++ b/ui/src/app/edge/live/common/storage/storage.component.html @@ -60,4 +60,4 @@ - \ No newline at end of file + 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/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/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/section/abstractsection.component.ts b/ui/src/app/edge/live/energymonitor/chart/section/abstractsection.component.ts index 869a8d30bf9..047bdff0e4d 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,8 +1,8 @@ // @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 { 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]'; 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/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/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/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/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.module.ts b/ui/src/app/edge/live/energymonitor/energymonitor.module.ts index ac7eb9461f4..1939bbf9d45 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 { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 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 { 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: [ 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/live.component.html b/ui/src/app/edge/live/live.component.html index e771887a085..bef5c983782 100644 --- a/ui/src/app/edge/live/live.component.html +++ b/ui/src/app/edge/live/live.component.html @@ -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.module.ts b/ui/src/app/edge/live/live.module.ts index 62c2a8b672e..a21b0b2caae 100644 --- a/ui/src/app/edge/live/live.module.ts +++ b/ui/src/app/edge/live/live.module.ts @@ -16,6 +16,7 @@ import { Controller_Ess_FixActivePower } from './Controller/Ess/FixActivePower/E 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'; @@ -40,7 +41,6 @@ import { Evcs_Api_ClusterComponent } from './Multiple/Evcs_Api_Cluster/Evcs_Api_ 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'; @NgModule({ imports: [ diff --git a/ui/src/app/edge/live/livedataservice.ts b/ui/src/app/edge/live/livedataservice.ts index 268b392bf72..3bcde8edb9c 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 { 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/settings/app/app.module.ts b/ui/src/app/edge/settings/app/app.module.ts index 3b12184a7ed..932b021cfa7 100644 --- a/ui/src/app/edge/settings/app/app.module.ts +++ b/ui/src/app/edge/settings/app/app.module.ts @@ -1,20 +1,20 @@ // @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 { FORMLY_CONFIG, FormlyModule } 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 { 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 }; 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..ff08690c381 100644 --- a/ui/src/app/edge/settings/app/formly/formly-text.ts +++ b/ui/src/app/edge/settings/app/formly/formly-text.ts @@ -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/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..ce5b702e4b1 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,7 +1,7 @@ // @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', 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/safe-input/formly-safe-input-modal.component.html b/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input-modal.component.html index 9415c5a3319..56855d3e69d 100644 --- a/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input-modal.component.html +++ b/ui/src/app/edge/settings/app/formly/safe-input/formly-safe-input-modal.component.html @@ -36,4 +36,4 @@ - \ No newline at end of file + 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..c0c55317216 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,9 +2,9 @@ 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', diff --git a/ui/src/app/edge/settings/app/index.component.ts b/ui/src/app/edge/settings/app/index.component.ts index 02051b79b30..328e4f384f5 100644 --- a/ui/src/app/edge/settings/app/index.component.ts +++ b/ui/src/app/edge/settings/app/index.component.ts @@ -10,16 +10,16 @@ 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'; -import { Flags } from './jsonrpc/flag/flags'; -import { App } from './keypopup/app'; -import { InstallAppComponent } from './install.component'; -import { AppCenterGetRegisteredKeys } from './keypopup/appCenterGetRegisteredKeys'; @Component({ selector: IndexComponent.SELECTOR, 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/jsonrpc/getAppAssistant.spec.ts b/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.spec.ts index d6cb07561a0..28dbc11b1b0 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.spec.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.spec.ts @@ -1,6 +1,6 @@ // @ts-strict-ignore -import { GetAppAssistant } from "./getAppAssistant"; import { FormlyFieldConfig } from "@ngx-formly/core"; +import { GetAppAssistant } from "./getAppAssistant"; describe('GetAppAssistant', () => { let fields: FormlyFieldConfig[]; 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..e8a3e2847b4 100644 --- a/ui/src/app/edge/settings/app/keypopup/modal.component.ts +++ b/ui/src/app/edge/settings/app/keypopup/modal.component.ts @@ -7,14 +7,14 @@ 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'; -import { Flags } from '../jsonrpc/flag/flags'; -import { hasPredefinedKey } from '../permissions'; @Component({ selector: KeyModalComponent.SELECTOR, 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..10e07150acd 100644 --- a/ui/src/app/edge/settings/app/single.component.ts +++ b/ui/src/app/edge/settings/app/single.component.ts @@ -4,10 +4,13 @@ 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'; @@ -16,9 +19,6 @@ 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'; @Component({ selector: SingleAppComponent.SELECTOR, 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..361070f1e21 100644 --- a/ui/src/app/edge/settings/app/update.component.ts +++ b/ui/src/app/edge/settings/app/update.component.ts @@ -6,11 +6,11 @@ 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'; -import { InstallAppComponent } from './install.component'; interface MyInstance { instanceId: string, // uuid diff --git a/ui/src/app/edge/settings/channels/channels.component.html b/ui/src/app/edge/settings/channels/channels.component.html index fd240402020..ecef95c38f1 100644 --- a/ui/src/app/edge/settings/channels/channels.component.html +++ b/ui/src/app/edge/settings/channels/channels.component.html @@ -197,4 +197,4 @@ - \ No newline at end of file + diff --git a/ui/src/app/edge/settings/channels/channels.component.ts b/ui/src/app/edge/settings/channels/channels.component.ts index f911ef9520f..a6adc4dd12c 100644 --- a/ui/src/app/edge/settings/channels/channels.component.ts +++ b/ui/src/app/edge/settings/channels/channels.component.ts @@ -6,10 +6,10 @@ 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 { Channel, GetChannelsOfComponentResponse } from 'src/app/shared/jsonrpc/response/getChannelsOfComponentResponse'; +import { ChannelAddress, Edge, EdgeConfig, EdgePermission, Service, Websocket } from '../../../shared/shared'; @Component({ selector: ChannelsComponent.SELECTOR, 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..5b5ec1ecf07 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 { 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, 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..53be5a1fef2 100644 --- a/ui/src/app/edge/settings/component/install/install.component.ts +++ b/ui/src/app/edge/settings/component/install/install.component.ts @@ -1,9 +1,9 @@ // @ts-strict-ignore -import { ActivatedRoute } from '@angular/router'; import { Component, OnInit } from '@angular/core'; import { FormGroup } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; import { FormlyFieldConfig } from '@ngx-formly/core'; -import { Service, Utils, Websocket, EdgeConfig, Edge } from '../../../../shared/shared'; +import { Edge, EdgeConfig, Service, Utils, Websocket } from '../../../../shared/shared'; @Component({ selector: ComponentInstallComponent.SELECTOR, 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/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..e4177748d18 100644 --- a/ui/src/app/edge/settings/component/update/update.component.ts +++ b/ui/src/app/edge/settings/component/update/update.component.ts @@ -1,9 +1,9 @@ // @ts-strict-ignore -import { ActivatedRoute } from '@angular/router'; import { Component, OnInit } from '@angular/core'; import { FormGroup } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; import { FormlyFieldConfig } from '@ngx-formly/core'; -import { Service, Utils, Websocket, EdgeConfig, Edge } from '../../../../shared/shared'; +import { Edge, EdgeConfig, Service, Utils, Websocket } from '../../../../shared/shared'; @Component({ selector: ComponentUpdateComponent.SELECTOR, 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.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/powerassistant/powerassistant.ts b/ui/src/app/edge/settings/powerassistant/powerassistant.ts index 1cdedeeefe6..8dfaabf14dd 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 { 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, 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/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/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/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/systemlog/systemlog.component.ts b/ui/src/app/edge/settings/systemlog/systemlog.component.ts index b460c3c7710..489f7c9bda2 100644 --- a/ui/src/app/edge/settings/systemlog/systemlog.component.ts +++ b/ui/src/app/edge/settings/systemlog/systemlog.component.ts @@ -1,13 +1,12 @@ 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 { 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 { Service, Utils, Websocket } from '../../../shared/shared'; export const LOG_LEVEL_FILTER = (translate: TranslateService): Filter => ({ placeholder: translate.instant("Edge.Config.Log.level"), 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..16cc1e4b1a4 100644 --- a/ui/src/app/index/filter/filter.component.ts +++ b/ui/src/app/index/filter/filter.component.ts @@ -2,9 +2,9 @@ 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', diff --git a/ui/src/app/index/index.module.ts b/ui/src/app/index/index.module.ts index fc90698bdaf..427fb34c7f5 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 { 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/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/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/sumState.ts b/ui/src/app/index/shared/sumState.ts index c2de550bd7d..a0a4dc504a0 100644 --- a/ui/src/app/index/shared/sumState.ts +++ b/ui/src/app/index/shared/sumState.ts @@ -1,8 +1,8 @@ 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', 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/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/shared/components/chart/abstracthistorychart.ts b/ui/src/app/shared/components/chart/abstracthistorychart.ts index e0e569d889a..feaadfa5623 100644 --- a/ui/src/app/shared/components/chart/abstracthistorychart.ts +++ b/ui/src/app/shared/components/chart/abstracthistorychart.ts @@ -414,10 +414,10 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { text: dataset.label, datasetIndex: index, fontColor: getComputedStyle(document.documentElement).getPropertyValue('--ion-color-text'), - ...(dataset.backgroundColor != null && {fillStyle: dataset.backgroundColor.toString()}), + ...(dataset.backgroundColor != null && { fillStyle: dataset.backgroundColor.toString() }), hidden: isHidden != null ? isHidden : !chart.isDatasetVisible(index), lineWidth: 2, - ...(dataset.borderColor != null && {strokeStyle: dataset.borderColor.toString()}), + ...(dataset.borderColor != null && { strokeStyle: dataset.borderColor.toString() }), ...(dataset['borderDash'] != null && { lineDash: dataset['borderDash'] }), }); }); diff --git a/ui/src/app/shared/components/edge/edge.ts b/ui/src/app/shared/components/edge/edge.ts index 29a53ed556d..55ede05a5cf 100644 --- a/ui/src/app/shared/components/edge/edge.ts +++ b/ui/src/app/shared/components/edge/edge.ts @@ -1,12 +1,9 @@ // @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 { 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'; @@ -16,18 +13,20 @@ import { DeleteComponentConfigRequest } from '../../jsonrpc/request/deleteCompon 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, SystemLog, Websocket, EdgePermission } from '../../shared'; +import { ChannelAddress, EdgePermission, SystemLog, Websocket } from '../../shared'; import { Role } from '../../type/role'; -import { GetEdgeConfigResponse } from '../../jsonrpc/response/getEdgeConfigResponse'; -import { GetEdgeConfigRequest } from '../../jsonrpc/request/getEdgeConfigRequest'; +import { CurrentData } from './currentdata'; +import { EdgeConfig } from './edgeconfig'; export class Edge { 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 4db1a8ebaba..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 @@ -5,4 +5,4 @@ - \ No newline at end of file + 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 91fbe244d4b..8daaa2c37ac 100644 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts @@ -8,10 +8,9 @@ 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 { CurrentVoltageAsymmetricChartComponent } from "./chart/asymmetricMeter"; import { CurrentVoltageSymmetricChartComponent } from "./chart/symmetricMeter"; import { CurrentAndVoltageOverviewComponent } from "./currentVoltage.overview"; -import { CurrentVoltageAsymmetricChartComponent } from "./chart/asymmetricMeter"; @NgModule({ imports: [ 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/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/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-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-percentagebar/flat-widget-percentagebar.html b/ui/src/app/shared/components/flat/flat-widget-percentagebar/flat-widget-percentagebar.html index 8c5bb50478f..eba1a1964a0 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 @@ -7,4 +7,4 @@ {{ displayValue | unitvalue: '%' }} - \ No newline at end of file + 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/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/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..84185208942 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,5 +1,5 @@ // @ts-strict-ignore -import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { FieldWrapper } from '@ngx-formly/core'; @Component({ 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..64b6e3a1fd9 100644 --- a/ui/src/app/shared/components/formly/form-field.wrapper.ts +++ b/ui/src/app/shared/components/formly/form-field.wrapper.ts @@ -1,4 +1,4 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; import { FieldWrapper } from '@ngx-formly/core'; @Component({ 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-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/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..c66a5c192e0 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,4 +1,4 @@ -import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { FieldWrapper } from '@ngx-formly/core'; @Component({ 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.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/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.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/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/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/modal/abstractModal.ts b/ui/src/app/shared/components/modal/abstractModal.ts index 5c5ca8f55aa..78331d04b12 100644 --- a/ui/src/app/shared/components/modal/abstractModal.ts +++ b/ui/src/app/shared/components/modal/abstractModal.ts @@ -10,8 +10,8 @@ import { ChannelAddress, CurrentData, Edge, EdgeConfig, Service, Utils, Websocke 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 { 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/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-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-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-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-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/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/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/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.module.ts b/ui/src/app/shared/components/pickdate/pickdate.module.ts index 4cf6632c20b..c555a743cac 100644 --- a/ui/src/app/shared/components/pickdate/pickdate.module.ts +++ b/ui/src/app/shared/components/pickdate/pickdate.module.ts @@ -3,10 +3,9 @@ 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'; -import { AngularMyDatePickerModule } from '@nodro7/angular-mydatepicker'; @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/shared/converter.ts b/ui/src/app/shared/components/shared/converter.ts index bb3318e2621..94f0c2a7635 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"; 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/oe-formly-component.ts b/ui/src/app/shared/components/shared/oe-formly-component.ts index 50516a057d5..a463642482f 100644 --- a/ui/src/app/shared/components/shared/oe-formly-component.ts +++ b/ui/src/app/shared/components/shared/oe-formly-component.ts @@ -3,8 +3,7 @@ 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"; 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..3894b66e66b 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,13 +1,12 @@ 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', () => { const testComponent = new EdgeConfig.Component("test", {}, { diff --git a/ui/src/app/shared/directive/directive.ts b/ui/src/app/shared/directive/directive.ts index 619719018a9..cd1e4561875 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 { VarDirective } from './ngvar'; @NgModule({ imports: [ 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..170c5b8af7f 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 { ChannelAddress } from "../../../shared/type/channeladdress"; import { format } from 'date-fns'; +import { Resolution } from "src/app/edge/history/shared"; +import { ChannelAddress } from "../../../shared/type/channeladdress"; 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. diff --git a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest.ts b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest.ts index c81fd430687..af0a86a679c 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 { ChannelAddress } from "../../type/channeladdress"; import { format } from 'date-fns'; +import { Resolution } from "src/app/edge/history/shared"; +import { ChannelAddress } from "../../type/channeladdress"; 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. diff --git a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest.ts b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest.ts index cd44298b563..054c45038b6 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 { ChannelAddress } from "../../type/channeladdress"; import { format } from 'date-fns'; +import { ChannelAddress } from "../../type/channeladdress"; import { JsonrpcRequest } from "../base"; import { JsonRpcUtils } from "../jsonrpcutils"; 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/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/pipe/unitvalue/unitvalue.pipe.spec.ts b/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.spec.ts index bba039ef456..d6c567b4fa1 100644 --- a/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.spec.ts +++ b/ui/src/app/shared/pipe/unitvalue/unitvalue.pipe.spec.ts @@ -1,7 +1,7 @@ import { DecimalPipe, registerLocaleData } from "@angular/common"; import localDE from '@angular/common/locales/de'; -import { UnitvaluePipe } from "./unitvalue.pipe"; import { Language } from "../../type/language"; +import { UnitvaluePipe } from "./unitvalue.pipe"; describe('UnitvaluePipe', () => { registerLocaleData(localDE); diff --git a/ui/src/app/shared/service/service.ts b/ui/src/app/shared/service/service.ts index a0efd655628..1cd5bdfb98a 100644 --- a/ui/src/app/shared/service/service.ts +++ b/ui/src/app/shared/service/service.ts @@ -9,7 +9,6 @@ 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'; 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/shared.module.ts b/ui/src/app/shared/shared.module.ts index 7d6fc9ccbd2..de8f4e59542 100644 --- a/ui/src/app/shared/shared.module.ts +++ b/ui/src/app/shared/shared.module.ts @@ -10,7 +10,6 @@ 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'; diff --git a/ui/src/app/shared/type/language.ts b/ui/src/app/shared/type/language.ts index 4737bf4510a..2a4f71af9c7 100644 --- a/ui/src/app/shared/type/language.ts +++ b/ui/src/app/shared/type/language.ts @@ -2,8 +2,8 @@ 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 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'; @@ -11,8 +11,8 @@ 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 nl from 'src/assets/i18n/nl.json'; interface Translation { [key: string]: string | Translation; diff --git a/ui/src/app/shared/type/widget.ts b/ui/src/app/shared/type/widget.ts index f91e01905fd..367bc6fac51 100644 --- a/ui/src/app/shared/type/widget.ts +++ b/ui/src/app/shared/type/widget.ts @@ -75,7 +75,6 @@ export class Widgets { } public static parseWidgets(edge: Edge, config: EdgeConfig): Widgets { - const classes: string[] = Object.values(WidgetClass) // .filter(v => typeof v === 'string') .filter(clazz => { 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..363937cb827 100644 --- a/ui/src/app/user/user.component.ts +++ b/ui/src/app/user/user.component.ts @@ -2,10 +2,9 @@ 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 { FormlyFieldConfig } from '@ngx-formly/core'; import { environment } from '../../environments'; import { GetUserInformationRequest } from '../shared/jsonrpc/request/getUserInformationRequest'; import { SetUserInformationRequest } from '../shared/jsonrpc/request/setUserInformationRequest'; diff --git a/ui/src/assets/i18n/de.json b/ui/src/assets/i18n/de.json index 6f0d3426a53..3096991606a 100644 --- a/ui/src/assets/i18n/de.json +++ b/ui/src/assets/i18n/de.json @@ -974,4 +974,4 @@ "APP": { "FUNCTIONALITY_TEMPORARILY_NOT_AVAILABLE": "Diese Funktion ist vorübergehend in der App nicht verfügbar, verwenden Sie bitte dafür die Web-App." } -} \ No newline at end of file +} diff --git a/ui/src/assets/i18n/en.json b/ui/src/assets/i18n/en.json index 99aa7e38184..45f7388ab29 100644 --- a/ui/src/assets/i18n/en.json +++ b/ui/src/assets/i18n/en.json @@ -977,4 +977,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/global.scss b/ui/src/global.scss index f29dac900c2..e0007c5fbe7 100644 --- a/ui/src/global.scss +++ b/ui/src/global.scss @@ -250,6 +250,7 @@ formly-input-section { .alert-button-group { justify-content: space-between; + .alert-button { color: $primary-color; font-size: small; diff --git a/ui/src/main.ts b/ui/src/main.ts index 43c16a32c32..001a8fbd192 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 { environment } from 'src/environments'; if (environment.production) { enableProdMode(); diff --git a/ui/src/polyfills.ts b/ui/src/polyfills.ts index 5aacd21714a..9c6628376e2 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` @@ -57,7 +57,7 @@ import './zone-flags'; /*************************************************************************************************** * Zone JS is required by default for Angular itself. */ -import 'zone.js/dist/zone'; // Included with Angular CLI. +import 'zone.js/dist/zone'; // Included with Angular CLI. /*************************************************************************************************** diff --git a/ui/src/test.ts b/ui/src/test.ts index d8e68564e1b..2d851fa6be3 100644 --- a/ui/src/test.ts +++ b/ui/src/test.ts @@ -8,6 +8,7 @@ // 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 { BrowserDynamicTestingModule, 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 +} From d00e0e9ea6063a35863548763341b7295ab160b3 Mon Sep 17 00:00:00 2001 From: Felix S <39899210+DerStoecki@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:06:23 +0200 Subject: [PATCH 05/28] UI: AppCenter Index: Refresh after install/delete of an App (#2533) * Refresh Index after install/delete User gets feedback after installing an app. (Manual refresh was nec. before) Admins get Feedback after removing an app due to auto refresh. * renamed installedAnApp to appInstanceChange * added a takeUntil as suggested in the code review to unsubscribe --- ui/src/app/edge/settings/app/index.component.ts | 15 +++++++++++++-- ui/src/app/edge/settings/app/install.component.ts | 3 ++- ui/src/app/edge/settings/app/update.component.ts | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/ui/src/app/edge/settings/app/index.component.ts b/ui/src/app/edge/settings/app/index.component.ts index 328e4f384f5..7540ea72633 100644 --- a/ui/src/app/edge/settings/app/index.component.ts +++ b/ui/src/app/edge/settings/app/index.component.ts @@ -1,10 +1,10 @@ // @ts-strict-ignore import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +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 { takeUntil } from 'rxjs/operators'; +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'; @@ -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 { diff --git a/ui/src/app/edge/settings/app/install.component.ts b/ui/src/app/edge/settings/app/install.component.ts index 18468365653..49d5591524b 100644 --- a/ui/src/app/edge/settings/app/install.component.ts +++ b/ui/src/app/edge/settings/app/install.component.ts @@ -180,7 +180,8 @@ export class InstallAppComponent implements OnInit, OnDestroy { } 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 }))) .finally(() => { diff --git a/ui/src/app/edge/settings/app/update.component.ts b/ui/src/app/edge/settings/app/update.component.ts index 361070f1e21..a5cb88b67ea 100644 --- a/ui/src/app/edge/settings/app/update.component.ts +++ b/ui/src/app/edge/settings/app/update.component.ts @@ -138,7 +138,8 @@ export class UpdateAppComponent implements OnInit { })).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/']); + 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 }))) .finally(() => { From d1b10125c320c59710e13749cc49687928fb438d Mon Sep 17 00:00:00 2001 From: Hannes Date: Thu, 22 Aug 2024 14:20:12 +0200 Subject: [PATCH 06/28] Fix for Configuration & Status not populated Fully (#2738) * Update edgeconfig.ts * Update edgeconfig.ts * Removed Comments for concat --- ui/src/app/shared/components/edge/edgeconfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/app/shared/components/edge/edgeconfig.ts b/ui/src/app/shared/components/edge/edgeconfig.ts index 345c440e2cf..020caa6d9eb 100644 --- a/ui/src/app/shared/components/edge/edgeconfig.ts +++ b/ui/src/app/shared/components/edge/edgeconfig.ts @@ -588,7 +588,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, From 21633deedb7586854a6a76850196e59ec2e3321f Mon Sep 17 00:00:00 2001 From: "Kai J." Date: Sun, 25 Aug 2024 22:21:17 +0200 Subject: [PATCH 07/28] UI: fix percentagebar svg (#2732) --- .../edge/live/common/storage/storage.component.html | 6 +++--- .../flat-widget-percentagebar.html | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) 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 ad219c8d17f..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 @@ - + 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 eba1a1964a0..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,8 +1,8 @@ - - - - + + + {{ displayValue | unitvalue: '%' }} From 6116728aa0b0ec8cf07c8f09cf0cfae484702213 Mon Sep 17 00:00:00 2001 From: Saeedniko <118315460+saeedniko@users.noreply.github.com> Date: Wed, 28 Aug 2024 11:27:08 +0200 Subject: [PATCH 08/28] Docs: use openems.io-theme repository in openems (#2754) Use https://github.com/OpenEMS/openems.io-theme as theme for the OpenEMS Docs Antora page at https://openems.github.io/openems.io/openems/latest/ --- doc/build/site.yml | 4 ++-- doc/build/uibundle_openems.zip | Bin 580960 -> 0 bytes .../ROOT/pages/backend/backend-to-backend.adoc | 1 - doc/modules/ROOT/pages/backend/build.adoc | 1 - doc/modules/ROOT/pages/backend/deploy.adoc | 1 - doc/modules/ROOT/pages/backend/metadata.adoc | 1 - doc/modules/ROOT/pages/backend/service.adoc | 1 - doc/modules/ROOT/pages/backend/timedata.adoc | 1 - .../pages/component-communication/index.adoc | 1 - .../pages/contribute/coding-guidelines.adoc | 1 - .../ROOT/pages/contribute/documentation.adoc | 1 - doc/modules/ROOT/pages/coreconcepts.adoc | 1 - doc/modules/ROOT/pages/edge/architecture.adoc | 1 - doc/modules/ROOT/pages/edge/bridge.adoc | 1 - doc/modules/ROOT/pages/edge/build.adoc | 1 - doc/modules/ROOT/pages/edge/configuration.adoc | 1 - doc/modules/ROOT/pages/edge/controller.adoc | 1 - doc/modules/ROOT/pages/edge/deploy.adoc | 1 - .../ROOT/pages/edge/device_service.adoc | 1 - doc/modules/ROOT/pages/edge/implement.adoc | 1 - doc/modules/ROOT/pages/edge/nature.adoc | 1 - doc/modules/ROOT/pages/edge/scheduler.adoc | 1 - doc/modules/ROOT/pages/edge/timedata.adoc | 1 - doc/modules/ROOT/pages/gettingstarted.adoc | 1 - doc/modules/ROOT/pages/intellij.adoc | 1 - doc/modules/ROOT/pages/simulation/gitpod.adoc | 1 - .../ROOT/pages/simulation/realtime.adoc | 1 - .../ROOT/pages/simulation/ui-history.adoc | 1 - doc/modules/ROOT/pages/ui/architecture.adoc | 1 - doc/modules/ROOT/pages/ui/build.adoc | 1 - .../ui/implementing-a-widget/introduction.adoc | 1 - doc/modules/ROOT/pages/ui/setup-ide.adoc | 1 - 32 files changed, 2 insertions(+), 32 deletions(-) delete mode 100644 doc/build/uibundle_openems.zip diff --git a/doc/build/site.yml b/doc/build/site.yml index 876e6391607..be6edfdcade 100644 --- a/doc/build/site.yml +++ b/doc/build/site.yml @@ -6,14 +6,14 @@ site: content: sources: - - url: ./../../ + - url: https://github.com/OpenEMS/openems.git edit_url: https://github.com/OpenEMS/openems/tree/{refname}/{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 2ed7adc83ec03e5b88208014814702f6b9060e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580960 zcma(1bC54g5G9EIx^LUIZQHhO+xBhSwr%%q+qP}n-fw0%-kTRYFLo;`GxD!f6({RN zWM!3t^dAr?!2cMo?i(8aGx)z8Bmf8CYH8$ZXJTVYuc`tG_|uKxW7hYdxq3hYfI!av z0095fDg1vRBt8CrArSvp2pdCBdsi3d{}W0R(Z?+4Kl|T6q5QW#1i%UmRyKy{I|>O1 z0LcH(F#dN?EDS7k7Dmqhb8~0y4%(&vcSP9)S^EJ7n9$oVD0=RCNorH1Fi6(!tHZVe z%QRf!OC)Q{KrHm&!mn3SP!c)M?-5^{_2uo&)yvu26I_X#z3*Eeqw1xC-tuIP5LUY=iUItns2jj%bgBRIS*fOpH_u*slL5{nO4C_MXy+Yg2@#OqQ3dC$=h#3gI6!)367 z61uT!?*6G*=oLPUMe&^v(;2G~mKOY)B;tU??##VdLu`Xh7d^QilI0A7)tGk#qkVZ- zZTUvW3rLLOj(O?9JbKmfMJXUmB{4`Zp?i$3CF3i4BG@JD!6(k|f28aG%W)z^RI>Ab z{3`yJO`QK7$0nv`hORa)|4%%}B=yS;{tupcLLk8fjHtH|tjG!XV1)dK7>jSL5=fPe z(n~3B4x*8d7fGuMG&F>d~$&`x$mFLnr^ z5o}rTJd)~iWadOaOiX~T9^&4&vc!c}SYgOq>L|?ItQ>Jy;uz;A7YI!+&h;Q=RWn~) z1R5T~GA9h?Vmx&)!KFFIDdU6>iz5Sn-gk^<4E|%)hipH=I4}$v%rFzIpnzymRM4H4J)Ni3%bYWqP zoke@TOIO#Xr>Xvliza+d{ww`N-L=`vVw2+|bh=3J-O;Kv$}MwhF*m-%;?zA=2=W8& zd@50tblf8*&htOfnL@?_oyY)e zVh;b)Fa7tIkdTTD4getiRsRa0)F9C44lWFwfNzBa_-_LN>g|Ixys43>tOfvpp)2^f zyC6q6;~_IpR4_9D!0B~V{vAA&PMU<7%uTEp0H9dGmxToYh&JQ&IxG)PgdhL{_&*jd zzkiVF+M?g-p}7G7u{-hCN0|KDJNN}EXyQ|ReT_7H*sEUvlE0DRrR9$@3;@tp1pr)5 zLqYAaODl87<((}2SomH5=+7|f2~y3(O8K|^cKd(u`5sPkX#B?T?H)$S-he2dU_B~I zawh$H(g1)vd0dIfxsvR_nxJucO|APfTxstyc`)`%TF|4s_c4VZNAj=Bt{Y%cU(Srb$El0|r58U3ip>ErWt2+?9~mK@ zi0p0m)z(4Ou#JXQflu3?0HlxsbtlZ55be&<%vMCSW5vD+V-=$lBLU+yy;3fYeG-q~ zG@D%p*sFNJ- zL`FeK!APi%HuIYOK9qkyBD{a}$o1&+Z7kFbKB>|xgm1I#lM>SeJkpou!L7~h64|D#Q8qV)4ruT?MK)4prpwxCYP^1}Ls_WFSwAJI%7;=Hrs{3N2YcGW*Kms ze-$KvV38K0n~uW~AA@>sm1CIq)znRLY&abD9QG0v3Xu}wZvRFIf0^KE{+}m}^d^r2 z$0ixX?6%`ZgChjt+~?_p!I;_WYa_wth_5^l@kxK*y>-}*dH?Yy>CObkIAo$j6U2-uJ)Gol(C-7*P6bT0h=}(j-myL}=WK4~|wX=aU7Q-!s zwi~tH3*6QX)*#eVpGYU=RC1`@Z3JuD&$c(QLW@pg5@L+kFP99w;IrOm?jI|;%SK7s zvE5#Df$t2qs$Dn?#EGz<7$V0z}`f$i~s(QLJFgQs$u>4cqC zFzFpJlOGWYELvzMJbY7f<=C6ZRpGaG^w`Fr-j@mza*;-`2}+o(;S*$inbM2wi6b?P z=7;e&QOcS_g-li)rV1#g4Dl9-aPwrJ`O<{*@uU@`aGJ&uVVRY4f`56n&*l|qr3(&G z#1~27>XkEG@m8V)cID)Dp~547E2C~c#k#dHhm)_piy}M>AIVwdrE6y&Sii$CMvq@R z&*mgwVy&^F+KGlO9OV*q=^WKk!=%{wHc7*2czZRSv#AW}H8Y_@SR|n`L}%7~a2D_! z$ys&FIC7~Sh1{#{9T!{3*T*uuH1Fk-T*|SYdl=5xT|tOboLr$Sl!WW}7&}?~&@>rz z3vt*tx#b-NvX_n^*BiVw^vx2Fu3`({uU62Y0@qeUok=%}zcZ1o)A=M+e#o5IBq8yC5Tz;Rp!&U?7l#Y&DC# zQKk5F^l*x3@q@@~&#mHF(Vd}lr*PaS989Ut%jkj{O=|CFFF(~V&goql+$Lh-r`lHN zao~c^l9h}SvZ$gxx`!)KNT6Y&anWUf<$x-Dw&oSxNT5vUb+^N)&(ls*8x}ip`(@O! z$u81S!q*YgBh%GgVG7hG3(>sPwd?3jRV>6|iM0^!fz!c6=hzqhQ*4zQQa-1CH>S-J z?0030D{ObAub;xm`fQsZmbqTmWb?sm3OvPjr7aAk4DzYH zP>~@d5beV~XDz<&_I7*y1&7yr{T}zDnqqvmzQ4Eo3H$oT!`BAC3=M1OuooE>85!jR z;aRI#IWZ`KL}&mL3>c}uMmStROqtf;5S!cx-v50xw*^RR<&nhc0swM=K+==|XL zXV9=E+ya_PPxhH9;{i+CCYR-mGs|_F93bXRSknvvKYE3?38BxZrdG2$ z+v2aGEvJkRLoBr%r_PNfIn;S8lQr)Y`k`g9%if18oTc583=rDlG?gJ{vv77~U4X>l8TXKB)>pYA=h4McFQij5Bi&kv1pL4#`MH zQy0NBNL2up`o)w7G@&a6Yw~IVdSfAUrFLUOxpAX*(M5Jgwone6p!K&{ znTh?kjvd!Q6WGWTxBGm!cMI4|3%ACjH(nV^8@Eup4`PFG@prN5uHPvExCQ4}@t2WN zXrgv$&D0yqYXtNpm6j(~6tV`Ug_5=^!KkCqD;B2VfR}56}hRk3UZz z0tAWzB*vFwzAq-QLO>HBd{+n1R>uNhfbNSyL5miDmz)~=z`t01v97g8_(K&hDFQwH8OXF| zcH4{U!q&1a(Iv*V7!-}W&NDGN0on=yt_u!7iGiO#PDXsrT8eCG0q>2~^p{B( zQDUSs#|kv@fY%;3}Js$F74H$P#Lge{CWsWRoQXV!LP=-2wz3UI|my(v>8va zLJjp@#!TjPHOrduEt(%H=TE{kGWkS-1;wV4t56NnVVg-K*2I=zl0i^>K!=Y}0N#s)DU*d|S@G@oIB!I(?e@$PIAj9q^l&esrL9MDE z2k0u0`+2{4vf>)%tp zocRvb8Epr9^NDIv6VYKk2rLG{mhxCFK&Uu#U0%@NYYl1STf`+R?$9m~UY}3Q$Df=6 z8{&4QZnQ__giyxo>V{7IG>Hd8xcdsW?@u@cz>cx5SU?m!dGb-aiTCYFt|k)7wQEbV zas9JlCyFnf?kmw6L6~Tt_?T3|QDhr0yPe-g`2GGHKPu8qmQ-R)#hxHeTbT3yVO#jd zVyUsIeJN>eO{rJC-(x4kMGx_fsY-w3@JdT-vnaACMwV9F`X36Om>wm(SIMd^c~1r$ z30`=8;XC`EnQIZq#4kEp3B4SF`a*iBZeSSLmb3I=to@o#-HmRml`Mk`Id7wN-Pk>g zD;9DtND+th%H5crpUy5w@ykxifm!PU&G{y;iwV}8x=PjOC2!b@npx7YV3<%EGIri_ zH>U)+jS0zRcx~AiM9iY`z=*Zxeg@0bZ(mzk7Su%ZOxvu!+Q8n6=T=GIo}&l-aN)EEqVRSW0^A{4=#=T zxAFv6&=&sb;Cw*^H=9vm)e0g4c?x(lktb;#hDTb)P(tT~Y$U(+C=PjZsx=87vp>OVu;hEY#`cab|gS#x%cMK-4f7 z`6R1mt@-0A^Vw(BS#TiMp-q2fK4dsVZ70#S9V}<;GVLbl%_E8WTIJb#{ADjCVm2?pdWw=y>=S*ejMN+X|(}%+7aSYVhc7BG?4@Y>;0Lp!)lC!wp*zwa; zD6QT^G9g;{r&j$c@4?YvrSEIP0x}oy#MKH zkl(4-u}v=PaROtE&ty{kZvsP^L^}2~(_jb<9B{GX9B(I@L z5}fPB-<{3NJCrRX*WG~0g7$V(nxsXyO_xz$Unjp~fTm_FOl&TjX^57cPlT+TEl%_s%;-#*lm&a{Ix4{qg4%LT*dUT<;MSQHjo0 zl<{8+j1zn?2wycvqP%(76;TWv+JcJ+oUN3rw+*BN`5UB2uzTL8IB-){Bfr`k1t94 z!Tp(wW|E{v%Z-45!MPz;3;Gd4f%~?Ug6}JXi;cD5u_k2htsKwJ9`#a}K+F?B$fH~d zgZ8n*JznDo80B5}l-?p3IJ?v34R!7x2~wHTWkPXY2_Ki;_nfT2;406$XwQ)Z16EGx5@nD;3UB0yp5A-tRioP* zIAP?wX1R~tH|K@1?`p61fMsUPy(A0w&Mz49>1F%IhL<^0b8`nm=AgDEmxzJ#RHmrg zaD*C;<)nkLW*dp41>AmAs>2$~B|RfDVp+qK*)}6UFsXcQ9Ti|32Blc?wC#9=TW%A4 zD{Tfl#{dCa)}EOcjOj|01L=o-WwbqR#u0#miXwoIsb$w|dv!)I8Pqmo(oSi!mss8| zaOH!EgYWW7#b*I+P>JdbHAX!%xIThv+PIfhpnw%CLFnV;fyq=iZV-J+W-yzilag7c zMlhl!y#H4MnN)e}auJV5`x=yqArG5YIS>y8sNyzIHAzOXUV3ei_h}_7@aog|Cg(`g z#oZOmoXZHBb=vP|h1-}X&GF~C--}RWTi^7sM`_<)6Q8a2gP(8jht3ctxJukNle!h+ z<+w+EAFihh4McbB(NyN!%nKqal(7X^u{?+>F!G(yW9`LTX$DhNX(2WJgTfj|N307f zSosbR8|aO!d5{fkjsj|hZ8>o;Hg>?O^;^B_w6&V4Uu^590PO)`Ob z)5|Nul{(&NFYkgwj^7~74vlK zvs$FeU+G+f$?Q`9e(ZZm+wwGyfOQ6{+V_IxvFmnx`VG25oN&{$B%|b1Tst<~_J3`= z^yMlzy$uxZgVSE-5`*I4W0H>@5-y16kB{fpJ739JG`WGbQ&Sj8E9!?}#)m+IV*sux z$n*F$aC+{`s-%#p@G!?NU?gcl@Wo@}4%H3Gr)D|nB8ZM~xH`HsOVCKYl?l6wVA<(7HWPYgL^r+EicPA*9 zA)w7HYyaM%kdG$m)k9B*90l)??(W+;sRIv&&9Eu)YPjVuEwHt#j4xYN)`NJ~rS$ zq*XHf-4TwMrRJyFabpGclY&o$pRF*7EYkFXQH>+EpP8N`u@>efZW$R$Q8cjhUj+++ zK0*4$4SEpY22r&x{O#aj-j2uYwBnVFHu*uXsc5+Bnoal}HXwLQGLP{}8!QBdmmd^q z=2fLsuMa`JBBV~sw7BMYeQi1rhWeWe%4v=5?9!$6x;c3n%OHJY?yzPNQE#AHy=;D5 z=pr5M27x_T&fj}IaIaCGZDO2+J{~y|v1_&D@Kcq3e(m39VR^T}*I~8%ts3EnSYAOP za+5~j5xB-X@~Fzl8>d77jq*n!l@Q+a2EL9KA7^K>A$|2}@>S zdO4>GiD{6{=ZDg21I5K57UcK{QRLt>oBER?nj6oyk3kMAxCy3B7Q>DC>ELP^B6gB+ zho$Y?zcY=2(^1s;sr$Iid(*|0B>x`oEL+t7w>e|-26tus79aJ}Zy6gU3FgY+`TqHd zHq|bblUc|(4oEsbTUg9e+bSh$WC@lgha5P-q|E#UUTB^!Xk${ z>5uV!Z%}+lv61y$9p$fE>+%iR=$2Q6D)hGsLtYXR->$f|& zjUFx2Tslb5r59Joxg4XeWVd~IEn`F(09Q?Hw+$V9Uy-Fd$VmR!kS|SUMV$H{Wfl%v z&0C12>u+@PZVh;dX&ZqMHRi9pgVA#7sqf3+DQZl$N~{ z1+aa@C9-c$>9Kak#edv&?fX3v5{b)`RW3BU%gQz6sknN<@p_XF3b0qNUA759g_T

wZfb8zH@0qP@&;#4KcuWF?4odv?!`KP%N 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

N<&W)1-!~8a#Md^kcw$ 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%0D%nx$Y|36j1jnOoGP^9uCl~#%9+hQ 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

_8t_<0iNL1 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 Date: Thu, 29 Aug 2024 09:38:03 +0200 Subject: [PATCH 09/28] Fix build (#2759) --- build.gradle | 13 ++++++++++--- doc/antora.yml | 2 +- doc/build.gradle | 11 ++++++++--- doc/build/site.yml | 4 ++-- io.openems.edge.evcs.spelsberg/readme.adoc | 6 +++--- 5 files changed, 24 insertions(+), 12 deletions(-) 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/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 be6edfdcade..79e4816da4f 100644 --- a/doc/build/site.yml +++ b/doc/build/site.yml @@ -6,8 +6,8 @@ site: content: sources: - - url: https://github.com/OpenEMS/openems.git - edit_url: https://github.com/OpenEMS/openems/tree/{refname}/{path} + - url: ./../../ + edit_url: https://github.com/OpenEMS/openems/tree/develop/{path} branches: HEAD start_path: doc 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 From fae53c21520df849343e7316376be61bca043b95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:54:16 +0200 Subject: [PATCH 10/28] Build(deps): Bump org.jetbrains.kotlin:kotlin-osgi-bundle from 2.0.0 to 2.0.20 in /cnf (#2758) * Build(deps): Bump org.jetbrains.kotlin:kotlin-osgi-bundle in /cnf Bumps org.jetbrains.kotlin:kotlin-osgi-bundle from 2.0.0 to 2.0.20. --- updated-dependencies: - dependency-name: org.jetbrains.kotlin:kotlin-osgi-bundle dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bndrun --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 5483a448725..0b8026955b7 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -301,7 +301,7 @@ org.jetbrains.kotlin kotlin-osgi-bundle - 2.0.0 + 2.0.20 org.jetbrains.kotlinx diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 1d0b0dde4e4..86353f9f27a 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -113,7 +113,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)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 46f4680d966..e1209754dfa 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -414,7 +414,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)',\ From 0e0aabf0366c7973bca430e39b992a3140add59a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:07:55 +0200 Subject: [PATCH 11/28] Build(deps): Bump io.reactivex.rxjava3:rxjava from 3.1.8 to 3.1.9 in /cnf (#2753) * Build(deps): Bump io.reactivex.rxjava3:rxjava in /cnf Bumps [io.reactivex.rxjava3:rxjava](https://github.com/ReactiveX/RxJava) from 3.1.8 to 3.1.9. - [Release notes](https://github.com/ReactiveX/RxJava/releases) - [Commits](https://github.com/ReactiveX/RxJava/compare/v3.1.8...v3.1.9) --- updated-dependencies: - dependency-name: io.reactivex.rxjava3:rxjava dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bndrun --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 0b8026955b7..2f0d9bd5be2 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -142,7 +142,7 @@ io.reactivex.rxjava3 rxjava - 3.1.8 + 3.1.9 diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 86353f9f27a..7df1c1145b4 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -100,7 +100,7 @@ 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-compress;version='[1.26.2,1.26.3)',\ org.apache.commons.commons-csv;version='[1.10.0,1.10.1)',\ org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index e1209754dfa..603edfffe9b 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -393,7 +393,7 @@ 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-compress;version='[1.26.2,1.26.3)',\ From b650e888a40f4e15d482fdc3eaeb310a4dad838c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:29:44 +0200 Subject: [PATCH 12/28] Build(deps): Bump com.influxdb:influxdb from 7.1.0 to 7.2.0 in /cnf (#2744) * Build(deps): Bump com.influxdb:influxdb-client-core in /cnf Bumps [com.influxdb:influxdb-client-core](https://github.com/influxdata/influxdb-client-java) from 7.1.0 to 7.2.0. - [Release notes](https://github.com/influxdata/influxdb-client-java/releases) - [Changelog](https://github.com/influxdata/influxdb-client-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-java/compare/v7.1.0...v7.2.0) --- updated-dependencies: - dependency-name: com.influxdb:influxdb-client-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Build(deps): Bump com.influxdb:flux-dsl from 7.1.0 to 7.2.0 in /cnf Bumps [com.influxdb:flux-dsl](https://github.com/influxdata/influxdb-client-java) from 7.1.0 to 7.2.0. - [Release notes](https://github.com/influxdata/influxdb-client-java/releases) - [Changelog](https://github.com/influxdata/influxdb-client-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-java/compare/v7.1.0...v7.2.0) --- updated-dependencies: - dependency-name: com.influxdb:flux-dsl dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Build(deps): Bump com.influxdb:influxdb-client-java in /cnf Bumps [com.influxdb:influxdb-client-java](https://github.com/influxdata/influxdb-client-java) from 7.1.0 to 7.2.0. - [Release notes](https://github.com/influxdata/influxdb-client-java/releases) - [Changelog](https://github.com/influxdata/influxdb-client-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-java/compare/v7.1.0...v7.2.0) --- updated-dependencies: - dependency-name: com.influxdb:influxdb-client-java dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Build(deps): Bump com.influxdb:influxdb-client-utils in /cnf Bumps [com.influxdb:influxdb-client-utils](https://github.com/influxdata/influxdb-client-java) from 7.1.0 to 7.2.0. - [Release notes](https://github.com/influxdata/influxdb-client-java/releases) - [Changelog](https://github.com/influxdata/influxdb-client-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-java/compare/v7.1.0...v7.2.0) --- updated-dependencies: - dependency-name: com.influxdb:influxdb-client-utils dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update bnd --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 8 ++++---- io.openems.backend.application/BackendApp.bndrun | 4 +++- io.openems.edge.application/EdgeApp.bndrun | 4 +++- io.openems.wrapper/influxdb-client-core.bnd | 4 ++-- io.openems.wrapper/influxdb-client-java.bnd | 4 ++-- io.openems.wrapper/influxdb-client-utils.bnd | 4 ++-- io.openems.wrapper/influxdb-flux-dsl.bnd | 4 ++-- 7 files changed, 18 insertions(+), 14 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 2f0d9bd5be2..6e19ea4a87e 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -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 diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 7df1c1145b4..11760f6ee1e 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -101,8 +101,10 @@ io.openems.wrapper.retrofit-converter-scalars;version=snapshot,\ io.openems.wrapper.retrofit2;version=snapshot,\ 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)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 603edfffe9b..e317511eab6 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -396,8 +396,10 @@ 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)',\ 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,\ From 8edaa796b373b76001045237fb9a7810235b9a47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 21:58:11 +0200 Subject: [PATCH 13/28] Build(deps): Bump @capacitor/core from 5.7.7 to 5.7.8 in /ui (#2741) Bumps [@capacitor/core](https://github.com/ionic-team/capacitor) from 5.7.7 to 5.7.8. - [Release notes](https://github.com/ionic-team/capacitor/releases) - [Changelog](https://github.com/ionic-team/capacitor/blob/5.7.8/CHANGELOG.md) - [Commits](https://github.com/ionic-team/capacitor/compare/5.7.7...5.7.8) --- updated-dependencies: - dependency-name: "@capacitor/core" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 9 ++++----- ui/package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index 43a20ab0945..03807d1468f 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -20,7 +20,7 @@ "@capacitor-community/file-opener": "^1.0.5", "@capacitor/android": "5.7.7", "@capacitor/app": "^5.0.6", - "@capacitor/core": "5.7.7", + "@capacitor/core": "5.7.8", "@capacitor/filesystem": "^5.2.0", "@capacitor/ios": "5.7.7", "@capacitor/splash-screen": "^5.0.6", @@ -3740,10 +3740,9 @@ } }, "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==", - "license": "MIT", + "version": "5.7.8", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.7.8.tgz", + "integrity": "sha512-rrZcm/2vJM0WdWRQup1TUidbjQV9PfIadSkV4rAGLD7R6PuzZSMPGT0gmoZzCRlXkqrazrWWDkurei3ozU02FA==", "dependencies": { "tslib": "^2.1.0" } diff --git a/ui/package.json b/ui/package.json index 667c971c560..32b1c126036 100644 --- a/ui/package.json +++ b/ui/package.json @@ -15,7 +15,7 @@ "@capacitor-community/file-opener": "^1.0.5", "@capacitor/android": "5.7.7", "@capacitor/app": "^5.0.6", - "@capacitor/core": "5.7.7", + "@capacitor/core": "5.7.8", "@capacitor/filesystem": "^5.2.0", "@capacitor/ios": "5.7.7", "@capacitor/splash-screen": "^5.0.6", From a3a0f967d661f2659378d9dc8adc2d9480bfd6c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 21:58:29 +0200 Subject: [PATCH 14/28] Build(deps): Bump @capacitor/ios from 5.7.7 to 5.7.8 in /ui (#2748) Bumps [@capacitor/ios](https://github.com/ionic-team/capacitor) from 5.7.7 to 5.7.8. - [Release notes](https://github.com/ionic-team/capacitor/releases) - [Changelog](https://github.com/ionic-team/capacitor/blob/5.7.8/CHANGELOG.md) - [Commits](https://github.com/ionic-team/capacitor/compare/5.7.7...5.7.8) --- updated-dependencies: - dependency-name: "@capacitor/ios" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 9 ++++----- ui/package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index 03807d1468f..94fc0190729 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -22,7 +22,7 @@ "@capacitor/app": "^5.0.6", "@capacitor/core": "5.7.8", "@capacitor/filesystem": "^5.2.0", - "@capacitor/ios": "5.7.7", + "@capacitor/ios": "5.7.8", "@capacitor/splash-screen": "^5.0.6", "@ionic-native/core": "^5.36.0", "@ionic-native/file-opener": "^5.36.0", @@ -3757,10 +3757,9 @@ } }, "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==", - "license": "MIT", + "version": "5.7.8", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.7.8.tgz", + "integrity": "sha512-XhGrziBnlRmCJ97LdPXOJquHPpYTwSJZIxYSXuPl7SDDuAEve8vs2wY76gLdaaFH2Z6ctdugUX+jR6VNu+ds+w==", "peerDependencies": { "@capacitor/core": "^5.7.0" } diff --git a/ui/package.json b/ui/package.json index 32b1c126036..5db7462df40 100644 --- a/ui/package.json +++ b/ui/package.json @@ -17,7 +17,7 @@ "@capacitor/app": "^5.0.6", "@capacitor/core": "5.7.8", "@capacitor/filesystem": "^5.2.0", - "@capacitor/ios": "5.7.7", + "@capacitor/ios": "5.7.8", "@capacitor/splash-screen": "^5.0.6", "@ionic-native/core": "^5.36.0", "@ionic-native/file-opener": "^5.36.0", From 4c577bc65f5acc1d54164e28786c1cc5275ae4ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:16:23 +0200 Subject: [PATCH 15/28] Build(deps): Bump @capacitor/android from 5.7.7 to 5.7.8 in /ui (#2749) * Build(deps): Bump @capacitor/android from 5.7.7 to 5.7.8 in /ui Bumps [@capacitor/android](https://github.com/ionic-team/capacitor) from 5.7.7 to 5.7.8. - [Release notes](https://github.com/ionic-team/capacitor/releases) - [Changelog](https://github.com/ionic-team/capacitor/blob/5.7.8/CHANGELOG.md) - [Commits](https://github.com/ionic-team/capacitor/compare/5.7.7...5.7.8) --- updated-dependencies: - dependency-name: "@capacitor/android" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Build(deps): Bump @capacitor/android from 5.7.7 to 5.7.8 in /ui Bumps [@capacitor/android](https://github.com/ionic-team/capacitor) from 5.7.7 to 5.7.8. - [Release notes](https://github.com/ionic-team/capacitor/releases) - [Changelog](https://github.com/ionic-team/capacitor/blob/5.7.8/CHANGELOG.md) - [Commits](https://github.com/ionic-team/capacitor/compare/5.7.7...5.7.8) --- updated-dependencies: - dependency-name: "@capacitor/android" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Group dependabot PRs - https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups - https://github.com/eve-val/eve-roster/pull/1815/files * Dependabot: add more groups --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- .github/dependabot.yml | 62 ++++++++++++++++++++++++++++++------------ ui/package-lock.json | 9 +++--- ui/package.json | 2 +- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 21080d06c45..ac7721a4511 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,20 +1,46 @@ 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 + + - 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/ui/package-lock.json b/ui/package-lock.json index 94fc0190729..e152abb7551 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -18,7 +18,7 @@ "@angular/router": "~16.2.12", "@angular/service-worker": "~16.2.12", "@capacitor-community/file-opener": "^1.0.5", - "@capacitor/android": "5.7.7", + "@capacitor/android": "5.7.8", "@capacitor/app": "^5.0.6", "@capacitor/core": "5.7.8", "@capacitor/filesystem": "^5.2.0", @@ -3228,10 +3228,9 @@ } }, "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==", - "license": "MIT", + "version": "5.7.8", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.7.8.tgz", + "integrity": "sha512-ooWclwcuW0dy3YfqgoozkHkjatX8H2fb2/RwRsJa3cew1P1lUXIXri3Dquuy4LdqFAJA7UHcJ19Bl/6UKdsZYA==", "peerDependencies": { "@capacitor/core": "^5.7.0" } diff --git a/ui/package.json b/ui/package.json index 5db7462df40..dd5a7f195b1 100644 --- a/ui/package.json +++ b/ui/package.json @@ -13,7 +13,7 @@ "@angular/router": "~16.2.12", "@angular/service-worker": "~16.2.12", "@capacitor-community/file-opener": "^1.0.5", - "@capacitor/android": "5.7.7", + "@capacitor/android": "5.7.8", "@capacitor/app": "^5.0.6", "@capacitor/core": "5.7.8", "@capacitor/filesystem": "^5.2.0", From 524fca94cbe8f3b11c9e169c6c75da87e0b2e94f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:16:58 +0200 Subject: [PATCH 16/28] Build(deps-dev): Bump @capacitor/cli from 6.1.1 to 6.1.2 in /ui (#2750) Bumps [@capacitor/cli](https://github.com/ionic-team/capacitor) from 6.1.1 to 6.1.2. - [Release notes](https://github.com/ionic-team/capacitor/releases) - [Changelog](https://github.com/ionic-team/capacitor/blob/main/CHANGELOG.md) - [Commits](https://github.com/ionic-team/capacitor/compare/6.1.1...6.1.2) --- updated-dependencies: - dependency-name: "@capacitor/cli" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 9 ++++----- ui/package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index e152abb7551..e7e618b800d 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -68,7 +68,7 @@ "@angular/compiler-cli": "^16.2.12", "@angular/language-service": "^16.2.12", "@capacitor/assets": "^3.0.0", - "@capacitor/cli": "6.1.1", + "@capacitor/cli": "6.1.2", "@ionic/angular-toolkit": "^11.0.1", "@stylistic/eslint-plugin": "^2.4.0", "@types/jasmine": "~4.3.6", @@ -3451,11 +3451,10 @@ } }, "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", diff --git a/ui/package.json b/ui/package.json index dd5a7f195b1..2d255880924 100644 --- a/ui/package.json +++ b/ui/package.json @@ -63,7 +63,7 @@ "@angular/compiler-cli": "^16.2.12", "@angular/language-service": "^16.2.12", "@capacitor/assets": "^3.0.0", - "@capacitor/cli": "6.1.1", + "@capacitor/cli": "6.1.2", "@ionic/angular-toolkit": "^11.0.1", "@stylistic/eslint-plugin": "^2.4.0", "@types/jasmine": "~4.3.6", From 483facaad8de7b4720e4f842f874db99a3d5f01f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:17:33 +0200 Subject: [PATCH 17/28] Build(deps-dev): Bump axios from 1.6.8 to 1.7.5 in /ui (#2760) Bumps [axios](https://github.com/axios/axios) from 1.6.8 to 1.7.5. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.6.8...v1.7.5) --- updated-dependencies: - dependency-name: axios dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 151 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 147 insertions(+), 4 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index e7e618b800d..be2ff6ae782 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -5450,6 +5450,150 @@ "dev": true, "license": "ISC" }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", + "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", + "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", + "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", + "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", + "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", + "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", + "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", + "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", + "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nx/nx-win32-x64-msvc": { "version": "16.5.1", "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", @@ -8188,11 +8332,10 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", + "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", "dev": true, - "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", From 12f2c9c1f251caef91623d13ed3fc9fe749b4744 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:18:18 +0200 Subject: [PATCH 18/28] Build(deps): Bump webpack and @angular-devkit/build-angular in /ui (#2761) Bumps [webpack](https://github.com/webpack/webpack) to 5.94.0 and updates ancestor dependency [@angular-devkit/build-angular](https://github.com/angular/angular-cli). These dependencies need to be updated together. Updates `webpack` from 5.88.2 to 5.94.0 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.88.2...v5.94.0) Updates `@angular-devkit/build-angular` from 16.2.14 to 16.2.15 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/16.2.14...16.2.15) --- updated-dependencies: - dependency-name: webpack dependency-type: indirect - dependency-name: "@angular-devkit/build-angular" dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 455 ++++++++++--------------------------------- ui/package.json | 2 +- 2 files changed, 100 insertions(+), 357 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index be2ff6ae782..5b3db5a9f2e 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -58,7 +58,7 @@ "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.14", + "@angular-devkit/build-angular": "^16.2.15", "@angular-eslint/builder": "^16.3.1", "@angular-eslint/eslint-plugin": "^16.3.1", "@angular-eslint/eslint-plugin-template": "^16.3.1", @@ -147,16 +147,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.14.tgz", - "integrity": "sha512-bXQ6i7QPhwmYHuh+DSNkBhjTIHQF0C6fqZEg2ApJA3NmnzE98oQnmJ9AnGnAkdf1Mjn3xi2gxoZWPDDxGEINMw==", + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.15.tgz", + "integrity": "sha512-gw9wQENYVNUCB2bnzk0yKd6YGlemDwuwKnrPnSm4myyMuScZpW+e+zliGW+JXRuVWZqiTJNcdd58e4CrrreILg==", "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", + "@angular-devkit/architect": "0.1602.15", + "@angular-devkit/build-webpack": "0.1602.15", + "@angular-devkit/core": "16.2.15", "@babel/core": "7.22.9", "@babel/generator": "7.22.9", "@babel/helper-annotate-as-pure": "7.22.5", @@ -168,7 +167,7 @@ "@babel/runtime": "7.22.6", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.14", + "@ngtools/webpack": "16.2.15", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -212,7 +211,7 @@ "tree-kill": "1.2.2", "tslib": "2.6.1", "vite": "4.5.3", - "webpack": "5.88.2", + "webpack": "5.94.0", "webpack-dev-middleware": "6.1.2", "webpack-dev-server": "4.15.1", "webpack-merge": "5.9.0", @@ -284,13 +283,12 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1602.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", - "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", + "version": "0.1602.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", + "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "16.2.14", + "@angular-devkit/core": "16.2.15", "rxjs": "7.8.1" }, "engines": { @@ -300,11 +298,10 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "16.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", - "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", + "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -327,36 +324,11 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/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/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/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": { "node": ">= 8" } @@ -430,33 +402,6 @@ "node": ">=6.9.0" } }, - "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/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": { - "ajv": "^6.9.1" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -481,19 +426,11 @@ "node": ">=8.6.0" } }, - "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-angular/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/less": { "version": "4.1.3", @@ -576,30 +513,10 @@ "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/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": { - "@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", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -653,54 +570,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "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", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -709,13 +578,12 @@ "license": "ISC" }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1602.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.14.tgz", - "integrity": "sha512-f+ZTCjOoA1SCQEaX3L/63ubqr/vlHkwDXAtKjBsQgyz6srnETcjy96Us5k/LoK7/hPc85zFneqLinfqOMVWHJQ==", + "version": "0.1602.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.15.tgz", + "integrity": "sha512-ms1+vCDdV0KX8BplJ7JoKH3wKjWHxxZTOX+mSPIjt4wS1uAk5DnezXHIjpBiJ3HY9XVHFI9C0HT4n7o6kFIOEQ==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/architect": "0.1602.15", "rxjs": "7.8.1" }, "engines": { @@ -729,13 +597,12 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1602.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", - "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", + "version": "0.1602.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", + "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "16.2.14", + "@angular-devkit/core": "16.2.15", "rxjs": "7.8.1" }, "engines": { @@ -745,11 +612,10 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "16.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", - "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", + "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -776,15 +642,13 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true, - "license": "MIT" + "dev": true }, "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": { "tslib": "^2.1.0" } @@ -4982,15 +4846,13 @@ "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" + "dev": true }, "node_modules/@ngtools/webpack": { - "version": "16.2.14", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", - "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.15.tgz", + "integrity": "sha512-rD4IHt3nS6PdIKvmoqwIadMIGKsemBSz412kD8Deetl0TiCVhD/Tn1M00dxXzMSHSFCQcOKxdZAeD53yRwTOOA==", "dev": true, - "license": "MIT", "engines": { "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", @@ -6485,7 +6347,6 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, - "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -6496,7 +6357,6 @@ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6506,7 +6366,6 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6516,7 +6375,6 @@ "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": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -6556,17 +6414,6 @@ "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "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", @@ -6579,7 +6426,6 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -6588,11 +6434,10 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.3", - "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": { "@types/node": "*", "@types/qs": "*", @@ -6613,15 +6458,13 @@ "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" + "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "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": { "@types/node": "*" } @@ -6661,8 +6504,7 @@ "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" + "dev": true }, "node_modules/@types/minimist": { "version": "1.2.5", @@ -6685,7 +6527,6 @@ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6708,22 +6549,19 @@ "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" + "dev": true }, "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" + "dev": true }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/selenium-webdriver": { "version": "3.0.26", @@ -6744,7 +6582,6 @@ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, - "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -6755,7 +6592,6 @@ "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": { "@types/express": "*" } @@ -6765,7 +6601,6 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, - "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -6783,7 +6618,6 @@ "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": { "@types/node": "*" } @@ -6796,11 +6630,10 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "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": { "@types/node": "*" } @@ -7738,12 +7571,11 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "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": { "acorn": "^8" } @@ -7933,7 +7765,6 @@ "engines": [ "node >= 0.8.0" ], - "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -8053,8 +7884,7 @@ "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" + "dev": true }, "node_modules/array-ify": { "version": "1.0.0", @@ -8595,8 +8425,7 @@ "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" + "dev": true }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", @@ -8735,7 +8564,6 @@ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -8950,7 +8778,6 @@ "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" } @@ -9485,7 +9312,6 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -9498,7 +9324,6 @@ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -9517,7 +9342,6 @@ "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" } @@ -9526,15 +9350,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "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" + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", @@ -9563,7 +9385,6 @@ "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": { "node": ">=0.8" } @@ -9639,7 +9460,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -10087,7 +9907,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10096,8 +9915,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cookiejar": { "version": "2.1.4", @@ -11104,7 +10922,6 @@ "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": { "execa": "^5.0.0" }, @@ -11347,8 +11164,7 @@ "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" + "dev": true }, "node_modules/dezalgo": { "version": "1.0.4", @@ -11394,7 +11210,6 @@ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, - "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -11756,11 +11571,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "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": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -12771,7 +12585,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12805,7 +12618,6 @@ "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", @@ -12855,7 +12667,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -12898,7 +12709,6 @@ "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" } @@ -12907,8 +12717,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/extend": { "version": "3.0.2", @@ -13017,7 +12826,6 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -13120,7 +12928,6 @@ "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", @@ -13139,7 +12946,6 @@ "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" } @@ -13148,8 +12954,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/find-cache-dir": { "version": "4.0.0", @@ -13320,7 +13125,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13344,7 +13148,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13656,7 +13459,6 @@ "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" }, @@ -13877,8 +13679,7 @@ "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" + "dev": true }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", @@ -14026,8 +13827,7 @@ "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" + "dev": true }, "node_modules/handlebars": { "version": "4.7.8", @@ -14299,7 +14099,6 @@ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -14312,7 +14111,6 @@ "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", "inherits": "~2.0.3", @@ -14327,15 +14125,13 @@ "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" + "dev": true }, "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" } @@ -14367,8 +14163,7 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ], - "license": "MIT" + ] }, "node_modules/html-escaper": { "version": "2.0.2", @@ -14408,8 +14203,7 @@ "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" + "dev": true }, "node_modules/http-errors": { "version": "2.0.0", @@ -14432,8 +14226,7 @@ "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" + "dev": true }, "node_modules/http-proxy": { "version": "1.18.1", @@ -14470,7 +14263,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", @@ -14525,7 +14317,6 @@ "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" } @@ -14917,7 +14708,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } @@ -15226,7 +15016,6 @@ "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": { "node": ">=10" }, @@ -16430,11 +16219,10 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "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": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -17372,8 +17160,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/merge-stream": { "version": "2.0.0", @@ -17526,8 +17313,7 @@ "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" + "dev": true }, "node_modules/minimatch": { "version": "3.1.2", @@ -17866,7 +17652,6 @@ "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": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -18121,7 +17906,6 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -19102,8 +18886,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/on-finished": { "version": "2.4.1", @@ -19123,7 +18906,6 @@ "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": { "node": ">= 0.8" } @@ -19350,7 +19132,6 @@ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -19364,7 +19145,6 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -19689,8 +19469,7 @@ "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" + "dev": true }, "node_modules/path-type": { "version": "4.0.0", @@ -20499,7 +20278,6 @@ "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": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -20513,7 +20291,6 @@ "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" } @@ -21886,8 +21663,7 @@ "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" + "dev": true }, "node_modules/selenium-webdriver": { "version": "3.6.0", @@ -21957,7 +21733,6 @@ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -22004,7 +21779,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -22029,7 +21803,6 @@ "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" } @@ -22038,15 +21811,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "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" + "dev": true }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -22063,7 +21834,6 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -22082,7 +21852,6 @@ "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" } @@ -22092,7 +21861,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -22102,7 +21870,6 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -22117,29 +21884,25 @@ "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" + "dev": true }, "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" + "dev": true }, "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" + "dev": true }, "node_modules/serve-index/node_modules/statuses": { "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.6" } @@ -22149,7 +21912,6 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, - "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -22284,7 +22046,6 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -22676,7 +22437,6 @@ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -22688,7 +22448,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -22832,7 +22591,6 @@ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -22849,7 +22607,6 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -23343,7 +23100,6 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -23743,8 +23499,7 @@ "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" + "dev": true }, "node_modules/tmp": { "version": "0.0.33", @@ -24855,11 +24610,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, - "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -24873,7 +24627,6 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -25049,26 +24802,25 @@ } }, "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", @@ -25076,7 +24828,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": { @@ -25129,7 +24881,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -25189,7 +24940,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, - "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -25209,11 +24959,10 @@ } }, "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==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -25282,7 +25031,6 @@ "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", @@ -25300,7 +25048,6 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -25310,8 +25057,7 @@ "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", @@ -25319,7 +25065,6 @@ "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", @@ -25338,7 +25083,6 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -25353,7 +25097,6 @@ "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" } diff --git a/ui/package.json b/ui/package.json index 2d255880924..1b1f1064ed3 100644 --- a/ui/package.json +++ b/ui/package.json @@ -53,7 +53,7 @@ "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.14", + "@angular-devkit/build-angular": "^16.2.15", "@angular-eslint/builder": "^16.3.1", "@angular-eslint/eslint-plugin": "^16.3.1", "@angular-eslint/eslint-plugin-template": "^16.3.1", From 9e2fd4cf11e94cf0777e8cf37415fd6388532452 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:22:51 +0200 Subject: [PATCH 19/28] Build(deps): Bump org.postgresql:postgresql from 42.7.3 to 42.7.4 in /cnf (#2762) * Build(deps): Bump org.postgresql:postgresql in /cnf Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.3 to 42.7.4. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.7.3...REL42.7.4) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bndrun --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 6e19ea4a87e..ef81464a4c9 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -399,7 +399,7 @@ org.postgresql postgresql - 42.7.3 + 42.7.4 diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 11760f6ee1e..130a02f2f85 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -124,6 +124,6 @@ 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.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 From f7196624a0a93bca4a1417235cb73bb1cdc1eebc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:41:32 +0200 Subject: [PATCH 20/28] Build(deps): Bump org.owasp.encoder:encoder from 1.2.3 to 1.3.1 in /cnf (#2763) * Build(deps): Bump org.owasp.encoder:encoder from 1.2.3 to 1.3.1 in /cnf Bumps [org.owasp.encoder:encoder](https://github.com/owasp/owasp-java-encoder) from 1.2.3 to 1.3.1. - [Release notes](https://github.com/owasp/owasp-java-encoder/releases) - [Commits](https://github.com/owasp/owasp-java-encoder/compare/v1.2.3...v1.3.1) --- updated-dependencies: - dependency-name: org.owasp.encoder:encoder dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Add influxdb dependabot group * Update bndrun --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- .github/dependabot.yml | 4 ++++ cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ac7721a4511..a7dddbfd65c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,6 +6,10 @@ updates: interval: weekly open-pull-requests-limit: 10 target-branch: develop + groups: + influxdb: + patterns: + - "com.influxdb:*" - package-ecosystem: npm directory: "/ui" diff --git a/cnf/pom.xml b/cnf/pom.xml index ef81464a4c9..1df3f146eb2 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -393,7 +393,7 @@ org.owasp.encoder encoder - 1.2.3 + 1.3.1 diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 130a02f2f85..50097343494 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -123,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.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.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index e317511eab6..1464a8d7850 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -426,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 From 7dc7dba96607981e4cbdaba0b53c4dc83df37aa4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:55:59 +0200 Subject: [PATCH 21/28] Build(deps): Bump com.google.guava:guava from 33.2.1-jre to 33.3.0-jre in /cnf (#2764) * Build(deps): Bump com.google.guava:guava in /cnf Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.2.1-jre to 33.3.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update bndrun --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/build.bnd | 2 +- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 1df3f146eb2..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 diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 50097343494..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)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 1464a8d7850..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)',\ From 5d68743e81236cecfa5a578aed87a02efea83089 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:58:06 +0200 Subject: [PATCH 22/28] Build(deps-dev): Bump the eslint group in /ui with 2 updates (#2767) Bumps the eslint group in /ui with 2 updates: [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) and [eslint-plugin-unused-imports](https://github.com/sweepline/eslint-plugin-unused-imports). Updates `@stylistic/eslint-plugin` from 2.6.2 to 2.7.2 - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v2.7.2/packages/eslint-plugin) Updates `eslint-plugin-unused-imports` from 3.2.0 to 4.1.3 - [Commits](https://github.com/sweepline/eslint-plugin-unused-imports/commits/v4.1.3) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint - dependency-name: eslint-plugin-unused-imports dependency-type: direct:development update-type: version-update:semver-major dependency-group: eslint ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 443 ++++++++----------------------------------- ui/package.json | 4 +- 2 files changed, 85 insertions(+), 362 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index 5b3db5a9f2e..e506fd383f4 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -70,7 +70,7 @@ "@capacitor/assets": "^3.0.0", "@capacitor/cli": "6.1.2", "@ionic/angular-toolkit": "^11.0.1", - "@stylistic/eslint-plugin": "^2.4.0", + "@stylistic/eslint-plugin": "^2.7.2", "@types/jasmine": "~4.3.6", "@types/jasminewd2": "~2.0.13", "@types/node": "^20.12.6", @@ -81,7 +81,7 @@ "eslint-plugin-import": "2.29.1", "eslint-plugin-jsdoc": "48.2.3", "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", @@ -5701,84 +5701,15 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.6.2.tgz", - "integrity": "sha512-Ic5oFNM/25iuagob6LiIBkSI/A2y45TsyKtDtODXHRZDy52WfPfeexI6r+OH5+aWN9QGob2Bw+4JRM9/4areWw==", + "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.6.2", - "@stylistic/eslint-plugin-jsx": "2.6.2", - "@stylistic/eslint-plugin-plus": "2.6.2", - "@stylistic/eslint-plugin-ts": "2.6.2", - "@types/eslint": "^9.6.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@stylistic/eslint-plugin-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.2.tgz", - "integrity": "sha512-wCr/kVctAPayMU3pcOI1MKR7MoKIh6VKZU89lPklAqtJoxT+Em6RueiiARbpznUYG5eg3LymiU+aMD+aIZXdqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^9.6.0", - "acorn": "^8.12.1", + "@types/eslint": "^9.6.1", + "@typescript-eslint/utils": "^8.3.0", "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" - } - }, - "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, - "license": "Apache-2.0", - "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, - "license": "BSD-2-Clause", - "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.6.2", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-2.6.2.tgz", - "integrity": "sha512-dSXK/fSPA938J1fBi10QmhzLKtZ/2TuyVNHQMk8jUhWfKJDleAogaSqcWNAbN8fwcoe9UWmt/3StiIf2oYC1aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@stylistic/eslint-plugin-js": "^2.6.2", - "@types/eslint": "^9.6.0", + "espree": "^10.1.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, @@ -5789,52 +5720,14 @@ "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, - "license": "BSD-2-Clause", - "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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@stylistic/eslint-plugin-plus": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-2.6.2.tgz", - "integrity": "sha512-cANcPASfRvq3VTbbQCrSIXq+2AI0IW68PNYaZoXXS0ENlp7HDB8dmrsJnOgWCcoEvdCB8z/eWcG/eq/v5Qcl+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^9.6.0", - "@typescript-eslint/utils": "^8.0.0" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/scope-manager": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", - "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "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": "8.0.1", - "@typescript-eslint/visitor-keys": "8.0.1" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5844,12 +5737,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/types": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", - "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/types": { + "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": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5858,17 +5750,16 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", - "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "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": "8.0.1", - "@typescript-eslint/visitor-keys": "8.0.1", + "@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", "minimatch": "^9.0.4", "semver": "^7.6.0", @@ -5887,17 +5778,16 @@ } } }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/utils": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz", - "integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/utils": { + "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.4.0", - "@typescript-eslint/scope-manager": "8.0.1", - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/typescript-estree": "8.0.1" + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5910,14 +5800,13 @@ "eslint": "^8.57.0 || ^9.0.0" } }, - "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", - "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", + "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "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": "8.0.1", + "@typescript-eslint/types": "8.3.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -5928,220 +5817,70 @@ "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, - "license": "MIT", - "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, - "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/@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, - "license": "ISC", - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@stylistic/eslint-plugin-ts": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.6.2.tgz", - "integrity": "sha512-6OEN3VtUNxjgOvWPavnC10MByr1H4zsgwNND3rQXr5lDFv93MLUnTsH+/SH15OkuqdyJgrQILI6b9lYecb1vIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@stylistic/eslint-plugin-js": "2.6.2", - "@types/eslint": "^9.6.0", - "@typescript-eslint/utils": "^8.0.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": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", - "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/visitor-keys": "8.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/types": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", - "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", + "node_modules/@stylistic/eslint-plugin/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": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", - "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", + "node_modules/@stylistic/eslint-plugin/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, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/visitor-keys": "8.0.1", - "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.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "balanced-match": "^1.0.0" } }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/utils": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz", - "integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==", + "node_modules/@stylistic/eslint-plugin/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, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.0.1", - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/typescript-estree": "8.0.1" - }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", - "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", + "node_modules/@stylistic/eslint-plugin/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, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.0.1", - "eslint-visitor-keys": "^3.4.3" + "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": { - "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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/@stylistic/eslint-plugin/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, - "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": ">=4.0" } }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/minimatch": { + "node_modules/@stylistic/eslint-plugin/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, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6152,14 +5891,16 @@ "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==", + "node_modules/@stylistic/eslint-plugin/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, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@tootallnate/once": { @@ -6404,11 +6145,10 @@ } }, "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": "*" @@ -12166,20 +11906,13 @@ } }, "node_modules/eslint-plugin-unused-imports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz", - "integrity": "sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==", + "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": { @@ -12187,16 +11920,6 @@ } } }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", diff --git a/ui/package.json b/ui/package.json index 1b1f1064ed3..16085e90ca2 100644 --- a/ui/package.json +++ b/ui/package.json @@ -65,7 +65,7 @@ "@capacitor/assets": "^3.0.0", "@capacitor/cli": "6.1.2", "@ionic/angular-toolkit": "^11.0.1", - "@stylistic/eslint-plugin": "^2.4.0", + "@stylistic/eslint-plugin": "^2.7.2", "@types/jasmine": "~4.3.6", "@types/jasminewd2": "~2.0.13", "@types/node": "^20.12.6", @@ -76,7 +76,7 @@ "eslint-plugin-import": "2.29.1", "eslint-plugin-jsdoc": "48.2.3", "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", From 63f606951a61fe5a770983c1e48c6e25e1abe4a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:58:38 +0200 Subject: [PATCH 23/28] Build(deps): Bump swiper from 11.1.9 to 11.1.11 in /ui (#2768) Bumps [swiper](https://github.com/nolimits4web/Swiper) from 11.1.9 to 11.1.11. - [Release notes](https://github.com/nolimits4web/Swiper/releases) - [Changelog](https://github.com/nolimits4web/swiper/blob/master/CHANGELOG.md) - [Commits](https://github.com/nolimits4web/Swiper/compare/v11.1.9...v11.1.11) --- updated-dependencies: - dependency-name: swiper dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 9 ++++----- ui/package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index e506fd383f4..9d5b618650d 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -52,7 +52,7 @@ "ngx-spinner": "^16.0.2", "roboto-fontface": "^0.10.0", "rxjs": "~6.6.7", - "swiper": "11.1.9", + "swiper": "11.1.11", "tslib": "^2.6.2", "uuid": "^10.0.0", "zone.js": "~0.13.3" @@ -22783,9 +22783,9 @@ } }, "node_modules/swiper": { - "version": "11.1.9", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.9.tgz", - "integrity": "sha512-rflu8zvfGa3x1v/aeSufk4zRJffhOQowyvtJlp46sUBnOqAuk1Rdv5Ldj0AWWBV595iZ+ZMk7VB35ZRtRUomtA==", + "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", @@ -22796,7 +22796,6 @@ "url": "http://opencollective.com/swiper" } ], - "license": "MIT", "engines": { "node": ">= 4.7.0" } diff --git a/ui/package.json b/ui/package.json index 16085e90ca2..85b1d20a316 100644 --- a/ui/package.json +++ b/ui/package.json @@ -47,7 +47,7 @@ "ngx-spinner": "^16.0.2", "roboto-fontface": "^0.10.0", "rxjs": "~6.6.7", - "swiper": "11.1.9", + "swiper": "11.1.11", "tslib": "^2.6.2", "uuid": "^10.0.0", "zone.js": "~0.13.3" From 31e7c7889482ee1ad364b7f0752b8ccfb27814ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:59:16 +0200 Subject: [PATCH 24/28] Build(deps): Bump chart.js from 4.4.3 to 4.4.4 in /ui (#2769) Bumps [chart.js](https://github.com/chartjs/Chart.js) from 4.4.3 to 4.4.4. - [Release notes](https://github.com/chartjs/Chart.js/releases) - [Commits](https://github.com/chartjs/Chart.js/compare/v4.4.3...v4.4.4) --- updated-dependencies: - dependency-name: chart.js dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ui/package-lock.json | 9 ++++----- ui/package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index 9d5b618650d..1e2cea1fdd0 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -36,7 +36,7 @@ "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", + "chart.js": "^4.4.4", "chartjs-adapter-date-fns": "^3.0.0", "chartjs-plugin-annotation": "^3.0.1", "chartjs-plugin-datalabels": "^2.2.0", @@ -8701,10 +8701,9 @@ "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==", - "license": "MIT", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", + "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", "dependencies": { "@kurkle/color": "^0.3.0" }, diff --git a/ui/package.json b/ui/package.json index 85b1d20a316..15d2ea454e1 100644 --- a/ui/package.json +++ b/ui/package.json @@ -31,7 +31,7 @@ "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", + "chart.js": "^4.4.4", "chartjs-adapter-date-fns": "^3.0.0", "chartjs-plugin-annotation": "^3.0.1", "chartjs-plugin-datalabels": "^2.2.0", From 4a852f706c76ffeca23e4ca3277a2ee9647df361 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Sat, 31 Aug 2024 14:51:11 +0200 Subject: [PATCH 25/28] FEMS-Backports 2024-08 (2) (#2771) * UI: fix sum chart in consumption history - Wrong variable used in consumption detail html * UI: add routing guards for settings - Introduction of [Routing Guards](https://v17.angular.io/api/router#types) - Not visible routes could be accessed through manually going there - Adding edge role check before accessing this route * UI: center refresher-spinner - Center refresh-content-spinner * Rrd4j: Fix query for custom range - fix start for timeranges with not the first day of the month - fix readonly only worked with debugmode * UI: Migration to angular 18 - Update Angular, Zone.js, Typescript * UI: Eslint: no-multiple-empty-lines * UI: fix tooltip afterTitle display bug * UI: enforce double quotes - Enforce usage of double quotes - prohibit single quotes - backticks are still usable -> [ref](https://eslint.org/docs/latest/rules/quotes#double) * UI: add exhaustive switch eslint rule - Add eslint rule [`switch-exhaustiveness-check`](https://typescript-eslint.io/rules/switch-exhaustiveness-check/) * UI: App: Update android api due to googles new policy - Updating android api level due to googles new policy, enforcing `ANDROID_API_LEVEL=34` to be minimum version * Build android app - Add CI pipeline for building Android apps * GridOptimizedCharge: avoid fail state in OFF * UI: Reduce history queries & overloading of chartData - If a history chart takes too long to load and the user switches the timerange, the old timerange will be shown instead of the actual one (at least for a few seconds, until the new chart is finished) * UI: Replace `setCurrentComponent` with `getCurrentEdge` - Replace `setCurrentComponent` with `getCurrentEdge`, setCurrentComponent is already deprecated and shouldnt be used anymore * UI: Unify fixDigitalOutput & singlethreshold history (#1315) - Unify and refactor all FixDigitalOutputControllers and SingleThresholds in one widget in history - Refactoring them and using the new `CumulatedLevelActiveTime`-Channel * UI: fix TimeOfUseTariff powerSocChart - Fix `TypeError: this.options.plugins is undefined` - To reproduce the error see "live" screen and open the modal for Time-of-Use with ADMIN role. --------- Co-authored-by: Lukas Rieger <73471197+lukasrgr@users.noreply.github.com> Co-authored-by: Michael Grill <59126309+michaelgrill@users.noreply.github.com> Co-authored-by: Kai Jeschek <99220919+da-Kai@users.noreply.github.com> Co-authored-by: Johann Kaufmann <165755282+johannk24@users.noreply.github.com> Co-authored-by: Fabian Brandtner <10850256+fabian94533@users.noreply.github.com> Co-authored-by: Sebastian Asen <47855186+sebastianasen@users.noreply.github.com> Reviewed-by: Sagar Venu <32655208+venu-sagar@users.noreply.github.com> Reviewed-by: Lukas Rieger <73471197+lukasrgr@users.noreply.github.com> Reviewed-by: Sebastian Asen <47855186+sebastianasen@users.noreply.github.com> Reviewed-by: Stefan Feilmeier <3515268+sfeilmeier@users.noreply.github.com> Reviewed-by: Hueseyin Sahutoglu <34771592+huseyinsaht@users.noreply.github.com> --- .woodpecker/ui-build.yml | 80 + .../ControllerEssGridOptimizedChargeImpl.java | 3 +- .../edge/timedata/rrd4j/RecordWorker.java | 6 +- .../edge/timedata/rrd4j/Rrd4jReadHandler.java | 22 +- .../timedata/rrd4j/Rrd4jReadHandlerTest.java | 15 + tools/common.sh | 35 +- tools/drone/openems-android.sh | 8 +- ui/.eslintrc.json | 13 +- ui/.vscode/settings.json | 5 +- ui/android/.gitignore | 101 + ui/android/app/build.gradle | 34 +- ui/android/build.gradle | 66 +- ui/android/gradle/wrapper/gradle-wrapper.jar | Bin 61608 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 - ui/android/gradlew | 246 +- ui/android/gradlew.bat | 96 +- ui/android/variables.gradle | 4 +- ui/capacitor.config.ts | 13 +- ui/package-lock.json | 20503 ++++++++-------- ui/package.json | 77 +- ui/src/app/app-routing.module.ts | 225 +- ui/src/app/app.component.ts | 44 +- ui/src/app/app.module.ts | 62 +- ui/src/app/app.service.ts | 50 +- ui/src/app/appupdateservice.ts | 10 +- ui/src/app/changelog/changelog.module.ts | 8 +- .../view/component/changelog.component.ts | 22 +- .../view/component/changelog.constants.ts | 100 +- ui/src/app/changelog/view/view.ts | 4 +- ui/src/app/edge/edge.component.ts | 8 +- ui/src/app/edge/edge.module.ts | 10 +- .../chart/totalchart.component.ts | 28 +- .../Controller/ChannelThreshold/flat/flat.ts | 18 +- .../ChannelThreshold/overview/overview.ts | 4 +- .../Ess/GridoptimizedCharge/chart/chart.ts | 76 +- .../chart/sellToGridLimitChart.component.ts | 58 +- .../Ess/GridoptimizedCharge/flat/flat.ts | 12 +- .../GridoptimizedCharge/overview/overview.ts | 8 +- .../Ess/TimeOfUseTariff/chart/chart.ts | 114 +- .../Ess/TimeOfUseTariff/flat/flat.ts | 20 +- .../Ess/TimeOfUseTariff/overview/overview.ts | 6 +- .../edge/history/Controller/Ess/ess.module.ts | 12 + .../Io/DigitalOutput/chart/chart.ts | 68 + .../Io/DigitalOutput/details/chart/chart.ts | 163 + .../details/details.overview.html | 4 + .../DigitalOutput/details/details.overview.ts | 7 + .../Io/DigitalOutput/digitalOutput.module.ts | 32 + .../Io/DigitalOutput/flat/flat.html | 19 + .../Controller/Io/DigitalOutput/flat/flat.ts | 22 + .../Io/DigitalOutput/overview/overview.html | 5 + .../Io/DigitalOutput/overview/overview.ts | 36 + .../edge/history/Controller/Io/Io.module.ts | 12 + .../history/Controller/controller.module.ts | 7 +- .../app/edge/history/abstracthistorychart.ts | 156 +- .../app/edge/history/abstracthistorywidget.ts | 24 +- .../edge/history/chpsoc/chart.component.ts | 59 +- .../chpsocchartoverview.component.ts | 10 +- .../edge/history/chpsoc/widget.component.ts | 24 +- .../edge/history/common/autarchy/Autarchy.ts | 12 +- .../history/common/autarchy/chart/chart.ts | 44 +- .../edge/history/common/autarchy/flat/flat.ts | 18 +- .../common/autarchy/overview/overview.ts | 6 +- ui/src/app/edge/history/common/common.ts | 14 +- .../history/common/consumption/Consumption.ts | 24 +- .../common/consumption/chart/channels.spec.ts | 40 +- .../consumption/chart/chart.constants.spec.ts | 2 +- .../common/consumption/chart/chart.spec.ts | 52 +- .../history/common/consumption/chart/chart.ts | 70 +- .../details/chart/channels.spec.ts | 18 +- .../details/chart/consumptionMeter.spec.ts | 32 +- .../details/chart/consumptionMeter.ts | 46 +- .../consumption/details/chart/evcs.spec.ts | 20 +- .../common/consumption/details/chart/evcs.ts | 34 +- .../consumption/details/chart/sum.spec.ts | 26 +- .../common/consumption/details/chart/sum.ts | 44 +- .../consumption/details/details.overview.html | 2 +- .../consumption/details/details.overview.ts | 38 +- .../history/common/consumption/flat/flat.ts | 24 +- .../common/consumption/overview/overview.ts | 26 +- .../common/energy/chart/channels.spec.ts | 100 +- .../energy/chart/chart.constants.spec.ts | 2 +- .../history/common/energy/chart/chart.spec.ts | 120 +- .../edge/history/common/energy/chart/chart.ts | 199 +- .../app/edge/history/common/energy/energy.ts | 10 +- .../edge/history/common/energy/flat/flat.ts | 38 +- .../common/grid/chart/chart.constants.spec.ts | 2 +- .../history/common/grid/chart/chart.spec.ts | 52 +- .../edge/history/common/grid/chart/chart.ts | 138 +- .../grid/details/chart/channels.spec.ts | 8 +- .../common/grid/details/chart/chart.spec.ts | 24 +- .../common/grid/details/chart/chart.ts | 42 +- .../common/grid/details/details.overview.ts | 20 +- .../app/edge/history/common/grid/flat/flat.ts | 20 +- ui/src/app/edge/history/common/grid/grid.ts | 18 +- .../history/common/grid/overview/overview.ts | 22 +- .../production/chart/productionMeterChart.ts | 42 +- .../common/production/chart/totalChart.ts | 80 +- .../production/details/chart/channels.spec.ts | 20 +- .../production/details/chart/charger.spec.ts | 20 +- .../production/details/chart/charger.ts | 34 +- .../details/chart/productionMeter.spec.ts | 28 +- .../details/chart/productionMeter.ts | 44 +- .../production/details/chart/sum.spec.ts | 60 +- .../common/production/details/chart/sum.ts | 52 +- .../production/details/details.overview.ts | 32 +- .../history/common/production/flat/flat.ts | 10 +- .../common/production/overview/overview.ts | 22 +- .../history/common/production/production.ts | 24 +- .../selfconsumption/chart/chart.component.ts | 46 +- .../common/selfconsumption/flat/flat.ts | 18 +- .../selfconsumption/overview/overview.ts | 6 +- .../delayedselltogrid/chart.component.ts | 77 +- ...elayedselltogridchartoverview.component.ts | 10 +- .../delayedselltogrid/widget.component.ts | 12 +- ...xdigitaloutputchartoverview.component.html | 44 - ...fixdigitaloutputchartoverview.component.ts | 49 - .../fixdigitaloutput/singlechart.component.ts | 108 - .../fixdigitaloutput/totalchart.component.ts | 126 - .../fixdigitaloutput/widget.component.html | 17 - .../fixdigitaloutput/widget.component.ts | 68 - .../history/heatingelement/chart.component.ts | 43 +- .../heatingelementchartoverview.component.ts | 10 +- .../heatingelement/widget.component.ts | 28 +- .../edge/history/heatpump/chart.component.ts | 59 +- .../heatpumpchartoverview.component.ts | 12 +- .../edge/history/heatpump/widget.component.ts | 40 +- .../app/edge/history/history.component.html | 2 +- ui/src/app/edge/history/history.component.ts | 25 +- ui/src/app/edge/history/history.module.ts | 82 +- ui/src/app/edge/history/historydataservice.ts | 35 +- ...etricpeakshavingchartoverview.component.ts | 10 +- .../peakshaving/asymmetric/chart.component.ts | 85 +- .../asymmetric/widget.component.ts | 12 +- .../peakshaving/symmetric/chart.component.ts | 73 +- ...etricpeakshavingchartoverview.component.ts | 10 +- .../peakshaving/symmetric/widget.component.ts | 12 +- .../peakshaving/timeslot/chart.component.ts | 81 +- ...eslotpeakshavingchartoverview.component.ts | 10 +- .../peakshaving/timeslot/widget.component.ts | 12 +- ui/src/app/edge/history/shared.ts | 124 +- .../singlethreshold/chart.component.ts | 276 - ...inglethresholdchartoverview.component.html | 47 - .../singlethresholdchartoverview.component.ts | 51 - .../singlethreshold/widget.component.html | 18 - .../singlethreshold/widget.component.ts | 74 - .../history/storage/chargerchart.component.ts | 25 +- .../history/storage/esschart.component.ts | 45 +- .../history/storage/singlechart.component.ts | 93 +- .../history/storage/socchart.component.ts | 53 +- .../storagechartoverview.component.ts | 10 +- .../history/storage/totalchart.component.ts | 101 +- .../edge/history/storage/widget.component.ts | 20 +- .../Channelthreshold/Channelthreshold.ts | 30 +- .../app/edge/live/Controller/ChpSoc/ChpSoc.ts | 52 +- .../ChpSoc/modal/modal.component.ts | 62 +- .../Ess/FixActivePower/Ess_FixActivePower.ts | 10 +- .../Ess/FixActivePower/flat/flat.ts | 18 +- .../Ess/FixActivePower/modal/modal.ts | 12 +- .../Ess_GridOptimizedCharge.ts | 12 +- .../Ess/GridOptimizedCharge/flat/flat.ts | 48 +- .../Ess/GridOptimizedCharge/modal/modal.ts | 74 +- .../modal/predictionChart.ts | 53 +- .../TimeOfUseTariff/Ess_TimeOfUseTariff.ts | 44 +- .../Ess/TimeOfUseTariff/flat/flat.ts | 16 +- .../Ess/TimeOfUseTariff/modal/modal.ts | 22 +- .../TimeOfUseTariff/modal/powerSocChart.ts | 125 +- .../TimeOfUseTariff/modal/statePriceChart.ts | 71 +- ui/src/app/edge/live/Controller/Evcs/Evcs.ts | 12 +- .../administration.component.ts | 26 +- .../edge/live/Controller/Evcs/flat/flat.ts | 98 +- .../edge/live/Controller/Evcs/modal/modal.ts | 146 +- .../live/Controller/Evcs/popover/popover.ts | 8 +- .../Io_ChannelSingleThreshold.ts | 100 +- .../modal/modal.component.ts | 136 +- .../FixDigitalOutput/Io_FixDigitalOutput.ts | 20 +- .../FixDigitalOutput/modal/modal.component.ts | 22 +- .../Controller/Io/HeatingElement/flat/flat.ts | 54 +- .../Io/HeatingElement/modal/modal.ts | 42 +- .../Controller/Io/Heatpump/Io_Heatpump.ts | 44 +- .../Io/Heatpump/modal/modal.component.ts | 44 +- .../PeakShaving/Asymmetric/Asymmetric.ts | 36 +- .../Asymmetric/modal/modal.component.ts | 42 +- .../PeakShaving/Symmetric/Symmetric.ts | 26 +- .../Symmetric/modal/modal.component.ts | 34 +- .../Symmetric_TimeSlot/Symmetric_TimeSlot.ts | 26 +- .../modal/modal.component.ts | 44 +- .../Api_DigitalInput/Io_Api_DigitalInput.ts | 12 +- .../Api_DigitalInput/modal/modal.component.ts | 24 +- .../Evcs_Api_Cluster/Evcs_Api_Cluster.ts | 58 +- .../modal/evcs-chart/evcs.chart.ts | 46 +- .../modal/evcsCluster-modal.page.ts | 102 +- .../live/common/autarchy/Common_Autarchy.ts | 10 +- .../edge/live/common/autarchy/flat/flat.ts | 20 +- .../live/common/autarchy/modal/modal.spec.ts | 4 +- .../edge/live/common/autarchy/modal/modal.ts | 16 +- .../common/consumption/Common_Consumption.ts | 10 +- .../edge/live/common/consumption/flat/flat.ts | 44 +- .../common/consumption/modal/modal.spec.ts | 68 +- .../live/common/consumption/modal/modal.ts | 74 +- .../app/edge/live/common/grid/Common_Grid.ts | 10 +- ui/src/app/edge/live/common/grid/flat/flat.ts | 30 +- .../edge/live/common/grid/modal/modal.spec.ts | 6 +- .../app/edge/live/common/grid/modal/modal.ts | 80 +- .../common/production/Common_Production.ts | 10 +- .../edge/live/common/production/flat/flat.ts | 12 +- .../live/common/production/modal/modal.ts | 16 +- .../selfconsumption/Common_Selfconsumption.ts | 10 +- .../live/common/selfconsumption/flat/flat.ts | 20 +- .../selfconsumption/modal/modal.spec.ts | 4 +- .../common/selfconsumption/modal/modal.ts | 16 +- .../common/storage/modal/modal.component.ts | 54 +- .../live/common/storage/storage.component.ts | 82 +- .../delayedselltogrid.component.ts | 16 +- .../modal/modal.component.ts | 32 +- .../energymonitor/chart/chart.component.ts | 28 +- .../section/abstractsection.component.ts | 22 +- .../chart/section/consumption.component.ts | 40 +- .../chart/section/grid.component.ts | 86 +- .../chart/section/production.component.ts | 40 +- .../chart/section/storage.component.ts | 78 +- .../energymonitor/energymonitor.component.ts | 24 +- .../energymonitor/energymonitor.module.ts | 23 +- ui/src/app/edge/live/info/info.component.ts | 6 +- ui/src/app/edge/live/live.component.html | 2 +- ui/src/app/edge/live/live.component.ts | 17 +- ui/src/app/edge/live/live.module.ts | 86 +- ui/src/app/edge/live/livedataservice.ts | 2 +- .../edge/live/offline/offline.component.ts | 10 +- .../settings/alerting/alerting.component.ts | 44 +- ui/src/app/edge/settings/app/app.module.ts | 42 +- .../edge/settings/app/formly/formly-text.ts | 4 +- .../settings/app/formly/input-with-unit.ts | 6 +- .../formly-option-group-picker.component.ts | 4 +- .../formly-reorder-array.component.ts | 4 +- .../formly-safe-input-modal.component.ts | 4 +- .../safe-input/formly-safe-input.extended.ts | 22 +- .../app/edge/settings/app/index.component.ts | 76 +- .../edge/settings/app/install.component.ts | 72 +- .../edge/settings/app/jsonrpc/flag/flags.ts | 2 +- .../app/jsonrpc/getAppAssistant.spec.ts | 48 +- .../settings/app/jsonrpc/getAppAssistant.ts | 50 +- .../app/edge/settings/app/jsonrpc/getApps.ts | 4 +- .../settings/app/keypopup/modal.component.ts | 130 +- ui/src/app/edge/settings/app/permissions.ts | 2 +- .../app/edge/settings/app/single.component.ts | 74 +- .../app/edge/settings/app/update.component.ts | 62 +- .../settings/channels/channels.component.ts | 64 +- .../component/install/index.component.ts | 16 +- .../component/install/install.component.ts | 26 +- .../component/update/index.component.ts | 10 +- .../component/update/update.component.ts | 30 +- .../jsonrpctest/jsonrpctest.module.ts | 6 +- .../edge/settings/jsonrpctest/jsonrpctest.ts | 40 +- .../settings/network/network.component.ts | 132 +- .../network/setNetworkConfigRequest.ts | 2 +- ui/src/app/edge/settings/network/shared.ts | 10 +- .../settings/powerassistant/powerassistant.ts | 26 +- .../settings/profile/aliasupdate.component.ts | 24 +- .../channelexport/channelExportXlsxRequest.ts | 2 +- .../getModbusProtocolExportXlsxRequest.ts | 2 +- .../modbusapi/getModbusProtocolRequest.ts | 2 +- .../modbusapi/getModbusProtocolResponse.ts | 2 +- .../settings/profile/profile.component.ts | 32 +- .../app/edge/settings/settings.component.ts | 18 +- ui/src/app/edge/settings/settings.module.ts | 40 +- ui/src/app/edge/settings/settings.spec.ts | 24 +- .../system/executesystemupdate.component.ts | 12 +- .../system/maintenance/maintenance.ts | 69 +- .../system/oe-system-update.component.ts | 22 +- .../edge/settings/system/system.component.ts | 10 +- .../systemexecute/systemexecute.component.ts | 59 +- .../settings/systemlog/systemlog.component.ts | 58 +- ui/src/app/index/filter/filter.component.ts | 8 +- ui/src/app/index/index.module.ts | 16 +- ui/src/app/index/login.component.ts | 56 +- ui/src/app/index/login.spec.ts | 4 +- .../app/index/overview/overview.component.ts | 20 +- ui/src/app/index/shared/loading-screen.ts | 18 +- ui/src/app/index/shared/sumState.ts | 18 +- .../app/registration/modal/modal.component.ts | 32 +- .../registration/registration.component.ts | 10 +- .../app/registration/registration.module.ts | 10 +- .../components/abstracthistorywidget.ts | 18 +- .../chart/abstractHistoryChartOverview.ts | 2 +- .../components/chart/abstracthistorychart.ts | 381 +- .../components/chart/chart.constants.spec.ts | 14 +- .../components/chart/chart.constants.ts | 23 +- .../shared/components/chart/chart.module.ts | 2 +- ui/src/app/shared/components/chart/chart.ts | 12 +- .../shared/components/components.module.ts | 40 +- .../components/edge/currentdata.spec.ts | 22 +- .../app/shared/components/edge/currentdata.ts | 58 +- .../app/shared/components/edge/edge.spec.ts | 26 +- ui/src/app/shared/components/edge/edge.ts | 66 +- .../shared/components/edge/edgeconfig.spec.ts | 28 +- .../app/shared/components/edge/edgeconfig.ts | 153 +- .../currentVoltage/chart/asymmetricMeter.ts | 46 +- .../currentVoltage/chart/symmetricMeter.ts | 44 +- .../currentVoltage/currentVoltage.overview.ts | 6 +- .../currentVoltage/currentVoltageModule.ts | 2 +- .../edge/meter/electricity/modal.component.ts | 26 +- .../edge/meter/esscharger/modal.component.ts | 14 +- .../components/edge/meter/meter.module.ts | 2 +- .../flat/abstract-flat-widget-line.ts | 4 +- .../components/flat/abstract-flat-widget.ts | 2 +- .../flat-widget-horizontal-line.ts | 4 +- .../flat-widget-line-divider.ts | 4 +- .../flat/flat-widget-line/flat-widget-line.ts | 4 +- .../flat-widget-percentagebar.ts | 4 +- ui/src/app/shared/components/flat/flat.ts | 8 +- ui/src/app/shared/components/footer/footer.ts | 8 +- .../footer/subnavigation/footerNavigation.ts | 12 +- .../form-field-checkbox-hyperlink.wrapper.ts | 10 +- .../form-field-default-cases.wrapper.ts | 10 +- .../components/formly/form-field.wrapper.ts | 8 +- .../formly-field-checkbox-with-image.ts | 8 +- .../formly-field-modal/formlyfieldmodal.ts | 4 +- .../formly-field-radio-with-image.ts | 8 +- .../formly-select-field-modal.component.ts | 4 +- .../formly/formly-select-field.extended.ts | 6 +- .../formly/formly-skeleton-wrapper.ts | 8 +- .../formly/input-serial-number-wrapper.ts | 8 +- ui/src/app/shared/components/formly/input.ts | 8 +- .../formly/panel-wrapper.component.ts | 2 +- ui/src/app/shared/components/formly/repeat.ts | 8 +- .../components/header/header.component.ts | 80 +- .../history-data-error.component.ts | 8 +- .../components/modal/abstract-modal-line.ts | 12 +- .../shared/components/modal/abstractModal.ts | 4 +- .../modal/help-button/help-button.ts | 6 +- .../modal/modal-button/modal-button.ts | 4 +- .../modal/modal-info-line/modal-info-line.ts | 4 +- .../components/modal/modal-line/modal-line.ts | 18 +- .../modal/modal-phases/modal-phases.ts | 8 +- .../modal-value-line/modal-value-line.ts | 10 +- .../shared/components/modal/modal.module.ts | 32 +- ui/src/app/shared/components/modal/modal.ts | 12 +- .../modal-horizontal-line.ts | 4 +- .../percentagebar/percentagebar.component.ts | 6 +- .../pickdate/pickdate.component.spec.ts | 34 +- .../components/pickdate/pickdate.component.ts | 33 +- .../components/pickdate/pickdate.module.ts | 16 +- .../pickdate/popover/popover.component.ts | 34 +- .../pickdate/popover/popover.spec.ts | 10 +- .../app/shared/components/shared/converter.ts | 30 +- .../app/shared/components/shared/formatter.ts | 12 +- ui/src/app/shared/components/shared/name.ts | 4 +- .../shared/notification/notification.ts | 14 +- .../components/shared/oe-formly-component.ts | 18 +- ui/src/app/shared/components/shared/phase.ts | 2 +- .../components/shared/testing/common.ts | 48 +- .../components/shared/testing/tester.ts | 46 +- .../components/shared/testing/utils.spec.ts | 14 +- .../status/single/status.component.spec.ts | 22 +- .../status/single/status.component.ts | 34 +- ui/src/app/shared/directive/autofill.ts | 12 +- ui/src/app/shared/directive/directive.ts | 8 +- ui/src/app/shared/directive/ngvar.ts | 4 +- ui/src/app/shared/guards/functional-guards.ts | 35 + ui/src/app/shared/jsonrpc/base.ts | 2 +- .../notification/edgeConfigNotification.ts | 2 +- .../queryHistoricTimeseriesDataRequest.ts | 6 +- ...istoricTimeseriesEnergyPerPeriodRequest.ts | 6 +- .../queryHistoricTimeseriesEnergyRequest.ts | 6 +- .../queryHistoricTimeseriesExportXlxs.ts | 8 +- .../chartoptions/chartoptions.component.ts | 26 +- .../chartoptions/popover/popover.component.ts | 16 +- .../shared/pipe/classname/classname.pipe.ts | 4 +- .../formatSecondsToDuration.pipe.ts | 12 +- .../app/shared/pipe/isclass/isclass.pipe.ts | 6 +- ui/src/app/shared/pipe/keys/keys.pipe.ts | 4 +- ui/src/app/shared/pipe/pipe.ts | 22 +- ui/src/app/shared/pipe/sign/sign.pipe.ts | 4 +- ui/src/app/shared/pipe/typeof/typeof.pipe.ts | 4 +- .../pipe/unitvalue/unitvalue.pipe.spec.ts | 28 +- .../shared/pipe/unitvalue/unitvalue.pipe.ts | 20 +- .../shared/pipe/version/version.pipe.spec.ts | 10 +- .../app/shared/pipe/version/version.pipe.ts | 10 +- ui/src/app/shared/service/abstractservice.ts | 22 +- ui/src/app/shared/service/arrayutils.ts | 2 +- ui/src/app/shared/service/defaulttypes.ts | 70 +- .../service/globalRouteChangeHandler.ts | 8 +- ui/src/app/shared/service/pagination.ts | 16 +- ui/src/app/shared/service/service.ts | 142 +- ui/src/app/shared/service/utils.spec.ts | 28 +- ui/src/app/shared/service/utils.ts | 143 +- ui/src/app/shared/service/websocket.ts | 102 +- .../app/shared/service/websocketInterface.ts | 6 +- ui/src/app/shared/shared.module.ts | 106 +- ui/src/app/shared/shared.spec.ts | 26 +- ui/src/app/shared/shared.ts | 32 +- ui/src/app/shared/translate.extension.ts | 10 +- ui/src/app/shared/type/channeladdress.ts | 2 +- ui/src/app/shared/type/country.ts | 24 +- ui/src/app/shared/type/general.ts | 10 +- ui/src/app/shared/type/language.spec.ts | 8 +- ui/src/app/shared/type/language.ts | 28 +- ui/src/app/shared/type/role.ts | 4 +- ui/src/app/shared/type/systemlog.ts | 2 +- ui/src/app/shared/type/widget.ts | 102 +- .../shared/utils/array/array.utils.spec.ts | 12 +- ui/src/app/shared/utils/array/array.utils.ts | 2 +- .../shared/utils/color/color.utils.spec.ts | 14 +- ui/src/app/shared/utils/color/color.utils.ts | 8 +- .../app/shared/utils/date/dateutils.spec.ts | 16 +- ui/src/app/shared/utils/date/dateutils.ts | 2 +- .../shared/utils/datetime/datetime-utils.ts | 11 +- .../app/shared/utils/time/timeutils.spec.ts | 10 +- ui/src/app/shared/utils/time/timeutils.ts | 8 +- ui/src/app/user/user.component.ts | 51 +- ui/src/app/user/user.module.ts | 6 +- ui/src/assets/i18n/de.json | 9 +- ui/src/assets/i18n/en.json | 9 +- ui/src/environments/index.ts | 10 +- ui/src/global.scss | 9 +- ui/src/main.ts | 8 +- ui/src/polyfills.ts | 8 +- ui/src/test.ts | 6 +- .../openems/environments/backend-dev.ts | 2 +- .../openems/environments/backend-docker.ts | 2 +- .../openems/environments/backend-prod.ts | 2 +- .../themes/openems/environments/edge-dev.ts | 2 +- .../openems/environments/edge-docker.ts | 2 +- .../themes/openems/environments/edge-prod.ts | 2 +- ui/src/themes/openems/environments/gitpod.ts | 2 +- ui/src/themes/openems/environments/theme.ts | 2 +- 426 files changed, 17338 insertions(+), 17185 deletions(-) create mode 100644 .woodpecker/ui-build.yml create mode 100644 ui/android/.gitignore delete mode 100644 ui/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 ui/android/gradle/wrapper/gradle-wrapper.properties mode change 100644 => 100755 ui/android/gradlew create mode 100644 ui/src/app/edge/history/Controller/Ess/ess.module.ts create mode 100644 ui/src/app/edge/history/Controller/Io/DigitalOutput/chart/chart.ts create mode 100644 ui/src/app/edge/history/Controller/Io/DigitalOutput/details/chart/chart.ts create mode 100644 ui/src/app/edge/history/Controller/Io/DigitalOutput/details/details.overview.html create mode 100644 ui/src/app/edge/history/Controller/Io/DigitalOutput/details/details.overview.ts create mode 100644 ui/src/app/edge/history/Controller/Io/DigitalOutput/digitalOutput.module.ts create mode 100644 ui/src/app/edge/history/Controller/Io/DigitalOutput/flat/flat.html create mode 100644 ui/src/app/edge/history/Controller/Io/DigitalOutput/flat/flat.ts create mode 100644 ui/src/app/edge/history/Controller/Io/DigitalOutput/overview/overview.html create mode 100644 ui/src/app/edge/history/Controller/Io/DigitalOutput/overview/overview.ts create mode 100644 ui/src/app/edge/history/Controller/Io/Io.module.ts delete mode 100644 ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.html delete mode 100644 ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.ts delete mode 100644 ui/src/app/edge/history/fixdigitaloutput/singlechart.component.ts delete mode 100644 ui/src/app/edge/history/fixdigitaloutput/totalchart.component.ts delete mode 100644 ui/src/app/edge/history/fixdigitaloutput/widget.component.html delete mode 100644 ui/src/app/edge/history/fixdigitaloutput/widget.component.ts delete mode 100644 ui/src/app/edge/history/singlethreshold/chart.component.ts delete mode 100644 ui/src/app/edge/history/singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component.html delete mode 100644 ui/src/app/edge/history/singlethreshold/singlethresholdchartoverview/singlethresholdchartoverview.component.ts delete mode 100644 ui/src/app/edge/history/singlethreshold/widget.component.html delete mode 100644 ui/src/app/edge/history/singlethreshold/widget.component.ts create mode 100644 ui/src/app/shared/guards/functional-guards.ts 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/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.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/tools/common.sh b/tools/common.sh index 47370e548d1..d18b68f18be 100644 --- a/tools/common.sh +++ b/tools/common.sh @@ -11,8 +11,9 @@ common_initialize_environment() { 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) @@ -120,6 +121,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 +163,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 - . 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 diff --git a/ui/android/gradle/wrapper/gradle-wrapper.properties b/ui/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index cab95f43c39..00000000000 --- a/ui/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -#Thu Apr 04 11:31:47 CEST 2024 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip -networkTimeout=10000 -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/ui/android/gradlew b/ui/android/gradlew old mode 100644 new mode 100755 index 79a61d421cc..5b9a91774fe --- a/ui/android/gradlew +++ b/ui/android/gradlew @@ -1,244 +1,6 @@ -#!/bin/sh +#!/bin/bash -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# +SCRIPT_DIR="$( readlink -f $( dirname -- "${BASH_SOURCE[0]}" ))" +ROOT="${SCRIPT_DIR%/*/*}" -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - 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/variables.gradle b/ui/android/variables.gradle index 232bd9dd0c5..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' 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/package-lock.json b/ui/package-lock.json index 1e2cea1fdd0..eb23f05a996 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -9,33 +9,32 @@ "version": "2024.9.0-SNAPSHOT", "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.8", - "@capacitor/app": "^5.0.6", - "@capacitor/core": "5.7.8", - "@capacitor/filesystem": "^5.2.0", - "@capacitor/ios": "5.7.8", - "@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", + "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", @@ -47,39 +46,47 @@ "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.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.15", - "@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", + "@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", + "@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": "^4.1.3", "jasmine-core": "~4.5.0", @@ -92,20 +99,10 @@ "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", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "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", @@ -121,19 +118,64 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1602.13", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.13.tgz", - "integrity": "sha512-ejrOYoXgbhDYjdaW4B2SyWeb6AqR8vqqzMyvCq2JX7fo08IhLnVu1fcl0fwr161l37TuzgPNWrHSciOzzmZDkw==", + "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": { @@ -147,96 +189,97 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.15.tgz", - "integrity": "sha512-gw9wQENYVNUCB2bnzk0yKd6YGlemDwuwKnrPnSm4myyMuScZpW+e+zliGW+JXRuVWZqiTJNcdd58e4CrrreILg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.15", - "@angular-devkit/build-webpack": "0.1602.15", - "@angular-devkit/core": "16.2.15", - "@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.15", - "@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", + "tslib": "2.6.3", + "vite": "5.4.0", + "watchpack": "2.4.1", "webpack": "5.94.0", - "webpack-dev-middleware": "6.1.2", - "webpack-dev-server": "4.15.1", - "webpack-merge": "5.9.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": { @@ -248,6 +291,12 @@ "@angular/service-worker": { "optional": true }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, "jest": { "optional": true }, @@ -268,50 +317,22 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "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.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", - "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "16.2.15", - "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-angular/node_modules/@angular-devkit/core": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", - "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "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.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.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" }, @@ -324,351 +345,525 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", - "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" + "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": ">=6.9.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" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "peerDependencies": { + "@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": { + "@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/@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==", + "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": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "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", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "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", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@angular-devkit/build-angular/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==", + "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" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "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", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "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": "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" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@angular-devkit/build-angular/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/@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": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "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" - } + "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", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "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" - }, - "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==", + "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, - "dependencies": { - "tslib": "^2.1.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "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": "ISC", + "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": { - "lru-cache": "^6.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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": "MIT", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@angular-devkit/build-angular/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==", + "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": "BSD-3-Clause", - "optional": true, + "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/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": { + "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": ">=0.10.0" + "node": ">=18.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "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": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" + "@types/estree": "1.0.5" }, "bin": { - "terser": "bin/terser" + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10" + "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/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "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": "0BSD" + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } }, - "node_modules/@angular-devkit/build-angular/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/@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": "ISC" + "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/@angular-devkit/build-webpack": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.15.tgz", - "integrity": "sha512-ms1+vCDdV0KX8BplJ7JoKH3wKjWHxxZTOX+mSPIjt4wS1uAk5DnezXHIjpBiJ3HY9XVHFI9C0HT4n7o6kFIOEQ==", + "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", "dependencies": { - "@angular-devkit/architect": "0.1602.15", - "rxjs": "7.8.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=12" }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^4.0.0" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", - "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "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": "0BSD" + }, + "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": { - "@angular-devkit/core": "16.2.15", - "rxjs": "7.8.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", - "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "node_modules/@angular-devkit/build-webpack": { + "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": { - "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" + "@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": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, "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": { "tslib": "^2.1.0" } }, "node_modules/@angular-devkit/core": { - "version": "16.2.13", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.13.tgz", - "integrity": "sha512-6jTlYOIeYsOF/Vw/hBNusjoCmKJBByoyGS1Fu2Yav8ltxYK04aDtI73l9JJB/5Cpzhc4YELrMqBMH7in5Vowaw==", + "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" }, @@ -682,9 +877,9 @@ } }, "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "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" }, @@ -699,31 +894,41 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "16.2.13", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.13.tgz", - "integrity": "sha512-uhhJZpppaeuT/2V6RiCheJKzS4bAZADL+Gw59VJaojqS8ssdG1UzvqRJokIzFzP7+MhHWylZBWUvWLQxuUvtsA==", + "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", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "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", @@ -735,135 +940,106 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.3.1.tgz", - "integrity": "sha512-PmIOnRwqdOW1bvZtpTGBTDcOq/Czm3D+IPC/k90yIMs1VsAtcxqUmUtELje+ylJeb2LPeEZavekSnEpcatM4HQ==", + "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", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", - "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", + "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", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.3.1.tgz", - "integrity": "sha512-kSc8ESfoy8TUSthbq0Lpq9e17I+3Smy4rHoNpKCFEGuJgPs0+OssZMxB6a5EawGbv2EKTPEtrxzFm1WsLR0U9Q==", + "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", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.3.1.tgz", - "integrity": "sha512-+RcFEWqNiRt3+5jXvmlIDlXtP9+vjdmgmVL6tt8yDbqdjBOewtyMu4pE4YaR4sFboyxgME9PbO2WrOyPXh6xjg==", + "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", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-16.3.1.tgz", - "integrity": "sha512-9+SxUtxB2iOnm0ldS2ow0stMxe02rB/TxeMIe8fxsLFHZdw8RQvs/p3HLvVHXzv6gUblMHebIb/ubUmwEVb2SA==", + "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", - "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": { - "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", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/@angular-eslint/utils": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.3.1.tgz", - "integrity": "sha512-tEBcce0rG+DmcPO8jhRffUFDioGw3G4cUAE15XlRctY1J3QzOBH9HdUOTDt0mMjBgpWCzh0YVT1Moh2bPXU9Xg==", + "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", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", - "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", + "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": { @@ -873,46 +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", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.13.tgz", - "integrity": "sha512-Zs/IHV0qeQBlRYp3XTJP96KKMFrOVd4gFWEXyt8xVbma9W7UCWr/0C6D8HRFjheiT40TSa2Suwpk6Hppm+9ESA==", + "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" }, @@ -920,58 +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", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "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", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "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", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "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", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "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" }, @@ -979,42 +1201,35 @@ "node": ">=10" } }, - "node_modules/@angular/cli/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/@angular/common": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", - "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", + "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", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", - "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", + "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": { @@ -1023,17 +1238,17 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", - "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", + "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" @@ -1044,72 +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", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", - "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", + "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", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", - "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", + "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", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", - "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", + "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", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", - "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", + "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": { @@ -1118,43 +1381,45 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.2.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", - "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", + "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", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-16.2.12.tgz", - "integrity": "sha512-o0z0s4c76NmRASa+mUHn/q6vUKQNa06mGmLBDKm84vRQ1sQ2TJv+R1p8K9WkiM5mGy6tjQCDOgaz13TcxMFWOQ==", + "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" @@ -1163,28 +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", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "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": { @@ -1192,9 +1450,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "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": { @@ -1202,22 +1460,22 @@ } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "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", @@ -1232,22 +1490,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", - "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", @@ -1266,15 +1508,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "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": { @@ -1282,41 +1524,42 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "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", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "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", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "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" }, @@ -1335,20 +1578,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "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": { @@ -1369,13 +1610,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "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" }, @@ -1397,9 +1638,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "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": { @@ -1413,81 +1654,45 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "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", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "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", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "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", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "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" @@ -1497,22 +1702,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "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", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "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": { @@ -1520,15 +1725,15 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "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" @@ -1538,15 +1743,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "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" @@ -1556,48 +1761,50 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "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", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "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", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "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", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "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": { @@ -1605,9 +1812,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "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": { @@ -1615,9 +1822,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "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": { @@ -1625,43 +1832,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "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", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "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", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "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" @@ -1671,11 +1877,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "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" }, @@ -1683,14 +1892,15 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "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.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "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" @@ -1699,68 +1909,81 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "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", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "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", - "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==", + "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", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "node_modules/@babel/plugin-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" @@ -1835,13 +2058,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "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" @@ -1851,13 +2074,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "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" @@ -2020,13 +2243,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "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" @@ -2036,16 +2259,16 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "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" @@ -2055,15 +2278,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "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" @@ -2073,13 +2296,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "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" @@ -2089,13 +2312,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "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" @@ -2105,14 +2328,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "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" @@ -2122,14 +2345,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "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": { @@ -2140,19 +2363,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "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": { @@ -2163,14 +2384,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "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" @@ -2180,13 +2401,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "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" @@ -2196,14 +2417,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "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" @@ -2213,13 +2434,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "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" @@ -2228,14 +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", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "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": { @@ -2246,14 +2484,14 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "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" @@ -2263,13 +2501,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "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": { @@ -2280,14 +2518,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "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" @@ -2297,15 +2535,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "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" @@ -2315,13 +2553,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "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": { @@ -2332,13 +2570,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "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" @@ -2348,13 +2586,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "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": { @@ -2365,13 +2603,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "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" @@ -2381,14 +2619,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "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" @@ -2398,15 +2636,15 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "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" @@ -2416,16 +2654,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "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" @@ -2435,14 +2673,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "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" @@ -2452,14 +2690,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "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" @@ -2469,13 +2707,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "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" @@ -2485,13 +2723,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "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": { @@ -2502,13 +2740,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "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": { @@ -2519,16 +2757,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "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" @@ -2538,14 +2776,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "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" @@ -2555,13 +2793,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "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": { @@ -2572,14 +2810,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "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": { @@ -2590,13 +2828,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "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" @@ -2606,14 +2844,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "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" @@ -2623,15 +2861,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "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": { @@ -2642,13 +2880,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "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" @@ -2658,13 +2896,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "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": { @@ -2675,13 +2913,13 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "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" @@ -2691,17 +2929,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "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": { @@ -2722,13 +2960,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "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" @@ -2738,14 +2976,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "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" @@ -2755,13 +2993,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "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" @@ -2771,13 +3009,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "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" @@ -2787,13 +3025,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "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" @@ -2803,13 +3041,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "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" @@ -2819,14 +3057,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "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" @@ -2836,14 +3074,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "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" @@ -2853,14 +3091,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "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" @@ -2870,26 +3108,29 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "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", @@ -2901,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": { @@ -2975,15 +3216,13 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "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" }, @@ -2999,9 +3238,9 @@ "license": "MIT" }, "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "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" @@ -3011,35 +3250,32 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "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", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "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" }, @@ -3048,13 +3284,13 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "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" @@ -3064,14 +3300,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "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": { @@ -3079,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.8", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.7.8.tgz", - "integrity": "sha512-ooWclwcuW0dy3YfqgoozkHkjatX8H2fb2/RwRsJa3cew1P1lUXIXri3Dquuy4LdqFAJA7UHcJ19Bl/6UKdsZYA==", + "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": { @@ -3136,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": { @@ -3178,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==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/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": { - "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" + "is-docker": "^2.0.0" }, - "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==", + "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": "ISC", + "license": "MIT", "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.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", @@ -3347,377 +3531,583 @@ "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, "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, "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, "license": "MIT", - "dependencies": { - "@types/fs-extra": "^8.0.0", - "debug": "^4.0.0", - "fs-extra": "^9.0.0", - "tslib": "^2.0.1" - }, "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, "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" + "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, "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "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.8", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.7.8.tgz", - "integrity": "sha512-rrZcm/2vJM0WdWRQup1TUidbjQV9PfIadSkV4rAGLD7R6PuzZSMPGT0gmoZzCRlXkqrazrWWDkurei3ozU02FA==", - "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.8", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.7.8.tgz", - "integrity": "sha512-XhGrziBnlRmCJ97LdPXOJquHPpYTwSJZIxYSXuPl7SDDuAEve8vs2wY76gLdaaFH2Z6ctdugUX+jR6VNu+ds+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", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "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", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "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", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "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", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "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", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz", - "integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==", + "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/@esbuild/win32-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "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": [ - "x64" + "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">=12" + "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==", + "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", - "dependencies": { + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "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", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "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", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "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": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "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", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "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", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "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": { @@ -3727,10 +4117,23 @@ "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.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "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": { @@ -3778,12 +4181,47 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "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": "Python-2.0" + "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", @@ -3801,19 +4239,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "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", @@ -3821,6 +4246,19 @@ "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", @@ -3844,17 +4282,11 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "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": { @@ -3866,6 +4298,30 @@ "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", @@ -3881,9 +4337,10 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "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" }, @@ -3897,39 +4354,239 @@ "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", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.7.5.tgz", - "integrity": "sha512-nV8HP7RedjYkIAT8nVr5ifHNT0D3XzA74RPG3/WCCFJKunERNJ9SBiNkCTWhUpSkqsYYwEB4+SOOHz+R5NLk/w==", + "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", + "@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" + }, + "engines": { + "node": ">=18" + } + }, + "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": { + "undici-types": "~6.19.2" + } + }, + "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": { + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "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": { + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "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", + "engines": { + "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" }, @@ -3954,9 +4611,9 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/core": { - "version": "17.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.3.tgz", - "integrity": "sha512-J22Sh3M7rj8Ar3iEs20ko5wgC3DE7vWfYZNdimt2IJiS4J7BEX8R3Awf+TRt+6AN3NFm3/xe1Sz4yvDh3FvNFg==", + "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": { @@ -3982,13 +4639,13 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/@angular-devkit/schematics": { - "version": "17.3.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.3.tgz", - "integrity": "sha512-SABqTtj2im4PJhQjNaAsSypbNkpZFW8YozJ3P748tlh5a9XoHpgiqXv5JhRbyKElLDAyk5i9fe2++JmSudPG/Q==", + "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.3", + "@angular-devkit/core": "17.3.8", "jsonc-parser": "3.2.1", "magic-string": "0.30.8", "ora": "5.4.1", @@ -4001,14 +4658,14 @@ } }, "node_modules/@ionic/angular-toolkit/node_modules/@schematics/angular": { - "version": "17.3.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.3.tgz", - "integrity": "sha512-kNlyjIKTBhfi8Jab3MCkxNRbbpErbzdu0lZNSL8Nidmqs6Tk23Dc1bZe4t/gPNOCkCvQlwYa6X88SjC/ntyVng==", + "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.3", - "@angular-devkit/schematics": "17.3.3", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", "jsonc-parser": "3.2.1" }, "engines": { @@ -4017,6 +4674,48 @@ "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", @@ -4057,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", @@ -4097,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", @@ -4123,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", @@ -4137,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", @@ -4148,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" @@ -4163,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", @@ -4179,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" @@ -4191,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" @@ -4236,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", @@ -4255,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" @@ -4270,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", @@ -4286,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" @@ -4298,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==", + "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": { - "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==", - "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" } @@ -4394,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", @@ -4410,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" @@ -4433,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", @@ -4446,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", @@ -4461,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", @@ -4472,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", @@ -4510,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", @@ -4523,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", @@ -4536,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", @@ -4550,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", @@ -4639,73 +5344,232 @@ "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.3.0" } }, - "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==", + "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", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "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", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "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", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "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", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "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": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" + "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": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4745,23 +5609,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "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", @@ -4788,9 +5635,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "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": { @@ -4808,20 +5655,20 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "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", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "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" }, @@ -4836,6 +5683,63 @@ "@jridgewell/sourcemap-codec": "^1.4.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": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "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": { + "@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": { + "tslib": "2" + } + }, + "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": { + "tslib": "2" + } + }, "node_modules/@kurkle/color": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", @@ -4846,44 +5750,230 @@ "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 - }, - "node_modules/@ngtools/webpack": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.15.tgz", - "integrity": "sha512-rD4IHt3nS6PdIKvmoqwIadMIGKsemBSz412kD8Deetl0TiCVhD/Tn1M00dxXzMSHSFCQcOKxdZAeD53yRwTOOA==", "dev": true, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "typescript": ">=4.9.3 <5.2", - "webpack": "^5.54.0" - } + "license": "MIT" }, - "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/@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": { - "tslib": "^2.0.0" + "@inquirer/type": "^1.3.3" + }, + "engines": { + "node": ">=18.0.0" }, "peerDependencies": { - "@angular/forms": ">=13.2.0", - "rxjs": "^6.5.3 || ^7.0.0" + "@inquirer/prompts": ">= 3 < 6" } }, - "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==", + "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": { - "tslib": "^2.0.0" + "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", @@ -4891,9 +5981,9 @@ } }, "node_modules/@ngx-formly/schematics": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-6.3.0.tgz", - "integrity": "sha512-XSzOvrZ1NoUhmd733bcgUFkl+26pSw8eyXChi9LwrS26nEPweR8RA/JxN+lFvIb92MWzLShLd1DY2oBz/0r0ZQ==", + "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", @@ -4978,6 +6068,23 @@ "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", @@ -5063,10 +6170,34 @@ "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", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "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": { @@ -5077,55 +6208,63 @@ } }, "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "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", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "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", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "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", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "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": { @@ -5133,26 +6272,12 @@ "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", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "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", @@ -5163,303 +6288,423 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "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", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "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" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "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": { - "@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" + "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/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "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", + "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": "BSD-2-Clause", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" + "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/@nrwl/devkit": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", - "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", - "dev": true, - "license": "MIT", + "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": { - "@nx/devkit": "16.5.1" + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@nrwl/tao": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", - "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", + "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", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "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": "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", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", - "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", + "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": "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" + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@nx/devkit/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/@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": { - "yallist": "^4.0.0" + "@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/@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": "ISC", + "engines": { + "node": ">=16" } }, - "node_modules/@nx/devkit/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "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", "dependencies": { - "lru-cache": "^6.0.0" + "isexe": "^3.1.1" }, "bin": { - "semver": "bin/semver.js" + "node-which": "bin/which.js" }, "engines": { - "node": ">=10" + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@nx/devkit/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "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, "engines": { - "node": ">=14.14" + "node": ">=14" } }, - "node_modules/@nx/devkit/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/@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": "ISC" + "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", + "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xml-tools/parser": "^1.0.11", + "prettier": ">=2.4.0" + } }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", - "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "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": [ - "arm64" + "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "darwin" + "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" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@nx/nx-darwin-x64": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", - "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "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": [ - "x64" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", - "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "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": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } + "darwin" + ] }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", - "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "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" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", - "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "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" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", - "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "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" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", - "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "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": [ - "x64" + "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" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", - "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "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" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", - "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "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" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", - "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "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" ], @@ -5468,222 +6713,206 @@ "optional": true, "os": [ "win32" - ], + ] + }, + "node_modules/@schematics/angular": { + "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": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "jsonc-parser": "3.3.1" + }, "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" } }, - "node_modules/@parcel/watcher": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", - "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "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, - "hasInstallScript": true, "license": "MIT", "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.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.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" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "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==", + "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": "MIT", - "optional": true, + "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" + "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/@prettier/plugin-xml": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", - "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "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": "MIT", "dependencies": { - "@xml-tools/parser": "^1.0.11", - "prettier": ">=2.4.0" + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@schematics/angular": { - "version": "16.2.13", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.13.tgz", - "integrity": "sha512-SFE9e7X/CEtzwGEqHUqXriAm4J4uTjcfoRXslc7BuqOKABM8RXPphGQsVG4xOt3n25kXXGkFO2dvDRHuLTP1fQ==", + "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", "dependencies": { - "@angular-devkit/core": "16.2.13", - "@angular-devkit/schematics": "16.2.13", - "jsonc-parser": "3.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "@jridgewell/sourcemap-codec": "^1.4.15" } }, - "node_modules/@schematics/angular/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "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": { + "tslib": "^2.1.0" + } }, "node_modules/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "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.2.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/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "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": "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": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "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": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "license": "MIT", "engines": { - "node": ">= 10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "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": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "@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": ">= 6" - } - }, - "node_modules/@sigstore/sign/node_modules/lru-cache": { - "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": "^16.14.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "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": { - "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" + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" }, "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", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "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": "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.1.0", + "@sigstore/protobuf-specs": "^0.3.2" }, "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", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "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": "ISC", + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" + "node": ">=18" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "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" }, @@ -5705,6 +6934,7 @@ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.7.2.tgz", "integrity": "sha512-3DVLU5HEuk2pQoBmXJlzvrxbKNpu2mJ0SRqz5O/CJjyNCr12ZiPcYMEtuArTyPOk5i7bsAU44nywh1rGfe3gKQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "^9.6.1", "@typescript-eslint/utils": "^8.3.0", @@ -5720,367 +6950,139 @@ "eslint": ">=8.40.0" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "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==", + "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, + "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==", + "dev": true, + "license": "SEE LICENSE" + }, + "node_modules/@trapezedev/project": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@trapezedev/project/-/project-7.0.10.tgz", + "integrity": "sha512-UjwsStjhHq/+D1bWREmFDoyKql+qFIgJX93zQLg7R6CyWZUdtlGP2hU3l7tsVRtjJBVXpVu5mj8tdwJJoABO3A==", "dev": true, + "license": "SEE LICENSE", "dependencies": { - "@typescript-eslint/types": "8.3.0", - "@typescript-eslint/visitor-keys": "8.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@ionic/utils-fs": "^3.1.5", + "@ionic/utils-subprocess": "^2.1.8", + "@prettier/plugin-xml": "^2.2.0", + "@trapezedev/gradle-parse": "7.0.10", + "@xmldom/xmldom": "^0.7.5", + "conventional-changelog": "^3.1.4", + "cross-fetch": "^3.1.5", + "cross-spawn": "^7.0.3", + "diff": "^5.1.0", + "env-paths": "^3.0.0", + "gradle-to-js": "^2.0.0", + "ini": "^2.0.0", + "kleur": "^4.1.5", + "lodash": "^4.17.21", + "mergexml": "^1.2.3", + "npm-watch": "^0.9.0", + "plist": "^3.0.4", + "prettier": "^2.7.1", + "prompts": "^2.4.2", + "replace": "^1.1.0", + "tempy": "^1.0.1", + "tmp": "^0.2.1", + "ts-node": "^10.2.1", + "xcode": "^3.0.1", + "xml-js": "^1.6.11", + "xpath": "^0.0.32", + "yargs": "^17.2.1" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", - "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", + "node_modules/@trapezedev/project/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=0.3.1" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", - "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", + "node_modules/@trapezedev/project/node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.3.0", - "@typescript-eslint/visitor-keys": "8.3.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", - "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", + "node_modules/@trapezedev/project/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true, - "dependencies": { - "@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" - }, + "license": "ISC", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "node": ">=10" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "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==", + "node_modules/@tsconfig/node10": { + "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, - "dependencies": { - "@typescript-eslint/types": "8.3.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "license": "MIT" }, - "node_modules/@stylistic/eslint-plugin/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==", + "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": "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": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/brace-expansion": { + "node_modules/@tufjs/models": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "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/@stylistic/eslint-plugin/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/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/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/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/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/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "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==", - "dev": true, - "license": "SEE LICENSE" - }, - "node_modules/@trapezedev/project": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@trapezedev/project/-/project-7.0.10.tgz", - "integrity": "sha512-UjwsStjhHq/+D1bWREmFDoyKql+qFIgJX93zQLg7R6CyWZUdtlGP2hU3l7tsVRtjJBVXpVu5mj8tdwJJoABO3A==", - "dev": true, - "license": "SEE LICENSE", - "dependencies": { - "@ionic/utils-fs": "^3.1.5", - "@ionic/utils-subprocess": "^2.1.8", - "@prettier/plugin-xml": "^2.2.0", - "@trapezedev/gradle-parse": "7.0.10", - "@xmldom/xmldom": "^0.7.5", - "conventional-changelog": "^3.1.4", - "cross-fetch": "^3.1.5", - "cross-spawn": "^7.0.3", - "diff": "^5.1.0", - "env-paths": "^3.0.0", - "gradle-to-js": "^2.0.0", - "ini": "^2.0.0", - "kleur": "^4.1.5", - "lodash": "^4.17.21", - "mergexml": "^1.2.3", - "npm-watch": "^0.9.0", - "plist": "^3.0.4", - "prettier": "^2.7.1", - "prompts": "^2.4.2", - "replace": "^1.1.0", - "tempy": "^1.0.1", - "tmp": "^0.2.1", - "ts-node": "^10.2.1", - "xcode": "^3.0.1", - "xml-js": "^1.6.11", - "xpath": "^0.0.32", - "yargs": "^17.2.1" - } - }, - "node_modules/@trapezedev/project/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/@trapezedev/project/node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@trapezedev/project/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "license": "ISC", - "engines": { - "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", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "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", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "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/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "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": { @@ -6088,6 +7090,7 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -6098,6 +7101,7 @@ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6107,6 +7111,7 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6116,6 +7121,7 @@ "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": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -6149,6 +7155,7 @@ "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": "*" @@ -6166,6 +7173,7 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -6178,6 +7186,7 @@ "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": { "@types/node": "*", "@types/qs": "*", @@ -6189,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": "*" @@ -6198,13 +7208,15 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/@types/http-proxy": { "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": { "@types/node": "*" } @@ -6244,7 +7256,8 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", @@ -6253,13 +7266,24 @@ "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", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "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": { @@ -6267,6 +7291,7 @@ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6289,19 +7314,22 @@ "version": "6.9.15", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", - "dev": true + "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 + "dev": true, + "license": "MIT" }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true + "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", @@ -6310,18 +7338,12 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true, - "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": { "@types/mime": "^1", "@types/node": "*" @@ -6332,6 +7354,7 @@ "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": { "@types/express": "*" } @@ -6341,6 +7364,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -6351,6 +7375,7 @@ "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": { @@ -6358,6 +7383,7 @@ "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": { "@types/node": "*" } @@ -6369,72 +7395,50 @@ "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.12", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "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", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "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": { @@ -6443,53 +7447,50 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "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", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "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": { @@ -6498,17 +7499,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "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", @@ -6516,68 +7517,26 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "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", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "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", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "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": { @@ -6585,63 +7544,37 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "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", - "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/@typescript-eslint/type-utils/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", - "engines": { - "node": ">=8" + "peerDependencies": { + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "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", @@ -6649,23 +7582,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "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", @@ -6677,102 +7610,41 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "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", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "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", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "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", @@ -6780,13 +7652,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "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", @@ -6794,22 +7666,23 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "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", @@ -6822,72 +7695,67 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "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", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "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", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://opencollective.com/eslint" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "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", @@ -6896,16 +7764,16 @@ "license": "ISC" }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", - "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "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": { @@ -7069,104 +7937,12 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@wessberg/ts-evaluator": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", - "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "node_modules/@xml-tools/parser": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", + "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", "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", - "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/@wessberg/ts-evaluator/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", - "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", - "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/@wessberg/ts-evaluator/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/@wessberg/ts-evaluator/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" - }, - "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", - "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", - "dev": true, - "license": "Apache-2.0", + "license": "Apache-2.0", "dependencies": { "chevrotain": "7.1.1" } @@ -7202,54 +7978,16 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", - "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "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", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", - "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", - "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", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "license": "ISC" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -7277,45 +8015,12 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "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", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.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": { "acorn": "^8" } @@ -7331,11 +8036,14 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "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" } @@ -7377,39 +8085,26 @@ } }, "node_modules/adm-zip": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz", - "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==", + "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", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "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": { @@ -7427,15 +8122,16 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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", @@ -7443,9 +8139,10 @@ } }, "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==", + "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" @@ -7486,6 +8183,7 @@ "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" @@ -7505,6 +8203,7 @@ "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -7545,12 +8244,18 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "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", @@ -7562,20 +8267,6 @@ "node": ">=14" } }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "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", @@ -7584,14 +8275,11 @@ "license": "MIT" }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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", @@ -7624,7 +8312,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/array-ify": { "version": "1.0.0", @@ -7634,16 +8323,17 @@ "license": "MIT" }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "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": { @@ -7769,6 +8459,7 @@ "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": { @@ -7795,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" @@ -7807,37 +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", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "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", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -7847,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": { @@ -7895,46 +8587,20 @@ } }, "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "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.7.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", - "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "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", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", - "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "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": { @@ -7962,32 +8628,15 @@ "webpack": ">=5" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "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" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "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": { @@ -8005,61 +8654,27 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "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-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" + "@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-corejs3/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "node_modules/babel-plugin-polyfill-regenerator": { + "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" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "dev": true, - "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" @@ -8069,6 +8684,7 @@ "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": { @@ -8156,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" @@ -8165,7 +8782,8 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", @@ -8198,13 +8816,16 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "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": { @@ -8259,16 +8880,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "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", @@ -8304,6 +8915,7 @@ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -8340,13 +8952,13 @@ } }, "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==", + "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": { @@ -8362,17 +8974,10 @@ "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -8390,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" @@ -8490,51 +9095,45 @@ "dev": true, "license": "MIT" }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "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", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "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", @@ -8543,33 +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", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "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", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "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", @@ -8624,9 +9232,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001606", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz", - "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==", + "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": [ { @@ -8655,21 +9263,21 @@ } }, "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": { @@ -8698,12 +9306,14 @@ "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.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" }, @@ -8725,6 +9335,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-3.0.1.tgz", "integrity": "sha512-hlIrXXKqSDgb+ZjVYHefmlZUXK8KbkCPiynSVrTb/HjTMkT62cOInaT1NTQCKtxKKOm9oHp958DY3RTAFKtkHg==", + "license": "MIT", "peerDependencies": { "chart.js": ">=4.0.0" } @@ -8733,6 +9344,7 @@ "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" } @@ -8760,16 +9372,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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", @@ -8783,6 +9389,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -8791,15 +9400,16 @@ "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", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "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": { @@ -8846,125 +9456,285 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "license": "ISC", + "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": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?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==", + "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": ">=0.8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "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", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "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": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=12.5.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/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": { - "color-name": "1.1.3" + "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/color-convert/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", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "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": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "node_modules/cli-width": { + "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", - "bin": { - "color-support": "bin.js" + "engines": { + "node": ">= 12" } }, - "node_modules/color/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/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": "MIT", + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "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/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/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": { + "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/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" + } + }, + "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": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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-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-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/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/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", @@ -8986,6 +9756,7 @@ "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" @@ -8995,12 +9766,13 @@ } }, "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==", + "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": { @@ -9041,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" @@ -9051,6 +9824,7 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -9063,6 +9837,7 @@ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -9076,11 +9851,22 @@ "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": { "ms": "2.0.0" } @@ -9089,18 +9875,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "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 + "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": { @@ -9124,6 +9913,7 @@ "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": { "node": ">=0.8" } @@ -9138,25 +9928,6 @@ "ms": "2.0.0" } }, - "node_modules/connect/node_modules/finalhandler": { - "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.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", @@ -9164,41 +9935,12 @@ "dev": true, "license": "MIT" }, - "node_modules/connect/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/connect/node_modules/statuses": { - "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.6" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "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": { "safe-buffer": "5.2.1" }, @@ -9253,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", @@ -9278,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", @@ -9303,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", @@ -9330,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", @@ -9368,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", @@ -9442,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", @@ -9467,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", @@ -9492,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", @@ -9517,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", @@ -9543,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", @@ -9642,10 +10215,11 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "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": { "node": ">= 0.6" } @@ -9654,12 +10228,14 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookiejar": { "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": { @@ -9676,21 +10252,21 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "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", @@ -9713,14 +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", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "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", @@ -9731,6 +10354,7 @@ "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": { @@ -9748,16 +10372,16 @@ } }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "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" @@ -9774,26 +10398,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "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", @@ -9802,9 +10406,9 @@ "license": "MIT" }, "node_modules/critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "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": { @@ -9814,7 +10418,7 @@ "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": { @@ -9863,6 +10467,13 @@ "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", @@ -9900,6 +10511,7 @@ "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", @@ -9921,30 +10533,39 @@ } }, "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "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": { @@ -9990,33 +10611,6 @@ "node": ">=4" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "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", @@ -10194,6 +10788,15 @@ "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", @@ -10239,9 +10842,9 @@ } }, "node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "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" @@ -10324,9 +10927,9 @@ } }, "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "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", @@ -10452,24 +11055,10 @@ "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", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "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": { @@ -10563,9 +11152,10 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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" @@ -10616,13 +11206,6 @@ "node": ">=0.10.0" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "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", @@ -10656,20 +11239,105 @@ "dev": true, "license": "MIT" }, - "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==", + "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": { - "execa": "^5.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults": { - "version": "1.0.4", + "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": { + "execa": "^5.0.0" + }, + "engines": { + "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", @@ -10684,6 +11352,7 @@ "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", @@ -10698,13 +11367,16 @@ } }, "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==", + "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": { @@ -10729,6 +11401,7 @@ "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", @@ -10740,90 +11413,33 @@ } }, "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": "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", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "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": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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" + "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": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/del/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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/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" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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": { @@ -10831,33 +11447,30 @@ }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "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", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "license": "MIT" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -10903,12 +11516,14 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dezalgo": { "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", @@ -10926,6 +11541,7 @@ "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" @@ -10949,6 +11565,7 @@ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -11010,29 +11627,6 @@ ], "license": "BSD-2-Clause" }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "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", @@ -11077,36 +11671,28 @@ "node": ">=8" } }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "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", @@ -11122,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" @@ -11151,6 +11739,13 @@ "safer-buffer": "^2.1.0" } }, + "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/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -11158,26 +11753,10 @@ "dev": true, "license": "MIT" }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/electron-to-chromium": { - "version": "1.4.728", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.728.tgz", - "integrity": "sha512-Ud1v7hJJYIqehlUJGqR6PF1Ek8l80zWwxA6nGxigBsGJ9f9M2fciHyrIiNMerSHSH3p+0/Ia7jIlnDkt41h5cw==", + "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" }, @@ -11185,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" @@ -11193,16 +11773,11 @@ "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": { @@ -11240,6 +11815,7 @@ "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" @@ -11268,52 +11844,21 @@ } }, "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "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" } }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/enhanced-resolve": { + "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", - "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==", - "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.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -11322,26 +11867,19 @@ "node": ">=10.13.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "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", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true, - "license": "MIT" - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -11365,6 +11903,19 @@ "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", @@ -11461,6 +12012,7 @@ "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" @@ -11473,15 +12025,16 @@ "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", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "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" }, @@ -11559,9 +12112,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "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", @@ -11569,50 +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", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", - "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", + "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", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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": { @@ -11630,6 +12185,7 @@ "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" @@ -11639,6 +12195,7 @@ "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", @@ -11656,19 +12213,11 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "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": { @@ -11754,9 +12303,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "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": { @@ -11813,6 +12362,17 @@ "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", @@ -11836,6 +12396,19 @@ "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", @@ -11847,21 +12420,22 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.3.tgz", - "integrity": "sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==", + "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" @@ -11883,17 +12457,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { - "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": { - "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", @@ -11909,6 +12472,7 @@ "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", "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^9.0.0 || ^8.0.0" @@ -11920,27 +12484,30 @@ } }, "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==", + "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", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "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" @@ -11979,12 +12546,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "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", @@ -12016,6 +12587,13 @@ "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", @@ -12046,31 +12624,35 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "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", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "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": { @@ -12112,19 +12694,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "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", @@ -12132,52 +12701,17 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "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", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "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": { @@ -12207,18 +12741,18 @@ } }, "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==", + "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" @@ -12228,6 +12762,7 @@ "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", @@ -12238,9 +12773,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "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": { @@ -12250,16 +12785,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/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, - "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", @@ -12273,7 +12798,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -12283,20 +12808,11 @@ "node": ">=4.0" } }, - "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/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" @@ -12307,17 +12823,11 @@ "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", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true, - "license": "MIT" - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -12336,19 +12846,20 @@ } }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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": { @@ -12358,6 +12869,13 @@ "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", @@ -12389,6 +12907,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -12426,20 +12945,61 @@ "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 + "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", @@ -12452,6 +13012,7 @@ "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", @@ -12466,6 +13027,7 @@ "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" @@ -12474,6 +13036,19 @@ "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", @@ -12531,12 +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", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "license": "ISC", "dependencies": { @@ -12548,6 +13131,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -12569,6 +13153,7 @@ "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" @@ -12599,39 +13184,6 @@ "integrity": "sha512-Kg0lt+is9nOyi/VDms9miScNGot25jVFbjFccXuCL/shd2Q+rt70MALxHVkXllsX83JEBLiHQNjDPGd/6FIOoQ==", "license": "MIT" }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "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", @@ -12646,17 +13198,18 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "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": { @@ -12668,6 +13221,7 @@ "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" } @@ -12676,7 +13230,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "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", @@ -12696,17 +13264,20 @@ } }, "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==", + "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": { @@ -12734,10 +13305,27 @@ "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", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true, "license": "ISC" }, @@ -12773,9 +13361,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "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": { @@ -12789,19 +13377,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "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": ">=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", @@ -12813,9 +13388,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "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": { @@ -12847,6 +13422,7 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12870,6 +13446,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12882,18 +13459,18 @@ "license": "MIT" }, "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==", + "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": { @@ -12909,33 +13486,33 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "dev": true, - "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" @@ -12970,26 +13547,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "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", @@ -13010,14 +13567,28 @@ "node": "6.* || 8.* || >= 10.*" } }, - "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==", + "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", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", + "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", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" @@ -13029,16 +13600,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "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", @@ -13058,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", @@ -13070,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", @@ -13140,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", @@ -13166,23 +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", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "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" @@ -13210,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", @@ -13225,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", @@ -13235,27 +13820,6 @@ "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", @@ -13300,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", @@ -13362,23 +13916,22 @@ "license": "MIT" }, "node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "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" @@ -13401,42 +13954,31 @@ "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 + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/glob/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==", + "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", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "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", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "license": "ISC", "engines": { - "node": ">=16 || 14 >=14.17" + "node": "*" } }, "node_modules/globals": { @@ -13450,13 +13992,14 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "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" @@ -13466,20 +14009,21 @@ } }, "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "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" @@ -13489,6 +14033,7 @@ "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" @@ -13501,6 +14046,7 @@ "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": { @@ -13523,19 +14069,6 @@ "dev": true, "license": "MIT" }, - "node_modules/guess-parser": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", - "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", - "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", @@ -13549,7 +14082,8 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/handlebars": { "version": "4.7.8", @@ -13597,6 +14131,7 @@ "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": { @@ -13688,6 +14223,7 @@ "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" @@ -13700,6 +14236,7 @@ "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" @@ -13712,6 +14249,7 @@ "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" @@ -13736,17 +14274,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "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" @@ -13755,25 +14287,6 @@ "node": ">= 0.4" } }, - "node_modules/hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "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", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true, - "license": "MIT" - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -13788,39 +14301,51 @@ "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", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "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": "^7.5.1" + "lru-cache": "^6.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", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "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": ">=12" + "node": ">=10" } }, + "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" + }, "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": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -13828,11 +14353,19 @@ "wbuf": "^1.1.0" } }, - "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==", + "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": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13847,28 +14380,17 @@ "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 + "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, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, "license": "MIT", "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" + "safe-buffer": "~5.1.0" } }, "node_modules/html-entities": { @@ -13885,7 +14407,8 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ] + ], + "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", @@ -13925,7 +14448,8 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", @@ -13944,11 +14468,22 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", @@ -13966,42 +14501,35 @@ } }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "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", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "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": { @@ -14021,36 +14549,37 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "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", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "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", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "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": { @@ -14099,9 +14628,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "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": { @@ -14116,9 +14645,9 @@ "license": "ISC" }, "node_modules/ignore-walk": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "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": { @@ -14128,32 +14657,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ignore-walk/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "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", @@ -14176,9 +14679,9 @@ "license": "MIT" }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true, "license": "MIT" }, @@ -14199,20 +14702,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "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" @@ -14228,17 +14722,12 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "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", @@ -14252,9 +14741,9 @@ "license": "ISC" }, "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "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": { @@ -14262,30 +14751,28 @@ } }, "node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "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": { @@ -14321,6 +14808,16 @@ "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", @@ -14334,6 +14831,13 @@ "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", @@ -14344,15 +14848,12 @@ "node": ">=8" } }, - "node_modules/inquirer/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==", + "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", @@ -14404,6 +14905,7 @@ "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", @@ -14413,23 +14915,12 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "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==", - "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": { "node": ">= 10" } @@ -14501,22 +14992,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "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", @@ -14531,13 +15006,16 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "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" @@ -14576,15 +15054,16 @@ } }, "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==", + "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" @@ -14604,6 +15083,7 @@ "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" @@ -14622,6 +15102,25 @@ "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", @@ -14651,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", @@ -14688,13 +15200,13 @@ } }, "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==", + "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": { @@ -14738,6 +15250,7 @@ "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": { "node": ">=10" }, @@ -14758,13 +15271,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "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", @@ -14802,6 +15308,7 @@ "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" @@ -14875,6 +15382,7 @@ "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": { @@ -14910,22 +15418,27 @@ "license": "MIT" }, "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==", + "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", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "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", @@ -14944,6 +15457,7 @@ "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": { @@ -14974,30 +15488,20 @@ } }, "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==", + "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", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/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": ">=10" } }, "node_modules/istanbul-lib-report": { @@ -15025,22 +15529,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/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": { - "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", @@ -15080,9 +15568,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "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": { @@ -15094,17 +15582,14 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "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" }, @@ -15112,94 +15597,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "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", - "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/jake/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", - "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", - "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/jake/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/jake/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" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jasmine": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", @@ -15232,27 +15629,6 @@ "colors": "1.4.0" } }, - "node_modules/jasmine/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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", @@ -15312,9 +15688,9 @@ } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "license": "MIT", "bin": { @@ -15329,23 +15705,22 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "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", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "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" }, @@ -15359,53 +15734,6 @@ "node": ">=12.0.0" } }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "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", @@ -15434,11 +15762,14 @@ "license": "MIT" }, "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==", + "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", @@ -15481,17 +15812,20 @@ } }, "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==", + "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", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "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" } @@ -15552,6 +15886,13 @@ "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", @@ -15586,9 +15927,9 @@ } }, "node_modules/karma": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", - "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "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": { @@ -15611,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", @@ -15682,25 +16023,15 @@ "url": "https://github.com/sponsors/mattlewis92" } }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": { @@ -15730,10 +16061,48 @@ "node": ">=6" } }, + "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": { @@ -15743,16 +16112,77 @@ "rimraf": "bin.js" } }, - "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==", + "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": "BSD-3-Clause", + "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": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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": "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", @@ -15791,6 +16221,33 @@ "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", @@ -15803,51 +16260,54 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/karma/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "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", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "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": { @@ -15860,15 +16320,22 @@ "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": { @@ -15890,16 +16357,6 @@ "node": ">=10" } }, - "node_modules/karma/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/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -15930,21 +16387,12 @@ "node": ">=6" } }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/launch-editor": { "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": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -15954,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", @@ -15965,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" @@ -15974,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", @@ -16003,24 +16455,81 @@ } }, "node_modules/less-loader": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "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": { @@ -16030,7 +16539,6 @@ "dev": true, "license": "BSD-3-Clause", "optional": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -16084,37 +16592,180 @@ "dev": true, "license": "MIT" }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "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": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "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": ">=4" + "node": ">=18.0.0" } }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "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", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/load-json-file/node_modules/pify": { + "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": { + "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/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" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", @@ -16135,9 +16786,9 @@ } }, "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "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": { @@ -16145,22 +16796,26 @@ } }, "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==", + "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": { @@ -16173,6 +16828,7 @@ "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", @@ -16183,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", @@ -16206,18 +16865,21 @@ "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==", + "dev": true, "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==", + "dev": true, "license": "MIT", "dependencies": { "lodash._baseassign": "^3.0.0", @@ -16236,12 +16898,14 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true, "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==", + "dev": true, "license": "MIT" }, "node_modules/lodash.ismatch": { @@ -16255,6 +16919,7 @@ "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": { "lodash._getnative": "^3.0.0", @@ -16273,6 +16938,7 @@ "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": "MIT" }, "node_modules/log-symbols": { @@ -16334,6 +17000,12 @@ "node": ">=7.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/log-symbols/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -16355,311 +17027,306 @@ "node": ">=8" } }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "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": "Apache-2.0", + "license": "MIT", "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" + "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": ">=8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": "MIT", "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "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": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "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": "MIT", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/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": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": "ISC" + "license": "MIT" }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "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": "ISC", + "license": "MIT", "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" + "get-east-asian-width": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "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": "ISC", + "license": "MIT", "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" + "mimic-function": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "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", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/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/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": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "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" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/make-fetch-happen/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==", + "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": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "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": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "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", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "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": "ISC", + "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": ">=12" + "node": ">=8.0" } }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "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": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "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": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "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": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "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": "ISC", + "license": "MIT", "dependencies": { - "unique-slug": "^3.0.0" + "semver": "^7.5.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "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": "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": { - "imurmurhash": "^0.1.4" + "@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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen/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/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -16684,16 +17351,23 @@ } }, "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz", + "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==", "dev": true, - "license": "Unlicense", + "license": "Apache-2.0", "dependencies": { - "fs-monkey": "^1.0.4" + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" }, "engines": { "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, "node_modules/meow": { @@ -16722,46 +17396,67 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/hosted-git-info": { + "node_modules/meow/node_modules/find-up": { "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==", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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/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", + "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": { - "yallist": "^4.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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/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": "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" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/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" } }, "node_modules/meow/node_modules/read-pkg": { @@ -16808,13 +17503,6 @@ "node": ">=8" } }, - "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", @@ -16828,16 +17516,6 @@ "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", @@ -16848,6 +17526,16 @@ "node": ">=8" } }, + "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", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", @@ -16861,33 +17549,18 @@ "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==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "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 + "dev": true, + "license": "MIT" }, "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": { @@ -16926,42 +17599,57 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "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": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=4" - } - }, + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=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": "MIT", "engines": { "node": ">= 0.6" @@ -16971,6 +17659,7 @@ "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": { "mime-db": "1.52.0" @@ -16988,6 +17677,19 @@ "node": ">=6" } }, + "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", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -17012,13 +17714,14 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "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": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -17035,24 +17738,30 @@ "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 + "dev": true, + "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "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", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17084,85 +17793,46 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, "engines": { - "node": ">= 8" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "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": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/minipass-collect/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-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "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": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, - "node_modules/minipass-fetch/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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-fetch/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-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -17196,37 +17866,6 @@ "dev": true, "license": "ISC" }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream/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", @@ -17297,6 +17936,7 @@ "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": { "minipass": "^3.0.0", @@ -17310,6 +17950,7 @@ "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" @@ -17322,18 +17963,20 @@ "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/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "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": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/mkdirp-classic": { @@ -17354,9 +17997,9 @@ } }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, "license": "MIT", "engines": { @@ -17367,13 +18010,48 @@ "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": "MIT" }, + "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", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "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, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "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/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": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -17383,10 +18061,14 @@ } }, "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "license": "ISC" + "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": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/nanoid": { "version": "3.3.7", @@ -17475,6 +18157,14 @@ "node": ">= 4.4.x" } }, + "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": "ISC", + "optional": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -17496,6 +18186,7 @@ "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.4.0" @@ -17519,28 +18210,29 @@ } }, "node_modules/ngx-cookie-service": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-16.1.0.tgz", - "integrity": "sha512-FrzMjsGCHZCd2sEucigMaGyzImBL0l6gwWn6jmLBhcNVx0D7P8Yvtgk9aUptlqBrVKy4c2upglSa3Ogv3679bw==", + "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": { - "tslib": "^2.0.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular/common": "^16.0.0", - "@angular/core": "^16.0.0" + "@angular/common": "^18.0.0-rc.0", + "@angular/core": "^18.0.0-rc.0" } }, "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==", + "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": "^16.0.0", - "@angular/core": "^16.0.0" + "@angular/common": "^18.0.0", + "@angular/core": "^18.0.0" } }, "node_modules/ngx-spinner": { @@ -17557,10 +18249,26 @@ "@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, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, "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==", + "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": "MIT", "dependencies": { @@ -17575,7 +18283,8 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/node-fetch": { "version": "2.7.0", @@ -17598,108 +18307,125 @@ } } }, - "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==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "BSD-2-Clause" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "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": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", + "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" + "tar": "^6.2.1", + "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.13 || ^14.13 || >=16" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "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", + "optional": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, + "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": { + "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": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": { - "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" + "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": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "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/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": "MIT", - "dependencies": { - "css-select": "^4.2.1", - "he": "1.2.0" + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "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": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "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": { + "css-select": "^4.2.1", + "he": "1.2.0" } }, "node_modules/node-html-parser/node_modules/css-select": { @@ -17776,9 +18502,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "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" }, @@ -17811,6 +18537,17 @@ "url": "https://opencollective.com/nodemon" } }, + "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": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/nodemon/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -17821,6 +18558,19 @@ "ms": "^2.1.1" } }, + "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": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/nodemon/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -17832,35 +18582,35 @@ } }, "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "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": "ISC", "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "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": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "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.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" } }, "node_modules/normalize-path": { @@ -17884,9 +18634,9 @@ } }, "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "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": "ISC", "dependencies": { @@ -17920,163 +18670,95 @@ } }, "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "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": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "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": { - "ignore-walk": "^6.0.0" + "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/npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "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", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "ISC" }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "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": { - "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" + "ignore-walk": "^6.0.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "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": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "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": ">= 6" - } - }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "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": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "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": "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", + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", "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/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "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" + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "license": "ISC", "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.14.0 || >=18.0.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": { "path-key": "^3.0.0" @@ -18099,22 +18781,6 @@ "npm-watch": "cli.js" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -18128,312 +18794,297 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "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": "MIT" + "license": "Apache-2.0", + "engines": { + "node": "*" + } }, - "node_modules/nx": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/nx/-/nx-16.5.1.tgz", - "integrity": "sha512-I3hJRE4hG7JWAtncWwDEO3GVeGPpN0TtM8xH5ArZXyDuVeTth/i3TtJzdDzqXO1HHtIoAQN0xeq4n9cLuMil5g==", + "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, - "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" - }, - "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 - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/nx/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/object-inspect": { + "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", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nx/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "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": "Python-2.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/nx/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nx/node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "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": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nx/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": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/nx/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/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": { - "color-name": "~1.1.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" } }, - "node_modules/nx/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "node_modules/object.values": { + "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": { - "@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" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nx/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "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": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=14.14" + "node": ">= 0.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": { + "node": ">= 0.8" } }, - "node_modules/nx/node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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": { - "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" + "wrappy": "1" + } + }, + "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" }, "engines": { - "node": "*" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nx/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==", + "node_modules/open": { + "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": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nx/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/nx/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/nx/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, + "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": { - "universalify": "^2.0.0" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nx/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, + "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" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/nx/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", + "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": { - "yallist": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/nx/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "license": "ISC", + "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": { - "brace-expansion": "^1.1.7" + "color-name": "~1.1.4" }, "engines": { - "node": "*" + "node": ">=7.0.0" } }, - "node_modules/nx/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "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": ">=10" + "node": ">=8" } }, - "node_modules/nx/node_modules/supports-color": { + "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==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -18442,2686 +19093,3012 @@ "node": ">=8" } }, - "node_modules/nx/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "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", - "engines": { - "node": ">=14.14" - } + "license": "MIT" }, - "node_modules/nx/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "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": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nx/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/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": ">= 10.0.0" + "node": ">=0.10.0" } }, - "node_modules/nx/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/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": { - "node": "*" - } - }, - "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==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "license": "MIT", + "node": ">=10" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "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": { + "aggregate-error": "^3.0.0" + }, "engines": { - "node": ">= 10.12.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/p-retry": { + "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": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" }, "engines": { - "node": ">= 0.4" + "node": ">=16.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "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==", + "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", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "node_modules/pac-proxy-agent": { + "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": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 14" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "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==", + "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": { - "ee-first": "1.1.1" + "degenerator": "^5.0.0", + "netmask": "^2.0.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 14" } }, - "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==", + "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, - "engines": { - "node": ">= 0.8" - } + "license": "BlueOak-1.0.0" }, - "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==", + "node_modules/pacote": { + "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": { - "wrappy": "1" + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@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": "^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", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "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": { - "mimic-fn": "^2.1.0" + "callsites": "^3.0.0" }, "engines": { "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" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 18" } }, - "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==", + "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": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "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/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": { - "@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" - }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.10" } }, - "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==", + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "devOptional": true, "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" + "entities": "^4.4.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "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==", + "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": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "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==", + "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "parse5": "^7.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "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==", + "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", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.8" } }, - "node_modules/ora/node_modules/has-flag": { + "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "license": "MIT", "engines": { "node": ">=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==", + "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", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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==", + "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" + } + }, + "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.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": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/path-scurry/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/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": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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==", + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "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.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": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", + "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", - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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==", + "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", - "dependencies": { - "aggregate-error": "^3.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "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": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "pinkie": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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==", + "node_modules/piscina": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", "dev": true, - "engines": { - "node": ">= 4" + "license": "MIT", + "optionalDependencies": { + "nice-napi": "^1.0.2" } }, - "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==", + "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": { + "find-up": "^6.3.0" + }, "engines": { - "node": ">=6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pac-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", - "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "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": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.5", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.4" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">= 14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "debug": "^4.3.4" + "p-locate": "^6.0.0" }, "engines": { - "node": ">= 14" - } + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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==", + "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": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">= 14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "agent-base": "^7.0.2", - "debug": "4" + "p-limit": "^4.0.0" }, "engines": { - "node": ">= 14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, "engines": { - "node": ">= 14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "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==", + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, "engines": { - "node": ">= 14" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/git": "^4.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", - "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", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10.4.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==", + "node_modules/plist/node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true, - "license": "(MIT AND Zlib)" + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } }, - "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==", + "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", - "dependencies": { - "callsites": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "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==", + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "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": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10 || ^12 || >=14" } }, - "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==", + "node_modules/postcss-loader": { + "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": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, "engines": { - "node": ">= 0.10" + "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/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "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/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==", + "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": "MIT", - "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "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": { - "entities": "^4.4.0" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "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==", + "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": "MIT", + "license": "ISC", "dependencies": { - "parse5": "^7.0.0" + "postcss-selector-parser": "^6.0.4" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/parse5-sax-parser/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "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": "MIT", + "license": "ISC", "dependencies": { - "entities": "^4.4.0" + "icss-utils": "^5.0.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/postcss-selector-parser": { + "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": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "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==", + "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", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "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==", + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dev": true, "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "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==", + "node_modules/prebuild-install/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, - "license": "(WTFPL OR MIT)" + "license": "ISC" }, - "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==", + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" } }, - "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", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "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": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "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": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "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": "ISC", + "license": "MIT", "engines": { - "node": "14 || >=16.14" + "node": ">= 0.8.0" } }, - "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 - }, - "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==", + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, "engines": { - "node": ">=8" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "node_modules/proc-log": { + "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": "MIT" + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "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==", + "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/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "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/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, + "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", - "engines": { - "node": ">=8.6" + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=10" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "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==", + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "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==", + "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": { - "pinkie": "^2.0.0" + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.1.7", + "yargs": "^15.3.1" }, + "bin": { + "protractor": "bin/protractor", + "webdriver-manager": "bin/webdriver-manager" + }, + "engines": { + "node": ">=10.13.x" + } + }, + "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": { "node": ">=0.10.0" } }, - "node_modules/piscina": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", - "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", + "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", - "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" + "engines": { + "node": ">=0.10.0" } }, - "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==", + "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": { - "find-up": "^6.3.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "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==", + "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": "MIT", + "license": "ISC", "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "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==", + "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", - "dependencies": { - "p-locate": "^6.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=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==", + "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": { - "yocto-queue": "^1.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=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==", + "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": { - "p-limit": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/path-exists": { + "node_modules/protractor/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "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": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "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": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=12.20" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "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": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10.4.0" + "node": ">=8" } }, - "node_modules/plist/node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "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": ">=10.0.0" + "node": ">=0.6.0", + "teleport": ">=0.2.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==", + "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", + "license": "BSD-3-Clause", "engines": { - "node": ">=8.0" + "node": ">=0.10.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==", + "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": ">= 0.4" + "dependencies": { + "source-map": "^0.5.6" } }, - "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "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, - "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.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "ansi-regex": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=0.10.0" } }, - "node_modules/postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "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": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" - }, "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "node": ">=0.8.0" } }, - "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==", + "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", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } + "license": "ISC" }, - "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==", + "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": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=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==", + "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": { - "postcss-selector-parser": "^6.0.4" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=6" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/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": "ISC", + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 0.10" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "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": ">=4" + "node": ">= 14" } }, - "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==", + "node_modules/proxy-agent/node_modules/lru-cache": { + "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-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/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "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", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } + "optional": true }, - "node_modules/prebuild-install/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "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": "ISC" + "license": "MIT" }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "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": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "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==", + "node_modules/punycode": { + "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.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.8.0" + "node": ">=0.6.0", + "teleport": ">=0.2.0" } }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "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", - "bin": { - "prettier": "bin-prettier.js" - }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=0.9" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "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": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { - "node": ">=6" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "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, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/promise-inflight": { + "node_modules/queue-tick": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "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==", + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "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": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, + "safe-buffer": "^5.1.0" + } + }, + "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": { - "node": ">= 6" + "node": ">= 0.6" } }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "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": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/protractor": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", - "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", + "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": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.1.7", - "yargs": "^15.3.1" - }, - "bin": { - "protractor": "bin/protractor", - "webdriver-manager": "bin/webdriver-manager" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=10.13.x" + "node": ">=0.10.0" } }, - "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==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "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==", + "node_modules/rc/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/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "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==", + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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==", + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "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==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "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==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/protractor/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/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "p-try": "^1.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/protractor/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "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" + "p-limit": "^1.1.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "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==", + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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==", + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/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": "BSD-2-Clause", "dependencies": { - "source-map": "^0.5.6" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "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==", + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "pify": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "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==", + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/protractor/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/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/readable-stream": { + "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": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/protractor/node_modules/wrap-ansi/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, + "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": { + "picomatch": "^2.2.1" + }, "engines": { - "node": ">=8" + "node": ">=8.10.0" } }, - "node_modules/protractor/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, + "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", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/protractor/node_modules/wrap-ansi/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==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { "node": ">=8" } }, - "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==", + "node_modules/reflect-metadata": { + "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": "ISC" + "license": "Apache-2.0" }, - "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==", + "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": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "regenerate": "^1.4.2" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "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==", + "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": "ISC", + "license": "MIT", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "@babel/runtime": "^7.8.4" + } + }, + "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" + }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true, + "license": "MIT" + }, + "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": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "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==", + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, - "engines": { - "node": ">= 0.10" + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "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==", + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", + "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "dev": true, "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" + "chalk": "2.4.2", + "minimatch": "3.0.5", + "yargs": "^15.3.1" + }, + "bin": { + "replace": "bin/replace.js", + "search": "bin/search.js" }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, - "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==", + "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": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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==", + "node_modules/replace/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": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "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/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": { - "agent-base": "^7.0.2", - "debug": "4" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/replace/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=12" + "node": "*" } }, - "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==", + "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": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 14" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "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==", + "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", - "optional": true + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "node_modules/replace/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": "MIT" + "license": "ISC" }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "node_modules/replace/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" - }, - "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==", "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "license": "MIT", + "node_modules/replace/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": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, "engines": { "node": ">=6" } }, - "node_modules/q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "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": "MIT", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" + "node": ">= 6" } }, - "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==", + "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": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">=0.9" + "node": ">= 0.12" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "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", - "dependencies": { - "side-channel": "^1.0.4" - }, "engines": { "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "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": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true, - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "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", - "engines": { - "node": ">=8" + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "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", - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "node": ">=0.10.0" } }, - "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, + "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.6" + "node": ">=0.10.0" } }, - "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==", + "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": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">= 0.8" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "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==", + "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": { - "safer-buffer": ">= 2.1.2 < 3" + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "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": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "license": "MIT", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, - "bin": { - "rc": "cli.js" + "engines": { + "node": ">=8.9.0" } }, - "node_modules/rc/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/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "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": "MIT", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", - "dev": true, - "license": "ISC", + "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": { - "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" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "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/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/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "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": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 4" } }, - "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "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": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "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": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "node_modules/rimraf/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": ">=4" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "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": "MIT", + "license": "ISC", "dependencies": { - "locate-path": "^2.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "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": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, + "license": "ISC", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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": "4.21.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=4" + "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" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, "engines": { - "node": ">=4" + "node": "0.12.* || 4.* || 6.* || >= 7.*" } }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "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": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "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": ">=4" + "node": ">=0.12.0" } }, - "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==", + "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, - "license": "ISC" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } }, - "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": "BSD-2-Clause", + "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": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "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": { - "pify": "^3.0.0" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" }, "engines": { - "node": ">=4" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "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", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "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": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/sass": { + "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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" }, "engines": { - "node": ">= 6" + "node": ">=14.0.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "devOptional": true, + "node_modules/sass-loader": { + "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": { - "picomatch": "^2.2.1" + "neo-async": "^2.6.2" }, "engines": { - "node": ">=8.10.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@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": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", "dev": true, - "license": "MIT", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "https-proxy-agent": "^2.2.1" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/reflect-metadata": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", - "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", - "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==", + "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": { - "regenerate": "^1.4.2" + "es6-promisify": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">= 4.0.0" } }, - "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==", + "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": { - "@babel/runtime": "^7.8.4" + "ms": "^2.1.1" } }, - "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==", + "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" + "license": "MIT", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } }, - "node_modules/regexp-to-ast": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", - "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "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==", + "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": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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==", + "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": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "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": "BSD-2-Clause", + "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": { - "jsesc": "~0.5.0" + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" }, - "bin": { - "regjsparser": "bin/parser" + "engines": { + "node": ">= 6.9.0" } }, - "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==", + "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": { + "glob": "^7.1.3" + }, "bin": { - "jsesc": "bin/jsesc" + "rimraf": "bin.js" } }, - "node_modules/replace": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", - "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "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": { - "chalk": "2.4.2", - "minimatch": "3.0.5", - "yargs": "^15.3.1" - }, - "bin": { - "replace": "bin/replace.js", - "search": "bin/search.js" + "os-tmpdir": "~1.0.1" }, "engines": { - "node": ">= 6" + "node": ">=0.4.0" } }, - "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/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": { - "color-convert": "^2.0.1" + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4.0.0" } }, - "node_modules/replace/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "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": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "license": "MIT", + "engines": { + "node": ">=4.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/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": { - "color-name": "~1.1.4" + "@types/node-forge": "^1.3.0", + "node-forge": "^1" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" } }, - "node_modules/replace/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "node_modules/semver": { + "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": { - "brace-expansion": "^1.1.7" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "*" + "node": ">=10" } }, - "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/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": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/replace/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/replace/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==", + "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": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" + "ms": "2.0.0" } }, - "node_modules/replace/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==", + "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": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "license": "MIT", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "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==", + "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", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, "engines": { - "node": ">= 0.12" + "node": ">= 0.8" } }, - "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==", + "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", - "engines": { - "node": ">=0.6" + "dependencies": { + "randombytes": "^2.1.0" } }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "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": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" }, "engines": { - "node": ">=0.8" + "node": ">= 0.8.0" } }, - "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==", + "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", - "bin": { - "uuid": "bin/uuid" + "dependencies": { + "ms": "2.0.0" } }, - "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==", + "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": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "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==", + "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": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "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==", + "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/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "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/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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-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": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "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", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.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==", + "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": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "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==", + "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": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "kind-of": "^6.0.2" }, "engines": { - "node": ">=8.9.0" + "node": ">=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==", + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", "dev": true, - "license": "BSD-3-Clause", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "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==", + "node_modules/sharp/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" + }, + "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": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "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": ">= 4" + "node": ">=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==", + "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", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/signal-exit": { + "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", - "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": "*" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "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", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "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", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" + "license": "Apache-2.0", + "dependencies": { + "@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": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "license": "MIT", - "engines": { - "node": "0.12.* || 4.* || 6.* || >= 7.*" - } - }, - "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==", - "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": "^16.14.0 || >=18.0.0" } }, - "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==", + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "dev": true, "funding": [ { @@ -21137,65 +22114,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "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" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "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": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "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/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==", + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, "funding": [ { "type": "github", @@ -21210,3091 +22135,2594 @@ "url": "https://feross.org/support" } ], - "license": "MIT" - }, - "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": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "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", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", - "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" } }, - "node_modules/sass-loader": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", - "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "dev": true, "license": "MIT", "dependencies": { - "neo-async": "^2.6.2" + "big-integer": "1.6.x" }, "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } + "node": ">= 5.10.0" } }, - "node_modules/saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dev": true, + "license": "MIT", "dependencies": { - "https-proxy-agent": "^2.2.1" - }, - "engines": { - "node": "*" + "is-arrayish": "^0.3.1" } }, - "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==", + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", "dev": true, "license": "MIT", "dependencies": { - "es6-promisify": "^5.0.0" + "semver": "~7.0.0" }, "engines": { - "node": ">= 4.0.0" + "node": ">=8.10.0" } }, - "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==", + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "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==", + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "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", - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, "engines": { - "node": ">= 4.5.0" + "node": ">=8" } }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "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/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "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": "ISC", + "license": "MIT", "dependencies": { - "xmlchars": "^2.2.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "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==", + "node_modules/slice-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": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 12.13.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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 - }, - "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==", + "node_modules/slice-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": "Apache-2.0", + "license": "MIT", "dependencies": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 6.9.0" + "node": ">=7.0.0" } }, - "node_modules/selenium-webdriver/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": "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" - }, + "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": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "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==", + "node_modules/socket.io": { + "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": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=10.2.0" } }, - "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==", + "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": { - "os-tmpdir": "~1.0.1" - }, - "engines": { - "node": ">=0.4.0" + "debug": "~4.3.4", + "ws": "~8.17.1" } }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "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": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" }, "engines": { - "node": ">=10" + "node": ">=10.0.0" } }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", + "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": { - "lru-cache": "^6.0.0" - }, + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "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": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "uuid": "dist/bin/uuid" } }, - "node_modules/semver/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==", - "license": "ISC", + "node_modules/socks": { + "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": { - "yallist": "^4.0.0" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=10" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 14" } }, - "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==", + "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, - "dependencies": { - "ms": "2.0.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" } }, - "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 - }, - "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 - }, - "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==", + "node_modules/source-map-js": { + "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", - "dependencies": { - "randombytes": "^2.1.0" + "engines": { + "node": ">=0.10.0" } }, - "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==", + "node_modules/source-map-loader": { + "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": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" } }, - "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==", + "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": { - "ms": "2.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "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==", + "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": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "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==", + "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": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "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 - }, - "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 + "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/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 + "node_modules/spdx-exceptions": { + "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/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/spdx-expression-parse": { + "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, - "engines": { - "node": ">= 0.6" + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "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==", + "node_modules/spdx-license-ids": { + "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": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6.0.0" } }, - "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==", + "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": "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==", "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "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==", + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "through": "2" }, "engines": { - "node": ">= 0.4" + "node": "*" } }, - "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==", + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "node_modules/sprintf-js": { + "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": "ISC" + "license": "BSD-3-Clause" }, - "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==", + "node_modules/ssh-config": { + "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": { - "kind-of": "^6.0.2" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/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==", + "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/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==", - "license": "MIT", + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "license": "ISC", "dependencies": { - "shebang-regex": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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==", + "node_modules/statuses": { + "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": ">=8" + "node": ">= 0.6" } }, - "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==", + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/stream-combiner2": { + "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": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, - "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/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/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "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": "Apache-2.0", + "license": "MIT", "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" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/sigstore/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "node_modules/stream-combiner2/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", - "engines": { - "node": ">= 10" - } + "license": "MIT" }, - "node_modules/sigstore/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "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": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "safe-buffer": "~5.1.0" } }, - "node_modules/sigstore/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "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": "ISC", + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, "engines": { - "node": ">=12" + "node": ">=8.0" } }, - "node_modules/sigstore/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "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": "ISC", + "license": "MIT", "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" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "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", - "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" + "graceful-fs": "^4.1.6" } }, - "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "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": "ISC", + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 4.0.0" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "node_modules/streamx": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.19.0.tgz", + "integrity": "sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" } }, - "node_modules/simple-plist": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", - "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", - "dev": true, + "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": { - "bplist-creator": "0.1.0", - "bplist-parser": "0.3.1", - "plist": "^3.0.5" + "safe-buffer": "~5.2.0" } }, - "node_modules/simple-plist/node_modules/bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "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": { - "big-integer": "1.6.x" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 5.10.0" + "node": ">=8" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "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": { - "is-arrayish": "^0.3.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "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": { - "semver": "~7.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "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", - "engines": { - "node": ">=12" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/slice-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==", + "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": { - "color-convert": "^2.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-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==", + "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": { - "color-name": "~1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "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==", + "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": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=4" } }, - "node_modules/socket.io": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.3.tgz", - "integrity": "sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==", + "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", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "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": ">=6" } }, - "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==", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "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==", + "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": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "node": ">=8" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" }, "engines": { - "node": ">=10.0.0" + "node": ">=6.4.0 <13 || >=14" } }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "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": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "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==", + "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, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">=4" } }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "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", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, "engines": { - "node": ">= 10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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", + "node_modules/swiper": { + "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", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">= 4.7.0" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "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": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/source-map-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", - "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "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", "dependencies": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 14.15.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" + "url": "https://opencollective.com/unts" } }, - "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==", + "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", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "engines": { + "node": ">=6" } }, - "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==", + "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": "BSD-3-Clause", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "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==", - "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==", + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true, - "license": "CC-BY-3.0" - }, - "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==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "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==", + "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": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=6.0.0" - } - }, - "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, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "node": ">= 8" } }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "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": "MIT", + "license": "ISC", "dependencies": { - "through": "2" + "yallist": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "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", - "dependencies": { - "readable-stream": "^3.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ssh-config": { - "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==", - "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==", + "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", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "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", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "ISC" }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "license": "MIT", - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-combiner2/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==", - "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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "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": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "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" - } - }, - "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==", - "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "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": ">=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": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "node": ">=10" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/terser": { + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "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==", + "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": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">=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": { - "ansi-regex": "^5.0.1" + "peerDependencies": { + "webpack": "^5.1.0" }, - "engines": { - "node": ">=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": { - "node": ">=4" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "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": { - "min-indent": "^1.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "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==", + "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", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "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": "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", - "license": "MIT", - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^2.1.2", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=6.4.0 <13 || >=14" - } + "license": "MIT" }, - "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==", + "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": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "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==", - "license": "MIT", - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" + "node": ">= 10.13.0" }, "funding": { - "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" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/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", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "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==", + "node_modules/text-decoder": { + "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": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/swiper": { - "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", - "url": "https://www.patreon.com/swiperjs" - }, - { - "type": "open_collective", - "url": "http://opencollective.com/swiper" - } - ], - "engines": { - "node": ">= 4.7.0" + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" } }, - "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==", + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "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/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "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": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" } }, - "node_modules/tar-fs/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==", + "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": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "readable-stream": "3" } }, - "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==", + "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.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "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": ">=14.14" } }, - "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==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "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": { - "node": ">= 8" + "node": ">=4" } }, - "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==", - "license": "ISC", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=8.0" } }, - "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==", - "license": "ISC" - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "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": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, - "license": "MIT", + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "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": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8" } }, - "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==", + "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", - "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": ">=6" } }, - "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==", + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "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": "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": ">=10" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "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==", + "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", - "engines": { - "node": ">=6" + "bin": { + "tree-kill": "cli.js" } }, - "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==", + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.29.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", - "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", - "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" + "node": ">=16" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "typescript": ">=4.2.0" } }, - "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==", + "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": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { - "webpack": "^5.1.0" + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" }, "peerDependenciesMeta": { "@swc/core": { "optional": true }, - "esbuild": { - "optional": true - }, - "uglify-js": { + "@swc/wasm": { "optional": true } } }, - "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==", + "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": { - "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/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": { - "ajv": "^6.9.1" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "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==", + "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": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" + "minimist": "^1.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "bin": { + "json5": "lib/cli.js" } }, - "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/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/tuf-js": { + "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": "ISC", + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" }, "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": "ISC", + "license": "Apache-2.0", "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" + "safe-buffer": "^5.0.1" }, "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==", + "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": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } + "license": "Unlicense" }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "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": { + "prelude-ls": "^1.2.1" + }, "engines": { - "node": ">=0.10" + "node": ">= 0.8.0" } }, - "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/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "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", - "dependencies": { - "readable-stream": "3" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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 - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "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": { - "os-tmpdir": "~1.0.2" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=0.6.0" + "node": ">= 0.6" } }, - "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==", + "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", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, - "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">=8.0" + "node": ">= 0.4" } }, - "node_modules/toidentifier": { + "node_modules/typed-array-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "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": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "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": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "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": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "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", - "engines": { - "node": ">= 4.0.0" - } + "license": "MIT" }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "node_modules/typedarray-to-buffer": { + "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": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" + "is-typedarray": "^1.0.0" } }, - "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==", - "license": "MIT", + "node_modules/typescript": { + "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": { - "tree-kill": "cli.js" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "node_modules/typescript-strict-plugin": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/typescript-strict-plugin/-/typescript-strict-plugin-2.4.4.tgz", + "integrity": "sha512-OXcWHQk+pW9gqEL/Mb1eTgj/Yiqk1oHBERr9v4VInPOYN++p+cXejmQK/h/VlUPGD++FXQ8pgiqVMyEtxU4T6A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "chalk": "^3.0.0", + "execa": "^4.0.0", + "minimatch": "^9.0.3", + "ora": "^5.4.1", + "yargs": "^16.2.0" + }, + "bin": { + "tsc-strict": "dist/cli/tsc-strict/index.js", + "update-strict-comments": "dist/cli/update-strict-comments/index.js" } }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "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": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=16" + "node": ">=8" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "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": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "engines": { + "node": ">=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==", + "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": "MIT", + "license": "ISC", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "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==", + "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": { - "minimist": "^1.2.0" + "color-name": "~1.1.4" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" + "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" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "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", - "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": ">=8" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "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": "MIT", "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" + "has-flag": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/tuf-js/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "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": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/tuf-js/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "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": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/tuf-js/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/ua-parser-js": { + "version": "0.7.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.38.tgz", + "integrity": "sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==", "dev": true, - "license": "ISC", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "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_modules/uglify-js": { + "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, + "bin": { + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.8.0" } }, - "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "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": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, - "optionalDependencies": { - "encoding": "^0.1.13" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } + "license": "MIT" }, - "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==", + "node_modules/undici-types": { + "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": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } + "license": "MIT" }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "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": "Unlicense" + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "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==", + "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": { - "prelude-ls": "^1.2.1" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=4" } }, - "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==", - "license": "(MIT OR CC0-1.0)", + "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": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "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==", + "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", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "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==", + "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", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": "MIT", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "unique-slug": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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==", + "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": "MIT", + "license": "ISC", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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==", + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "crypto-random-string": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=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==", + "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" - }, - "node_modules/typedarray-to-buffer": { - "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==", "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "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": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", "engines": { - "node": ">=4.2.0" + "node": ">= 0.8" } }, - "node_modules/typescript-strict-plugin": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/typescript-strict-plugin/-/typescript-strict-plugin-2.4.4.tgz", - "integrity": "sha512-OXcWHQk+pW9gqEL/Mb1eTgj/Yiqk1oHBERr9v4VInPOYN++p+cXejmQK/h/VlUPGD++FXQ8pgiqVMyEtxU4T6A==", + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^3.0.0", - "execa": "^4.0.0", - "minimatch": "^9.0.3", - "ora": "^5.4.1", - "yargs": "^16.2.0" - }, - "bin": { - "tsc-strict": "dist/cli/tsc-strict/index.js", - "update-strict-comments": "dist/cli/update-strict-comments/index.js" + "engines": { + "node": ">=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==", + "node_modules/update-browserslist-db": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "update-browserslist-db": "cli.js" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/typescript-strict-plugin/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, - "license": "MIT", + "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": { - "balanced-match": "^1.0.0" + "punycode": "^2.1.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, + "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", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "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": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, - "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==", + "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", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4.0" } }, - "node_modules/typescript-strict-plugin/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, + "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", - "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" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/typescript-strict-plugin/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/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", + "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": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "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==", + "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", - "engines": { - "node": ">=8" + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/typescript-strict-plugin/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==", + "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": "Apache-2.0", + "license": "ISC", "engines": { - "node": ">=8.12.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/typescript-strict-plugin/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "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": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.8" } }, - "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==", + "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": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "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==", + "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": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "esbuild": "^0.21.3", + "postcss": "^8.4.40", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=10" + "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/typescript-strict-plugin/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/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": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/ua-parser-js": { - "version": "0.7.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", - "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } + "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": "*" + "node": ">=12" } }, - "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==", + "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": "BSD-2-Clause", + "license": "MIT", "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, + "os": [ + "android" + ], "engines": { - "node": ">=0.8.0" + "node": ">=12" } }, - "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==", + "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", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "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==", + "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": ">=4" + "node": ">=12" } }, - "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==", + "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", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "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==", + "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": ">=4" + "node": ">=12" } }, - "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==", + "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": ">=4" + "node": ">=12" } }, - "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==", + "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": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "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==", + "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": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "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", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "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==", + "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", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4.0.0" + "node": ">=12" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "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.8" + "node": ">=12" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "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", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "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", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "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", - "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", - "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==", + "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": "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/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": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true, - "license": "MIT" - }, - "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==", + "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" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } }, - "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==", + "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": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "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": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "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==", + "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.8" + "node": ">=12" } }, - "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" + "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": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "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": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, "bin": { - "vite": "bin/vite.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" + "node": ">=12" }, "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 - } + "@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": { @@ -24307,34 +24735,12 @@ "node": ">=0.10.0" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "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": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -24348,6 +24754,7 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -24361,6 +24768,13 @@ "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", @@ -24421,6 +24835,19 @@ "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", @@ -24438,25 +24865,41 @@ "node": ">=0.10.0" } }, - "node_modules/webdriver-manager/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": { @@ -24466,10 +24909,21 @@ "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": { @@ -24512,21 +24966,43 @@ "node": ">=0.8.0" } }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "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": "BSD-2-Clause", + "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": ">=10.4" + "node": ">=4.0" } }, + "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==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/webpack": { "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", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -24569,20 +25045,21 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", - "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", + "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", @@ -24598,54 +25075,55 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dev": true, - "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", + "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.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": { @@ -24656,62 +25134,81 @@ } } }, - "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "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": "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.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "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", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "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": { @@ -24773,6 +25270,37 @@ "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", @@ -24804,6 +25332,7 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -24818,59 +25347,27 @@ "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", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-encoding/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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true, - "license": "MIT" - }, "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "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" @@ -24926,16 +25423,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "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", @@ -24947,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" @@ -24958,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": { @@ -25013,9 +25464,10 @@ "license": "MIT" }, "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==", + "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", @@ -25023,10 +25475,7 @@ "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": { @@ -25077,10 +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" @@ -25096,6 +25553,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" @@ -25104,16 +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", @@ -25122,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": { @@ -25181,17 +25655,17 @@ "xml-js": "bin/cli.js" } }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "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", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "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": { @@ -25202,7 +25676,7 @@ "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==", @@ -25212,12 +25686,15 @@ "node": ">=4.0" } }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "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", @@ -25276,6 +25753,16 @@ } }, "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==", @@ -25319,14 +25806,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zone.js": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", - "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", + "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 15d2ea454e1..11ad80f8c00 100644 --- a/ui/package.json +++ b/ui/package.json @@ -4,33 +4,32 @@ "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.8", - "@capacitor/app": "^5.0.6", - "@capacitor/core": "5.7.8", - "@capacitor/filesystem": "^5.2.0", - "@capacitor/ios": "5.7.8", - "@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", + "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", @@ -42,39 +41,47 @@ "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.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.15", - "@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", + "@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", + "@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": "^4.1.3", "jasmine-core": "~4.5.0", @@ -87,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 40394041c80..b04097ce80b 100644 --- a/ui/src/app/app-routing.module.ts +++ b/ui/src/app/app-routing.module.ts @@ -1,148 +1,151 @@ -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 { 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 { 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 { CurrentAndVoltageOverviewComponent } from './shared/components/edge/meter/currentVoltage/currentVoltage.overview'; -import { DataService } from './shared/components/shared/dataservice'; -import { UserComponent } from './user/user.component'; +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"; + 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: '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 }, + { 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 d4c4c458a00..bcab88af3be 100644 --- a/ui/src/app/app.component.ts +++ b/ui/src/app/app.component.ts @@ -1,25 +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 { 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'; +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; @@ -54,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(); @@ -78,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", }, ], }); @@ -92,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 3a7db60566a..8a191a18baa 100644 --- a/ui/src/app/app.module.ts +++ b/ui/src/app/app.module.ts @@ -1,34 +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 { 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'; +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 943f7fd254c..c7c02533b42 100644 --- a/ui/src/app/appupdateservice.ts +++ b/ui/src/app/appupdateservice.ts @@ -4,7 +4,7 @@ import { SwUpdate } from "@angular/service-worker"; import { Service } from "./shared/shared"; @Injectable({ - providedIn: 'root', + providedIn: "root", }) export class CheckForUpdateService { @@ -19,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 fbd3bed9b24..0bef8c32fa2 100644 --- a/ui/src/app/changelog/view/component/changelog.constants.ts +++ b/ui/src/app/changelog/view/component/changelog.constants.ts @@ -5,7 +5,7 @@ export class Changelog { public static readonly UI_VERSION = "2024.9.0-SNAPSHOT"; 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.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 6cc3aabb469..fdeeebc3a3c 100644 --- a/ui/src/app/edge/edge.component.ts +++ b/ui/src/app/edge/edge.component.ts @@ -30,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; @@ -39,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 e88789f32af..38a9176e4a1 100644 --- a/ui/src/app/edge/edge.module.ts +++ b/ui/src/app/edge/edge.module.ts @@ -1,8 +1,8 @@ -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'; +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.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.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.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/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.ts b/ui/src/app/edge/history/abstracthistorychart.ts index f1587b43962..0891b3f453e 100644 --- a/ui/src/app/edge/history/abstracthistorychart.ts +++ b/ui/src/app/edge/history/abstracthistorychart.ts @@ -1,18 +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 { ChartConstants, XAxisType } from 'src/app/shared/components/chart/chart.constants'; -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 { 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 { @@ -37,26 +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'; + protected formatNumber: string = "1.0-2"; /** @deprecated*/ 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, @@ -67,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" }); } } @@ -107,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: () => [], @@ -134,7 +137,7 @@ export abstract class AbstractHistoryChart { options = NewAbstractHistoryChart.getDefaultOptions(this.xAxisType, this.service, this.labels); /** Hide default displayed yAxis */ - options.scales['y'] = { + options.scales["y"] = { display: false, }; @@ -152,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) => { @@ -186,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, }); }); @@ -220,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(() => { @@ -267,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: {} })); + }); } /** @@ -403,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 22459c5a240..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 { DateUtils } from 'src/app/shared/utils/date/dateutils'; -import { calculateResolution } from './shared'; +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 56cf7403401..89019ad7b87 100644 --- a/ui/src/app/edge/history/chpsoc/chart.component.ts +++ b/ui/src/app/edge/history/chpsoc/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 { YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, Edge, EdgeConfig, Service } from '../../../shared/shared'; -import { AbstractHistoryChart } from '../abstracthistorychart'; +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 { @@ -30,7 +30,6 @@ export class ChpSocChartComponent extends AbstractHistoryChart implements OnInit ngOnInit() { this.startSpinner(); - this.service.setCurrentComponent('', this.route); } ngOnDestroy() { @@ -48,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[] = []; @@ -79,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 => { @@ -94,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)", }); } } @@ -144,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.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 6b01e6b18fa..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 { 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 { 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.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.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 c21e92b1a78..bdfda86d25d 100644 --- a/ui/src/app/edge/history/common/common.ts +++ b/ui/src/app/edge/history/common/common.ts @@ -1,10 +1,10 @@ -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'; +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 4cc05a0454f..c36c786695d 100644 --- a/ui/src/app/edge/history/common/consumption/Consumption.ts +++ b/ui/src/app/edge/history/common/consumption/Consumption.ts @@ -1,16 +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 { 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'; +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: [ 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 4793ffc4ded..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 @@ -5,7 +5,7 @@ import { removeFunctions, TestContext } from "src/app/shared/components/shared/t 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 index 20defa63495..3f907efebad 100644 --- 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 @@ -21,15 +21,15 @@ export namespace History { }), 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], + "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"], 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 index 27ef1645867..c73384cbce2 100644 --- 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 @@ -9,52 +9,52 @@ import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; import { History } from "./channels.spec"; import { ConsumptionMeterChartDetailsComponent } from "./consumptionMeter"; -describe('History Consumption Details - consumptionMeters', () => { +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'); + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("meter0"); }); - it('#getChartData()', () => { + it("#getChartData()", () => { { - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + 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]), + 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 } } }, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, ), }, }); } { - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + 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]), + 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', {}), + 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 { +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( 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 index fd696ec5368..7fd59547f17 100644 --- a/ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.ts +++ b/ui/src/app/edge/history/common/consumption/details/chart/consumptionMeter.ts @@ -1,15 +1,15 @@ -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, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; +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', + selector: "consumptionMeterChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class ConsumptionMeterChartDetailsComponent extends AbstractHistoryChart { @@ -18,20 +18,20 @@ export class ConsumptionMeterChartDetailsComponent extends AbstractHistoryChart return { input: [{ 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"), }, ...Phase.THREE_PHASE.map(phase => ({ - name: 'ConsumptionActivePower' + phase, - powerChannel: ChannelAddress.fromString(component.id + '/ActivePower' + phase), - energyChannel: ChannelAddress.fromString(component.id + '/ActiveProductionEnergy' + 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'], + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data[component.id + "/ActiveProductionEnergy"], converter: () => data[component.id], - color: 'rgb(0,152,204)', + color: "rgb(0,152,204)", hiddenOnInit: false, stack: 2, }, @@ -39,18 +39,18 @@ export class ConsumptionMeterChartDetailsComponent extends AbstractHistoryChart ...Phase.THREE_PHASE.map((phase, i) => ({ name: "Phase " + phase, converter: () => - data['ConsumptionActivePower' + phase], - color: 'rgb(' + AbstractHistoryChart.phaseColors[i] + ')', + data["ConsumptionActivePower" + phase], + color: "rgb(" + AbstractHistoryChart.phaseColors[i] + ")", stack: 3, })), ], tooltip: { - formatNumber: '1.1-2', - afterTitle: translate.instant('General.TOTAL'), + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), }, 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/evcs.spec.ts b/ui/src/app/edge/history/common/consumption/details/chart/evcs.spec.ts index 9a45e639dee..75a40f7b0ba 100644 --- 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 @@ -9,46 +9,46 @@ import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; import { History } from "./channels.spec"; import { EvcsChartDetailsComponent } from "./evcs"; -describe('History Consumption Details - 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'); + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("evcs0"); }); - it('#getChartData() - evcs', () => { + it("#getChartData() - evcs", () => { { - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + 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]), + 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 } } }, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, ), }, }); } { - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + 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]), + 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', {}), + 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 { +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( 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 index 637343afb09..62e58482cfe 100644 --- a/ui/src/app/edge/history/common/consumption/details/chart/evcs.ts +++ b/ui/src/app/edge/history/common/consumption/details/chart/evcs.ts @@ -1,14 +1,14 @@ -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, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; +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', + selector: "evcsChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class EvcsChartDetailsComponent extends AbstractHistoryChart { @@ -18,24 +18,24 @@ export class EvcsChartDetailsComponent extends AbstractHistoryChart { return { input: [{ name: component.id, - powerChannel: ChannelAddress.fromString(component.id + '/ChargePower'), - energyChannel: ChannelAddress.fromString(component.id + '/ActiveConsumptionEnergy'), + 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'], + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data[component.id + "/ActiveConsumptionEnergy"], converter: () => data[component.id], - color: 'rgb(0,152,204)', + color: "rgb(0,152,204)", hiddenOnInit: false, stack: 2, }], tooltip: { - formatNumber: '1.1-2', - afterTitle: translate.instant('General.TOTAL'), + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), }, 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/sum.spec.ts b/ui/src/app/edge/history/common/consumption/details/chart/sum.spec.ts index a7e61affa4e..0192ff39015 100644 --- 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 @@ -9,49 +9,49 @@ import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; import { History } from "./channels.spec"; import { SumChartDetailsComponent } from "./sum"; -describe('History Production Details - _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'); + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("_sum"); }); - it('#getChartData()', () => { + it("#getChartData()", () => { { - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + 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]), + 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 } } }, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, ), }, }); } { - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + 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]), + 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', {}), + 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 { +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( 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 index 273263dab12..cf25ef1a843 100644 --- a/ui/src/app/edge/history/common/consumption/details/chart/sum.ts +++ b/ui/src/app/edge/history/common/consumption/details/chart/sum.ts @@ -1,15 +1,15 @@ -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, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; +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', + selector: "sumChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class SumChartDetailsComponent extends AbstractHistoryChart { @@ -19,20 +19,20 @@ export class SumChartDetailsComponent extends AbstractHistoryChart { return { input: [{ name: component.id, - powerChannel: ChannelAddress.fromString(component.id + '/ConsumptionActivePower'), - energyChannel: ChannelAddress.fromString(component.id + '/ConsumptionActiveEnergy'), + 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), + 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'], + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data[component.id + "/ConsumptionActiveEnergy"], converter: () => data[component.id], - color: 'rgb(0,152,204)', + color: "rgb(0,152,204)", hiddenOnInit: false, stack: 2, }, @@ -40,17 +40,17 @@ export class SumChartDetailsComponent extends AbstractHistoryChart { ...Phase.THREE_PHASE.map((phase, i) => ({ name: "Phase " + phase, converter: () => - data['ConsumptionActivePower' + phase], - color: 'rgb(' + AbstractHistoryChart.phaseColors[i] + ')', + data["ConsumptionActivePower" + phase], + color: "rgb(" + AbstractHistoryChart.phaseColors[i] + ")", stack: 3, }))], tooltip: { - formatNumber: '1.1-2', - afterTitle: translate.instant('General.TOTAL'), + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), }, 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/details.overview.html b/ui/src/app/edge/history/common/consumption/details/details.overview.html index 80ddb738d14..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,5 +1,5 @@ - + 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 74647b30812..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,18 +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; + protected componentType: "sum" | "consumptionMeter" | "evcs" | null = null; constructor( public override service: Service, @@ -36,13 +36,13 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { return; } - if (this.component.factoryId === 'Core.Sum') { - this.component.alias = this.translate.instant('General.TOTAL'); + 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 }); } }]; }); } @@ -52,19 +52,19 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { } 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.factoryId !== "Evcs.Cluster.SelfConsumption") + && this.component.factoryId !== "Evcs.Cluster.PeakShaving" && this.component.isEnabled !== false) { - return 'evcs'; + 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'; + return "consumptionMeter"; } - if (this.component.factoryId === 'Core.Sum') { - return 'sum'; + if (this.component.factoryId === "Core.Sum") { + return "sum"; } return null; 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.ts b/ui/src/app/edge/history/common/consumption/overview/overview.ts index b67018fc4fb..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,13 +1,13 @@ -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'; +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 { @@ -29,18 +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)); - const sum: EdgeConfig.Component = this.config.getComponent('_sum'); - sum.alias = this.translate.instant('General.TOTAL'); + 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 }); } } + { 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 c6cf681d16e..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,8 +8,8 @@ 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": { @@ -17,7 +17,7 @@ export namespace History { "enabled": false, }, "legend": { - "display": true, "position": "bottom", "labels": { "color": '' }, + "display": true, "position": "bottom", "labels": { "color": "" }, }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {}, }, @@ -30,14 +30,14 @@ export namespace History { }, "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, }, @@ -45,8 +45,8 @@ 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": { @@ -54,7 +54,7 @@ export namespace History { "enabled": false, }, "legend": { - "display": true, "position": "bottom", "labels": { "color": '' }, + "display": true, "position": "bottom", "labels": { "color": "" }, }, "tooltip": { "intersect": false, "mode": "x", "callbacks": {}, }, @@ -67,10 +67,10 @@ export namespace History { }, "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, }, @@ -87,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, @@ -385,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, @@ -675,7 +675,7 @@ export namespace History { null, null, null], - '_sum/EssActivePower': [null, + "_sum/EssActivePower": [null, null, null, 81, @@ -963,7 +963,7 @@ export namespace History { null, null, null], - '_sum/ProductionActivePower': [null, + "_sum/ProductionActivePower": [null, null, null, 0, @@ -1251,7 +1251,7 @@ export namespace History { null, null, null], - '_sum/ProductionDcActualPower': [null, + "_sum/ProductionDcActualPower": [null, null, null, 0, @@ -1839,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, @@ -2017,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, @@ -2186,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, @@ -2354,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, @@ -2522,7 +2522,7 @@ export namespace History { 439.375, 578.7, 150.375], - '_sum/ProductionActivePower': [0, + "_sum/ProductionActivePower": [0, 0, 0, 0, @@ -2690,7 +2690,7 @@ export namespace History { 61.5, 0.6, 0], - '_sum/ProductionDcActualPower': [0, + "_sum/ProductionDcActualPower": [0, 0, 0, 0, @@ -3037,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, @@ -3279,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 abaa914fefe..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 @@ -5,7 +5,7 @@ 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.ts b/ui/src/app/edge/history/common/energy/flat/flat.ts index 3e500cdd718..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 { 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'; +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 f2bf6848a0a..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 @@ -8,7 +8,7 @@ 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 index 1d89d965adf..dda556efe21 100644 --- 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 @@ -17,10 +17,10 @@ export namespace History { }), 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], + "_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"], }), 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 index 5866fa9f23d..286718266cf 100644 --- 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 @@ -9,47 +9,47 @@ import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; import { History } from "./channels.spec"; import { ChartComponent } from "./chart"; -describe('History Grid Details - _sum', () => { +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'); + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("_sum"); }); - it('#getChartData()', () => { + it("#getChartData()", () => { { - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + 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]), + 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 } } }, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, ), }, }); } { - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + expectView(defaultEMS, TEST_CONTEXT, "bar", History.MONTH, { datasets: { data: [], labels: LABELS(History.MONTH.energyPerPeriodChannelWithValues.result.timestamps), - options: OeTester.ChartOptions.BAR_CHART_OPTIONS('hour', 'bar', {}), + 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 { +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( 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 index 8368db9f96a..c941630eb8a 100644 --- a/ui/src/app/edge/history/common/grid/details/chart/chart.ts +++ b/ui/src/app/edge/history/common/grid/details/chart/chart.ts @@ -1,15 +1,15 @@ // @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, 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 { 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', + selector: "gridDetailsChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class ChartComponent extends AbstractHistoryChart { @@ -17,12 +17,12 @@ export class ChartComponent extends AbstractHistoryChart { return { input: [ { - name: 'GridActivePower', - powerChannel: ChannelAddress.fromString('_sum/GridActivePower'), + name: "GridActivePower", + powerChannel: ChannelAddress.fromString("_sum/GridActivePower"), }, ...Phase.THREE_PHASE.map((phase, index) => ({ - name: 'Phase' + phase, - powerChannel: ChannelAddress.fromString('_sum/GridActivePower' + phase), + name: "Phase" + phase, + powerChannel: ChannelAddress.fromString("_sum/GridActivePower" + phase), })), ], output: (data: DefaultTypes.History.ChannelData) => { @@ -30,17 +30,17 @@ export class ChartComponent extends AbstractHistoryChart { const datasets: DefaultTypes.History.DisplayValues[] = [ { - name: translate.instant('General.TOTAL'), + name: translate.instant("General.TOTAL"), converter: () => { - return data['GridActivePower']; + return data["GridActivePower"]; }, - color: 'rgba(0,0,200)', + color: "rgba(0,0,200)", stack: 1, }, ...Phase.THREE_PHASE.map((phase, index) => ({ - name: 'Phase ' + phase, + name: "Phase " + phase, converter: () => { - return data['Phase' + phase]; + return data["Phase" + phase]; }, color: AbstractHistoryChart.phaseColors[index], })), @@ -49,11 +49,11 @@ 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/grid/details/details.overview.ts b/ui/src/app/edge/history/common/grid/details/details.overview.ts index b85fb0f5970..179c6ca5ce5 100644 --- a/ui/src/app/edge/history/common/grid/details/details.overview.ts +++ b/ui/src/app/edge/history/common/grid/details/details.overview.ts @@ -1,14 +1,14 @@ -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[] = []; @@ -34,7 +34,7 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { } 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 }); } }]; + { 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.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 8e7d54bca35..2957572d7f9 100644 --- a/ui/src/app/edge/history/common/grid/grid.ts +++ b/ui/src/app/edge/history/common/grid/grid.ts @@ -1,12 +1,12 @@ -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 { 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: [ 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 736028491fc..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,13 +1,13 @@ -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'; +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 { protected navigationButtons: NavigationOption[] = []; @@ -24,8 +24,8 @@ export class OverviewComponent extends AbstractHistoryChartOverview { protected override afterIsInitialized() { - const sum: EdgeConfig.Component = this.config.getComponent('_sum'); - sum.alias = this.translate.instant('General.TOTAL'); + 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)); @@ -41,7 +41,7 @@ export class OverviewComponent extends AbstractHistoryChartOverview { } this.navigationButtons = navigationButtons.map(el => ( - { id: el.id, alias: el.alias, callback: () => { this.router.navigate(['./' + el.id], { relativeTo: this.route }); } } + { 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/productionMeterChart.ts b/ui/src/app/edge/history/common/production/chart/productionMeterChart.ts index e4a1cfa5a17..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,11 +60,11 @@ 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/totalChart.ts b/ui/src/app/edge/history/common/production/chart/totalChart.ts index 6b7c04b5277..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,12 +157,12 @@ 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, }], }; 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 index e12a4af205f..ec95a07e629 100644 --- 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 @@ -21,16 +21,16 @@ export namespace History { }), 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], + "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"], }), 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 index 717ef36a8b0..08cfeb6e0b9 100644 --- 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 @@ -9,46 +9,46 @@ import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; import { History } from "./channels.spec"; import { ChargerChartDetailsComponent } from "./charger"; -describe('History Production Details - chargers', () => { +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'); + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("charger0"); }); - it('#getChartData()', () => { + it("#getChartData()", () => { { - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + 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]), + 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 } } }, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, ), }, }); } { - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + 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]), + 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', {}), + 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 { +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( 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 index a6b44d794c5..7673bac3ffd 100644 --- a/ui/src/app/edge/history/common/production/details/chart/charger.ts +++ b/ui/src/app/edge/history/common/production/details/chart/charger.ts @@ -1,14 +1,14 @@ -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, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; +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', + selector: "chargerChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class ChargerChartDetailsComponent extends AbstractHistoryChart { @@ -17,28 +17,28 @@ export class ChargerChartDetailsComponent extends AbstractHistoryChart { return { input: [{ 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"), }], output: (data: HistoryUtils.ChannelData) => [{ name: component.alias, nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyQueryResponse.result.data[component.id + '/ActualEnergy']; + return energyQueryResponse.result.data[component.id + "/ActualEnergy"]; }, converter: () => { return data[component.id]; }, - color: 'rgb(0,152,204)', + color: "rgb(0,152,204)", hiddenOnInit: false, stack: 2, }], tooltip: { - formatNumber: '1.1-2', - afterTitle: translate.instant('General.TOTAL'), + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), }, yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }], }; 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 index 5a4ab2d5393..d3cc8490cc1 100644 --- 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 @@ -9,50 +9,50 @@ import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; import { History } from "./channels.spec"; import { ProductionMeterChartDetailsComponent } from "./productionMeter"; -describe('History Production Details - productionMeters', () => { +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'); + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("meter0"); }); - it('#getChartData()', () => { + it("#getChartData()", () => { { - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + 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]), + 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 } } }, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, ), }, }); } { - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + 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]), + 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', {}), + 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))); +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( 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 index f7c7e682b3b..634398525b7 100644 --- a/ui/src/app/edge/history/common/production/details/chart/productionMeter.ts +++ b/ui/src/app/edge/history/common/production/details/chart/productionMeter.ts @@ -1,15 +1,15 @@ -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, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; +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', + selector: "productionMeterChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class ProductionMeterChartDetailsComponent extends AbstractHistoryChart { @@ -18,12 +18,12 @@ export class ProductionMeterChartDetailsComponent extends AbstractHistoryChart { return { input: [{ 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"), }, ...Phase.THREE_PHASE.map(phase => ({ - name: 'ProductionAcActivePower' + phase, - powerChannel: ChannelAddress.fromString(component.id + '/ActivePower' + phase), + name: "ProductionAcActivePower" + phase, + powerChannel: ChannelAddress.fromString(component.id + "/ActivePower" + phase), }))], output: (data: HistoryUtils.ChannelData) => { @@ -31,12 +31,12 @@ export class ProductionMeterChartDetailsComponent extends AbstractHistoryChart { datasets.push({ name: component.alias, nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => { - return energyQueryResponse.result.data[component.id + '/ActiveProductionEnergy']; + return energyQueryResponse.result.data[component.id + "/ActiveProductionEnergy"]; }, converter: () => { return data[component.id]; }, - color: 'rgb(0,152,204)', + color: "rgb(0,152,204)", hiddenOnInit: false, stack: 2, }); @@ -44,20 +44,20 @@ export class ProductionMeterChartDetailsComponent extends AbstractHistoryChart { datasets.push(...Phase.THREE_PHASE.map((phase, i) => ({ name: "Phase " + phase, converter: () => - data['ProductionAcActivePower' + phase], - color: 'rgb(' + AbstractHistoryChart.phaseColors[i] + ')', + data["ProductionAcActivePower" + phase], + color: "rgb(" + AbstractHistoryChart.phaseColors[i] + ")", stack: 3, }))); return datasets; }, tooltip: { - formatNumber: '1.1-2', - afterTitle: translate.instant('General.TOTAL'), + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), }, yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }], }; 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 index 511011732fd..286910ff833 100644 --- 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 @@ -9,7 +9,7 @@ import { DATA, LABELS } from "../../../energy/chart/chart.constants.spec"; import { History } from "./channels.spec"; import { SumChartDetailsComponent } from "./sum"; -describe('History Production Details - _sum', () => { +describe("History Production Details - _sum", () => { const defaultEMS = DummyConfig.from( DummyConfig.Component.SUM("_sum", "Gesamt"), DummyConfig.Component.SOLAR_EDGE_PV_INVERTER("meter0"), @@ -17,105 +17,105 @@ describe('History Production Details - _sum', () => { let TEST_CONTEXT: TestContext & { route: ActivatedRoute }; beforeEach(async () => { - TEST_CONTEXT = await sharedSetupWithComponentIdRoute('_sum'); + TEST_CONTEXT = await sharedSetupWithComponentIdRoute("_sum"); }); - it('#getChartData() - asymmetricMeter && no essDcCharger configured', () => { + it("#getChartData() - asymmetricMeter && no essDcCharger configured", () => { { - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + 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]), + 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 } } }, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, ), }, }); } { - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + 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]), + 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', {}), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), }, }); } }); - it('#getChartData() - essDcCharger configured', () => { + 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, + 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])], + 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 } } }, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, ), }, }); } { - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + 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]), + 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', {}), + options: OeTester.ChartOptions.BAR_CHART_OPTIONS("day", "bar", {}), }, }); } }); - it('#getChartData() - no essDcCharger & no assymetric meter configured', () => { + it("#getChartData() - no essDcCharger & no assymetric meter configured", () => { { const defaultEMS = DummyConfig.from( DummyConfig.Component.SUM("_sum", "Gesamt"), ); - expectView(defaultEMS, TEST_CONTEXT, 'line', History.DAY, + 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("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 } } }, + options: OeTester.ChartOptions.LINE_CHART_OPTIONS("hour", "line", { "left": { scale: { beginAtZero: true } } }, ), }, }); } { - expectView(defaultEMS, TEST_CONTEXT, 'bar', History.MONTH, + 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]), + 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', {}), + 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 { +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( 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 index e3d09200f9d..6c630946ae0 100644 --- a/ui/src/app/edge/history/common/production/details/chart/sum.ts +++ b/ui/src/app/edge/history/common/production/details/chart/sum.ts @@ -1,16 +1,16 @@ // @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, YAxisTitle } from 'src/app/shared/service/utils'; -import { ChannelAddress, EdgeConfig } from 'src/app/shared/shared'; +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', + selector: "sumChart", + templateUrl: "../../../../../../shared/components/chart/abstracthistorychart.html", }) export class SumChartDetailsComponent extends AbstractHistoryChart { @@ -23,8 +23,8 @@ export class SumChartDetailsComponent extends AbstractHistoryChart { const input: HistoryUtils.InputChannel[] = [ { name: component.id, - powerChannel: ChannelAddress.fromString(component.id + '/ProductionActivePower'), - energyChannel: ChannelAddress.fromString(component.id + '/ProductionActiveEnergy'), + powerChannel: ChannelAddress.fromString(component.id + "/ProductionActivePower"), + energyChannel: ChannelAddress.fromString(component.id + "/ProductionActiveEnergy"), }, ]; let converter: ((data: HistoryUtils.ChannelData, phase: string) => any) | null = null; @@ -32,23 +32,23 @@ export class SumChartDetailsComponent extends AbstractHistoryChart { if (hasCharger) { input.push({ name: component.id + "ActualPower", - powerChannel: ChannelAddress.fromString('_sum/ProductionDcActualPower'), + 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])); + 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]; + 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), + name: "ProductionAcActivePower" + phase, + powerChannel: ChannelAddress.fromString(component.id + "/ProductionAcActivePower" + phase), }))); } @@ -56,7 +56,7 @@ export class SumChartDetailsComponent extends AbstractHistoryChart { converter ? (data) => Phase.THREE_PHASE.map((phase, i) => ({ name: "Phase " + phase, converter: () => converter(data, phase), - color: 'rgb(' + AbstractHistoryChart.phaseColors[i] + ')', + color: "rgb(" + AbstractHistoryChart.phaseColors[i] + ")", stack: 3, })) : () => []; @@ -64,22 +64,22 @@ export class SumChartDetailsComponent extends AbstractHistoryChart { input: input, output: (data: HistoryUtils.ChannelData) => [ { - name: translate.instant('General.TOTAL'), - nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data['_sum/ProductionActiveEnergy'], + name: translate.instant("General.TOTAL"), + nameSuffix: (energyQueryResponse: QueryHistoricTimeseriesEnergyResponse) => energyQueryResponse.result.data["_sum/ProductionActiveEnergy"], converter: () => data[component.id], - color: 'rgb(0,152,204)', + color: "rgb(0,152,204)", hiddenOnInit: false, stack: 2, }, ...phaseOutput(data), ], tooltip: { - formatNumber: '1.1-2', - afterTitle: translate.instant('General.TOTAL'), + formatNumber: "1.1-2", + afterTitle: translate.instant("General.TOTAL"), }, yAxes: [{ - unit: YAxisTitle.ENERGY, - position: 'left', + unit: YAxisType.ENERGY, + position: "left", yAxisId: ChartAxis.LEFT, }], }; 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 f9470110124..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,19 +1,19 @@ -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; + protected componentSome: { type: "sum" | "productionMeter" | "charger", displayName: string } | null = null; constructor( public override service: Service, @@ -31,12 +31,12 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { this.service.getCurrentEdge().then(edge => { // Hide current & voltage - if (this.component?.factoryId === 'Core.Sum') { + 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 }); } }]; }); } @@ -46,15 +46,15 @@ export class DetailsOverviewComponent extends AbstractHistoryChartOverview { } if (this.config.hasComponentNature("io.openems.edge.ess.dccharger.api.EssDcCharger", this.component.id) && this.component.isEnabled) { - return { type: 'charger', displayName: this.component.alias }; + return { type: "charger", displayName: this.component.alias }; } if (this.config.isProducer(this.component) && this.component.isEnabled) { - return { type: 'productionMeter', displayName: this.component.alias }; + return { type: "productionMeter", displayName: this.component.alias }; } - if (this.component.factoryId === 'Core.Sum') { - return { type: 'sum', displayName: this.translate.instant('General.TOTAL') }; + 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.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.ts b/ui/src/app/edge/history/common/production/overview/overview.ts index 7b6f24fff11..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 { 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'; +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[] = []; @@ -35,11 +35,11 @@ export class OverviewComponent extends AbstractHistoryChartOverview { this.config.getComponentsImplementingNature("io.openems.edge.meter.api.ElectricityMeter") .filter(component => component.isEnabled && this.config.isProducer(component)); - const sum: EdgeConfig.Component = this.config.getComponent('_sum'); - sum.alias = this.translate.instant('General.TOTAL'); + 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 }); } } + { 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 fbd0f922279..d4b7b9ce39c 100644 --- a/ui/src/app/edge/history/common/production/production.ts +++ b/ui/src/app/edge/history/common/production/production.ts @@ -1,16 +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 { 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'; +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: [ 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.ts b/ui/src/app/edge/history/common/selfconsumption/flat/flat.ts index 6d617da7808..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 { 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"; @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.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.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.ts b/ui/src/app/edge/history/delayedselltogrid/widget.component.ts index a31ec5da133..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 { 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: 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 e516087b8b3..00000000000 --- a/ui/src/app/edge/history/fixdigitaloutput/fixdigitaloutputchartoverview/fixdigitaloutputchartoverview.component.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - {{ component.alias }} - - - - - - - - - - - - - - - - - - - - - - -
General.TOTAL
- - -
-
- - - - - - -
- - -
-
-
-
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 fb8bf4bc466..00000000000 --- a/ui/src/app/edge/history/fixdigitaloutput/widget.component.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - {{ component.alias }} - - - - - - - -
- Edge.History.activeDuration - {{ activeSecondsOverPeriod | formatSecondsToDuration }} -
-
-
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.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.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.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.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 97ac3e1f53b..5abba259cc0 100644 --- a/ui/src/app/edge/history/historydataservice.ts +++ b/ui/src/app/edge/history/historydataservice.ts @@ -2,6 +2,7 @@ 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"; @@ -15,6 +16,7 @@ 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.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.ts b/ui/src/app/edge/history/peakshaving/asymmetric/widget.component.ts index befb0fa19ef..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 { 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: AsymmetricPeakshavingWidgetComponent.SELECTOR, - templateUrl: './widget.component.html', + templateUrl: "./widget.component.html", }) export class AsymmetricPeakshavingWidgetComponent implements OnInit { @@ -22,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.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.ts b/ui/src/app/edge/history/peakshaving/symmetric/widget.component.ts index 2a4a3720976..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 { @@ -22,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.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.ts b/ui/src/app/edge/history/peakshaving/timeslot/widget.component.ts index a8748d264b0..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 { @@ -22,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 ce039d3e05a..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; @@ -177,16 +177,16 @@ export const DEFAULT_TIME_CHART_OPTIONS = (): Chart.ChartOptions => ({ 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; @@ -203,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: { @@ -216,18 +216,18 @@ 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, }, }, }, @@ -244,7 +244,7 @@ export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions maintainAspectRatio: false, legend: { labels: {}, - position: 'bottom', + position: "bottom", }, elements: { point: { @@ -261,7 +261,7 @@ export const DEFAULT_TIME_CHART_OPTIONS_WITHOUT_PREDEFINED_Y_AXIS: ChartOptions }, }, hover: { - mode: 'point', + mode: "point", intersect: true, }, scales: { @@ -269,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); @@ -299,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; @@ -319,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; @@ -394,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"; } } @@ -409,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 = { @@ -460,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; }, @@ -493,16 +493,16 @@ export const DEFAULT_NUMBER_CHART_OPTIONS = (labels: (Date | string)[]): Chart.C 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; @@ -520,7 +520,7 @@ export const DEFAULT_NUMBER_CHART_OPTIONS = (labels: (Date | string)[]): Chart.C x: { stacked: true, offset: false, - type: 'category', + type: "category", ticks: { autoSkip: true, callback: function (value, index, ticks) { @@ -531,7 +531,7 @@ export const DEFAULT_NUMBER_CHART_OPTIONS = (labels: (Date | string)[]): Chart.C return labels[index].toString(); }, }, - bounds: 'data', + 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 a0d04bc95ca..00000000000 --- a/ui/src/app/edge/history/singlethreshold/widget.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - {{ component.alias }} - - - - - - - -
- Edge.History.activeDuration - {{ activeSecondsOverPeriod | formatSecondsToDuration }} -
-
-
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.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.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.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.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.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.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.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.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 34ad15b24e1..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 @@ -37,8 +37,8 @@ export namespace Controller_Ess_TimeOfUseTariff { }; export enum ControlMode { - CHARGE_CONSUMPTION = 'CHARGE_CONSUMPTION', - DELAY_DISCHARGE = 'DELAY_DISCHARGE', + CHARGE_CONSUMPTION = "CHARGE_CONSUMPTION", + DELAY_DISCHARGE = "DELAY_DISCHARGE", } /** @@ -89,49 +89,49 @@ export namespace 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, @@ -139,21 +139,21 @@ export namespace 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 = { 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 f28a7ee3b36..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,20 +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 { ChartConstants } from 'src/app/shared/components/chart/chart.constants'; -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 { 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 { @@ -38,7 +38,6 @@ export class SchedulePowerAndSocChartComponent extends AbstractHistoryChart impl public ngOnInit() { this.service.startSpinner(this.spinnerId); - this.service.setCurrentComponent('', this.route); } public ngOnDestroy() { @@ -52,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); + }, + }, + }, }; } @@ -92,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; @@ -197,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 a11644b8445..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 { 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'; +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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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 fe0490cb871..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 { 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'; +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.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.ts b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcs-chart/evcs.chart.ts index 426c5ad9ec5..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 { 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'; +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.ts b/ui/src/app/edge/live/Multiple/Evcs_Api_Cluster/modal/evcsCluster-modal.page.ts index 219e685ada7..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 { 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'; +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.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.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.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.ts b/ui/src/app/edge/live/common/production/flat/flat.ts index 8141104ce0c..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 { 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'; +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.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.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.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.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.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.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 047bdff0e4d..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 { TranslateService } from '@ngx-translate/core'; -import * as d3 from 'd3'; -import { GridMode, Service } from 'src/app/shared/shared'; -import { DefaultTypes } from '../../../../../shared/service/defaulttypes'; +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.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.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.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.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.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 1939bbf9d45..9da9e75aa96 100644 --- a/ui/src/app/edge/live/energymonitor/energymonitor.module.ts +++ b/ui/src/app/edge/live/energymonitor/energymonitor.module.ts @@ -1,13 +1,13 @@ -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'; +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: [ @@ -28,6 +28,3 @@ import { EnergymonitorComponent } from './energymonitor.component'; ], }) export class EnergymonitorModule { } - - - 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 bef5c983782..edf538ba7ab 100644 --- a/ui/src/app/edge/live/live.component.html +++ b/ui/src/app/edge/live/live.component.html @@ -1,7 +1,7 @@
- + 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 a21b0b2caae..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_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'; +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 3bcde8edb9c..e4eda4ab642 100644 --- a/ui/src/app/edge/live/livedataservice.ts +++ b/ui/src/app/edge/live/livedataservice.ts @@ -2,7 +2,7 @@ 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"; diff --git a/ui/src/app/edge/live/offline/offline.component.ts b/ui/src/app/edge/live/offline/offline.component.ts index b168aabffe6..5af0358d185 100644 --- a/ui/src/app/edge/live/offline/offline.component.ts +++ b/ui/src/app/edge/live/offline/offline.component.ts @@ -1,11 +1,11 @@ -import { Component, OnInit } from '@angular/core'; -import { Edge, Service, Utils } from 'src/app/shared/shared'; -import { DateUtils } from 'src/app/shared/utils/date/dateutils'; +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 { 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 932b021cfa7..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 { 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'; +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 ff08690c381..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: ` 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.ts b/ui/src/app/edge/settings/app/formly/option-group-picker/formly-option-group-picker.component.ts index ce5b702e4b1..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 @@ -4,8 +4,8 @@ import { FieldType, FieldTypeConfig, FormlyFieldConfig } from "@ngx-formly/core" 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.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 { 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 7540ea72633..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, 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'; +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 }; @@ -131,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); @@ -163,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) { @@ -211,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; @@ -231,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(); @@ -251,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; } @@ -282,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; @@ -295,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 => { @@ -324,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.ts b/ui/src/app/edge/settings/app/install.component.ts index 49d5591524b..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,16 +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(); const navigationExtras = { state: { appInstanceChange: true } }; - this.router.navigate(['device/' + (this.edge.id) + '/settings/app/'], navigationExtras); + 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); @@ -228,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 28dbc11b1b0..588aa68cc5e 100644 --- a/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.spec.ts +++ b/ui/src/app/edge/settings/app/jsonrpc/getAppAssistant.spec.ts @@ -2,57 +2,57 @@ 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.ts b/ui/src/app/edge/settings/app/keypopup/modal.component.ts index e8a3e2847b4..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 { 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'; +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.ts b/ui/src/app/edge/settings/app/single.component.ts index 10e07150acd..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 { 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'; +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.ts b/ui/src/app/edge/settings/app/update.component.ts index a5cb88b67ea..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 { InstallAppComponent } from './install.component'; -import { DeleteAppInstance } from './jsonrpc/deleteAppInstance'; -import { GetAppAssistant } from './jsonrpc/getAppAssistant'; -import { GetAppInstances } from './jsonrpc/getAppInstances'; -import { UpdateAppInstance } from './jsonrpc/updateAppInstance'; +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,17 +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.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); + 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.ts b/ui/src/app/edge/settings/channels/channels.component.ts index a6adc4dd12c..36ea1f7911c 100644 --- a/ui/src/app/edge/settings/channels/channels.component.ts +++ b/ui/src/app/edge/settings/channels/channels.component.ts @@ -1,26 +1,26 @@ // @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 { 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'; +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; @@ -45,19 +45,19 @@ export class ChannelsComponent { 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(() => { @@ -91,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) { @@ -136,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"); }); } } @@ -161,17 +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/"]); } } @@ -190,21 +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'; + 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; } } @@ -213,9 +213,9 @@ 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; } } } @@ -229,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; } @@ -239,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); }); @@ -272,7 +272,7 @@ export class ChannelsComponent { } 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.ts b/ui/src/app/edge/settings/component/install/index.component.ts index 5b5ec1ecf07..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 { 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'; +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.ts b/ui/src/app/edge/settings/component/install/install.component.ts index 53be5a1fef2..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 { 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'; +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.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.ts b/ui/src/app/edge/settings/component/update/update.component.ts index e4177748d18..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 { 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'; +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.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.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 8dfaabf14dd..4dcc5708141 100644 --- a/ui/src/app/edge/settings/powerassistant/powerassistant.ts +++ b/ui/src/app/edge/settings/powerassistant/powerassistant.ts @@ -1,10 +1,10 @@ // @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 { DataService } from 'src/app/shared/components/shared/dataservice'; -import { ChannelAddress, CurrentData, EdgeConfig, Utils } from '../../../shared/shared'; -import { LiveDataService } from '../../live/livedataservice'; +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, @@ -28,8 +28,8 @@ type Entry = { }; @Component({ - selector: 'powerassistant', - templateUrl: './powerassistant.html', + selector: "powerassistant", + templateUrl: "./powerassistant.html", providers: [{ useClass: LiveDataService, provide: DataService, @@ -97,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, @@ -128,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, @@ -222,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; } }; } @@ -232,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.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.ts b/ui/src/app/edge/settings/settings.component.ts index 58f3666e896..8c667833490 100644 --- a/ui/src/app/edge/settings/settings.component.ts +++ b/ui/src/app/edge/settings/settings.component.ts @@ -1,13 +1,13 @@ -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'; +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 { @@ -19,7 +19,7 @@ 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, 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 d46eb0e7ca5..e53b68e6ec4 100644 --- a/ui/src/app/edge/settings/settings.spec.ts +++ b/ui/src/app/edge/settings/settings.spec.ts @@ -1,7 +1,7 @@ // @ts-strict-ignore 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 { FORMLY_CONFIG } from "@ngx-formly/core"; @@ -14,11 +14,11 @@ import { Role } from "src/app/shared/type/role"; import { registerTranslateExtension } from "./app/app.module"; import { SettingsComponent } from "./settings.component"; -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: {} }, }), }); @@ -37,15 +37,15 @@ describe('Edge', () => { ], }).compileComponents().then(() => { const translateService = TestBed.inject(TranslateService); - translateService.addLangs(['de']); - translateService.use('de'); - registerLocaleData(localDE, 'de', localeDeExtra); + translateService.addLangs(["de"]); + translateService.use("de"); + registerLocaleData(localDE, "de", localeDeExtra); settingsComponent = new SettingsComponent(Utils, serviceSypObject, translateService); }); }); - it('+ngOnInit - Role.ADMIN', async () => { + it("+ngOnInit - Role.ADMIN", async () => { const result = await expectNgOnInit(serviceSypObject, Role.ADMIN, settingsComponent); expect(result).toEqual({ isAtLeastOwner: true, @@ -53,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, @@ -61,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, @@ -76,7 +76,7 @@ export async function expectNgOnInit(serviceSypObject: jasmine.SpyObj, 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.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.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 489f7c9bda2..8b2776a41a9 100644 --- a/ui/src/app/edge/settings/systemlog/systemlog.component.ts +++ b/ui/src/app/edge/settings/systemlog/systemlog.component.ts @@ -1,27 +1,27 @@ -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'; +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", }, { @@ -33,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; @@ -139,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(); @@ -159,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"); })); } @@ -181,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"; } } @@ -216,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.ts b/ui/src/app/index/filter/filter.component.ts index 16cc1e4b1a4..336008c0ca3 100644 --- a/ui/src/app/index/filter/filter.component.ts +++ b/ui/src/app/index/filter/filter.component.ts @@ -7,14 +7,14 @@ import { environment } from "src/environments"; import { SUM_STATES } from "../shared/sumState"; @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 427fb34c7f5..17a07364ee1 100644 --- a/ui/src/app/index/index.module.ts +++ b/ui/src/app/index/index.module.ts @@ -1,11 +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 { LoginComponent } from './login.component'; -import { OverViewComponent } from './overview/overview.component'; -import { LoadingScreenComponent } from './shared/loading-screen'; -import { SumStateComponent } from './shared/sumState'; +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 06d83b9a264..dad874f51d4 100644 --- a/ui/src/app/index/login.spec.ts +++ b/ui/src/app/index/login.spec.ts @@ -2,7 +2,7 @@ import { TestBed } from "@angular/core/testing"; import { LoginComponent } from "./login.component"; -describe('Login', () => { +describe("Login", () => { const password = " password "; const username = " username "; @@ -12,7 +12,7 @@ describe('Login', () => { }).compileComponents(); }); - it('#trimCredentials should trim password and username', () => { + 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.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.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 a0a4dc504a0..38a892087d6 100644 --- a/ui/src/app/index/shared/sumState.ts +++ b/ui/src/app/index/shared/sumState.ts @@ -5,14 +5,14 @@ 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.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.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 feaadfa5623..97d491dc2f4 100644 --- a/ui/src/app/shared/components/chart/abstracthistorychart.ts +++ b/ui/src/app/shared/components/chart/abstracthistorychart.ts @@ -1,33 +1,33 @@ // @ts-strict-ignore -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, 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, XAxisType } 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); @@ -36,7 +36,7 @@ Chart.Chart.register(annotationPlugin); @Directive() 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 = ""; @@ -57,12 +57,13 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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( @@ -83,7 +84,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { * @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 { @@ -102,7 +103,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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; @@ -162,7 +163,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { }; } - 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[] = []; @@ -204,10 +205,10 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { * @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)', + 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)", }; } @@ -217,12 +218,12 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { * @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: { @@ -245,6 +246,8 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { } break; } + default: + break; } options.datasets.bar = { @@ -253,14 +256,14 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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; @@ -278,7 +281,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { * @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 { + 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, @@ -296,32 +299,32 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { return dataset; } - public static getYAxisTitle(title: YAxisTitle, translate: TranslateService, chartType: 'bar' | 'line', customTitle?: string): string { + public static getYAxisType(title: YAxisType, translate: TranslateService, chartType: "bar" | "line", customTitle?: string): string { switch (title) { - case YAxisTitle.RELAY: - if (chartType === 'line') { + case YAxisType.RELAY: + if (chartType === "line") { // Hide YAxis title - return ''; + 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'; + 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'; + return "kW"; } - case YAxisTitle.VOLTAGE: - return translate.instant('Edge.History.VOLTAGE'); - case YAxisTitle.CURRENT: - return translate.instant('Edge.History.CURRENT'); - case YAxisTitle.NONE: - return ''; + 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'; + return "kW"; } } @@ -338,7 +341,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { * @returns options */ public static getOptions( - chartObject: HistoryUtils.ChartData, chartType: 'line' | 'bar', service: Service, + chartObject: HistoryUtils.ChartData, chartType: "line" | "bar", service: Service, translate: TranslateService, legendOptions: { label: string, strokeThroughHidingStyle: boolean; }[], channelData: { data: { [name: string]: number[]; }; }, @@ -353,9 +356,9 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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 => { @@ -403,7 +406,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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; } @@ -413,12 +416,12 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { chartLegendLabelItems.push({ text: dataset.label, datasetIndex: index, - fontColor: getComputedStyle(document.documentElement).getPropertyValue('--ion-color-text'), + 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["borderDash"] != null && { lineDash: dataset["borderDash"] }), }); }); @@ -445,11 +448,11 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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; @@ -478,9 +481,9 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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); @@ -497,13 +500,13 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { * @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 { + 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, showYAxisTitle); + 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, @@ -520,14 +523,14 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { }, }; 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, @@ -536,7 +539,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { }; break; - case YAxisTitle.TIME: + case YAxisType.TIME: options.scales[element.yAxisId] = { ...baseConfig, min: 0, @@ -544,26 +547,26 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { ...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.CURRENT: - 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; @@ -579,21 +582,23 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { * @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 { + public static getTooltipsLabelName(baseName: string, unit: YAxisType, suffix?: number | string): string { if (suffix != null) { - if (typeof suffix === 'string') { + if (typeof suffix === "string") { return 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: { + 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; } } } @@ -601,43 +606,43 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { } /** - * Gets the tooltips label, dependent on YAxisTitle + * Gets the tooltips label, dependent on YAxisType * - * @param title the YAxisTitle + * @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.CURRENT: - tooltipsLabel = 'A'; + case YAxisType.CURRENT: + tooltipsLabel = "A"; break; - case YAxisTitle.POWER: - tooltipsLabel = 'W'; + case YAxisType.POWER: + tooltipsLabel = "W"; break; - case YAxisTitle.ENERGY: - if (chartType == 'bar') { - tooltipsLabel = 'kWh'; + case YAxisType.ENERGY: + if (chartType == "bar") { + tooltipsLabel = "kWh"; } else { - tooltipsLabel = 'kW'; + tooltipsLabel = "kW"; } break; default: @@ -645,7 +650,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { break; } - return formatNumber(value, 'de', format) + ' ' + tooltipsLabel; + return formatNumber(value, "de", format) + " " + tooltipsLabel; } public static getDefaultOptions(xAxisType: XAxisType, service: Service, labels: (Date | string)[]): Chart.ChartOptions { @@ -656,9 +661,8 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { options = DEFAULT_NUMBER_CHART_OPTIONS(labels); break; case XAxisType.TIMESERIES: - default: options = Utils.deepCopy(DEFAULT_TIME_CHART_OPTIONS()); - options.scales.x['time'].unit = calculateResolution(service, service.historyPeriod.value.from, service.historyPeriod.value.to).timeFormat; + options.scales.x["time"].unit = calculateResolution(service, service.historyPeriod.value.from, service.historyPeriod.value.to).timeFormat; break; } @@ -684,50 +688,50 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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'] = { + 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 + * @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.CURRENT: - return 'A'; - 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 ""; } } @@ -739,16 +743,16 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { * @param chartType the chartType * @returns plugin options */ - private static getExternalPluginFeatures(displayValues: (HistoryUtils.DisplayValue)[], options: Chart.ChartOptions, chartType: 'line' | 'bar'): Chart.ChartOptions { + 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'] = { + switch (el.custom["pluginType"]) { + case "box": + options.plugins["annotation"] = { annotations: (el.custom as HistoryUtils.BoxCustomOptions).annotations.map(annotation => { return ({ ...AbstractHistoryChart.getColors(el.color, chartType), @@ -757,10 +761,10 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { }), }; break; - case 'datalabels': - options.plugins['datalabels'] = + 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); + Chart.Chart.register(ChartConstants.Plugins.BAR_CHART_DATALABELS("kWh", true).plugin); break; } }); @@ -791,7 +795,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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; @@ -835,7 +839,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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.chartType = "bar"; this.chartObject = this.getChartData(); // TODO after chartjs migration, look for config @@ -859,7 +863,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { .then(([dataResponse, energyResponse]) => { dataResponse = DateTimeUtils.normalizeTimestamps(unit, dataResponse); - this.chartType = 'line'; + this.chartType = "line"; this.chartObject = this.getChartData(); const displayValues = AbstractHistoryChart.fillChart(this.chartType, this.chartObject, dataResponse, energyResponse); this.datasets = displayValues.datasets; @@ -885,39 +889,44 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { 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; + } /** @@ -1034,7 +1043,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy { this.datasets = HistoryUtils.createEmptyDataset(this.translate); this.labels = []; this.loading = false; - this.options.scales['y'] = { + this.options.scales["y"] = { display: false, }; 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 67f26bc778e..93bf4dc58e7 100644 --- a/ui/src/app/shared/components/chart/chart.constants.ts +++ b/ui/src/app/shared/components/chart/chart.constants.ts @@ -3,7 +3,7 @@ import { ChartComponentLike, ChartDataset } from "chart.js"; import { formatNumber } from "@angular/common"; import { TranslateService } from "@ngx-translate/core"; -import ChartDataLabels from 'chartjs-plugin-datalabels'; +import ChartDataLabels from "chartjs-plugin-datalabels"; import { HistoryUtils, Utils } from "../../service/utils"; import { ArrayUtils } from "../../utils/array/array.utils"; import { AbstractHistoryChart } from "./abstracthistorychart"; @@ -11,23 +11,24 @@ 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', + id: "empty_chart", beforeDraw: (chart, args, options) => { const { ctx } = <{ ctx: CanvasRenderingContext2D }>chart; ctx.save(); - ctx.textAlign = 'center'; - ctx.fillStyle = 'grey'; + 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', + color: "none", }, }); @@ -40,10 +41,10 @@ export class ChartConstants { 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; + return formatNumber(value, "de", "1.0-0") + "\xa0" + unit ?? null; }, ...{ - anchor: 'end', offset: -18, align: 'start', clip: false, clamp: true, + anchor: "end", offset: -18, align: "start", clip: false, clamp: true, }, plugin: ChartDataLabels, display: disable, @@ -59,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: { @@ -77,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, }, @@ -93,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; 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 70140d5549a..8e39c2dc74e 100644 --- a/ui/src/app/shared/components/components.module.ts +++ b/ui/src/app/shared/components/components.module.ts @@ -1,24 +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 { 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'; +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: [ 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 55ede05a5cf..babbb91da9e 100644 --- a/ui/src/app/shared/components/edge/edge.ts +++ b/ui/src/app/shared/components/edge/edge.ts @@ -1,32 +1,32 @@ // @ts-strict-ignore -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'; +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 { @@ -104,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, @@ -127,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] }]; @@ -135,7 +135,7 @@ export class Edge { } const response = await this.sendRequest(websocket, new ComponentJsonApiRequest({ - componentId: '_componentManager', + componentId: "_componentManager", payload: new GetChannelsOfComponentRequest({ componentId: componentId }), })); @@ -145,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]; @@ -317,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 9e9545fb627..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; }, {}), }); @@ -189,7 +189,7 @@ export namespace DummyConfig { 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", @@ -200,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, @@ -250,7 +250,7 @@ export namespace DummyConfig { 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, @@ -263,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, @@ -384,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 020caa6d9eb..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; @@ -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 index d83646812eb..54d5f05ee5c 100644 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/chart/asymmetricMeter.ts +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/chart/asymmetricMeter.ts @@ -1,62 +1,62 @@ -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, 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 { 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', + 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 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), + 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), + 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, + name: this.translate.instant("Edge.History.CURRENT") + " " + phase, converter: () => { - return data['Current' + phase]; + 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, + name: this.translate.instant("Edge.History.VOLTAGE") + " " + phase, converter: () => { - return data['Voltage' + phase]; + return data["Voltage" + phase]; }, hideShadow: true, color: voltagePhasesColors[index], })), ], tooltip: { - formatNumber: '1.1-2', - afterTitle: this.translate.instant('General.TOTAL'), + formatNumber: "1.1-2", + afterTitle: this.translate.instant("General.TOTAL"), }, yAxes: [{ - unit: YAxisTitle.VOLTAGE, - position: 'left', + unit: YAxisType.VOLTAGE, + position: "left", yAxisId: ChartAxis.LEFT, }, { - unit: YAxisTitle.CURRENT, - position: 'right', + unit: YAxisType.CURRENT, + position: "right", yAxisId: ChartAxis.RIGHT, }, ], 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 index 24914ca30c1..e7998dda9f6 100644 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/chart/symmetricMeter.ts +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/chart/symmetricMeter.ts @@ -1,11 +1,11 @@ -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'; +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', + selector: "currentVoltageChart", + templateUrl: "../../../../../components/chart/abstracthistorychart.html", }) export class CurrentVoltageSymmetricChartComponent extends AbstractHistoryChart { @@ -15,51 +15,51 @@ export class CurrentVoltageSymmetricChartComponent extends AbstractHistoryChart const chartObject: HistoryUtils.ChartData = { input: [ { - name: component.id + 'Current', - powerChannel: ChannelAddress.fromString(component.id + '/Current'), + name: component.id + "Current", + powerChannel: ChannelAddress.fromString(component.id + "/Current"), }, { - name: component.id + 'Voltage', - powerChannel: ChannelAddress.fromString(component.id + '/Voltage'), + name: component.id + "Voltage", + powerChannel: ChannelAddress.fromString(component.id + "/Voltage"), }, ], output: (data: HistoryUtils.ChannelData) => [ { - name: this.translate.instant('Edge.History.CURRENT'), + name: this.translate.instant("Edge.History.CURRENT"), converter: () => { - return data[component.id + 'Current']; + return data[component.id + "Current"]; }, - color: 'rgb(253,197,7)', + color: "rgb(253,197,7)", hiddenOnInit: false, stack: 1, yAxisId: ChartAxis.RIGHT, }, { - name: this.translate.instant('Edge.History.VOLTAGE'), + name: this.translate.instant("Edge.History.VOLTAGE"), converter: () => { - return data[component.id + 'Voltage']; + return data[component.id + "Voltage"]; }, - color: 'rgb(255,0,0)', + color: "rgb(255,0,0)", hiddenOnInit: false, stack: 1, yAxisId: ChartAxis.LEFT, }, ], tooltip: { - formatNumber: '1.1-2', - afterTitle: this.translate.instant('General.TOTAL'), + formatNumber: "1.1-2", + afterTitle: this.translate.instant("General.TOTAL"), }, yAxes: [{ - unit: YAxisTitle.VOLTAGE, - position: 'left', + unit: YAxisType.VOLTAGE, + position: "left", yAxisId: ChartAxis.LEFT, }, { - unit: YAxisTitle.CURRENT, - position: 'right', + unit: YAxisType.CURRENT, + position: "right", yAxisId: ChartAxis.RIGHT, }, ], 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 7cd86d20236..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,8 +1,8 @@ -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 { 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 8daaa2c37ac..8455ccf34b3 100644 --- a/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts +++ b/ui/src/app/shared/components/edge/meter/currentVoltage/currentVoltageModule.ts @@ -22,7 +22,7 @@ import { CurrentAndVoltageOverviewComponent } from "./currentVoltage.overview"; NgChartsModule, HistoryDataErrorModule, NgxSpinnerModule.forRoot({ - type: 'ball-clip-rotate-multiple', + type: "ball-clip-rotate-multiple", }), ChartModule, PickdateModule, 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.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 1f0e6f2c2ce..bddb7f5283e 100644 --- a/ui/src/app/shared/components/flat/abstract-flat-widget.ts +++ b/ui/src/app/shared/components/flat/abstract-flat-widget.ts @@ -6,7 +6,7 @@ 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 { FormBuilder, FormGroup } from "@angular/forms"; import { Service } from "../../service/service"; 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.ts b/ui/src/app/shared/components/flat/flat-widget-line-divider/flat-widget-line-divider.ts index 6250b551b85..059b5e487fe 100644 --- 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 @@ -6,8 +6,8 @@ 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', + selector: "oe-flat-widget-line-divider", + templateUrl: "./flat-widget-line-divider.html", }) export class FlatWidgetLineDividerComponent { 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.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.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.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.ts b/ui/src/app/shared/components/formly/form-field-checkbox-hyperlink/form-field-checkbox-hyperlink.wrapper.ts index 84185208942..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 { 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: '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.ts b/ui/src/app/shared/components/formly/form-field.wrapper.ts index 64b6e3a1fd9..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 { ChangeDetectionStrategy, Component } 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.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.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-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 c66a5c192e0..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 { 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-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.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.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.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.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.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.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 78331d04b12..225cf314e76 100644 --- a/ui/src/app/shared/components/modal/abstractModal.ts +++ b/ui/src/app/shared/components/modal/abstractModal.ts @@ -7,7 +7,7 @@ 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 { Converter } from "../shared/converter"; @@ -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.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.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.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.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.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.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.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.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.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 c555a743cac..a094850a04c 100644 --- a/ui/src/app/shared/components/pickdate/pickdate.module.ts +++ b/ui/src/app/shared/components/pickdate/pickdate.module.ts @@ -1,11 +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 { AngularMyDatePickerModule } from '@nodro7/angular-mydatepicker'; -import { PickDateComponent } from './pickdate.component'; -import { PickDatePopoverComponent } from './popover/popover.component'; +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: [ 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 94f0c2a7635..136ecff555b 100644 --- a/ui/src/app/shared/components/shared/converter.ts +++ b/ui/src/app/shared/components/shared/converter.ts @@ -22,21 +22,21 @@ 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') { + if (typeof value === "number" || typeof value === "string") { return callback(value); } return "-"; // null or string @@ -153,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; } @@ -180,7 +180,7 @@ export namespace Converter { * @returns always "" */ export const HIDE_VALUE: Converter = (ignore): string => { - return ''; + return ""; }; /** @@ -192,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/formatter.ts b/ui/src/app/shared/components/shared/formatter.ts index e3bc42073fb..8f2d5df2c8d 100644 --- a/ui/src/app/shared/components/shared/formatter.ts +++ b/ui/src/app/shared/components/shared/formatter.ts @@ -4,31 +4,31 @@ 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); + 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 a463642482f..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,5 +1,4 @@ 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"; @@ -17,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) => { @@ -36,7 +34,7 @@ export abstract class AbstractFormlyComponent { required: true, options: [{ lines: view.lines }], }, - wrappers: ['formly-field-modal'], + wrappers: ["formly-field-modal"], }]; }); }); @@ -68,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, @@ -96,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[], @@ -105,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 f8104a42887..62f21fe345a 100644 --- a/ui/src/app/shared/components/shared/testing/common.ts +++ b/ui/src/app/shared/components/shared/testing/common.ts @@ -22,19 +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": {} }, "datalabels": { + "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 }, + "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, }, @@ -42,20 +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": {} }, "datalabels": { + "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, }, @@ -63,8 +63,8 @@ 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": { @@ -72,7 +72,7 @@ export namespace OeTester { "enabled": false, }, "legend": { - "display": true, "position": "bottom", "labels": { "color": '' }, + "display": true, "position": "bottom", "labels": { "color": "" }, }, "tooltip": { "intersect": false, "mode": "index", "callbacks": {}, }, @@ -84,23 +84,23 @@ export namespace OeTester { }, }, "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, }, @@ -108,30 +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": {} }, "datalabels": { + "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 b9e29d6e3af..2e30117a4fa 100644 --- a/ui/src/app/shared/components/shared/testing/tester.ts +++ b/ui/src/app/shared/components/shared/testing/tester.ts @@ -30,7 +30,7 @@ export class OeFormlyViewTester { /** * OeFormlyField.Line */ - case 'children-line': { + case "children-line": { const tmp = OeFormlyViewTester.applyLineWithChildren(field, context); // Prepare result @@ -61,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; @@ -206,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 }; } @@ -224,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, xAxisScalingType: XAxisType = XAxisType.TIMESERIES): 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); @@ -258,7 +258,7 @@ export class OeChartTester { */ public static convertChartLabelsToLegendLabels(labels: Date[]): OeChartTester.Dataset.LegendLabel { return { - type: 'label', + type: "label", timestamps: labels, }; } @@ -275,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[], }); @@ -293,7 +293,7 @@ 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[], xAxisType: XAxisType = XAxisType.TIMESERIES, labels: (Date | string)[] = []): 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); @@ -302,21 +302,21 @@ export class OeChartTester { 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', + 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; } } @@ -342,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", }; } @@ -383,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 65444f5db9f..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,7 +1,7 @@ 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, TestModuleMetadata } from "@angular/core/testing"; import { ActivatedRoute, RouterModule } from "@angular/router"; @@ -29,9 +29,9 @@ export const BASE_TEST_BED: TestModuleMetadata = { export function setTranslateParams(): void { const translateService = TestBed.inject(TranslateService); - translateService.addLangs(['de']); - translateService.use('de'); - registerLocaleData(localDE, 'de', localeDeExtra); + translateService.addLangs(["de"]); + translateService.use("de"); + registerLocaleData(localDE, "de", localeDeExtra); } export async function sharedSetup(): Promise { @@ -46,13 +46,13 @@ 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]); } } 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 3894b66e66b..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 @@ -8,7 +8,7 @@ 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", @@ -20,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({ @@ -44,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 cd1e4561875..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 { AutofillDirective } from './autofill'; -import { VarDirective } from './ngvar'; +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/request/queryHistoricTimeseriesDataRequest.ts b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest.ts index 170c5b8af7f..c96f00e5752 100644 --- a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest.ts +++ b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesDataRequest.ts @@ -1,5 +1,5 @@ // @ts-strict-ignore -import { format } from 'date-fns'; +import { format } from "date-fns"; import { Resolution } from "src/app/edge/history/shared"; import { ChannelAddress } from "../../../shared/type/channeladdress"; import { JsonrpcRequest } from "../base"; @@ -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 af0a86a679c..3c5bbde6911 100644 --- a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest.ts +++ b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyPerPeriodRequest.ts @@ -1,5 +1,5 @@ // @ts-strict-ignore -import { format } from 'date-fns'; +import { format } from "date-fns"; import { Resolution } from "src/app/edge/history/shared"; import { ChannelAddress } from "../../type/channeladdress"; import { JsonrpcRequest } from "../base"; @@ -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 054c45038b6..b96874be72a 100644 --- a/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest.ts +++ b/ui/src/app/shared/jsonrpc/request/queryHistoricTimeseriesEnergyRequest.ts @@ -1,5 +1,5 @@ // @ts-strict-ignore -import { format } from 'date-fns'; +import { format } from "date-fns"; import { ChannelAddress } from "../../type/channeladdress"; 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.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.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 d6c567b4fa1..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 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 a8edd55a54c..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")), }); } } diff --git a/ui/src/app/shared/service/globalRouteChangeHandler.ts b/ui/src/app/shared/service/globalRouteChangeHandler.ts index 2aa282842a4..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,7 +21,7 @@ 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; @@ -32,7 +32,7 @@ export class GlobalRouteChangeHandler { ).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 1cd5bdfb98a..67ce8b1a64f 100644 --- a/ui/src/app/shared/service/service.ts +++ b/ui/src/app/shared/service/service.ts @@ -1,31 +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 { @@ -54,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. @@ -147,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; @@ -196,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 { @@ -214,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; @@ -239,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); } } @@ -264,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; } @@ -300,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({ @@ -398,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/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 a5fc752c5fc..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 { @@ -253,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"; } }; @@ -269,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"; } }; @@ -297,7 +297,7 @@ export class Utils { * @returns converted value */ public static CONVERT_TO_PERCENT = (value: any): string => { - return value + ' %'; + return value + " %"; }; /** @@ -307,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"; }; /** @@ -317,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"; }; /** @@ -328,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 "-"; } }; }; @@ -347,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 }; } } @@ -362,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 "-"; } }; }; @@ -384,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" }); }; }; @@ -397,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; }; /** @@ -410,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"); } }; }; @@ -427,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"; } } @@ -450,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); @@ -458,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"); } /* @@ -553,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); } /** @@ -570,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)); } @@ -600,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; @@ -625,7 +625,7 @@ export class Utils { } } -export enum YAxisTitle { +export enum YAxisType { NONE, POWER, PERCENTAGE, @@ -635,13 +635,12 @@ export enum YAxisTitle { CURRENT, TIME, CURRENCY, - NUMBER, } export enum ChartAxis { - LEFT = 'left', - RIGHT = 'right', - RIGHT_2 = 'right2', + LEFT = "left", + RIGHT = "right", + RIGHT_2 = "right2", } export namespace HistoryUtils { @@ -713,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, } @@ -725,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, @@ -739,7 +738,7 @@ export namespace HistoryUtils { } export interface DataLabelsCustomOptions extends PluginCustomOptions { - pluginType: 'datalabels', + pluginType: "datalabels", datalabels: { displayUnit: string, }, @@ -769,8 +768,8 @@ 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, - 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 @@ -861,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 de8f4e59542..1bf1507d696 100644 --- a/ui/src/app/shared/shared.module.ts +++ b/ui/src/app/shared/shared.module.ts @@ -1,48 +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) { @@ -63,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 178fe40332f..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,7 +81,7 @@ 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"); } } @@ -113,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; } } @@ -141,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; @@ -181,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 2a4f71af9c7..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 localJA from '@angular/common/locales/ja'; -import localNL from '@angular/common/locales/nl'; +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 ja from 'src/assets/i18n/ja.json'; -import nl from 'src/assets/i18n/nl.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 367bc6fac51..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 = { @@ -76,39 +77,42 @@ 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) { @@ -116,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 }); @@ -126,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 52de4321ed7..253e06cda38 100644 --- a/ui/src/app/shared/utils/date/dateutils.ts +++ b/ui/src/app/shared/utils/date/dateutils.ts @@ -106,6 +106,6 @@ export namespace DateUtils { if (!fromDate || !toDate) { return null; } - return format(fromDate, translate.instant('General.dateFormat')) + " - " + format(toDate, translate.instant('General.dateFormat')); + 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.ts b/ui/src/app/user/user.component.ts index 363937cb827..b42945d1521 100644 --- a/ui/src/app/user/user.component.ts +++ b/ui/src/app/user/user.component.ts @@ -1,18 +1,18 @@ // @ts-strict-ignore -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'; +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 }; @@ -28,7 +28,7 @@ type UserInformation = { }; @Component({ - templateUrl: './user.component.html', + templateUrl: "./user.component.html", }) export class UserComponent implements OnInit { @@ -67,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({}), @@ -127,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, }, }, @@ -152,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, @@ -168,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(); @@ -203,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; @@ -246,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 { @@ -256,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 3096991606a..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.", diff --git a/ui/src/assets/i18n/en.json b/ui/src/assets/i18n/en.json index 45f7388ab29..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", 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 e0007c5fbe7..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; @@ -396,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 001a8fbd192..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 { AppModule } from 'src/app/app.module'; -import { environment } from 'src/environments'; +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 9c6628376e2..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 2d851fa6be3..31342e27233 100644 --- a/ui/src/test.ts +++ b/ui/src/test.ts @@ -7,13 +7,13 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files -import 'zone.js/testing'; +import "zone.js/testing"; -import { getTestBed } from '@angular/core/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, From 804ea56fce51b8cbde5d961025500d3b5c796469 Mon Sep 17 00:00:00 2001 From: Hannes Date: Sat, 31 Aug 2024 14:52:12 +0200 Subject: [PATCH 26/28] Docs: fix `./gradlew :io.openems.edge.io.shelly:test` (#2752) Fix the "clean" into "test" for starting a test --- doc/modules/ROOT/pages/edge/implement.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/modules/ROOT/pages/edge/implement.adoc b/doc/modules/ROOT/pages/edge/implement.adoc index 51890ce5a40..79904339734 100644 --- a/doc/modules/ROOT/pages/edge/implement.adoc +++ b/doc/modules/ROOT/pages/edge/implement.adoc @@ -584,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. ---- From 67747a8b5e3b49f76d4bf2bec9cb0f8982ff301d Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Sat, 31 Aug 2024 15:04:23 +0200 Subject: [PATCH 27/28] Update to Gradle 8.10 --- .gradle-wrapper/gradle-wrapper.jar | Bin 43453 -> 43504 bytes .gradle-wrapper/gradle-wrapper.properties | 2 +- gradlew | 5 ++++- gradlew.bat | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.gradle-wrapper/gradle-wrapper.jar b/.gradle-wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 8703 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 Ojj7^59?Sdh$^Qpp*~F>< delta 8662 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 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/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 ########################################################################## From d2ef52ac07af6fdb65885d3f789cb156e2c341fe Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Sat, 31 Aug 2024 15:10:46 +0200 Subject: [PATCH 28/28] Push version to 2024.9.0 --- .../src/io/openems/common/OpenemsConstants.java | 2 +- tools/common.sh | 5 ----- ui/package-lock.json | 4 ++-- ui/package.json | 2 +- ui/src/app/changelog/view/component/changelog.constants.ts | 2 +- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/io.openems.common/src/io/openems/common/OpenemsConstants.java b/io.openems.common/src/io/openems/common/OpenemsConstants.java index 001ac36ce1c..69b49e779ee 100644 --- a/io.openems.common/src/io/openems/common/OpenemsConstants.java +++ b/io.openems.common/src/io/openems/common/OpenemsConstants.java @@ -36,7 +36,7 @@ public class OpenemsConstants { /** * The additional version string. */ - public static final String VERSION_STRING = "SNAPSHOT"; + public static final String VERSION_STRING = ""; /** * The complete version as a SemanticVersion. diff --git a/tools/common.sh b/tools/common.sh index d18b68f18be..ed3c536b323 100644 --- a/tools/common.sh +++ b/tools/common.sh @@ -8,7 +8,6 @@ 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="${THEME:-openems}" @@ -62,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 diff --git a/ui/package-lock.json b/ui/package-lock.json index eb23f05a996..edc7956ab67 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "openems-ui", - "version": "2024.9.0-SNAPSHOT", + "version": "2024.9.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "openems-ui", - "version": "2024.9.0-SNAPSHOT", + "version": "2024.9.0", "license": "AGPL-3.0", "dependencies": { "@angular/animations": "18.0.5", diff --git a/ui/package.json b/ui/package.json index 11ad80f8c00..0e232477e3c 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "openems-ui", - "version": "2024.9.0-SNAPSHOT", + "version": "2024.9.0", "license": "AGPL-3.0", "private": true, "dependencies": { diff --git a/ui/src/app/changelog/view/component/changelog.constants.ts b/ui/src/app/changelog/view/component/changelog.constants.ts index 0bef8c32fa2..99de881dd8b 100644 --- a/ui/src/app/changelog/view/component/changelog.constants.ts +++ b/ui/src/app/changelog/view/component/changelog.constants.ts @@ -2,7 +2,7 @@ import { Role } from "src/app/shared/type/role"; export class Changelog { - public static readonly UI_VERSION = "2024.9.0-SNAPSHOT"; + public static readonly UI_VERSION = "2024.9.0"; public static product(...products: Product[]) { return products.map(product => Changelog.link(product.name, product.url)).join(", ") + ". ";