> getHistoryDay() th
*
* All recorded performance values in per hour of the requested day
* sorted by hour in ascending order. The values are stored in arrays of
- * lenght 30 and 12. Arrays of length 30 represent 2 minute average
+ * length 30 and 12. Arrays of length 30 represent 2 minute average
* values, arrays of 12 represent 5 minute average values.
*
*
diff --git a/io.openems.edge.katek.edcom/src/com/ed/edcom/Client.java b/io.openems.edge.katek.edcom/src/com/ed/edcom/Client.java
index 4b04490507d..3e39681b187 100644
--- a/io.openems.edge.katek.edcom/src/com/ed/edcom/Client.java
+++ b/io.openems.edge.katek.edcom/src/com/ed/edcom/Client.java
@@ -196,7 +196,7 @@ public byte getAccessFeedb() {
/**
* Check if ID is accepted by inverter
*
- * @return true - ID accepted, false - ID not accpeted.
+ * @return true - ID accepted, false - ID not accepted.
*/
public boolean isIdAccepted() {
@@ -206,7 +206,7 @@ public boolean isIdAccepted() {
/**
* Check if user password is accepted by inverter
*
- * @return true - ID accepted, false - ID not accpeted.
+ * @return true - ID accepted, false - ID not accepted.
*/
public boolean isPasswordAccepted() {
return this.accessBitTest(2);
diff --git a/io.openems.edge.simulator/bnd.bnd b/io.openems.edge.simulator/bnd.bnd
index dbc46e64278..f674ba8c3a9 100644
--- a/io.openems.edge.simulator/bnd.bnd
+++ b/io.openems.edge.simulator/bnd.bnd
@@ -13,6 +13,7 @@ Bundle-Version: 1.0.0.${tstamp}
io.openems.edge.evcs.api,\
io.openems.edge.io.api,\
io.openems.edge.meter.api,\
+ io.openems.edge.predictor.api,\
io.openems.edge.pvinverter.api,\
io.openems.edge.thermometer.api,\
io.openems.edge.timedata.api,\
diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/DataContainer.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/DataContainer.java
index b0bf32fbe4c..02b08f55252 100644
--- a/io.openems.edge.simulator/src/io/openems/edge/simulator/DataContainer.java
+++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/DataContainer.java
@@ -53,6 +53,22 @@ public Float[] getCurrentRecord() {
return this.records.get(this.currentIndex);
}
+ /**
+ * Gets all values for the key. If no keys exist, get the value of all records.
+ *
+ * @param key the Channel-Id
+ * @return the record values
+ */
+ public List getValues(String key) {
+ var index = this.getIndex(key);
+ if (index == null) {
+ return List.of();
+ }
+ return this.records.stream() //
+ .map(a -> a[index]) //
+ .toList();
+ }
+
/**
* Gets the value for the key from the current record. If no keys exist, get the
* first value of the record.
@@ -61,16 +77,9 @@ public Float[] getCurrentRecord() {
* @return the record value
*/
public Optional getValue(String key) {
- Integer index;
- if (this.keys.isEmpty()) {
- // no keys -> first value
- index = 0;
- } else {
- // find index of key
- index = this.keys.get(key);
- if (index == null) {
- return Optional.empty();
- }
+ var index = this.getIndex(key);
+ if (index == null) {
+ return Optional.empty();
}
var record = this.getCurrentRecord();
if (index < record.length) {
@@ -79,6 +88,22 @@ var record = this.getCurrentRecord();
return Optional.empty();
}
+ /**
+ * Gets the index of the kex.
+ *
+ * @param key the Channel-Id
+ * @return the index; possibly null
+ */
+ private Integer getIndex(String key) {
+ if (this.keys.isEmpty()) {
+ // no keys -> first value
+ return 0;
+ } else {
+ // find index of key
+ return this.keys.get(key);
+ }
+ }
+
/**
* Switch to the next row of values.
*/
diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/app/SimulatorAppImpl.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/app/SimulatorAppImpl.java
index a1bce438a71..e646771b004 100644
--- a/io.openems.edge.simulator/src/io/openems/edge/simulator/app/SimulatorAppImpl.java
+++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/app/SimulatorAppImpl.java
@@ -473,6 +473,12 @@ public int getTimeDelta() {
return -1;
}
+ @Override
+ public List getValues(OpenemsType type, ChannelAddress channelAddress) {
+ // TODO Auto-generated method stub
+ return List.of();
+ }
+
@Override
public T getValue(OpenemsType type, ChannelAddress channelAddress) {
if (this.currentSimulation == null) {
diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/datasource/api/AbstractCsvDatasource.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/datasource/api/AbstractCsvDatasource.java
index 82997c7a8c2..33aae79cab5 100644
--- a/io.openems.edge.simulator/src/io/openems/edge/simulator/datasource/api/AbstractCsvDatasource.java
+++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/datasource/api/AbstractCsvDatasource.java
@@ -3,6 +3,7 @@
import java.io.IOException;
import java.time.Duration;
import java.time.LocalDateTime;
+import java.util.List;
import java.util.Set;
import org.osgi.service.component.ComponentContext;
@@ -59,6 +60,20 @@ public void handleEvent(Event event) {
}
}
+ @SuppressWarnings("unchecked")
+ @Override
+ public List getValues(OpenemsType type, ChannelAddress channelAddress) {
+ // First: try full ChannelAddress
+ var values = this.data.getValues(channelAddress.toString());
+ if (values.isEmpty()) {
+ // Not found: try Channel-ID only (without Component-ID)
+ values = this.data.getValues(channelAddress.getChannelId());
+ }
+ return values.stream() //
+ .map(v -> (T) TypeUtils.getAsType(type, v)) //
+ .toList();
+ }
+
@Override
public T getValue(OpenemsType type, ChannelAddress channelAddress) {
// First: try full ChannelAddress
diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/datasource/api/SimulatorDatasource.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/datasource/api/SimulatorDatasource.java
index cac3c09485d..f5d1411d896 100644
--- a/io.openems.edge.simulator/src/io/openems/edge/simulator/datasource/api/SimulatorDatasource.java
+++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/datasource/api/SimulatorDatasource.java
@@ -1,5 +1,6 @@
package io.openems.edge.simulator.datasource.api;
+import java.util.List;
import java.util.Set;
import io.openems.common.types.ChannelAddress;
@@ -12,14 +13,24 @@ public interface SimulatorDatasource {
*
* @return the Channel-Id
*/
- Set getKeys();
+ public Set getKeys();
/**
* Returns the delta between two values in seconds.
*
* @return the delta in seconds
*/
- int getTimeDelta();
+ public int getTimeDelta();
+
+ /**
+ * Gets all values for the given key (channelId) in the given type.
+ *
+ * @param the type
+ * @param type the expected type
+ * @param channelAddress the Channel-Address
+ * @return the values, possibly empty
+ */
+ public List getValues(OpenemsType type, ChannelAddress channelAddress);
/**
* Gets the value for the given key (channelId) in the given type.
@@ -29,6 +40,6 @@ public interface SimulatorDatasource {
* @param channelAddress the Channel-Address
* @return the value, possibly null
*/
- T getValue(OpenemsType type, ChannelAddress channelAddress);
+ public T getValue(OpenemsType type, ChannelAddress channelAddress);
}
diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/predictor/Config.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/predictor/Config.java
new file mode 100644
index 00000000000..3498f4b97cb
--- /dev/null
+++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/predictor/Config.java
@@ -0,0 +1,38 @@
+package io.openems.edge.simulator.predictor;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+import io.openems.edge.predictor.api.prediction.LogVerbosity;
+
+@ObjectClassDefinition(//
+ name = "Simulator Predictor", //
+ description = "This Predictor simulates predictions from a DataSource")
+@interface Config {
+
+ @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component")
+ String id() default "timedata0";
+
+ @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID")
+ String alias() default "";
+
+ @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?")
+ boolean enabled() default true;
+
+ @AttributeDefinition(name = "Channel-Addresses", description = "List of Channel-Addresses this Predictor is used for, e.g. '*/ActivePower', '*/ActualPower'")
+ String[] channelAddresses() default { //
+ "_sum/ProductionActivePower", //
+ "_sum/UnmanagedConsumptionActivePower", //
+ "_sum/ConsumptionActivePower" };
+
+ @AttributeDefinition(name = "Datasource-ID", description = "ID of Simulator Datasource.")
+ String datasource_id() default "datasource0";
+
+ @AttributeDefinition(name = "Datasource target filter", description = "This is auto-generated by 'Datasource-ID'.")
+ String datasource_target() default "(enabled=true)";
+
+ @AttributeDefinition(name = "Log-Verbosity", description = "The log verbosity.")
+ LogVerbosity logVerbosity() default LogVerbosity.NONE;
+
+ String webconsole_configurationFactory_nameHint() default "Simulator Predictor [{id}]";
+}
\ No newline at end of file
diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/predictor/SimulatorPredictor.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/predictor/SimulatorPredictor.java
new file mode 100644
index 00000000000..0a80bff172b
--- /dev/null
+++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/predictor/SimulatorPredictor.java
@@ -0,0 +1,23 @@
+package io.openems.edge.simulator.predictor;
+
+import io.openems.edge.common.channel.Doc;
+import io.openems.edge.common.component.OpenemsComponent;
+import io.openems.edge.predictor.api.prediction.Predictor;
+
+public interface SimulatorPredictor extends Predictor, OpenemsComponent {
+
+ public enum ChannelId implements io.openems.edge.common.channel.ChannelId {
+ ;
+
+ private final Doc doc;
+
+ private ChannelId(Doc doc) {
+ this.doc = doc;
+ }
+
+ @Override
+ public Doc doc() {
+ return this.doc;
+ }
+ }
+}
diff --git a/io.openems.edge.simulator/src/io/openems/edge/simulator/predictor/SimulatorPredictorImpl.java b/io.openems.edge.simulator/src/io/openems/edge/simulator/predictor/SimulatorPredictorImpl.java
new file mode 100644
index 00000000000..59fc9590f53
--- /dev/null
+++ b/io.openems.edge.simulator/src/io/openems/edge/simulator/predictor/SimulatorPredictorImpl.java
@@ -0,0 +1,102 @@
+package io.openems.edge.simulator.predictor;
+
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.LinkedList;
+
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+import org.osgi.service.event.propertytypes.EventTopics;
+import org.osgi.service.metatype.annotations.Designate;
+
+import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
+import io.openems.common.types.ChannelAddress;
+import io.openems.common.types.OpenemsType;
+import io.openems.edge.common.component.ClockProvider;
+import io.openems.edge.common.component.ComponentManager;
+import io.openems.edge.common.component.OpenemsComponent;
+import io.openems.edge.common.event.EdgeEventConstants;
+import io.openems.edge.common.type.TypeUtils;
+import io.openems.edge.predictor.api.prediction.AbstractPredictor;
+import io.openems.edge.predictor.api.prediction.Prediction;
+import io.openems.edge.predictor.api.prediction.Predictor;
+import io.openems.edge.simulator.datasource.api.SimulatorDatasource;
+
+@Designate(ocd = Config.class, factory = true)
+@Component(//
+ name = "Simulator.Predictor", //
+ immediate = true, //
+ configurationPolicy = ConfigurationPolicy.REQUIRE //
+)
+@EventTopics({ //
+ EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE //
+})
+public class SimulatorPredictorImpl extends AbstractPredictor
+ implements SimulatorPredictor, Predictor, OpenemsComponent {
+
+ @Reference
+ private ComponentManager componentManager;
+
+ @Reference
+ private ConfigurationAdmin cm;
+
+ @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY)
+ private SimulatorDatasource datasource;
+
+ public SimulatorPredictorImpl() {
+ super(//
+ OpenemsComponent.ChannelId.values(), //
+ SimulatorPredictor.ChannelId.values() //
+ );
+ }
+
+ @Activate
+ private void activate(ComponentContext context, Config config) throws OpenemsNamedException {
+ super.activate(context, config.id(), config.alias(), config.enabled(), config.channelAddresses(),
+ config.logVerbosity());
+
+ // update filter for 'datasource'
+ if (OpenemsComponent.updateReferenceFilter(this.cm, this.servicePid(), "datasource", config.datasource_id())) {
+ return;
+ }
+ }
+
+ @Override
+ @Deactivate
+ protected void deactivate() {
+ super.deactivate();
+ }
+
+ @Override
+ protected ClockProvider getClockProvider() {
+ return this.componentManager;
+ }
+
+ @Override
+ protected Prediction createNewPrediction(ChannelAddress channelAddress) {
+ var source = this.datasource.getValues(OpenemsType.INTEGER, channelAddress);
+ if (source.isEmpty()) {
+ return Prediction.EMPTY_PREDICTION;
+ }
+ // Fill 48 hours starting from midnight; assume Datasource provides one vale per
+ // 5 minutes
+ var values = new Integer[48 /* hours */ * 4 /* quarters per hour */];
+ var cache = new LinkedList();
+ for (var i = 0; i < values.length; i++) {
+ while (cache.size() < 3) {
+ cache.addAll(source);
+ }
+ values[i] = TypeUtils.averageInt(cache.poll(), cache.poll(), cache.poll());
+ }
+ var today = ZonedDateTime.now(this.componentManager.getClock()).truncatedTo(ChronoUnit.DAYS);
+ return Prediction.from(today, values);
+ }
+}
diff --git a/io.openems.edge.simulator/test/io/openems/edge/simulator/datasource/csv/direct/SimulatorDatasourceCsvDirectImplTest.java b/io.openems.edge.simulator/test/io/openems/edge/simulator/datasource/csv/direct/SimulatorDatasourceCsvDirectImplTest.java
index 22f4942d5de..347a36a4535 100644
--- a/io.openems.edge.simulator/test/io/openems/edge/simulator/datasource/csv/direct/SimulatorDatasourceCsvDirectImplTest.java
+++ b/io.openems.edge.simulator/test/io/openems/edge/simulator/datasource/csv/direct/SimulatorDatasourceCsvDirectImplTest.java
@@ -11,17 +11,33 @@ public class SimulatorDatasourceCsvDirectImplTest {
private static final String COMPONENT_ID = "datasource0";
- @Test
- public void test() throws Exception {
- new ComponentTest(new SimulatorDatasourceCsvDirectImpl()) //
+ private static ComponentTest createTest(String componentId, String source) throws Exception {
+ return new ComponentTest(new SimulatorDatasourceCsvDirectImpl()) //
.addReference("componentManager", new DummyComponentManager()) //
.activate(MyConfig.create() //
- .setId(COMPONENT_ID) //
+ .setId(componentId) //
.setFactor(1) //
.setFormat(CsvFormat.ENGLISH) //
- .setSource("") //
+ .setSource(source) //
.setTimeDelta(0) //
- .build()) //
+ .build()); //
+ }
+
+ /**
+ * Creates and activates a {@link SimulatorDatasourceCsvDirectImpl}.
+ *
+ * @param componentId the Component-ID
+ * @param source the data
+ * @return a {@link SimulatorDatasourceCsvDirectImpl} object
+ * @throws Exception on error
+ */
+ public static SimulatorDatasourceCsvDirectImpl create(String componentId, String source) throws Exception {
+ return (SimulatorDatasourceCsvDirectImpl) createTest(componentId, source).getSut();
+ }
+
+ @Test
+ public void test() throws Exception {
+ createTest(COMPONENT_ID, "") //
.next(new TestCase()) //
;
}
diff --git a/io.openems.edge.simulator/test/io/openems/edge/simulator/predictor/MyConfig.java b/io.openems.edge.simulator/test/io/openems/edge/simulator/predictor/MyConfig.java
new file mode 100644
index 00000000000..4d2583743ae
--- /dev/null
+++ b/io.openems.edge.simulator/test/io/openems/edge/simulator/predictor/MyConfig.java
@@ -0,0 +1,80 @@
+package io.openems.edge.simulator.predictor;
+
+import io.openems.common.test.AbstractComponentConfig;
+import io.openems.common.utils.ConfigUtils;
+import io.openems.edge.predictor.api.prediction.LogVerbosity;
+
+@SuppressWarnings("all")
+public class MyConfig extends AbstractComponentConfig implements Config {
+
+ protected static class Builder {
+ private String id;
+ private String datasourceId;
+ private String[] channelAddresses;
+ private LogVerbosity logVerbosity;
+
+ private Builder() {
+ }
+
+ public Builder setId(String id) {
+ this.id = id;
+ return this;
+ }
+
+ public Builder setDatasourceId(String datasourceId) {
+ this.datasourceId = datasourceId;
+ return this;
+ }
+
+ public Builder setChannelAddresses(String... channelAddresses) {
+ this.channelAddresses = channelAddresses;
+ return this;
+ }
+
+ public Builder setLogVerbosity(LogVerbosity logVerbosity) {
+ this.logVerbosity = logVerbosity;
+ return this;
+ }
+
+ public MyConfig build() {
+ return new MyConfig(this);
+ }
+ }
+
+ /**
+ * Create a Config builder.
+ *
+ * @return a {@link Builder}
+ */
+ public static Builder create() {
+ return new Builder();
+ }
+
+ private final Builder builder;
+
+ private MyConfig(Builder builder) {
+ super(Config.class, builder.id);
+ this.builder = builder;
+ }
+
+ @Override
+ public String[] channelAddresses() {
+ return this.builder.channelAddresses;
+ }
+
+ @Override
+ public String datasource_id() {
+ return this.builder.datasourceId;
+ }
+
+ @Override
+ public String datasource_target() {
+ return ConfigUtils.generateReferenceTargetFilter(this.id(), this.datasource_id());
+ }
+
+ @Override
+ public LogVerbosity logVerbosity() {
+ return this.builder.logVerbosity;
+ }
+
+}
\ No newline at end of file
diff --git a/io.openems.edge.simulator/test/io/openems/edge/simulator/predictor/SimulatorPredictorImplTest.java b/io.openems.edge.simulator/test/io/openems/edge/simulator/predictor/SimulatorPredictorImplTest.java
new file mode 100644
index 00000000000..cb52b93658c
--- /dev/null
+++ b/io.openems.edge.simulator/test/io/openems/edge/simulator/predictor/SimulatorPredictorImplTest.java
@@ -0,0 +1,55 @@
+package io.openems.edge.simulator.predictor;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+import org.junit.Test;
+
+import io.openems.common.exceptions.OpenemsException;
+import io.openems.common.test.TimeLeapClock;
+import io.openems.common.types.ChannelAddress;
+import io.openems.edge.common.test.ComponentTest;
+import io.openems.edge.common.test.DummyComponentManager;
+import io.openems.edge.common.test.DummyConfigurationAdmin;
+import io.openems.edge.predictor.api.prediction.LogVerbosity;
+import io.openems.edge.simulator.datasource.csv.direct.SimulatorDatasourceCsvDirectImplTest;
+
+public class SimulatorPredictorImplTest {
+
+ private static final TimeLeapClock CLOCK = new TimeLeapClock(Instant.ofEpochSecond(946684800), ZoneId.of("UTC"));
+ private static final String COMPONENT_ID = "predictor0";
+ private static final String DATASOURCE_ID = "datasource0";
+ private static final ChannelAddress SUM_PRODUCTION = new ChannelAddress("_sum", "ProductionActivePower");
+
+ @Test
+ public void test() throws OpenemsException, Exception {
+ final var datasource = SimulatorDatasourceCsvDirectImplTest.create(DATASOURCE_ID, """
+ 10
+ 20
+ 30
+ 40
+ """);
+ final var sut = new SimulatorPredictorImpl();
+ new ComponentTest(sut) //
+ .addReference("cm", new DummyConfigurationAdmin()) //
+ .addReference("datasource", datasource) //
+ .addReference("componentManager", new DummyComponentManager(CLOCK)) //
+ .activate(MyConfig.create() //
+ .setId(COMPONENT_ID) //
+ .setDatasourceId(DATASOURCE_ID) //
+ .setChannelAddresses(SUM_PRODUCTION.toString()) //
+ .setLogVerbosity(LogVerbosity.REQUESTED_PREDICTIONS) //
+ .build()); //
+
+ var p = sut.createNewPrediction(SUM_PRODUCTION);
+ assertEquals(192, p.asArray().length);
+ assertEquals(Integer.valueOf(20), p.asArray()[0]);
+ assertEquals(Integer.valueOf(23), p.asArray()[1]);
+ assertEquals(Integer.valueOf(27), p.asArray()[2]);
+ assertEquals(ZonedDateTime.of(2000, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")), p.valuePerQuarter.firstKey());
+ }
+
+}
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 7ee00663374..e12637892de 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
@@ -150,7 +150,7 @@ private static Timeranges getTimerangesOfNotSendData(RrdDb db, long start) throw
* @param rrdDbId the id of the rrdb
* @param notSendChannel the channel with the timestamps where the data got
* not send
- * @param lastResendTimestamp the timstamp of the last resend
+ * @param lastResendTimestamp the timestamp of the last resend
* @param debugMode if debugMode is active
* @return the {@link Timeranges}
* @throws OpenemsNamedException on error
diff --git a/io.openems.wrapper/bnd.bnd b/io.openems.wrapper/bnd.bnd
index 8bed7415c14..d024f94a589 100644
--- a/io.openems.wrapper/bnd.bnd
+++ b/io.openems.wrapper/bnd.bnd
@@ -24,7 +24,7 @@ Bundle-Description: This wraps external java libraries that do not have OSGi hea
com.google.gson;version='2.10.1',\
de.bytefish:pgbulkinsert;version='8.1.4',\
fr.turri:aXMLRPC;version='1.13.0',\
- org.dhatim:fastexcel;version='0.18.1',\
- org.dhatim:fastexcel-reader;version='0.18.1',\
+ org.dhatim:fastexcel;version='0.18.4',\
+ org.dhatim:fastexcel-reader;version='0.18.4',\
org.eclipse.paho.mqttv5.client;version='1.2.5',\
- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm;version='1.7.3',\
+ org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm;version='1.9.0',\
diff --git a/io.openems.wrapper/fastexcel.bnd b/io.openems.wrapper/fastexcel.bnd
index e3fa142345c..68c2302413d 100644
--- a/io.openems.wrapper/fastexcel.bnd
+++ b/io.openems.wrapper/fastexcel.bnd
@@ -1,11 +1,11 @@
Bundle-Name: fastexcel
Bundle-DocURL: https://github.com/dhatim/fastexcel
Bundle-License: https://opensource.org/licenses/Apache-2.0
-Bundle-Version: 0.18.1
+Bundle-Version: 0.18.4
Include-Resource: \
- @fastexcel-0.18.1.jar,\
- @fastexcel-reader-0.18.1.jar,\
+ @fastexcel-0.18.4.jar,\
+ @fastexcel-reader-0.18.4.jar,\
-dsannotations: *
diff --git a/io.openems.wrapper/kotlinx-coroutines-core-jvm.bnd b/io.openems.wrapper/kotlinx-coroutines-core-jvm.bnd
index eaafb47be8d..3b276e9c952 100644
--- a/io.openems.wrapper/kotlinx-coroutines-core-jvm.bnd
+++ b/io.openems.wrapper/kotlinx-coroutines-core-jvm.bnd
@@ -2,10 +2,10 @@ Bundle-Name: kotlinx-coroutines-core-jvm
Bundle-Description: The Java InfluxDB 2.0 Client Core
Bundle-DocURL: https://github.com/influxdata/influxdb-client-client
Bundle-License: https://opensource.org/licenses/MIT
-Bundle-Version: 1.8.1
+Bundle-Version: 1.9.0
Include-Resource: \
- @kotlinx-coroutines-core-jvm-1.8.1.jar,\
+ @kotlinx-coroutines-core-jvm-1.9.0.jar,\
Export-Package: \
kotlinx.coroutines,\
diff --git a/ui/.eslintrc.json b/ui/.eslintrc.json
index c3095af0cf3..8a3902ecddb 100644
--- a/ui/.eslintrc.json
+++ b/ui/.eslintrc.json
@@ -89,8 +89,8 @@
}
],
"@typescript-eslint/member-ordering": "error",
- "no-multiple-empty-lines": "error",
- "quotes": [
+ "@stylistic/no-multiple-empty-lines": "error",
+ "@stylistic/quotes": [
"error",
"double"
],
diff --git a/ui/package-lock.json b/ui/package-lock.json
index edc7956ab67..fca2ca8fb74 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -1,35 +1,35 @@
{
"name": "openems-ui",
- "version": "2024.9.0",
+ "version": "2024.10.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openems-ui",
- "version": "2024.9.0",
+ "version": "2024.10.0",
"license": "AGPL-3.0",
"dependencies": {
- "@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",
+ "@angular/animations": "18.2.5",
+ "@angular/common": "18.2.5",
+ "@angular/core": "18.2.5",
+ "@angular/forms": "18.2.5",
+ "@angular/platform-browser": "18.2.5",
+ "@angular/platform-browser-dynamic": "18.2.5",
+ "@angular/router": "18.2.5",
+ "@angular/service-worker": "18.2.5",
+ "@capacitor-community/file-opener": "^6.0.1",
+ "@capacitor/android": "^6.1.2",
+ "@capacitor/app": "^6.0.1",
+ "@capacitor/core": "^6.1.2",
+ "@capacitor/filesystem": "^6.0.1",
+ "@capacitor/ios": "^6.1.2",
+ "@capacitor/splash-screen": "^6.0.2",
"@ionic-native/core": "^5.36.0",
"@ionic-native/file-opener": "^5.36.0",
"@ionic/angular": "^6.7.5",
- "@ngx-formly/core": "^6.3.0",
- "@ngx-formly/ionic": "^6.3.6",
- "@ngx-formly/schematics": "^6.3.0",
+ "@ngx-formly/core": "^6.3.7",
+ "@ngx-formly/ionic": "^6.3.7",
+ "@ngx-formly/schematics": "^6.3.7",
"@ngx-translate/core": "^15.0.0",
"@nodro7/angular-mydatepicker": "^0.14.0",
"capacitor-blob-writer": "^1.1.17",
@@ -51,47 +51,47 @@
"ngx-spinner": "^16.0.2",
"roboto-fontface": "^0.10.0",
"rxjs": "~6.6.7",
- "swiper": "11.1.11",
+ "swiper": "11.1.14",
"tslib": "^2.6.2",
"uuid": "^10.0.0",
"zone.js": "~0.14.7"
},
"devDependencies": {
- "@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",
+ "@angular-devkit/build-angular": "^18.2.5",
+ "@angular-devkit/core": "18.2.5",
+ "@angular-devkit/schematics": "18.2.5",
+ "@angular-eslint/builder": "^18.3.1",
+ "@angular-eslint/eslint-plugin": "^18.3.1",
+ "@angular-eslint/eslint-plugin-template": "^18.3.1",
+ "@angular-eslint/template-parser": "^18.3.1",
+ "@angular/cli": "18.2.5",
+ "@angular/compiler": "18.2.5",
+ "@angular/compiler-cli": "18.2.5",
+ "@angular/language-service": "18.2.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",
+ "@stylistic/eslint-plugin": "^2.8.0",
"@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/qs": "^6.9.16",
"@types/range-parser": "^1.2.7",
"@types/send": "^0.17.4",
"@types/uuid": "^10.0.0",
"@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0",
- "@typescript-eslint/types": "^7.0.0",
+ "@typescript-eslint/types": "^8.7.0",
"eslint": "^8.57.0",
- "eslint-plugin-import": "2.29.1",
- "eslint-plugin-jsdoc": "48.10.0",
+ "eslint-plugin-import": "2.30.0",
+ "eslint-plugin-jsdoc": "50.2.4",
"eslint-plugin-prefer-arrow": "1.2.3",
- "eslint-plugin-unused-imports": "^4.1.3",
- "jasmine-core": "~4.5.0",
+ "eslint-plugin-unused-imports": "^4.1.4",
+ "jasmine-core": "~5.3.0",
"jasmine-spec-reporter": "~7.0.0",
- "karma": "~6.4.2",
+ "karma": "~6.4.4",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.1",
"karma-coverage-istanbul-reporter": "~3.0.3",
@@ -118,13 +118,12 @@
}
},
"node_modules/@angular-devkit/architect": {
- "version": "0.1802.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.2.tgz",
- "integrity": "sha512-LPRl9jhcf0NgshaL6RoUy1uL/cAyNt7oxctoZ9EHUu8eh5E9W/jZGhVowjOLpirwqYhmEzKJJIeS49Ssqs3RQg==",
+ "version": "0.1802.5",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz",
+ "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@angular-devkit/core": "18.2.2",
+ "@angular-devkit/core": "18.2.5",
"rxjs": "7.8.1"
},
"engines": {
@@ -133,73 +132,27 @@
"yarn": ">= 1.13.0"
}
},
- "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": {
- "version": "18.2.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.2.tgz",
- "integrity": "sha512-Zz0tGptI/QQnUBDdp+1G5wGwQWMjpfe2oO+UohkrDVgFS71yVj4VDnOy51kMTxBvzw+36evTgthPpmzqPIfxBw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "8.17.1",
- "ajv-formats": "3.0.1",
- "jsonc-parser": "3.3.1",
- "picomatch": "4.0.2",
- "rxjs": "7.8.1",
- "source-map": "0.7.4"
- },
- "engines": {
- "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
- "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
- "yarn": ">= 1.13.0"
- },
- "peerDependencies": {
- "chokidar": "^3.5.2"
- },
- "peerDependenciesMeta": {
- "chokidar": {
- "optional": true
- }
- }
- },
- "node_modules/@angular-devkit/architect/node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
"node_modules/@angular-devkit/architect/node_modules/rxjs": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
"integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
"dev": true,
- "license": "Apache-2.0",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@angular-devkit/build-angular": {
- "version": "18.2.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.2.tgz",
- "integrity": "sha512-7HEnTN2T1jnjuItXKcApOsoYGgfou4+POju3ZbwIQukDZ3B2COskvQkVTxqPNrQ0ZjT2mxZYoVlmGW9M+7N25g==",
+ "version": "18.2.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.6.tgz",
+ "integrity": "sha512-u12cJZttgs5j7gICHWSmcaTCu0EFXEzKqI8nkYCwq2MtuJlAXiMQSXYuEP9OU3Go4vMAPtQh2kShyOWCX5b4EQ==",
"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",
+ "@angular-devkit/architect": "0.1802.6",
+ "@angular-devkit/build-webpack": "0.1802.6",
+ "@angular-devkit/core": "18.2.6",
+ "@angular/build": "18.2.6",
"@babel/core": "7.25.2",
"@babel/generator": "7.25.0",
"@babel/helper-annotate-as-pure": "7.24.7",
@@ -210,7 +163,7 @@
"@babel/preset-env": "7.25.3",
"@babel/runtime": "7.25.0",
"@discoveryjs/json-ext": "0.6.1",
- "@ngtools/webpack": "18.2.2",
+ "@ngtools/webpack": "18.2.6",
"@vitejs/plugin-basic-ssl": "1.1.0",
"ansi-colors": "4.1.3",
"autoprefixer": "10.4.20",
@@ -250,10 +203,10 @@
"terser": "5.31.6",
"tree-kill": "1.2.2",
"tslib": "2.6.3",
- "vite": "5.4.0",
+ "vite": "5.4.6",
"watchpack": "2.4.1",
"webpack": "5.94.0",
- "webpack-dev-middleware": "7.3.0",
+ "webpack-dev-middleware": "7.4.2",
"webpack-dev-server": "5.0.4",
"webpack-merge": "6.0.1",
"webpack-subresource-integrity": "5.1.0"
@@ -317,10 +270,26 @@
}
}
},
+ "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": {
+ "version": "0.1802.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.6.tgz",
+ "integrity": "sha512-oF7cPFdTLxeuvXkK/opSdIxZ1E4LrBbmuytQ/nCoAGOaKBWdqvwagRZ6jVhaI0Gwu48rkcV7Zhesg/ESNnROdw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@angular-devkit/core": "18.2.6",
+ "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-devkit/build-angular/node_modules/@angular-devkit/core": {
- "version": "18.2.2",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.2.tgz",
- "integrity": "sha512-Zz0tGptI/QQnUBDdp+1G5wGwQWMjpfe2oO+UohkrDVgFS71yVj4VDnOy51kMTxBvzw+36evTgthPpmzqPIfxBw==",
+ "version": "18.2.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.6.tgz",
+ "integrity": "sha512-la4CFvs5PcRWSkQ/H7TB5cPZirFVA9GoWk5LzIk8si6VjWBJRm8b3keKJoC9LlNeABRUIR5z0ocYkyQQUhdMfg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -346,14 +315,14 @@
}
},
"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==",
+ "version": "18.2.6",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.6.tgz",
+ "integrity": "sha512-TQzX6Mi7uXFvmz7+OVl4Za7WawYPcx+B5Ewm6IY/DdMyB9P/Z4tbKb1LO+ynWUXYwm7avXo6XQQ4m5ArDY5F/A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.1802.2",
+ "@angular-devkit/architect": "0.1802.6",
"@babel/core": "7.25.2",
"@babel/helper-annotate-as-pure": "7.24.7",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -372,10 +341,10 @@
"parse5-html-rewriting-stream": "7.0.0",
"picomatch": "4.0.2",
"piscina": "4.6.1",
- "rollup": "4.20.0",
+ "rollup": "4.22.4",
"sass": "1.77.6",
"semver": "7.6.3",
- "vite": "5.4.0",
+ "vite": "5.4.6",
"watchpack": "2.4.1"
},
"engines": {
@@ -415,9 +384,9 @@
}
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz",
+ "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==",
"cpu": [
"arm"
],
@@ -429,9 +398,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz",
+ "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==",
"cpu": [
"arm64"
],
@@ -443,9 +412,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz",
+ "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==",
"cpu": [
"arm64"
],
@@ -457,9 +426,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz",
+ "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==",
"cpu": [
"x64"
],
@@ -471,9 +440,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz",
+ "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==",
"cpu": [
"arm"
],
@@ -485,9 +454,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz",
+ "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==",
"cpu": [
"arm"
],
@@ -499,9 +468,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz",
+ "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==",
"cpu": [
"arm64"
],
@@ -513,9 +482,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz",
+ "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==",
"cpu": [
"arm64"
],
@@ -527,9 +496,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz",
+ "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==",
"cpu": [
"ppc64"
],
@@ -541,9 +510,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz",
+ "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==",
"cpu": [
"riscv64"
],
@@ -555,9 +524,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz",
+ "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==",
"cpu": [
"s390x"
],
@@ -569,9 +538,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz",
+ "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==",
"cpu": [
"x64"
],
@@ -583,9 +552,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz",
+ "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==",
"cpu": [
"x64"
],
@@ -597,9 +566,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz",
+ "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==",
"cpu": [
"arm64"
],
@@ -611,9 +580,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz",
+ "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==",
"cpu": [
"ia32"
],
@@ -625,9 +594,9 @@
]
},
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz",
+ "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==",
"cpu": [
"x64"
],
@@ -638,85 +607,17 @@
"win32"
]
},
- "node_modules/@angular-devkit/build-angular/node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.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/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": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@angular-devkit/build-angular/node_modules/emoji-regex": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
- "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
- "dev": true,
- "license": "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==",
+ "node_modules/@angular-devkit/build-angular/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/@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": ">=18.0.0"
- }
- },
"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==",
+ "version": "4.22.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz",
+ "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -730,22 +631,22 @@
"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",
+ "@rollup/rollup-android-arm-eabi": "4.22.4",
+ "@rollup/rollup-android-arm64": "4.22.4",
+ "@rollup/rollup-darwin-arm64": "4.22.4",
+ "@rollup/rollup-darwin-x64": "4.22.4",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.22.4",
+ "@rollup/rollup-linux-arm-musleabihf": "4.22.4",
+ "@rollup/rollup-linux-arm64-gnu": "4.22.4",
+ "@rollup/rollup-linux-arm64-musl": "4.22.4",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4",
+ "@rollup/rollup-linux-riscv64-gnu": "4.22.4",
+ "@rollup/rollup-linux-s390x-gnu": "4.22.4",
+ "@rollup/rollup-linux-x64-gnu": "4.22.4",
+ "@rollup/rollup-linux-x64-musl": "4.22.4",
+ "@rollup/rollup-win32-arm64-msvc": "4.22.4",
+ "@rollup/rollup-win32-ia32-msvc": "4.22.4",
+ "@rollup/rollup-win32-x64-msvc": "4.22.4",
"fsevents": "~2.3.2"
}
},
@@ -754,79 +655,65 @@
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
"integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
"dev": true,
- "license": "Apache-2.0",
"dependencies": {
"tslib": "^2.1.0"
}
},
- "node_modules/@angular-devkit/build-angular/node_modules/string-width": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
- "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "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-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
},
- "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==",
+ "node_modules/@angular-devkit/build-webpack": {
+ "version": "0.1802.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.6.tgz",
+ "integrity": "sha512-JMLcXFaitJplwZMKkqhbYirINCRD6eOPZuIGaIOVynXYGWgvJkLT9t5C2wm9HqSLtp1K7NcYG2Y7PtTVR4krnQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "@angular-devkit/architect": "0.1802.6",
+ "rxjs": "7.8.1"
},
"engines": {
- "node": ">=12"
+ "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": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ "peerDependencies": {
+ "webpack": "^5.30.0",
+ "webpack-dev-server": "^5.0.2"
}
},
- "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==",
+ "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": {
+ "version": "0.1802.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.6.tgz",
+ "integrity": "sha512-oF7cPFdTLxeuvXkK/opSdIxZ1E4LrBbmuytQ/nCoAGOaKBWdqvwagRZ6jVhaI0Gwu48rkcV7Zhesg/ESNnROdw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^6.2.1",
- "string-width": "^7.0.0",
- "strip-ansi": "^7.1.0"
+ "@angular-devkit/core": "18.2.6",
+ "rxjs": "7.8.1"
},
"engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "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/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==",
+ "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": {
+ "version": "18.2.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.6.tgz",
+ "integrity": "sha512-la4CFvs5PcRWSkQ/H7TB5cPZirFVA9GoWk5LzIk8si6VjWBJRm8b3keKJoC9LlNeABRUIR5z0ocYkyQQUhdMfg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/architect": "0.1802.2",
- "rxjs": "7.8.1"
+ "ajv": "8.17.1",
+ "ajv-formats": "3.0.1",
+ "jsonc-parser": "3.3.1",
+ "picomatch": "4.0.2",
+ "rxjs": "7.8.1",
+ "source-map": "0.7.4"
},
"engines": {
"node": "^18.19.1 || ^20.11.1 || >=22.0.0",
@@ -834,8 +721,12 @@
"yarn": ">= 1.13.0"
},
"peerDependencies": {
- "webpack": "^5.30.0",
- "webpack-dev-server": "^5.0.2"
+ "chokidar": "^3.5.2"
+ },
+ "peerDependenciesMeta": {
+ "chokidar": {
+ "optional": true
+ }
}
},
"node_modules/@angular-devkit/build-webpack/node_modules/rxjs": {
@@ -849,15 +740,14 @@
}
},
"node_modules/@angular-devkit/core": {
- "version": "18.0.5",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.5.tgz",
- "integrity": "sha512-sGtrS0SqkcBvyuv0QkIfyadwPgDhMroz1r51lMh1hwzJaJ0LNuVMLviEeYIybeBnvAdp9YvYC8I1WgB/FUEFBw==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.5.tgz",
+ "integrity": "sha512-r9TumPlJ8PvA2+yz4sp+bUHgtznaVKzhvXTN5qL1k4YP8LJ7iZWMR2FOP+HjukHZOTsenzmV9pszbogabqwoZQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "ajv": "8.13.0",
+ "ajv": "8.17.1",
"ajv-formats": "3.0.1",
- "jsonc-parser": "3.2.1",
+ "jsonc-parser": "3.3.1",
"picomatch": "4.0.2",
"rxjs": "7.8.1",
"source-map": "0.7.4"
@@ -876,13 +766,6 @@
}
}
},
- "node_modules/@angular-devkit/core/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/@angular-devkit/core/node_modules/rxjs": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
@@ -894,15 +777,14 @@
}
},
"node_modules/@angular-devkit/schematics": {
- "version": "18.0.5",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.5.tgz",
- "integrity": "sha512-hZwAq3hwuJzCuh7uqO/7T9IMERhYVxz+ganJlEykpyr58o0IjUM1Q4ZSH5UOYlGRPdBCZJbfiafZ0Sg5w5xBww==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.5.tgz",
+ "integrity": "sha512-NUmz2UQ1Xl4cf4j1AgkwIfsCjBzAPgfeC3IBrD29hSOBE1Y3j6auqjBkvw50v6mbSPxESND995Xy13HpK1Xflw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@angular-devkit/core": "18.0.5",
- "jsonc-parser": "3.2.1",
- "magic-string": "0.30.10",
+ "@angular-devkit/core": "18.2.5",
+ "jsonc-parser": "3.3.1",
+ "magic-string": "0.30.11",
"ora": "5.4.1",
"rxjs": "7.8.1"
},
@@ -912,23 +794,6 @@
"yarn": ">= 1.13.0"
}
},
- "node_modules/@angular-devkit/schematics/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/@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",
@@ -940,9 +805,9 @@
}
},
"node_modules/@angular-eslint/builder": {
- "version": "18.3.0",
- "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.3.0.tgz",
- "integrity": "sha512-httEQyqyBw3+0CRtAa7muFxHrauRfkEfk/jmrh5fn2Eiu+I53hAqFPgrwVi1V6AP/kj2zbAiWhd5xM3pMJdoRQ==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.3.1.tgz",
+ "integrity": "sha512-cPc7Ye9zDs5M4i+feL6vob+mh7yX5vxvOS5KQIhneUrp5e9D+IGuNFMmBLlOPpmklSc9XJBtuvI5Zjuh4z1ETw==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -951,21 +816,21 @@
}
},
"node_modules/@angular-eslint/bundled-angular-compiler": {
- "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==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.3.1.tgz",
+ "integrity": "sha512-sikmkjfsXPpPTku1aQkQ1MNNEKGBgGGRvUN/WeNS9dhCJ4dxU3O7dZctt1aQWj+W3nbuUtDiimAWF5fZHGFE2Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@angular-eslint/eslint-plugin": {
- "version": "18.3.0",
- "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.3.0.tgz",
- "integrity": "sha512-Vl7gfPMXxvtHTjYdlzR161aj5xrqW6T57wd8ToQ7Gqzm0qHGfY6kE4SQobUa2LCYckTNSlv+zXe48C4ah/dSjw==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.3.1.tgz",
+ "integrity": "sha512-MP4Nm+SHboF8KdnN0KpPEGAaTTzDLPm3+S/4W3Mg8onqWCyadyd4mActh9mK/pvCj8TVlb/SW1zeTtdMYhwonw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-eslint/bundled-angular-compiler": "18.3.0",
- "@angular-eslint/utils": "18.3.0"
+ "@angular-eslint/bundled-angular-compiler": "18.3.1",
+ "@angular-eslint/utils": "18.3.1"
},
"peerDependencies": {
"@typescript-eslint/utils": "^7.11.0 || ^8.0.0",
@@ -974,14 +839,14 @@
}
},
"node_modules/@angular-eslint/eslint-plugin-template": {
- "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==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.3.1.tgz",
+ "integrity": "sha512-hBJ3+f7VSidvrtYaXH7Vp0sWvblA9jLK2c6uQzhYGWdEDUcTg7g7VI9ThW39WvMbHqkyzNE4PPOynK69cBEDGg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-eslint/bundled-angular-compiler": "18.3.0",
- "@angular-eslint/utils": "18.3.0",
+ "@angular-eslint/bundled-angular-compiler": "18.3.1",
+ "@angular-eslint/utils": "18.3.1",
"aria-query": "5.3.0",
"axobject-query": "4.1.0"
},
@@ -992,13 +857,13 @@
}
},
"node_modules/@angular-eslint/template-parser": {
- "version": "18.3.0",
- "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.3.0.tgz",
- "integrity": "sha512-1mUquqcnugI4qsoxcYZKZ6WMi6RPelDcJZg2YqGyuaIuhWmi3ZqJZLErSSpjP60+TbYZu7wM8Kchqa1bwJtEaQ==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.3.1.tgz",
+ "integrity": "sha512-JUUkfWH1G+u/Uk85ZYvJSt/qwN/Ko+jlXFtzBEcknJZsTWTwBcp36v77gPZe5FmKSziJZpyPUd+7Kiy6tuSCTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-eslint/bundled-angular-compiler": "18.3.0",
+ "@angular-eslint/bundled-angular-compiler": "18.3.1",
"eslint-scope": "^8.0.2"
},
"peerDependencies": {
@@ -1007,13 +872,13 @@
}
},
"node_modules/@angular-eslint/utils": {
- "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==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.3.1.tgz",
+ "integrity": "sha512-sd9niZI7h9H2FQ7OLiQsLFBhjhRQTASh+Q0+4+hyjv9idbSHBJli8Gsi2fqj9zhtMKpAZFTrWzuLUpubJ9UYbA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-eslint/bundled-angular-compiler": "18.3.0"
+ "@angular-eslint/bundled-angular-compiler": "18.3.1"
},
"peerDependencies": {
"@typescript-eslint/utils": "^7.11.0 || ^8.0.0",
@@ -1022,9 +887,9 @@
}
},
"node_modules/@angular/animations": {
- "version": "18.0.5",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.0.5.tgz",
- "integrity": "sha512-RYwlS+4I33beAWdzFFmaDPqXZN+r66qPzzMOk9LQguwF76eBJbykHniODalSLvjrY6Iz7CULavByYNpzq2TT7A==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.5.tgz",
+ "integrity": "sha512-IlXtW/Nj48ZzjHUzH1TykZcSR64ScJx39T3IHnjV2z/bVATzZ36JGoadQHdqpJNKBodYJNgtJCGLCbgAvGWY2g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1033,7 +898,7 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/core": "18.0.5"
+ "@angular/core": "18.2.5"
}
},
"node_modules/@angular/cdk": {
@@ -1055,27 +920,27 @@
}
},
"node_modules/@angular/cli": {
- "version": "18.1.0",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.1.0.tgz",
- "integrity": "sha512-2E+b7S/736AOmxf5je9OWoPpgPY240TfJfFXwQiVvq/4KyC+ZR9lBrqRx72Xghn8nu3z8Q2BPZIXVGZppl0USQ==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.5.tgz",
+ "integrity": "sha512-97uNs0HsOdnMaTlNJKFjIBUXw0wz43uYvSSKmIpBt7eq1LaPLju1G/qpDIHx2YwhMClPrXXrW2H/xdvqZiIw+w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@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",
+ "@angular-devkit/architect": "0.1802.5",
+ "@angular-devkit/core": "18.2.5",
+ "@angular-devkit/schematics": "18.2.5",
+ "@inquirer/prompts": "5.3.8",
+ "@listr2/prompt-adapter-inquirer": "2.0.15",
+ "@schematics/angular": "18.2.5",
"@yarnpkg/lockfile": "1.1.0",
"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",
+ "listr2": "8.2.4",
+ "npm-package-arg": "11.0.3",
+ "npm-pick-manifest": "9.1.0",
"pacote": "18.0.6",
"resolve": "1.22.8",
- "semver": "7.6.2",
+ "semver": "7.6.3",
"symbol-observable": "4.0.0",
"yargs": "17.7.2"
},
@@ -1088,163 +953,49 @@
"yarn": ">= 1.13.0"
}
},
- "node_modules/@angular/cli/node_modules/@angular-devkit/architect": {
- "version": "0.1801.0",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1801.0.tgz",
- "integrity": "sha512-iZa3J3CrZT6MKiHPw8ijgVwMyCMewCsP4xc75SetUwF/yuqRUHygALs5jJVZQFQjSFUrkg9gqXa1cCjFDwpT8A==",
- "dev": true,
- "license": "MIT",
+ "node_modules/@angular/common": {
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.5.tgz",
+ "integrity": "sha512-m+KJrtbFXTE36jP/po6UAMeUR/enQxRHpVGLCRcIcE7VWVH1ZcOvoW1yqh2A6k+KxWXeajlq/Z04nnMhcoxMRw==",
"dependencies": {
- "@angular-devkit/core": "18.1.0",
- "rxjs": "7.8.1"
+ "tslib": "^2.3.0"
},
"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": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/core": "18.2.5",
+ "rxjs": "^6.5.3 || ^7.4.0"
}
},
- "node_modules/@angular/cli/node_modules/@angular-devkit/core": {
- "version": "18.1.0",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.1.0.tgz",
- "integrity": "sha512-6eXQDzHZCbpSMLv9Ohl+1QyLVDmGEXpuuHz3y64LfUTP0aEiBaxk96FjLXIxzJ4f2pbbW2XHzc+yuboGToRA0w==",
- "dev": true,
+ "node_modules/@angular/compiler": {
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.5.tgz",
+ "integrity": "sha512-vcqe9x4dGGAnMfPhEpcZyiSVgAiqJeK80LqP1vWoAmBR+HeOqAilSv6SflcLAtuTzwgzMMAvD2T+SMCgUvaqww==",
"license": "MIT",
"dependencies": {
- "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"
+ "tslib": "^2.3.0"
},
"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": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "chokidar": "^3.5.2"
+ "@angular/core": "18.2.5"
},
"peerDependenciesMeta": {
- "chokidar": {
+ "@angular/core": {
"optional": true
}
}
},
- "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==",
+ "node_modules/@angular/compiler-cli": {
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.5.tgz",
+ "integrity": "sha512-CCCtZobUTUfId/RTYtuDCw5R1oK0w65hdAUMRP1MdGmd8bb8DKJA86u1QCWwozL3rbXlIIX4ognQ6urQ43k/Gw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "18.1.0",
- "jsonc-parser": "3.3.1",
- "magic-string": "0.30.10",
- "ora": "5.4.1",
- "rxjs": "7.8.1"
- },
- "engines": {
- "node": "^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": {
- "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.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@angular/common": {
- "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": "^18.19.1 || ^20.11.1 || >=22.0.0"
- },
- "peerDependencies": {
- "@angular/core": "18.0.5",
- "rxjs": "^6.5.3 || ^7.4.0"
- }
- },
- "node_modules/@angular/compiler": {
- "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": "^18.19.1 || ^20.11.1 || >=22.0.0"
- },
- "peerDependencies": {
- "@angular/core": "18.0.5"
- },
- "peerDependenciesMeta": {
- "@angular/core": {
- "optional": true
- }
- }
- },
- "node_modules/@angular/compiler-cli": {
- "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.24.7",
+ "@babel/core": "7.25.2",
"@jridgewell/sourcemap-codec": "^1.4.14",
"chokidar": "^3.0.0",
"convert-source-map": "^1.5.1",
@@ -1262,62 +1013,14 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@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"
+ "@angular/compiler": "18.2.5",
+ "typescript": ">=5.4 <5.6"
}
},
"node_modules/@angular/core": {
- "version": "18.0.5",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.5.tgz",
- "integrity": "sha512-0UuL+aMMWGYksz09YBsiHq1li7GmL8obB3IC3T5MwDqnn7FGRUBfBUOZEkM6B+pwgg+RAtNdJkbCfbh1z74bFQ==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.5.tgz",
+ "integrity": "sha512-5BLVc5gXxzanQkADNS9WPsor3vNF5nQcyIHBi5VScErwM5vVZ7ATH1iZwaOg1ykDEVTFVhKDwD0X1aaqGDbhmQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1327,13 +1030,13 @@
},
"peerDependencies": {
"rxjs": "^6.5.3 || ^7.4.0",
- "zone.js": "~0.14.0"
+ "zone.js": "~0.14.10"
}
},
"node_modules/@angular/forms": {
- "version": "18.0.5",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.5.tgz",
- "integrity": "sha512-nO7bN+nO2/czgKSvPx6ewqpfb8xXOyns06uovWpAXSH4jYoiZ6CHTHhOKrOL/3SRkhUV9u+EUXTTAOSBkS+OBA==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.5.tgz",
+ "integrity": "sha512-ohKeH+EZCCIyGSiFYlraWLzssGAZc13P92cuYpXB62322PkcA5u0IT72mML9JWGKRqF2zteVsw4koWHVxXM5mA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1342,16 +1045,16 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "18.0.5",
- "@angular/core": "18.0.5",
- "@angular/platform-browser": "18.0.5",
+ "@angular/common": "18.2.5",
+ "@angular/core": "18.2.5",
+ "@angular/platform-browser": "18.2.5",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/language-service": {
- "version": "18.0.5",
- "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.0.5.tgz",
- "integrity": "sha512-ahZnsUk8q/4k+okP9hBcfWRiOiMximSAI7Vq5M/fe9cezykt8cWEzxgRoduTvDKoQPqcRl0nHlDYju2zkXcU6g==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.2.5.tgz",
+ "integrity": "sha512-JE6ck4UWXayiG8ptJJtkrKCjy+5Ftktgsoj4QGdQzMhbpia7Wge5XDj28o+bwEFndRnP6ihRtud63IvOz9aKFQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1359,9 +1062,9 @@
}
},
"node_modules/@angular/platform-browser": {
- "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==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.5.tgz",
+ "integrity": "sha512-PoX9idwnOpTJBlujzZ2nFGOsmCnZzOH7uNSWIR7trdoq0b1AFXfrxlCQ36qWamk7bbhJI4H28L8YTmKew/nXDA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1370,9 +1073,9 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/animations": "18.0.5",
- "@angular/common": "18.0.5",
- "@angular/core": "18.0.5"
+ "@angular/animations": "18.2.5",
+ "@angular/common": "18.2.5",
+ "@angular/core": "18.2.5"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -1381,9 +1084,9 @@
}
},
"node_modules/@angular/platform-browser-dynamic": {
- "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==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.5.tgz",
+ "integrity": "sha512-5u0IuAt1r5e2u2vSKhp3phnaf6hH89B/q7GErfPse1sdDfNI6wHVppxai28PAfAj9gwooJun6MjFWhJFLzS44A==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1392,16 +1095,16 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "18.0.5",
- "@angular/compiler": "18.0.5",
- "@angular/core": "18.0.5",
- "@angular/platform-browser": "18.0.5"
+ "@angular/common": "18.2.5",
+ "@angular/compiler": "18.2.5",
+ "@angular/core": "18.2.5",
+ "@angular/platform-browser": "18.2.5"
}
},
"node_modules/@angular/router": {
- "version": "18.0.5",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.0.5.tgz",
- "integrity": "sha512-GmdzD5FZYPKCGP6mV3AZraAU6czfGcjjCym6mIsdJr3DyMwnQSwaaHAu8qlQbPDVfsP+gKVSPh1JxI1lzzarLA==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.5.tgz",
+ "integrity": "sha512-OjZV1PTiSwT0ytmR0ykveLYzs4uQWf0EuIclZmWqM/bb8Q4P+gJl7/sya05nGnZsj6nHGOL0e/LhSZ3N+5p6qg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1410,16 +1113,16 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "18.0.5",
- "@angular/core": "18.0.5",
- "@angular/platform-browser": "18.0.5",
+ "@angular/common": "18.2.5",
+ "@angular/core": "18.2.5",
+ "@angular/platform-browser": "18.2.5",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/service-worker": {
- "version": "18.0.5",
- "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.0.5.tgz",
- "integrity": "sha512-Uz3rKHY0pBOvAfxhaGI9X8glS8oaPv03e3GsucZhzuDCijQGHQb1Plaz56NntIGvGaghLMq3zwV7YLPnquarvw==",
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.2.5.tgz",
+ "integrity": "sha512-MoF2n7z/X+yqK89mIRHQutVHIBTyEUo/fDEL8LcuBP4KOZmX9cRoCEt+vqH49BkArsgOM0jNFMYCM8yt0jg7pw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -1431,8 +1134,8 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "18.0.5",
- "@angular/core": "18.0.5"
+ "@angular/common": "18.2.5",
+ "@angular/core": "18.2.5"
}
},
"node_modules/@babel/code-frame": {
@@ -3315,10 +3018,9 @@
}
},
"node_modules/@capacitor-community/file-opener": {
- "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",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@capacitor-community/file-opener/-/file-opener-6.0.1.tgz",
+ "integrity": "sha512-6DMcCVZPWnx1ewlCcciDGQ9n+hZt7ixLuSMv5U2epyZJ44vdLXEKjZvwU+Wpdpmsq5p0pT9jExDODFdc+DNCsw==",
"engines": {
"node": ">=16.0.0",
"npm": ">=8.0.0"
@@ -3679,15 +3381,15 @@
}
},
"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==",
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz",
+ "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==",
"dev": true,
"license": "MIT",
"dependencies": {
"comment-parser": "1.4.1",
"esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~4.0.0"
+ "jsdoc-type-pratt-parser": "~4.1.0"
},
"engines": {
"node": ">=16"
@@ -4355,15 +4057,15 @@
}
},
"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==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz",
+ "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^9.0.10",
+ "@inquirer/core": "^9.1.0",
"@inquirer/figures": "^1.0.5",
- "@inquirer/type": "^1.5.2",
+ "@inquirer/type": "^1.5.3",
"ansi-escapes": "^4.3.2",
"yoctocolors-cjs": "^2.1.2"
},
@@ -4386,19 +4088,18 @@
}
},
"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==",
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz",
+ "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/figures": "^1.0.5",
- "@inquirer/type": "^1.5.2",
+ "@inquirer/figures": "^1.0.6",
+ "@inquirer/type": "^2.0.0",
"@types/mute-stream": "^0.0.4",
- "@types/node": "^22.1.0",
+ "@types/node": "^22.5.5",
"@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",
@@ -4410,10 +4111,23 @@
"node": ">=18"
}
},
+ "node_modules/@inquirer/core/node_modules/@inquirer/type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz",
+ "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mute-stream": "^1.0.0"
+ },
+ "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==",
+ "version": "22.6.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz",
+ "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4421,14 +4135,14 @@
}
},
"node_modules/@inquirer/editor": {
- "version": "2.1.22",
- "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.1.22.tgz",
- "integrity": "sha512-K1QwTu7GCK+nKOVRBp5HY9jt3DXOfPGPr6WRDrPImkcJRelG9UTx2cAtK1liXmibRrzJlTWOwqgWT3k2XnS62w==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz",
+ "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^9.0.10",
- "@inquirer/type": "^1.5.2",
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3",
"external-editor": "^3.1.0"
},
"engines": {
@@ -4436,14 +4150,14 @@
}
},
"node_modules/@inquirer/expand": {
- "version": "2.1.22",
- "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.1.22.tgz",
- "integrity": "sha512-wTZOBkzH+ItPuZ3ZPa9lynBsdMp6kQ9zbjVPYEtSBG7UulGjg2kQiAnUjgyG4SlntpTce5bOmXAPvE4sguXjpA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz",
+ "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^9.0.10",
- "@inquirer/type": "^1.5.2",
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
@@ -4451,9 +4165,9 @@
}
},
"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==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz",
+ "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4461,28 +4175,42 @@
}
},
"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==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz",
+ "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^9.0.10",
- "@inquirer/type": "^1.5.2"
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/number": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz",
+ "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3"
},
"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==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz",
+ "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^9.0.10",
- "@inquirer/type": "^1.5.2",
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3",
"ansi-escapes": "^4.3.2"
},
"engines": {
@@ -4490,34 +4218,52 @@
}
},
"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==",
+ "version": "5.3.8",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.3.8.tgz",
+ "integrity": "sha512-b2BudQY/Si4Y2a0PdZZL6BeJtl8llgeZa7U2j47aaJSCeAl1e4UI7y8a9bSkO3o/ZbZrgT5muy/34JbsjfIWxA==",
"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"
+ "@inquirer/checkbox": "^2.4.7",
+ "@inquirer/confirm": "^3.1.22",
+ "@inquirer/editor": "^2.1.22",
+ "@inquirer/expand": "^2.1.22",
+ "@inquirer/input": "^2.2.9",
+ "@inquirer/number": "^1.0.10",
+ "@inquirer/password": "^2.1.22",
+ "@inquirer/rawlist": "^2.2.4",
+ "@inquirer/search": "^1.0.7",
+ "@inquirer/select": "^2.4.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==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz",
+ "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^9.0.10",
- "@inquirer/type": "^1.5.2",
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/search": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.1.0.tgz",
+ "integrity": "sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/figures": "^1.0.5",
+ "@inquirer/type": "^1.5.3",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
@@ -4525,15 +4271,15 @@
}
},
"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==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz",
+ "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^9.0.10",
+ "@inquirer/core": "^9.1.0",
"@inquirer/figures": "^1.0.5",
- "@inquirer/type": "^1.5.2",
+ "@inquirer/type": "^1.5.3",
"ansi-escapes": "^4.3.2",
"yoctocolors-cjs": "^2.1.2"
},
@@ -4542,9 +4288,9 @@
}
},
"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==",
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz",
+ "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5754,13 +5500,13 @@
"license": "MIT"
},
"node_modules/@listr2/prompt-adapter-inquirer": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.13.tgz",
- "integrity": "sha512-nAl6teTt7EWSjttNavAnv3uFR3w3vPP3OTYmHyPNHzKhAj2NoBDHmbS3MGpvvO8KXXPASnHjEGrrKrdKTMKPnQ==",
+ "version": "2.0.15",
+ "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.15.tgz",
+ "integrity": "sha512-MZrGem/Ujjd4cPTLYDfCZK2iKKeiO/8OX13S6jqxldLs0Prf2aGqVlJ77nMBqMv7fzqgXEgjrNHLXcKR8l9lOg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/type": "^1.3.3"
+ "@inquirer/type": "^1.5.1"
},
"engines": {
"node": ">=18.0.0"
@@ -5938,9 +5684,9 @@
]
},
"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==",
+ "version": "18.2.6",
+ "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.6.tgz",
+ "integrity": "sha512-7HwOPE1EOgcHnpt4brSiT8G2CcXB50G0+CbCBaKGy4LYCG3Y3mrlzF5Fup9HvMJ6Tzqd62RqzpKKYBiGUT7hxg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5955,9 +5701,9 @@
}
},
"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==",
+ "version": "6.3.7",
+ "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-6.3.7.tgz",
+ "integrity": "sha512-To2mH09YSm3nyThABNHIameIJCPA9C+x3/JFxFtBWek+UbYeW9DYOqNHRCc7P1ToqLqNEuwrmzjB2YSA8pO9Pw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.0.0"
@@ -5968,22 +5714,22 @@
}
},
"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==",
+ "version": "6.3.7",
+ "resolved": "https://registry.npmjs.org/@ngx-formly/ionic/-/ionic-6.3.7.tgz",
+ "integrity": "sha512-j3jiv51CVNeJGY02bZgizarO24DF5AdzL5HJ7SAtJqBIxJNR++AkQZZvgMYtPYTrvhdOIiZrhkBWh0x+rfQMJQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"@ionic/angular": "^6.0.0 || ^7.0.0",
- "@ngx-formly/core": "6.3.6"
+ "@ngx-formly/core": "6.3.7"
}
},
"node_modules/@ngx-formly/schematics": {
- "version": "6.3.6",
- "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-6.3.6.tgz",
- "integrity": "sha512-QdrvdL4YrfhU9AxIXczSyzbZHWq7uuDtsIeEZ3lC0dFyvA0YyTxZRWfNyyMwCXCRXvn70WGlaU8UpeahTXsoAg==",
+ "version": "6.3.7",
+ "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-6.3.7.tgz",
+ "integrity": "sha512-e1Y7RNa6AGK+YEIzNXNX5lvA8MrFQ9UEL/Pj8zwGdotKI8CnNyRVHneQ/1F+QZBo1mLXUtXJnejPoOMkGfo7VQ==",
"license": "MIT",
"dependencies": {
"@angular-devkit/core": "^13.0.3",
@@ -6492,9 +6238,9 @@
}
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.23.0.tgz",
+ "integrity": "sha512-8OR+Ok3SGEMsAZispLx8jruuXw0HVF16k+ub2eNXKHDmdxL4cf9NlNpAzhlOhNyXzKDEJuFeq0nZm+XlNb1IFw==",
"cpu": [
"arm"
],
@@ -6506,9 +6252,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.23.0.tgz",
+ "integrity": "sha512-rEFtX1nP8gqmLmPZsXRMoLVNB5JBwOzIAk/XAcEPuKrPa2nPJ+DuGGpfQUR0XjRm8KjHfTZLpWbKXkA5BoFL3w==",
"cpu": [
"arm64"
],
@@ -6520,9 +6266,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.23.0.tgz",
+ "integrity": "sha512-ZbqlMkJRMMPeapfaU4drYHns7Q5MIxjM/QeOO62qQZGPh9XWziap+NF9fsqPHT0KzEL6HaPspC7sOwpgyA3J9g==",
"cpu": [
"arm64"
],
@@ -6534,9 +6280,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.23.0.tgz",
+ "integrity": "sha512-PfmgQp78xx5rBCgn2oYPQ1rQTtOaQCna0kRaBlc5w7RlA3TDGGo7m3XaptgitUZ54US9915i7KeVPHoy3/W8tA==",
"cpu": [
"x64"
],
@@ -6548,9 +6294,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.23.0.tgz",
+ "integrity": "sha512-WAeZfAAPus56eQgBioezXRRzArAjWJGjNo/M+BHZygUcs9EePIuGI1Wfc6U/Ki+tMW17FFGvhCfYnfcKPh18SA==",
"cpu": [
"arm"
],
@@ -6562,9 +6308,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.23.0.tgz",
+ "integrity": "sha512-v7PGcp1O5XKZxKX8phTXtmJDVpE20Ub1eF6w9iMmI3qrrPak6yR9/5eeq7ziLMrMTjppkkskXyxnmm00HdtXjA==",
"cpu": [
"arm"
],
@@ -6576,9 +6322,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.23.0.tgz",
+ "integrity": "sha512-nAbWsDZ9UkU6xQiXEyXBNHAKbzSAi95H3gTStJq9UGiS1v+YVXwRHcQOQEF/3CHuhX5BVhShKoeOf6Q/1M+Zhg==",
"cpu": [
"arm64"
],
@@ -6590,9 +6336,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.23.0.tgz",
+ "integrity": "sha512-5QT/Di5FbGNPaVw8hHO1wETunwkPuZBIu6W+5GNArlKHD9fkMHy7vS8zGHJk38oObXfWdsuLMogD4sBySLJ54g==",
"cpu": [
"arm64"
],
@@ -6604,9 +6350,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.23.0.tgz",
+ "integrity": "sha512-Sefl6vPyn5axzCsO13r1sHLcmPuiSOrKIImnq34CBurntcJ+lkQgAaTt/9JkgGmaZJ+OkaHmAJl4Bfd0DmdtOQ==",
"cpu": [
"ppc64"
],
@@ -6618,9 +6364,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.23.0.tgz",
+ "integrity": "sha512-o4QI2KU/QbP7ZExMse6ULotdV3oJUYMrdx3rBZCgUF3ur3gJPfe8Fuasn6tia16c5kZBBw0aTmaUygad6VB/hQ==",
"cpu": [
"riscv64"
],
@@ -6632,9 +6378,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.23.0.tgz",
+ "integrity": "sha512-+bxqx+V/D4FGrpXzPGKp/SEZIZ8cIW3K7wOtcJAoCrmXvzRtmdUhYNbgd+RztLzfDEfA2WtKj5F4tcbNPuqgeg==",
"cpu": [
"s390x"
],
@@ -6646,9 +6392,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.23.0.tgz",
+ "integrity": "sha512-I/eXsdVoCKtSgK9OwyQKPAfricWKUMNCwJKtatRYMmDo5N859tbO3UsBw5kT3dU1n6ZcM1JDzPRSGhAUkxfLxw==",
"cpu": [
"x64"
],
@@ -6660,9 +6406,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.23.0.tgz",
+ "integrity": "sha512-4ZoDZy5ShLbbe1KPSafbFh1vbl0asTVfkABC7eWqIs01+66ncM82YJxV2VtV3YVJTqq2P8HMx3DCoRSWB/N3rw==",
"cpu": [
"x64"
],
@@ -6674,9 +6420,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.23.0.tgz",
+ "integrity": "sha512-+5Ky8dhft4STaOEbZu3/NU4QIyYssKO+r1cD3FzuusA0vO5gso15on7qGzKdNXnc1gOrsgCqZjRw1w+zL4y4hQ==",
"cpu": [
"arm64"
],
@@ -6688,9 +6434,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.23.0.tgz",
+ "integrity": "sha512-0SPJk4cPZQhq9qA1UhIRumSE3+JJIBBjtlGl5PNC///BoaByckNZd53rOYD0glpTkYFBQSt7AkMeLVPfx65+BQ==",
"cpu": [
"ia32"
],
@@ -6702,9 +6448,9 @@
]
},
"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==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.23.0.tgz",
+ "integrity": "sha512-lqCK5GQC8fNo0+JvTSxcG7YB1UKYp8yrNLhsArlvPWN+16ovSZgoehlVHg6X0sSWPUkpjRBR5TuR12ZugowZ4g==",
"cpu": [
"x64"
],
@@ -6715,63 +6461,23 @@
"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": "^18.19.1 || ^20.11.1 || >=22.0.0",
- "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
- "yarn": ">= 1.13.0"
- }
- },
- "node_modules/@schematics/angular/node_modules/@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==",
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "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": "^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
- }
- }
+ "license": "MIT"
},
- "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==",
+ "node_modules/@schematics/angular": {
+ "version": "18.2.5",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.5.tgz",
+ "integrity": "sha512-tBXhk9OGT4U6VsBNbuCNl2ITDOF3NYdGrEieIHU+lHSkpJNGZUIGxCgXCETXkmXDq1pe4wFZSKelWjeqYDfX0g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "18.1.0",
- "jsonc-parser": "3.3.1",
- "magic-string": "0.30.10",
- "ora": "5.4.1",
- "rxjs": "7.8.1"
+ "@angular-devkit/core": "18.2.5",
+ "@angular-devkit/schematics": "18.2.5",
+ "jsonc-parser": "3.3.1"
},
"engines": {
"node": "^18.19.1 || ^20.11.1 || >=22.0.0",
@@ -6779,43 +6485,6 @@
"yarn": ">= 1.13.0"
}
},
- "node_modules/@schematics/angular/node_modules/ajv": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
- "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
- "dev": true,
- "license": "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": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "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": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- }
- },
- "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": "Apache-2.0",
- "dependencies": {
- "tslib": "^2.1.0"
- }
- },
"node_modules/@sigstore/bundle": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz",
@@ -6930,14 +6599,12 @@
}
},
"node_modules/@stylistic/eslint-plugin": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.7.2.tgz",
- "integrity": "sha512-3DVLU5HEuk2pQoBmXJlzvrxbKNpu2mJ0SRqz5O/CJjyNCr12ZiPcYMEtuArTyPOk5i7bsAU44nywh1rGfe3gKQ==",
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.8.0.tgz",
+ "integrity": "sha512-Ufvk7hP+bf+pD35R/QfunF793XlSRIC7USr3/EdgduK9j13i2JjmsM0LUz3/foS+jDYp2fzyWZA9N44CPur0Ow==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@types/eslint": "^9.6.1",
- "@typescript-eslint/utils": "^8.3.0",
+ "@typescript-eslint/utils": "^8.4.0",
"eslint-visitor-keys": "^4.0.0",
"espree": "^10.1.0",
"estraverse": "^5.3.0",
@@ -7150,21 +6817,10 @@
"@types/node": "*"
}
},
- "node_modules/@types/eslint": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
- "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
"node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
"dev": true,
"license": "MIT"
},
@@ -7182,9 +6838,22 @@
}
},
"node_modules/@types/express-serve-static-core": {
- "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==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz",
+ "integrity": "sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
+ "version": "4.19.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7311,9 +6980,9 @@
"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==",
+ "version": "6.9.16",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz",
+ "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==",
"dev": true,
"license": "MIT"
},
@@ -7424,9 +7093,218 @@
"@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.3.1",
- "natural-compare": "^1.4.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^7.0.0",
+ "eslint": "^8.56.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
+ "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
+ "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
+ "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/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": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "7.18.0",
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/typescript-estree": "7.18.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.56.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
+ "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/parser": {
+ "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": "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": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.56.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
+ "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
+ "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
+ "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
"ts-api-utils": "^1.3.0"
},
"engines": {
@@ -7436,27 +7314,21 @@
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
- "peerDependencies": {
- "@typescript-eslint/parser": "^7.0.0",
- "eslint": "^8.56.0"
- },
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
+ "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
"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==",
+ "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": {
- "@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"
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -7464,52 +7336,33 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
}
},
- "node_modules/@typescript-eslint/parser": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
- "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+ "node_modules/@typescript-eslint/parser/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",
- "dependencies": {
- "@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"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "url": "https://opencollective.com/eslint"
}
},
"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.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz",
+ "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0"
+ "@typescript-eslint/types": "8.7.0",
+ "@typescript-eslint/visitor-keys": "8.7.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
@@ -7544,17 +7397,15 @@
}
}
},
- "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": {
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": {
"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==",
+ "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": {
- "@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/visitor-keys": "7.18.0"
},
"engines": {
"node": "^18.18.0 || >=20.0.0"
@@ -7562,12 +7413,9 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
}
},
- "node_modules/@typescript-eslint/types": {
+ "node_modules/@typescript-eslint/type-utils/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==",
@@ -7581,7 +7429,7 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/typescript-estree": {
+ "node_modules/@typescript-eslint/type-utils/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==",
@@ -7610,53 +7458,65 @@
}
}
},
- "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/@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": {
"@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"
+ "@typescript-eslint/scope-manager": "7.18.0",
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/typescript-estree": "7.18.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^18.18.0 || >=20.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0"
+ "eslint": "^8.56.0"
}
},
- "node_modules/@typescript-eslint/utils/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/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
+ "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0"
+ "@typescript-eslint/types": "7.18.0",
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^18.18.0 || >=20.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/utils/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/@typescript-eslint/type-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/@typescript-eslint/types": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz",
+ "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -7665,15 +7525,15 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/utils/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/@typescript-eslint/typescript-estree": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz",
+ "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0",
+ "@typescript-eslint/types": "8.7.0",
+ "@typescript-eslint/visitor-keys": "8.7.0",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
@@ -7694,15 +7554,16 @@
}
}
},
- "node_modules/@typescript-eslint/utils/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/@typescript-eslint/utils": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz",
+ "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "eslint-visitor-keys": "^3.4.3"
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "8.7.0",
+ "@typescript-eslint/types": "8.7.0",
+ "@typescript-eslint/typescript-estree": "8.7.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -7710,33 +7571,23 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
- }
- },
- "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": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0"
}
},
"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.7.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz",
+ "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/types": "8.7.0",
"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",
@@ -8122,16 +7973,15 @@
}
},
"node_modules/ajv": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz",
- "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==",
+ "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",
- "uri-js": "^4.4.1"
+ "require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
@@ -8856,11 +8706,10 @@
}
},
"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==",
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.5",
@@ -8870,7 +8719,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
- "qs": "6.11.0",
+ "qs": "6.13.0",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@@ -9474,9 +9323,9 @@
}
},
"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==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -9500,9 +9349,9 @@
}
},
"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==",
+ "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": "MIT"
},
@@ -12303,9 +12152,9 @@
}
},
"node_modules/eslint-module-utils": {
- "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==",
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.1.tgz",
+ "integrity": "sha512-EwcbfLOhwVMAfatfqLecR2yv3dE5+kQ8kx+Rrt0DvDXEVwW86KQ/xbMDQhtp5l42VXukD5SOF8mQQHbaNtO0CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -12331,27 +12180,28 @@
}
},
"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==",
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz",
+ "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "array-includes": "^3.1.7",
- "array.prototype.findlastindex": "^1.2.3",
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlastindex": "^1.2.5",
"array.prototype.flat": "^1.3.2",
"array.prototype.flatmap": "^1.3.2",
"debug": "^3.2.7",
"doctrine": "^2.1.0",
"eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.8.0",
- "hasown": "^2.0.0",
- "is-core-module": "^2.13.1",
+ "eslint-module-utils": "^2.9.0",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.15.1",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
- "object.fromentries": "^2.0.7",
- "object.groupby": "^1.0.1",
- "object.values": "^1.1.7",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.0",
"semver": "^6.3.1",
"tsconfig-paths": "^3.15.0"
},
@@ -12420,17 +12270,18 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
- "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==",
+ "version": "50.2.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.2.4.tgz",
+ "integrity": "sha512-020jA+dXaXdb+TML3ZJBvpPmzwbNROjnYuTYi/g6A5QEmEjhptz4oPJDKkOGMIByNxsPpdTLzSU1HYVqebOX1w==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
- "@es-joy/jsdoccomment": "~0.46.0",
+ "@es-joy/jsdoccomment": "~0.48.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
- "debug": "^4.3.5",
+ "debug": "^4.3.6",
"escape-string-regexp": "^4.0.0",
+ "espree": "^10.1.0",
"esquery": "^1.6.0",
"parse-imports": "^2.1.1",
"semver": "^7.6.3",
@@ -12468,11 +12319,10 @@
}
},
"node_modules/eslint-plugin-unused-imports": {
- "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==",
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz",
+ "integrity": "sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==",
"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"
@@ -12903,38 +12753,38 @@
"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==",
+ "version": "4.21.0",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
+ "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
"dev": true,
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.20.2",
+ "body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "1.2.0",
+ "finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
+ "merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
+ "path-to-regexp": "0.1.10",
"proxy-addr": "~2.0.7",
- "qs": "6.11.0",
+ "qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@@ -12965,15 +12815,25 @@
"ms": "2.0.0"
}
},
+ "node_modules/express/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"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==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@@ -13113,8 +12973,7 @@
"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"
+ "dev": true
},
"node_modules/fastq": {
"version": "1.17.1",
@@ -15613,9 +15472,9 @@
}
},
"node_modules/jasmine-core": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz",
- "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.3.0.tgz",
+ "integrity": "sha512-zsOmeBKESky4toybvWEikRiZ0jHoBEu79wNArLfMdSnlLMZx3Xcp6CSm2sUcYyoJC+Uyj8LBJap/MUbVSfJ27g==",
"dev": true,
"license": "MIT"
},
@@ -15725,9 +15584,9 @@
"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==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz",
+ "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -16211,6 +16070,13 @@
"karma-jasmine": "^5.0.0"
}
},
+ "node_modules/karma-jasmine/node_modules/jasmine-core": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz",
+ "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"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",
@@ -16388,9 +16254,9 @@
}
},
"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==",
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz",
+ "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -16593,16 +16459,16 @@
"license": "MIT"
},
"node_modules/listr2": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz",
- "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==",
+ "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.0.0",
+ "log-update": "^6.1.0",
"rfdc": "^1.4.1",
"wrap-ansi": "^9.0.0"
},
@@ -16611,9 +16477,9 @@
}
},
"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==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -16637,9 +16503,9 @@
}
},
"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==",
+ "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": "MIT"
},
@@ -17064,9 +16930,9 @@
}
},
"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==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -17106,9 +16972,9 @@
}
},
"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==",
+ "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": "MIT"
},
@@ -17275,7 +17141,6 @@
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
"integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0"
}
@@ -17351,9 +17216,9 @@
}
},
"node_modules/memfs": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz",
- "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==",
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.12.0.tgz",
+ "integrity": "sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -17550,11 +17415,14 @@
}
},
"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==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
"node_modules/merge-stream": {
"version": "2.0.0",
@@ -18670,9 +18538,9 @@
}
},
"node_modules/npm-package-arg": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz",
- "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==",
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz",
+ "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -18719,9 +18587,9 @@
}
},
"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==",
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz",
+ "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -19094,9 +18962,9 @@
}
},
"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==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.2.tgz",
+ "integrity": "sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA==",
"dev": true,
"license": "MIT"
},
@@ -19476,9 +19344,9 @@
"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==",
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
+ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
"dev": true,
"license": "MIT"
},
@@ -19507,11 +19375,10 @@
"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"
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+ "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
+ "dev": true
},
"node_modules/picomatch": {
"version": "4.0.2",
@@ -20395,13 +20262,12 @@
}
},
"node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.4"
+ "side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@@ -21306,13 +21172,13 @@
"license": "Unlicense"
},
"node_modules/rollup": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz",
- "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.23.0.tgz",
+ "integrity": "sha512-vXB4IT9/KLDrS2WRXmY22sVB2wTsTwkpxjB8Q3mnakTENcYw3FRmfdYDy/acNmls+lHmDazgrRjK/yQ6hQAtwA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.5"
+ "@types/estree": "1.0.6"
},
"bin": {
"rollup": "dist/bin/rollup"
@@ -21322,22 +21188,22 @@
"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",
+ "@rollup/rollup-android-arm-eabi": "4.23.0",
+ "@rollup/rollup-android-arm64": "4.23.0",
+ "@rollup/rollup-darwin-arm64": "4.23.0",
+ "@rollup/rollup-darwin-x64": "4.23.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.23.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.23.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.23.0",
+ "@rollup/rollup-linux-arm64-musl": "4.23.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.23.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.23.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.23.0",
+ "@rollup/rollup-linux-x64-gnu": "4.23.0",
+ "@rollup/rollup-linux-x64-musl": "4.23.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.23.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.23.0",
+ "@rollup/rollup-win32-x64-msvc": "4.23.0",
"fsevents": "~2.3.2"
}
},
@@ -21740,9 +21606,9 @@
}
},
"node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -21898,21 +21764,31 @@
"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==",
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "0.18.0"
+ "send": "0.19.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
+ "node_modules/serve-static/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@@ -22403,11 +22279,10 @@
}
},
"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==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true,
- "license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
@@ -22989,9 +22864,9 @@
}
},
"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==",
+ "version": "11.1.14",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.14.tgz",
+ "integrity": "sha512-VbQLQXC04io6AoAjIUWuZwW4MSYozkcP9KjLdrsG/00Q/yiwvhz9RQyt0nHXV10hi9NVnDNy1/wv7Dzq1lkOCQ==",
"funding": [
{
"type": "patreon",
@@ -23002,7 +22877,6 @@
"url": "http://opencollective.com/swiper"
}
],
- "license": "MIT",
"engines": {
"node": ">= 4.7.0"
}
@@ -24236,15 +24110,15 @@
}
},
"node_modules/vite": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz",
- "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==",
+ "version": "5.4.6",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz",
+ "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.21.3",
- "postcss": "^8.4.40",
- "rollup": "^4.13.0"
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
},
"bin": {
"vite": "bin/vite.js"
@@ -24725,6 +24599,35 @@
"@esbuild/win32-x64": "0.21.5"
}
},
+ "node_modules/vite/node_modules/postcss": {
+ "version": "8.4.47",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "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.1.0",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
"node_modules/void-elements": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
@@ -25045,9 +24948,9 @@
}
},
"node_modules/webpack-dev-middleware": {
- "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==",
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz",
+ "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==",
"dev": true,
"license": "MIT",
"dependencies": {
diff --git a/ui/package.json b/ui/package.json
index 0e232477e3c..fdacf2654a7 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -1,30 +1,30 @@
{
"name": "openems-ui",
- "version": "2024.9.0",
+ "version": "2024.10.0",
"license": "AGPL-3.0",
"private": true,
"dependencies": {
- "@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",
+ "@angular/animations": "18.2.5",
+ "@angular/common": "18.2.5",
+ "@angular/core": "18.2.5",
+ "@angular/forms": "18.2.5",
+ "@angular/platform-browser": "18.2.5",
+ "@angular/platform-browser-dynamic": "18.2.5",
+ "@angular/router": "18.2.5",
+ "@angular/service-worker": "18.2.5",
+ "@capacitor-community/file-opener": "^6.0.1",
+ "@capacitor/android": "^6.1.2",
+ "@capacitor/app": "^6.0.1",
+ "@capacitor/core": "^6.1.2",
+ "@capacitor/filesystem": "^6.0.1",
+ "@capacitor/ios": "^6.1.2",
+ "@capacitor/splash-screen": "^6.0.2",
"@ionic-native/core": "^5.36.0",
"@ionic-native/file-opener": "^5.36.0",
"@ionic/angular": "^6.7.5",
- "@ngx-formly/core": "^6.3.0",
- "@ngx-formly/ionic": "^6.3.6",
- "@ngx-formly/schematics": "^6.3.0",
+ "@ngx-formly/core": "^6.3.7",
+ "@ngx-formly/ionic": "^6.3.7",
+ "@ngx-formly/schematics": "^6.3.7",
"@ngx-translate/core": "^15.0.0",
"@nodro7/angular-mydatepicker": "^0.14.0",
"capacitor-blob-writer": "^1.1.17",
@@ -46,47 +46,47 @@
"ngx-spinner": "^16.0.2",
"roboto-fontface": "^0.10.0",
"rxjs": "~6.6.7",
- "swiper": "11.1.11",
+ "swiper": "11.1.14",
"tslib": "^2.6.2",
"uuid": "^10.0.0",
"zone.js": "~0.14.7"
},
"devDependencies": {
- "@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",
+ "@angular-devkit/build-angular": "^18.2.5",
+ "@angular-devkit/core": "18.2.5",
+ "@angular-devkit/schematics": "18.2.5",
+ "@angular-eslint/builder": "^18.3.1",
+ "@angular-eslint/eslint-plugin": "^18.3.1",
+ "@angular-eslint/eslint-plugin-template": "^18.3.1",
+ "@angular-eslint/template-parser": "^18.3.1",
+ "@angular/cli": "18.2.5",
+ "@angular/compiler": "18.2.5",
+ "@angular/compiler-cli": "18.2.5",
+ "@angular/language-service": "18.2.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",
+ "@stylistic/eslint-plugin": "^2.8.0",
"@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/qs": "^6.9.16",
"@types/range-parser": "^1.2.7",
"@types/send": "^0.17.4",
"@types/uuid": "^10.0.0",
"@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0",
- "@typescript-eslint/types": "^7.0.0",
+ "@typescript-eslint/types": "^8.7.0",
"eslint": "^8.57.0",
- "eslint-plugin-import": "2.29.1",
- "eslint-plugin-jsdoc": "48.10.0",
+ "eslint-plugin-import": "2.30.0",
+ "eslint-plugin-jsdoc": "50.2.4",
"eslint-plugin-prefer-arrow": "1.2.3",
- "eslint-plugin-unused-imports": "^4.1.3",
- "jasmine-core": "~4.5.0",
+ "eslint-plugin-unused-imports": "^4.1.4",
+ "jasmine-core": "~5.3.0",
"jasmine-spec-reporter": "~7.0.0",
- "karma": "~6.4.2",
+ "karma": "~6.4.4",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.1",
"karma-coverage-istanbul-reporter": "~3.0.3",
diff --git a/ui/src/app/app-routing.module.ts b/ui/src/app/app-routing.module.ts
index b04097ce80b..f84be2e897f 100644
--- a/ui/src/app/app-routing.module.ts
+++ b/ui/src/app/app-routing.module.ts
@@ -9,12 +9,14 @@ import { OverviewComponent as ConsumptionChartOverviewComponent } from "./edge/h
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 { DetailsOverviewComponent as DigitalOutputDetailsOverviewComponent } from "./edge/history/Controller/Io/DigitalOutput/details/details.overview";
+import { OverviewComponent as DigitalOutputChartOverviewComponent } from "./edge/history/Controller/Io/DigitalOutput/overview/overview";
+import { OverviewComponent as ModbusTcpApiOverviewComponent } from "./edge/history/Controller/ModbusTcpApi/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";
@@ -48,14 +50,12 @@ import { SystemExecuteComponent as EdgeSettingsSystemExecuteComponent } from "./
import { SystemLogComponent as EdgeSettingsSystemLogComponent } from "./edge/settings/systemlog/systemlog.component";
import { LoginComponent } from "./index/login.component";
import { OverViewComponent } from "./index/overview/overview.component";
-import { UserComponent } from "./user/user.component";
import { LoadingScreenComponent } from "./index/shared/loading-screen";
import { CurrentAndVoltageOverviewComponent } from "./shared/components/edge/meter/currentVoltage/currentVoltage.overview";
import { DataService } from "./shared/components/shared/dataservice";
import { hasEdgeRole } from "./shared/guards/functional-guards";
import { Role } from "./shared/type/role";
-import { OverviewComponent as DigitalOutputChartOverviewComponent } from "./edge/history/Controller/Io/DigitalOutput/overview/overview";
-
+import { UserComponent } from "./user/user.component";
export const routes: Routes = [
@@ -101,6 +101,7 @@ export const routes: Routes = [
{ path: "gridchart", component: GridChartOverviewComponent },
{ path: "gridchart/:componentId", component: GridDetailsOverviewComponent },
{ path: "gridchart/:componentId/currentVoltage", component: CurrentAndVoltageOverviewComponent },
+ { path: ":componentId/modbusTcpApi", component: ModbusTcpApiOverviewComponent },
{ path: "productionchart", component: ProductionChartOverviewComponent },
{ path: "productionchart/:componentId", component: DetailsOverviewComponent },
{ path: "productionchart/:componentId/currentVoltage", component: CurrentAndVoltageOverviewComponent },
diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts
index bcab88af3be..27d05b4410d 100644
--- a/ui/src/app/app.component.ts
+++ b/ui/src/app/app.component.ts
@@ -8,6 +8,7 @@ import { Subject, Subscription } from "rxjs";
import { filter, takeUntil } from "rxjs/operators";
import { environment } from "../environments";
import { AppService } from "./app.service";
+import { AppStateTracker } from "./shared/ngrx-store/states";
import { GlobalRouteChangeHandler } from "./shared/service/globalRouteChangeHandler";
import { Service, UserPermission, Websocket } from "./shared/shared";
import { Language } from "./shared/type/language";
@@ -42,6 +43,7 @@ export class AppComponent implements OnInit, OnDestroy {
private meta: Meta,
private appService: AppService,
private title: Title,
+ private stateService: AppStateTracker,
) {
service.setLang(Language.getByKey(localStorage.LANGUAGE) ?? Language.getByBrowserLang(navigator.language));
diff --git a/ui/src/app/app.module.ts b/ui/src/app/app.module.ts
index 8a191a18baa..e8ad40d998a 100644
--- a/ui/src/app/app.module.ts
+++ b/ui/src/app/app.module.ts
@@ -23,6 +23,7 @@ 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 { AppStateTracker } from "./shared/ngrx-store/states";
import { MyErrorHandler } from "./shared/service/myerrorhandler";
import { Pagination } from "./shared/service/pagination";
import { SharedModule } from "./shared/shared.module";
@@ -64,6 +65,7 @@ import { UserModule } from "./user/user.module";
Pagination,
CheckForUpdateService,
AppService,
+ AppStateTracker,
],
bootstrap: [AppComponent],
})
diff --git a/ui/src/app/changelog/view/component/changelog.constants.ts b/ui/src/app/changelog/view/component/changelog.constants.ts
index 99de881dd8b..99abdf46dd4 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";
+ public static readonly UI_VERSION = "2024.10.0";
public static product(...products: Product[]) {
return products.map(product => Changelog.link(product.name, product.url)).join(", ") + ". ";
diff --git a/ui/src/app/edge/edge.component.ts b/ui/src/app/edge/edge.component.ts
index fdeeebc3a3c..c0acc0aa952 100644
--- a/ui/src/app/edge/edge.component.ts
+++ b/ui/src/app/edge/edge.component.ts
@@ -10,8 +10,6 @@ import { ChannelAddress, Edge, Service, Websocket } from "src/app/shared/shared"
template: `
-
`,
})
export class EdgeComponent implements OnInit, OnDestroy {
diff --git a/ui/src/app/edge/history/Controller/ModbusTcpApi/chart/channels.spec.ts b/ui/src/app/edge/history/Controller/ModbusTcpApi/chart/channels.spec.ts
new file mode 100644
index 00000000000..d96d89c0015
--- /dev/null
+++ b/ui/src/app/edge/history/Controller/ModbusTcpApi/chart/channels.spec.ts
@@ -0,0 +1,1070 @@
+import { TimeUnit } from "chart.js";
+import { ChartConstants } from "src/app/shared/components/chart/chart.constants";
+import { OeTester } from "src/app/shared/components/shared/testing/common";
+import { OeChartTester } from "src/app/shared/components/shared/testing/tester";
+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 {
+
+ export const LINE_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": {}, "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": {
+ ...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": "",
+ "padding": 5,
+ "maxTicksLimit": ChartConstants.NUMBER_OF_Y_AXIS_TICKS,
+ },
+ },
+ },
+ },
+ });
+ 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": {} } }, "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 } : {}), "title": { "text": "kWh", "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,
+ },
+ },
+ },
+ },
+ });
+
+ /**
+ * 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: {
+ "ctrlApiModbusTcp0/Ess0SetActivePowerEquals": [null,
+ null,
+ null,
+ 112,
+ 262,
+ 392,
+ 240,
+ 230,
+ 229,
+ 227,
+ 317,
+ 224,
+ 133,
+ 135,
+ 133,
+ 192,
+ 209,
+ 90,
+ 95,
+ 96,
+ 164,
+ 297,
+ 184,
+ 182,
+ 183,
+ 198,
+ 333,
+ 183,
+ 93,
+ 97,
+ 98,
+ 197,
+ 266,
+ 177,
+ 144,
+ 140,
+ 173,
+ 304,
+ 305,
+ 237,
+ 232,
+ 227,
+ 283,
+ 344,
+ 135,
+ 96,
+ 95,
+ null,
+ null,
+ null,
+ null,
+ 102,
+ 129,
+ 140,
+ 301,
+ 248,
+ 267,
+ 319,
+ 310,
+ 452,
+ 451,
+ 280,
+ 234,
+ 226,
+ 249,
+ 390,
+ 242,
+ 199,
+ 179,
+ 166,
+ 280,
+ 239,
+ 192,
+ 187,
+ 187,
+ 190,
+ 303,
+ 146,
+ 62,
+ 62,
+ 64,
+ 887,
+ 1119,
+ 1070,
+ 1057,
+ 596,
+ 138,
+ 233,
+ 152,
+ 209,
+ 192,
+ 202,
+ 308,
+ 254,
+ 175,
+ 122,
+ 108,
+ 137,
+ 216,
+ 947,
+ 599,
+ 203,
+ 232,
+ 328,
+ 299,
+ 520,
+ 1213,
+ 641,
+ 1030,
+ 442,
+ 374,
+ 1758,
+ 249,
+ 260,
+ 346,
+ 1879,
+ 230,
+ 484,
+ 1260,
+ 1317,
+ 1488,
+ 1451,
+ 1892,
+ 1466,
+ 1332,
+ 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],
+ },
+ 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 164 datapoints(1 hour values) from a {@link Day.energyPerPeriodChannelWithValues} and {@link Day.dataChannelWithValues}
+ * */
+ export const WEEK: OeTester.Types.Channels = ({
+ energyChannelWithValues: new QueryHistoricTimeseriesEnergyResponse("0", {
+ data: {},
+ }),
+ dataChannelWithValues: new QueryHistoricTimeseriesDataResponse("0", {
+ data: {
+ "ctrlApiModbusTcp0/Ess0SetActivePowerEquals": [
+ 112,
+ 262,
+ 392,
+ 240,
+ 230,
+ 229,
+ 227,
+ 317,
+ 224,
+ 133,
+ 135,
+ 133,
+ 192,
+ 209,
+ 90,
+ 95,
+ 96,
+ 164,
+ 297,
+ 184,
+ 182,
+ 183,
+ 198,
+ 333,
+ 183,
+ 93,
+ 97,
+ 98,
+ 197,
+ 266,
+ 177,
+ ],
+ },
+ timestamps: [
+ "2023-07-01T00:00:00Z",
+ "2023-07-02T00:00:00Z",
+ "2023-07-03T00:00:00Z",
+ "2023-07-04T00:00:00Z",
+ "2023-07-05T00:00:00Z",
+ "2023-07-06T00:00:00Z",
+ "2023-07-07T00:00:00Z",
+ "2023-07-08T00:00:00Z",
+ "2023-07-09T00:00:00Z",
+ "2023-07-10T00:00:00Z",
+ "2023-07-11T00:00:00Z",
+ "2023-07-12T00:00:00Z",
+ "2023-07-13T00:00:00Z",
+ "2023-07-14T00:00:00Z",
+ "2023-07-15T00:00:00Z",
+ "2023-07-16T00:00:00Z",
+ "2023-07-17T00:00:00Z",
+ "2023-07-18T00:00:00Z",
+ "2023-07-19T00:00:00Z",
+ "2023-07-20T00:00:00Z",
+ "2023-07-21T00:00:00Z",
+ "2023-07-22T00:00:00Z",
+ "2023-07-23T00:00:00Z",
+ "2023-07-24T00:00:00Z",
+ "2023-07-25T00:00:00Z",
+ "2023-07-26T00:00:00Z",
+ "2023-07-27T00:00:00Z",
+ "2023-07-28T00:00:00Z",
+ "2023-07-29T00:00:00Z",
+ "2023-07-30T00:00:00Z",
+ "2023-07-31T00:00: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: {
+ "_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,
+ 346615,
+ 341433,
+ 333054,
+ 358458,
+ 347872,
+ 289283,
+ null,
+ 556510,
+ 311366,
+ 314722,
+ 355556,
+ 381671,
+ 384558,
+ 366190,
+ 349336,
+ 303696,
+ 288727,
+ 357434,
+ 388659,
+ 402625,
+ null,
+ 713771,
+ 320238,
+ 332099,
+ null,
+ 756429,
+ 384136,
+ 371322,
+ null],
+ "_sum/EssDcChargeEnergy": [
+ 113476,
+ 162917,
+ 150189,
+ 157158,
+ 149782,
+ 159833,
+ 155084,
+ null,
+ 228757,
+ 128138,
+ 157539,
+ 59414,
+ 156504,
+ 107339,
+ 156392,
+ 158925,
+ 158578,
+ 121505,
+ 120971,
+ 154566,
+ 173235,
+ null,
+ 204273,
+ 156676,
+ 143745,
+ null,
+ 247673,
+ 157410,
+ 104249,
+ null,
+ ],
+ "_sum/EssDcDischargeEnergy": [
+ 112818,
+ 126532,
+ 139622,
+ 133212,
+ 169240,
+ 98705,
+ 109367,
+ null,
+ 204267,
+ 118504,
+ 121261,
+ 74970,
+ 144175,
+ 89897,
+ 141582,
+ 111261,
+ 122274,
+ 106232,
+ 139405,
+ 132225,
+ 143860,
+ null,
+ 235044,
+ 63914,
+ 123844,
+ null,
+ 242102,
+ 130546,
+ 59571,
+ null,
+ ],
+ "_sum/GridBuyActiveEnergy": [
+ 16000,
+ 6000,
+ 3000,
+ 3000,
+ 5000,
+ 48000,
+ 4000,
+ null,
+ 5000,
+ 26000,
+ 17000,
+ 62000,
+ 8000,
+ 66000,
+ 13000,
+ 21000,
+ 4000,
+ 3000,
+ 18000,
+ 27000,
+ 29000,
+ null,
+ 118000,
+ 85000,
+ 2000,
+ null,
+ 72000,
+ 28000,
+ 84000,
+ null,
+ ],
+ "_sum/GridSellActiveEnergy": [
+ 603000,
+ 590000,
+ 551000,
+ 572000,
+ 69000,
+ 236000,
+ 626000,
+ null,
+ 1003000,
+ 261000,
+ 518000,
+ 698000,
+ 640000,
+ 388000,
+ 471000,
+ 373000,
+ 373000,
+ 677000,
+ 286000,
+ 406000,
+ 249000,
+ null,
+ 446000,
+ 369000,
+ 558000,
+ null,
+ 776000,
+ 425000,
+ 574000,
+ null,
+ ],
+ "_sum/ProductionActiveEnergy": [
+ 908000,
+ 967000,
+ 900000,
+ 926000,
+ 403000,
+ 597000,
+ 957000,
+ null,
+ 1579000,
+ 556000,
+ 852000,
+ 976000,
+ 1026000,
+ 724000,
+ 839000,
+ 749000,
+ 709000,
+ 978000,
+ 607000,
+ 790000,
+ 652000,
+ null,
+ 1011000,
+ 697000,
+ 908000,
+ null,
+ 1466000,
+ 808000,
+ 906000,
+ 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",
+ ],
+ }),
+ };
+
+ /**
+ * up to 12 datapoints(1 month values) from a {@link Day.energyPerPeriodChannelWithValues} and {@link Day.dataChannelWithValues}*/
+ 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,
+ },
+ }),
+ energyPerPeriodChannelWithValues:
+ new QueryHistoricTimeseriesEnergyPerPeriodResponse("0", {
+ data: {
+ "_sum/ConsumptionActiveEnergy": [11634885,
+ 8207927,
+ 8976354,
+ 8311835,
+ 10341804,
+ 9976102,
+ 975807,
+ null,
+ null,
+ null,
+ null,
+ null],
+ "_sum/EssDcChargeEnergy": [
+ 294606,
+ 1673109,
+ 3337772,
+ 3074303,
+ 2495947,
+ 3944328,
+ 372595,
+ null,
+ null,
+ null,
+ null,
+ null,
+ ],
+ "_sum/EssDcDischargeEnergy": [
+ 208491,
+ 1339036,
+ 2911126,
+ 2555138,
+ 2123751,
+ 3394430,
+ 335402,
+ null,
+ null,
+ null,
+ null,
+ null,
+ ],
+ "_sum/GridBuyActiveEnergy": [9829000,
+ 4812000,
+ 2915000,
+ 2036000,
+ 2712000,
+ 773000,
+ 94000,
+ null,
+ null,
+ null,
+ null,
+ null],
+ "_sum/GridSellActiveEnergy": [20000,
+ 86000,
+ 677000,
+ 3657000,
+ 12839000,
+ 12738000,
+ 627000,
+ null,
+ null,
+ null,
+ null,
+ null],
+ "_sum/ProductionActiveEnergy": [1912000,
+ 3816000,
+ 7165000,
+ 10452000,
+ 20841000,
+ 22491000,
+ 1546000,
+ null,
+ null,
+ null,
+ null,
+ null],
+ },
+ 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/Controller/ModbusTcpApi/chart/chart.ts b/ui/src/app/edge/history/Controller/ModbusTcpApi/chart/chart.ts
new file mode 100644
index 00000000000..987109ea767
--- /dev/null
+++ b/ui/src/app/edge/history/Controller/ModbusTcpApi/chart/chart.ts
@@ -0,0 +1,89 @@
+// @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, YAxisType } from "src/app/shared/service/utils";
+import { ChannelAddress, EdgeConfig } from "src/app/shared/shared";
+
+@Component({
+ selector: "modbusTcpApiChart",
+ templateUrl: "../../../../../shared/components/chart/abstracthistorychart.html",
+})
+export class ChartComponent extends AbstractHistoryChart {
+
+ public static getChartData(component: EdgeConfig.Component, config: EdgeConfig, chartType: "line" | "bar", translate: TranslateService, showPhases: boolean): HistoryUtils.ChartData {
+ let writeChannels: string[] = [];
+
+ const colors: string[] = [
+ "rgb(191, 144, 33)",
+ "rgb(162, 191, 33)",
+ "rgb(86, 191, 33)",
+ "rgb(33, 191, 165)",
+ "rgb(33, 115, 191)",
+ ];
+
+ const input: HistoryUtils.InputChannel[] =
+ [{
+ name: "SetActivePowerEquals",
+ powerChannel: ChannelAddress.fromString(component.id + "/Ess0SetActivePowerEquals"),
+ }];
+
+ if (component.properties.writeChannels) {
+ writeChannels = component.properties.writeChannels.filter(c => !c.includes("Ess0SetActivePowerEquals"));
+ writeChannels.forEach(c => {
+ input.push({
+ name: c,
+ powerChannel: ChannelAddress.fromString(component.id + `/${c}`),
+ });
+ });
+ }
+
+ return {
+ input,
+ output: (data: HistoryUtils.ChannelData) => {
+ const values: HistoryUtils.DisplayValue[] = [{
+ name: translate.instant("MODBUS_TCP_API_READ_WRITE.SET_ACTIVE_POWER_EQUALS"),
+ converter: () => data["SetActivePowerEquals"],
+ color: "rgb(214, 28, 28)",
+ }];
+ if (writeChannels) {
+ writeChannels.forEach((c: string, index: number) => {
+ const name: string = c;
+ // Add translations for active power channels of ess0
+ if (c.includes("Ess0SetActive")) {
+ const channelName = c.replace("Ess0", "");
+ switch (channelName) {
+ case "SetActivePowerEquals":
+ return translate.instant("MODBUS_TCP_API_READ_WRITE.SET_ACTIVE_POWER_EQUALS");
+ case "SetActivePowerGreaterOrEquals":
+ return translate.instant("MODBUS_TCP_API_READ_WRITE.SET_ACTIVE_POWER_GREATER_OR_EQUALS");
+ case "SetActivePowerLessOrEquals":
+ return translate.instant("MODBUS_TCP_API_READ_WRITE.SET_ACTIVE_POWER_LESS_OR_EQUALS");
+ }
+ }
+
+ values.push({
+ name: name,
+ converter: () => data[c],
+ color: colors[index],
+ });
+ });
+ }
+ return values;
+ },
+ tooltip: {
+ formatNumber: "1.1-2",
+ },
+ yAxes: [{
+ unit: YAxisType.ENERGY,
+ position: "left",
+ yAxisId: ChartAxis.LEFT,
+ },
+ ],
+ };
+ }
+
+ public override getChartData() {
+ return ChartComponent.getChartData(this.component, this.config, this.chartType, this.translate, this.showPhases);
+ }
+}
diff --git a/ui/src/app/edge/history/Controller/ModbusTcpApi/flat/flat.html b/ui/src/app/edge/history/Controller/ModbusTcpApi/flat/flat.html
new file mode 100644
index 00000000000..e7a0c6ad6a6
--- /dev/null
+++ b/ui/src/app/edge/history/Controller/ModbusTcpApi/flat/flat.html
@@ -0,0 +1,5 @@
+
+
+
+
diff --git a/ui/src/app/edge/history/Controller/ModbusTcpApi/flat/flat.ts b/ui/src/app/edge/history/Controller/ModbusTcpApi/flat/flat.ts
new file mode 100644
index 00000000000..9a857c71826
--- /dev/null
+++ b/ui/src/app/edge/history/Controller/ModbusTcpApi/flat/flat.ts
@@ -0,0 +1,21 @@
+import { Component } from "@angular/core";
+
+import { AbstractFlatWidget } from "src/app/shared/components/flat/abstract-flat-widget";
+import { ChannelAddress } from "src/app/shared/shared";
+
+@Component({
+ selector: "modbusTcpApiWidget",
+ templateUrl: "./flat.html",
+})
+export class FlatComponent extends AbstractFlatWidget {
+
+ protected TIME_CONVERTER = this.Converter.FORMAT_SECONDS_TO_DURATION("de");
+
+ protected override getChannelAddresses(): ChannelAddress[] {
+
+ return [
+ new ChannelAddress(this.component.id, "CumulatedInactiveTime"),
+ new ChannelAddress(this.component.id, "CumulatedActiveTime"),
+ ];
+ }
+}
diff --git a/ui/src/app/edge/history/Controller/ModbusTcpApi/modbusTcpApi.module.ts b/ui/src/app/edge/history/Controller/ModbusTcpApi/modbusTcpApi.module.ts
new file mode 100644
index 00000000000..aef372d5a35
--- /dev/null
+++ b/ui/src/app/edge/history/Controller/ModbusTcpApi/modbusTcpApi.module.ts
@@ -0,0 +1,24 @@
+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 { OverviewComponent } from "./overview/overview";
+import { ChartComponent } from "./chart/chart";
+
+@NgModule({
+ imports: [
+ BrowserModule,
+ SharedModule,
+ ],
+ declarations: [
+ FlatComponent,
+ OverviewComponent,
+ ChartComponent,
+ ],
+ exports: [
+ FlatComponent,
+ OverviewComponent,
+ ChartComponent,
+ ],
+})
+export class ModbusTcpApi { }
diff --git a/ui/src/app/edge/history/Controller/ModbusTcpApi/overview/overview.html b/ui/src/app/edge/history/Controller/ModbusTcpApi/overview/overview.html
new file mode 100644
index 00000000000..c08da36f604
--- /dev/null
+++ b/ui/src/app/edge/history/Controller/ModbusTcpApi/overview/overview.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+ Edge.Index.Widgets.InfoStorageForCharge
+
+
+
+
+ Edge.Index.Widgets.InfoStorageForDischarge
+
+
+
+
+
+
+
+
diff --git a/ui/src/app/edge/history/Controller/ModbusTcpApi/overview/overview.ts b/ui/src/app/edge/history/Controller/ModbusTcpApi/overview/overview.ts
new file mode 100644
index 00000000000..51ed8f95a67
--- /dev/null
+++ b/ui/src/app/edge/history/Controller/ModbusTcpApi/overview/overview.ts
@@ -0,0 +1,7 @@
+import { Component } from "@angular/core";
+import { AbstractHistoryChartOverview } from "src/app/shared/components/chart/abstractHistoryChartOverview";
+
+@Component({
+ templateUrl: "./overview.html",
+})
+export class OverviewComponent extends AbstractHistoryChartOverview { }
diff --git a/ui/src/app/edge/history/Controller/controller.module.ts b/ui/src/app/edge/history/Controller/controller.module.ts
index dec242649f6..e009e41d838 100644
--- a/ui/src/app/edge/history/Controller/controller.module.ts
+++ b/ui/src/app/edge/history/Controller/controller.module.ts
@@ -4,6 +4,7 @@ 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";
+import { ModbusTcpApi } from "./ModbusTcpApi/modbusTcpApi.module";
@NgModule({
imports: [
@@ -11,6 +12,7 @@ import { TimeOfUseTariff } from "./Ess/TimeOfUseTariff/timeOfUseTariff.module";
ControllerIo,
ChannelThreshold,
TimeOfUseTariff,
+ ModbusTcpApi,
GridOptimizeCharge,
],
exports: [
@@ -18,6 +20,7 @@ import { TimeOfUseTariff } from "./Ess/TimeOfUseTariff/timeOfUseTariff.module";
ControllerIo,
ChannelThreshold,
TimeOfUseTariff,
+ ModbusTcpApi,
GridOptimizeCharge,
],
})
diff --git a/ui/src/app/edge/history/history.component.html b/ui/src/app/edge/history/history.component.html
index 8774f678d1b..bd86a09bf04 100644
--- a/ui/src/app/edge/history/history.component.html
+++ b/ui/src/app/edge/history/history.component.html
@@ -38,6 +38,10 @@
+
+
+
+
@@ -72,6 +76,13 @@
+
+
+
+
+
+
+
diff --git a/ui/src/app/edge/history/history.component.ts b/ui/src/app/edge/history/history.component.ts
index 719a287a158..e2349530d0d 100644
--- a/ui/src/app/edge/history/history.component.ts
+++ b/ui/src/app/edge/history/history.component.ts
@@ -5,7 +5,7 @@ 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 { Edge, EdgeConfig, EdgePermission, Service, Widgets } from "src/app/shared/shared";
import { environment } from "src/environments";
@Component({
@@ -34,6 +34,7 @@ export class HistoryComponent implements OnInit {
public config: EdgeConfig | null = null;
protected errorResponse: JsonrpcResponseError | null = null;
+ protected isModbusTcpWidgetAllowed: boolean = false;
constructor(
public service: Service,
@@ -44,6 +45,7 @@ export class HistoryComponent implements OnInit {
ngOnInit() {
this.service.currentEdge.subscribe((edge) => {
this.edge = edge;
+ this.isModbusTcpWidgetAllowed = EdgePermission.isModbusTcpApiWidgetAllowed(edge);
});
this.service.getConfig().then(config => {
// gather ControllerIds of Channelthreshold Components
@@ -74,11 +76,11 @@ export class HistoryComponent implements OnInit {
/* handle grid breakpoints */(window.innerWidth < 768 ? window.innerWidth - 150 : window.innerWidth - 400));
this.socChartHeight =
/* minimum size */ Math.max(150,
- /* maximium size */ Math.min(200, ref),
+ /* maximum size */ Math.min(200, ref),
) + "px";
this.energyChartHeight =
/* minimum size */ Math.max(300,
- /* maximium size */ Math.min(600, ref),
+ /* maximum size */ Math.min(600, ref),
) + "px";
}
diff --git a/ui/src/app/edge/live/Controller/ModbusTcpApi/flat/flat.html b/ui/src/app/edge/live/Controller/ModbusTcpApi/flat/flat.html
new file mode 100644
index 00000000000..9df8ac9fb01
--- /dev/null
+++ b/ui/src/app/edge/live/Controller/ModbusTcpApi/flat/flat.html
@@ -0,0 +1,3 @@
+
+
+
diff --git a/ui/src/app/edge/live/Controller/ModbusTcpApi/flat/flat.ts b/ui/src/app/edge/live/Controller/ModbusTcpApi/flat/flat.ts
new file mode 100644
index 00000000000..89b23b86751
--- /dev/null
+++ b/ui/src/app/edge/live/Controller/ModbusTcpApi/flat/flat.ts
@@ -0,0 +1,51 @@
+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 { OverrideStatus } from "src/app/shared/type/general";
+import { ModalComponent } from "../modal/modal";
+
+@Component({
+ selector: "Controller_Api_ModbusTcp",
+ templateUrl: "./flat.html",
+})
+export class FlatComponent extends AbstractFlatWidget {
+
+ protected overrideStatus: OverrideStatus | null = null;
+
+ async presentModal() {
+ if (!this.isInitialized) {
+ return;
+ }
+ const modal = await this.modalController.create({
+ component: ModalComponent,
+ componentProps: {
+ component: this.component,
+ },
+ });
+ return await modal.present();
+ }
+
+
+ protected override getChannelAddresses(): ChannelAddress[] {
+
+ return [
+ new ChannelAddress(this.component.id, "OverrideStatus"),
+ ];
+ }
+
+ protected override onCurrentData(currentData: CurrentData) {
+ this.overrideStatus = this.getTranslatedState(currentData.allComponents[this.component.id + "/OverrideStatus"]);
+ }
+
+ private getTranslatedState(state: OverrideStatus) {
+ switch (state) {
+ case OverrideStatus.ACTIVE:
+ return this.translate.instant("MODBUS_TCP_API_READ_WRITE.OVERRIDING");
+ case OverrideStatus.ERROR:
+ return this.translate.instant("EVCS.error");
+ default:
+ return this.translate.instant("MODBUS_TCP_API_READ_WRITE.NOT_OVERRIDING");
+ }
+ }
+
+}
diff --git a/ui/src/app/edge/live/Controller/ModbusTcpApi/modal/modal.html b/ui/src/app/edge/live/Controller/ModbusTcpApi/modal/modal.html
new file mode 100644
index 00000000000..b8468f22958
--- /dev/null
+++ b/ui/src/app/edge/live/Controller/ModbusTcpApi/modal/modal.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ 'MODBUS_TCP_API_READ_WRITE.DOWNLOAD_PROTOCOL' | translate }}
+
+
+
diff --git a/ui/src/app/edge/live/Controller/ModbusTcpApi/modal/modal.ts b/ui/src/app/edge/live/Controller/ModbusTcpApi/modal/modal.ts
new file mode 100644
index 00000000000..ae11a7a121a
--- /dev/null
+++ b/ui/src/app/edge/live/Controller/ModbusTcpApi/modal/modal.ts
@@ -0,0 +1,102 @@
+// @ts-strict-ignore
+import { Component } from "@angular/core";
+import { ProfileComponent } from "src/app/edge/settings/profile/profile.component";
+import { AbstractModal } from "src/app/shared/components/modal/abstractModal";
+import { Converter } from "src/app/shared/components/shared/converter";
+import { ChannelAddress, ChannelRegister, CurrentData } from "src/app/shared/shared";
+import { OverrideStatus } from "src/app/shared/type/general";
+
+@Component({
+ templateUrl: "./modal.html",
+})
+export class ModalComponent extends AbstractModal {
+
+ protected readonly CONVERT_TO_WATT = Converter.POWER_IN_WATT;
+
+ protected writeChannelValues: number[] | null = [];
+ protected writeChannels: ChannelAddress[] | null = [];
+ protected overrideStatus: string | null = null;
+ protected formattedWriteChannels: string[] | null = null;
+
+ protected activePowerEqualsChannel: ChannelAddress | null = null;
+ protected activePowerEqualsValue: number | null = null;
+ protected channelRegisters = ChannelRegister;
+
+ private profile = new ProfileComponent(this.service, this.route, null, this.translate);
+
+ protected override getChannelAddresses(): ChannelAddress[] {
+ this.activePowerEqualsChannel = new ChannelAddress(this.component.id, "Ess0SetActivePowerEquals");
+ const writeChannelIds = this.config.components[this.component.id]?.properties.writeChannels || [];
+ this.writeChannels = writeChannelIds.map(channelId => new ChannelAddress(this.component.id, channelId));
+ return [
+ ...this.writeChannels,
+ this.activePowerEqualsChannel,
+ new ChannelAddress(this.component.id, "OverrideStatus"),
+ ];
+ }
+
+ protected override onIsInitialized(): void {
+ this.edge.getConfig(this.websocket).subscribe((config) => {
+ const newChannels = (config.components[this.component.id]?.properties?.writeChannels || [])
+ .map(channelId => new ChannelAddress(this.component.id, channelId));
+
+ this.writeChannels = newChannels.filter(channel => !channel.channelId.includes("Ess0SetActivePowerEquals"));
+ this.getFormatChannelNames();
+ this.edge.subscribeChannels(this.websocket, this.component.id, this.writeChannels);
+ });
+ }
+
+ protected getModbusProtocol(componentId: string) {
+ return this.profile.getModbusProtocol(componentId);
+ }
+
+ protected override onCurrentData(currentData: CurrentData) {
+ this.activePowerEqualsValue = this.edge.currentData.value.channel[this.activePowerEqualsChannel!.toString()];
+ this.writeChannelValues = this.writeChannels?.map(channel =>
+ this.edge.currentData.value.channel[channel.toString()],
+ ) || [];
+ this.overrideStatus = this.getTranslatedState(currentData.allComponents[this.component.id + "/OverrideStatus"]);
+ }
+
+ protected getTranslatedChannel(channel: ChannelAddress): string {
+ if (channel.channelId.includes("Ess0SetActive")) {
+ const channelName = channel.channelId.replace("Ess0", "");
+ switch (channelName) {
+ case "SetActivePowerEquals":
+ return this.translate.instant("MODBUS_TCP_API_READ_WRITE.SET_ACTIVE_POWER_EQUALS");
+ case "SetActivePowerGreaterOrEquals":
+ return this.translate.instant("MODBUS_TCP_API_READ_WRITE.SET_ACTIVE_POWER_GREATER_OR_EQUALS");
+ case "SetActivePowerLessOrEquals":
+ return this.translate.instant("MODBUS_TCP_API_READ_WRITE.SET_ACTIVE_POWER_LESS_OR_EQUALS");
+ }
+ }
+ }
+
+ private getTranslatedState(state: OverrideStatus) {
+ switch (state) {
+ case OverrideStatus.ACTIVE:
+ return this.translate.instant("MODBUS_TCP_API_READ_WRITE.OVERRIDING");
+ case OverrideStatus.ERROR:
+ return this.translate.instant("EVCS.error");
+ default:
+ return this.translate.instant("MODBUS_TCP_API_READ_WRITE.NOT_OVERRIDING");
+ }
+ }
+
+ /**
+ * This method adds the name and register number of the corresponding channel to
+ * the modal view. It has to be done dynamically since channels can be overwritten in any order.
+ */
+ private getFormatChannelNames(): void {
+ this.formattedWriteChannels = [];
+ this.writeChannels.forEach(channel => {
+ for (const registerName in ChannelRegister) {
+ if (channel.channelId.includes(registerName)) {
+ // If channelId is included in ChannelRegister, get key/value e.g. SetActivePowerEquals/706
+ const formattedString = `(${registerName}/${ChannelRegister[registerName]})`;
+ this.formattedWriteChannels.push(formattedString);
+ }
+ }
+ });
+ }
+}
diff --git a/ui/src/app/edge/live/Controller/ModbusTcpApi/modbusTcpApi.module.ts b/ui/src/app/edge/live/Controller/ModbusTcpApi/modbusTcpApi.module.ts
new file mode 100644
index 00000000000..69104d3973c
--- /dev/null
+++ b/ui/src/app/edge/live/Controller/ModbusTcpApi/modbusTcpApi.module.ts
@@ -0,0 +1,20 @@
+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: [
+ BrowserModule,
+ SharedModule,
+ ],
+ declarations: [
+ FlatComponent,
+ ModalComponent,
+ ],
+ exports: [
+ FlatComponent,
+ ],
+})
+export class Controller_Api_ModbusTcp { }
diff --git a/ui/src/app/edge/live/live.component.html b/ui/src/app/edge/live/live.component.html
index edf538ba7ab..88a68dd2777 100644
--- a/ui/src/app/edge/live/live.component.html
+++ b/ui/src/app/edge/live/live.component.html
@@ -81,6 +81,13 @@
+
+
+
+
+
+
diff --git a/ui/src/app/edge/live/live.component.ts b/ui/src/app/edge/live/live.component.ts
index e3e022542c6..335b7d1fa62 100644
--- a/ui/src/app/edge/live/live.component.ts
+++ b/ui/src/app/edge/live/live.component.ts
@@ -3,7 +3,7 @@ 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 { Edge, EdgeConfig, EdgePermission, Service, Utils, Websocket, Widgets } from "src/app/shared/shared";
@Component({
selector: "live",
@@ -14,6 +14,7 @@ export class LiveComponent implements OnInit, OnDestroy {
public edge: Edge | null = null;
public config: EdgeConfig | null = null;
public widgets: Widgets | null = null;
+ protected isModbusTcpWidgetAllowed: boolean = false;
private stopOnDestroy: Subject = new Subject();
constructor(
@@ -27,6 +28,7 @@ export class LiveComponent implements OnInit, OnDestroy {
public ngOnInit() {
this.service.currentEdge.subscribe((edge) => {
this.edge = edge;
+ this.isModbusTcpWidgetAllowed = EdgePermission.isModbusTcpApiWidgetAllowed(edge);
});
this.service.getConfig().then(config => {
this.config = config;
diff --git a/ui/src/app/edge/live/live.module.ts b/ui/src/app/edge/live/live.module.ts
index e3d7bbc0de3..944e2240b03 100644
--- a/ui/src/app/edge/live/live.module.ts
+++ b/ui/src/app/edge/live/live.module.ts
@@ -2,21 +2,14 @@ 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 { AdministrationComponent } from "./Controller/Evcs/administration/administration.component";
import { Controller_Io_ChannelSingleThresholdComponent } from "./Controller/Io/ChannelSingleThreshold/Io_ChannelSingleThreshold";
import { Controller_Io_ChannelSingleThresholdModalComponent } from "./Controller/Io/ChannelSingleThreshold/modal/modal.component";
import { Controller_Io_FixDigitalOutputComponent } from "./Controller/Io/FixDigitalOutput/Io_FixDigitalOutput";
@@ -24,22 +17,30 @@ import { Controller_Io_FixDigitalOutputModalComponent } from "./Controller/Io/Fi
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_Api_ModbusTcp } from "./Controller/ModbusTcpApi/modbusTcpApi.module";
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_PeakShavingModalComponent } from "./Controller/PeakShaving/Symmetric/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 { Controller_Symmetric_TimeSlot_PeakShavingModalComponent } from "./Controller/PeakShaving/Symmetric_TimeSlot/modal/modal.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 { 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 { 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 { LiveComponent } from "./live.component";
import { OfflineComponent } from "./offline/offline.component";
@NgModule({
@@ -56,6 +57,7 @@ import { OfflineComponent } from "./offline/offline.component";
Controller_Ess_FixActivePower,
Controller_Ess_GridOptimizedCharge,
Controller_Io_HeatingElement,
+ Controller_Api_ModbusTcp,
EnergymonitorModule,
SharedModule,
Controller_Evcs,
diff --git a/ui/src/app/index/login.component.ts b/ui/src/app/index/login.component.ts
index 146cbd32166..4fa20f9aeff 100644
--- a/ui/src/app/index/login.component.ts
+++ b/ui/src/app/index/login.component.ts
@@ -8,6 +8,7 @@ import { environment } from "src/environments";
import { Capacitor } from "@capacitor/core";
import { AppService } from "../app.service";
import { AuthenticateWithPasswordRequest } from "../shared/jsonrpc/request/authenticateWithPasswordRequest";
+import { States } from "../shared/ngrx-store/states";
import { Edge, Service, Utils, Websocket } from "../shared/shared";
@Component({
@@ -93,6 +94,7 @@ export class LoginComponent implements OnInit, AfterContentChecked, OnDestroy {
*/
public doLogin(param: { username?: string, password: string }) {
+ this.websocket.state.set(States.AUTHENTICATION_WITH_CREDENTIALS);
param = LoginComponent.trimCredentials(param.password, param.username);
// Prevent that user submits via keyevent 'enter' multiple times
diff --git a/ui/src/app/index/shared/loading-screen.html b/ui/src/app/index/shared/loading-screen.html
index 2001205da68..481d1773885 100644
--- a/ui/src/app/index/shared/loading-screen.html
+++ b/ui/src/app/index/shared/loading-screen.html
@@ -1,5 +1,63 @@
-
- Loading...
-
+
+
+
+
+ LOADING_SCREEN.LOADING
+
+ ...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ LOADING_SCREEN.SERVER_NOT_ACCESSIBLE
+
+
+
+
+
+
+
+ LOADING_SCREEN.SERVER_NOT_ACCESSIBLE_DESCRIPTION
+
+
+
+
+
+
+
+
+
+ LOADING_SCREEN.SERVER_NOT_ACCESSIBLE_TRY_RELOADING
+
+
+
+
+
+
diff --git a/ui/src/app/index/shared/loading-screen.ts b/ui/src/app/index/shared/loading-screen.ts
index 14d5d7b43a5..05322949c51 100644
--- a/ui/src/app/index/shared/loading-screen.ts
+++ b/ui/src/app/index/shared/loading-screen.ts
@@ -1,38 +1,41 @@
// @ts-strict-ignore
-import { Component, OnInit } from "@angular/core";
+import { Component, effect } from "@angular/core";
import { Router } from "@angular/router";
+import { AppStateTracker } from "src/app/shared/ngrx-store/states";
+import { Environment, environment } from "src/environments";
import { Service, Websocket } from "../../shared/shared";
@Component({
selector: "index",
templateUrl: "./loading-screen.html",
})
-export class LoadingScreenComponent implements OnInit {
+export class LoadingScreenComponent {
protected readonly spinnerId: string = "IndexComponent";
+ protected readonly environment: Environment = environment;
+ protected backendState: "loading" | "failed" | "authenticated" = "loading";
constructor(
public service: Service,
public websocket: Websocket,
private router: Router,
- ) { }
+ private appStateTracker: AppStateTracker,
+ ) {
- ngOnInit() {
-
- // TODO add websocket status observable
- const interval = setInterval(() => {
- this.service.startSpinner(this.spinnerId);
- if (this.websocket.status === "online") {
- this.service.stopSpinner(this.spinnerId);
- this.router.navigate(["/overview"]);
- clearInterval(interval);
- }
- if (this.websocket.status === "waiting for credentials") {
- this.service.stopSpinner(this.spinnerId);
- this.router.navigate(["/login"]);
- clearInterval(interval);
+ effect(() => {
+ this.backendState = this.appStateTracker.loadingState();
+ switch (this.backendState) {
+ case "loading":
+ this.service.startSpinner(this.spinnerId);
+ break;
+ case "failed":
+ this.service.stopSpinner(this.spinnerId);
+ break;
+ case "authenticated":
+ this.appStateTracker.navigateAfterAuthentication();
+ break;
}
- }, 1000);
+ });
}
}
diff --git a/ui/src/app/shared/components/chart/abstracthistorychart.html b/ui/src/app/shared/components/chart/abstracthistorychart.html
index 0c1225b56f0..a727e42f4dc 100644
--- a/ui/src/app/shared/components/chart/abstracthistorychart.html
+++ b/ui/src/app/shared/components/chart/abstracthistorychart.html
@@ -11,3 +11,5 @@
[type]="chartType">
+
+
diff --git a/ui/src/app/shared/components/chart/abstracthistorychart.ts b/ui/src/app/shared/components/chart/abstracthistorychart.ts
index 97d491dc2f4..b30e69af4b8 100644
--- a/ui/src/app/shared/components/chart/abstracthistorychart.ts
+++ b/ui/src/app/shared/components/chart/abstracthistorychart.ts
@@ -5,7 +5,7 @@ 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 { ChronoUnit, DEFAULT_NUMBER_CHART_OPTIONS, DEFAULT_TIME_CHART_OPTIONS, Resolution, calculateResolution, isLabelVisible, 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";
@@ -311,6 +311,8 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy {
return translate.instant("Edge.Index.Widgets.Channeltreshold.ACTIVE_TIME_OVER_PERIOD");
case YAxisType.PERCENTAGE:
return translate.instant("General.percentage");
+ case YAxisType.REACTIVE:
+ return "var";
case YAxisType.ENERGY:
if (chartType == "bar") {
return "kWh";
@@ -556,6 +558,7 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy {
break;
case YAxisType.POWER:
case YAxisType.ENERGY:
+ case YAxisType.REACTIVE:
case YAxisType.VOLTAGE:
case YAxisType.CURRENT:
case YAxisType.NONE:
@@ -645,6 +648,9 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy {
tooltipsLabel = "kW";
}
break;
+ case YAxisType.REACTIVE:
+ tooltipsLabel = "var";
+ break;
default:
tooltipsLabel = "";
break;
@@ -724,6 +730,8 @@ export abstract class AbstractHistoryChart implements OnInit, OnDestroy {
return "V";
case YAxisType.CURRENT:
return "A";
+ case YAxisType.REACTIVE:
+ return "var";
case YAxisType.ENERGY:
if (chartType == "bar") {
return "kWh";
diff --git a/ui/src/app/shared/components/edge/edgeconfig.spec.ts b/ui/src/app/shared/components/edge/edgeconfig.spec.ts
index 8921e4235d6..ec7d23d4a2c 100644
--- a/ui/src/app/shared/components/edge/edgeconfig.spec.ts
+++ b/ui/src/app/shared/components/edge/edgeconfig.spec.ts
@@ -172,6 +172,18 @@ export namespace DummyConfig {
"io.openems.edge.evcs.api.Evcs",
],
};
+
+ export const MODBUS_TCP_READWRITE = {
+ id: "Controller.Api.ModbusTcp.ReadWrite",
+ natureIds: [
+ "io.openems.edge.common.jsonapi.JsonApi",
+ "io.openems.edge.common.component.OpenemsComponent",
+ "io.openems.edge.controller.api.modbus.ModbusTcpApi",
+ "io.openems.edge.controller.api.modbus.readwrite.ControllerApiModbusTcpReadWrite",
+ "io.openems.edge.controller.api.Controller",
+ "io.openems.edge.timedata.api.TimedataProvider",
+ ],
+ };
}
export namespace Component {
@@ -295,6 +307,21 @@ export namespace DummyConfig {
},
channels: {},
});
+
+ export const MODBUS_TCP_READWRITE = (id: string, alias?: string): Component => ({
+ id: id,
+ alias: alias ?? id,
+ factory: Factory.MODBUS_TCP_READWRITE,
+ properties: {
+ invert: false,
+ modbusUnitId: 5,
+ type: "PRODUCTION",
+ writeChannels: [
+ "Ess0SetActivePowerEquals",
+ ],
+ },
+ channels: {},
+ });
}
}
diff --git a/ui/src/app/shared/components/edge/edgeconfig.ts b/ui/src/app/shared/components/edge/edgeconfig.ts
index c06af3db4ac..4b12b73aed2 100644
--- a/ui/src/app/shared/components/edge/edgeconfig.ts
+++ b/ui/src/app/shared/components/edge/edgeconfig.ts
@@ -710,7 +710,7 @@ export namespace PersistencePriority {
}
}
-export module EdgeConfig {
+export namespace EdgeConfig {
export class ComponentChannel {
public readonly type!: "BOOLEAN" | "SHORT" | "INTEGER" | "LONG" | "FLOAT" | "DOUBLE" | "STRING";
public readonly accessMode!: "RO" | "RW" | "WO";
diff --git a/ui/src/app/shared/components/header/header.component.ts b/ui/src/app/shared/components/header/header.component.ts
index 0c192f21047..fc97026c4e6 100644
--- a/ui/src/app/shared/components/header/header.component.ts
+++ b/ui/src/app/shared/components/header/header.component.ts
@@ -63,7 +63,7 @@ export class HeaderComponent implements OnInit, OnDestroy, AfterViewChecked {
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" || file == "index" || 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" || url === "/index") {
this.backUrl = false;
return;
}
diff --git a/ui/src/app/shared/components/modal/modal.module.ts b/ui/src/app/shared/components/modal/modal.module.ts
index 57ecf5e89e0..9f6c54a7b5a 100644
--- a/ui/src/app/shared/components/modal/modal.module.ts
+++ b/ui/src/app/shared/components/modal/modal.module.ts
@@ -26,6 +26,7 @@ import { ModalHorizontalLineComponent } from "./model-horizontal-line/modal-hori
PipeModule,
],
declarations: [
+ HelpButtonComponent,
ModalButtonsComponent,
ModalInfoLineComponent,
ModalLineComponent,
@@ -37,6 +38,7 @@ import { ModalHorizontalLineComponent } from "./model-horizontal-line/modal-hori
HelpButtonComponent,
],
exports: [
+ HelpButtonComponent,
ModalButtonsComponent,
ModalInfoLineComponent,
ModalLineComponent,
diff --git a/ui/src/app/shared/components/shared/converter.ts b/ui/src/app/shared/components/shared/converter.ts
index 136ecff555b..b76ad1ace3f 100644
--- a/ui/src/app/shared/components/shared/converter.ts
+++ b/ui/src/app/shared/components/shared/converter.ts
@@ -93,6 +93,34 @@ export namespace Converter {
Formatter.FORMAT_WATT(value));
};
+ /**
+ * Formats a Energy value as Kilo watt hours [kWh].
+ *
+ * Value 1000 -> "1,00 kWh".
+ * Value null -> "-".
+ *
+ * @param value the power value
+ * @returns formatted value; '-' for null
+ */
+ export const WATT_HOURS_IN_KILO_WATT_HOURS: Converter = (raw) => {
+ return IF_NUMBER(raw, value =>
+ Formatter.FORMAT_KILO_WATT_HOURS(value / 1000));
+ };
+
+ /**
+ * Formats a Energy value as Kilo watt hours [kWh].
+ *
+ * Value 1000 -> "1000 kWh".
+ * Value null -> "-".
+ *
+ * @param value the power value
+ * @returns formatted value; '-' for null
+ */
+ export const TO_KILO_WATT_HOURS: Converter = (raw) => {
+ return IF_NUMBER(raw, value =>
+ Formatter.FORMAT_KILO_WATT_HOURS(value));
+ };
+
export const STATE_IN_PERCENT: Converter = (raw) => {
return IF_NUMBER(raw, value =>
Formatter.FORMAT_PERCENT(value));
diff --git a/ui/src/app/shared/components/shared/formatter.ts b/ui/src/app/shared/components/shared/formatter.ts
index 8f2d5df2c8d..798818e17b6 100644
--- a/ui/src/app/shared/components/shared/formatter.ts
+++ b/ui/src/app/shared/components/shared/formatter.ts
@@ -7,6 +7,11 @@ export namespace Formatter {
return formatNumber(value, "de", "1.0-0") + " W";
};
+ export const FORMAT_KILO_WATT_HOURS = (value: number) => {
+ // TODO apply correct locale
+ return formatNumber(value, "de", "1.0-0") + " kWh";
+ };
+
export const FORMAT_VOLT = (value: number) => {
// TODO apply correct locale
return formatNumber(value, "de", "1.0-0") + " V";
diff --git a/ui/src/app/shared/ngrx-store/states.ts b/ui/src/app/shared/ngrx-store/states.ts
new file mode 100644
index 00000000000..33d8f0aeb0d
--- /dev/null
+++ b/ui/src/app/shared/ngrx-store/states.ts
@@ -0,0 +1,110 @@
+import { Injectable, WritableSignal, effect, signal } from "@angular/core";
+import { Router } from "@angular/router";
+
+import { differenceInSeconds } from "date-fns";
+import { environment } from "src/environments";
+import { Pagination } from "../service/pagination";
+import { PreviousRouteService } from "../service/previousRouteService";
+import { Websocket } from "../shared";
+
+export enum States {
+ WEBSOCKET_CONNECTION_CLOSED,
+ WEBSOCKET_NOT_YET_CONNECTED,
+ WEBSOCKET_CONNECTING,
+ WEBSOCKET_CONNECTED,
+
+ // TODO substates
+ NOT_AUTHENTICATED,
+ AUTHENTICATING_WITH_TOKEN,
+ AUTHENTICATION_WITH_CREDENTIALS,
+ AUTHENTICATED,
+ EDGE_SELECTED,
+}
+
+@Injectable({
+ providedIn: "root",
+})
+export class AppStateTracker {
+ private static readonly LOG_PREFIX: string = "AppState";
+ private static readonly TIME_TILL_TIMEOUT: number = 10;
+ private static readonly ENABLE_ROUTING: boolean = true;
+ public loadingState: WritableSignal<"failed" | "loading" | "authenticated"> = signal("loading");
+ private lastTimeStamp: Date | null = null;
+
+ constructor(
+ protected router: Router,
+ protected pagination: Pagination,
+ private websocket: Websocket,
+ private previousRouteService: PreviousRouteService,
+ ) {
+ if (!localStorage.getItem("AppState")) {
+ console.log(`${AppStateTracker.LOG_PREFIX} Log deactivated`);
+ }
+
+ if (!AppStateTracker.ENABLE_ROUTING) {
+ console.log(`${AppStateTracker.LOG_PREFIX} Routing deactivated`);
+ }
+
+ effect(() => {
+ const state = this.websocket.state();
+ this.startStateHandler(state);
+ }, { allowSignalWrites: true });
+ }
+
+ /**
+ * Handles navigation after authentication
+ */
+ public navigateAfterAuthentication() {
+ const segments = this.router.routerState.snapshot.url.split("/");
+ const previousUrl: string = this.previousRouteService.getPreviousUrl();
+
+ if ((previousUrl === segments[segments.length - 1]) || previousUrl === "/") {
+ this.router.navigate(["./overview"]);
+ return;
+ }
+
+ this.router.navigate(previousUrl.split("/"));
+ }
+
+ private startStateHandler(state: States): void {
+
+ if (environment.debugMode && localStorage.getItem("AppState")) {
+ console.log(`${AppStateTracker.LOG_PREFIX} [${States[this.websocket.state()]}]`);
+ }
+
+ if (!AppStateTracker.ENABLE_ROUTING) {
+ return;
+ }
+
+ switch (state) {
+ case States.WEBSOCKET_CONNECTING:
+ this.lastTimeStamp = this.handleWebSocketConnecting(this.lastTimeStamp);
+ break;
+ case States.WEBSOCKET_CONNECTION_CLOSED:
+ break;
+ case States.AUTHENTICATED:
+ this.loadingState.set("authenticated");
+ break;
+ default:
+ this.lastTimeStamp = null;
+ break;
+ }
+ }
+
+
+ private handleWebSocketConnecting(lastTimeStamp: Date | null): Date | null {
+ const now = new Date();
+ if (lastTimeStamp === null) {
+ return now;
+ }
+
+ if (differenceInSeconds(now, lastTimeStamp) > AppStateTracker.TIME_TILL_TIMEOUT) {
+ console.warn(`Websocket connection couldnt be established in ${AppStateTracker.TIME_TILL_TIMEOUT}s`);
+ this.loadingState.set("failed");
+ this.router.navigate(["index"]);
+ return null;
+ }
+
+ return lastTimeStamp;
+ }
+}
diff --git a/ui/src/app/shared/pipe/converter/converter.ts b/ui/src/app/shared/pipe/converter/converter.ts
new file mode 100644
index 00000000000..34cc2fc6649
--- /dev/null
+++ b/ui/src/app/shared/pipe/converter/converter.ts
@@ -0,0 +1,22 @@
+import { Pipe, PipeTransform } from "@angular/core";
+
+import { Converter } from "../../components/shared/converter";
+
+@Pipe({
+ name: "converter",
+})
+export class ConverterPipe implements PipeTransform {
+
+ constructor() { }
+
+ /**
+ * Transforms the value with a given converter
+ *
+ * @param value the passed value
+ * @param converter the passed converter
+ * @returns the result of the converter as a string
+ */
+ transform(value: number, converter: Converter): string {
+ return converter(value);
+ }
+}
diff --git a/ui/src/app/shared/pipe/pipe.ts b/ui/src/app/shared/pipe/pipe.ts
index ff8f05002e8..dba4d592001 100644
--- a/ui/src/app/shared/pipe/pipe.ts
+++ b/ui/src/app/shared/pipe/pipe.ts
@@ -2,6 +2,7 @@ import { DecimalPipe } from "@angular/common";
import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { ClassnamePipe } from "./classname/classname.pipe";
+import { ConverterPipe } from "./converter/converter";
import { FormatSecondsToDurationPipe } from "./formatSecondsToDuration/formatSecondsToDuration.pipe";
import { IsclassPipe } from "./isclass/isclass.pipe";
import { KeysPipe } from "./keys/keys.pipe";
@@ -23,6 +24,7 @@ import { VersionPipe } from "./version/version.pipe";
ClassnamePipe,
VersionPipe,
TypeofPipe,
+ ConverterPipe,
],
exports: [
UnitvaluePipe,
@@ -33,6 +35,7 @@ import { VersionPipe } from "./version/version.pipe";
ClassnamePipe,
VersionPipe,
TypeofPipe,
+ ConverterPipe,
],
providers: [
DecimalPipe,
diff --git a/ui/src/app/shared/service/defaulttypes.ts b/ui/src/app/shared/service/defaulttypes.ts
index c2551ff2e0b..b01b9875627 100644
--- a/ui/src/app/shared/service/defaulttypes.ts
+++ b/ui/src/app/shared/service/defaulttypes.ts
@@ -5,7 +5,7 @@ import { endOfMonth, endOfYear, format, getDay, getMonth, getYear, isSameDay, is
import { QueryHistoricTimeseriesEnergyResponse } from "../jsonrpc/response/queryHistoricTimeseriesEnergyResponse";
import { ChannelAddress, Service } from "../shared";
-export module DefaultTypes {
+export namespace DefaultTypes {
export type Backend = "OpenEMS Backend" | "OpenEMS Edge";
diff --git a/ui/src/app/shared/service/globalRouteChangeHandler.ts b/ui/src/app/shared/service/globalRouteChangeHandler.ts
index 17d628c4fa7..8992c77e7a4 100644
--- a/ui/src/app/shared/service/globalRouteChangeHandler.ts
+++ b/ui/src/app/shared/service/globalRouteChangeHandler.ts
@@ -4,6 +4,7 @@ import { Router, RoutesRecognized } from "@angular/router";
import { TranslateService } from "@ngx-translate/core";
import { filter, map } from "rxjs/operators";
+import { environment } from "src/environments";
import { Service } from "./service";
@Injectable({
@@ -35,7 +36,7 @@ export class GlobalRouteChangeHandler {
throw new Error("Either use navbarTitle or navbarTitleToBeTranslated");
}
- this.service.currentPageTitle = e.navbarTitle ?? (e.navbarTitleToBeTranslated ? translate.instant(e.navbarTitleToBeTranslated) : null) ?? this.service.currentPageTitle;
+ this.service.currentPageTitle = e.navbarTitle ?? (e.navbarTitleToBeTranslated ? translate.instant(e.navbarTitleToBeTranslated) : null) ?? this.service.currentPageTitle ?? environment.uiTitle;
});
}
}
diff --git a/ui/src/app/shared/service/pagination.ts b/ui/src/app/shared/service/pagination.ts
index ed549837116..f75a43c2f71 100644
--- a/ui/src/app/shared/service/pagination.ts
+++ b/ui/src/app/shared/service/pagination.ts
@@ -4,6 +4,7 @@ import { Router } from "@angular/router";
import { SubscribeEdgesRequest } from "../jsonrpc/request/subscribeEdgesRequest";
import { ChannelAddress, Edge } from "../shared";
import { Service } from "./service";
+import { States } from "../ngrx-store/states";
@Directive()
export class Pagination {
@@ -22,6 +23,7 @@ export class Pagination {
this.edge = edge;
this.service.websocket.sendRequest(new SubscribeEdgesRequest({ edges: [edge.id] }));
}).then(() => {
+ this.service.websocket.state.set(States.EDGE_SELECTED);
this.edge.subscribeChannels(this.service.websocket, "", [
new ChannelAddress("_sum", "State"),
]);
diff --git a/ui/src/app/shared/service/previousRouteService.ts b/ui/src/app/shared/service/previousRouteService.ts
new file mode 100644
index 00000000000..f6087a0ea2c
--- /dev/null
+++ b/ui/src/app/shared/service/previousRouteService.ts
@@ -0,0 +1,29 @@
+import { Injectable } from "@angular/core";
+import { NavigationEnd, Router } from "@angular/router";
+
+@Injectable()
+export class PreviousRouteService {
+
+ private previousUrl: string;
+ private currentUrl: string;
+
+ constructor(private router: Router) {
+ this.currentUrl = this.router.url;
+ this.previousUrl = this.currentUrl;
+ router.events.subscribe(event => {
+ if (event instanceof NavigationEnd) {
+ this.previousUrl = this.currentUrl;
+ this.currentUrl = event.url;
+ }
+ });
+ }
+
+ /**
+ * Gets the previous url, active before this url
+ *
+ * @returns the previous url
+ */
+ public getPreviousUrl() {
+ return this.previousUrl;
+ }
+}
diff --git a/ui/src/app/shared/service/service.ts b/ui/src/app/shared/service/service.ts
index 67ce8b1a64f..e25fa22fac3 100644
--- a/ui/src/app/shared/service/service.ts
+++ b/ui/src/app/shared/service/service.ts
@@ -20,6 +20,7 @@ import { GetEdgeResponse } from "../jsonrpc/response/getEdgeResponse";
import { GetEdgesResponse } from "../jsonrpc/response/getEdgesResponse";
import { QueryHistoricTimeseriesEnergyResponse } from "../jsonrpc/response/queryHistoricTimeseriesEnergyResponse";
import { User } from "../jsonrpc/shared";
+import { States } from "../ngrx-store/states";
import { ChannelAddress } from "../shared";
import { Language } from "../type/language";
import { Role } from "../type/role";
@@ -198,6 +199,7 @@ export class Service extends AbstractService {
public onLogout() {
this.currentEdge.next(null);
this.metadata.next(null);
+ this.websocket.state.set(States.NOT_AUTHENTICATED);
this.router.navigate(["/login"]);
}
diff --git a/ui/src/app/shared/service/utils.ts b/ui/src/app/shared/service/utils.ts
index 36f44a37d47..9e237060345 100644
--- a/ui/src/app/shared/service/utils.ts
+++ b/ui/src/app/shared/service/utils.ts
@@ -632,6 +632,7 @@ export enum YAxisType {
RELAY,
ENERGY,
VOLTAGE,
+ REACTIVE,
CURRENT,
TIME,
CURRENCY,
diff --git a/ui/src/app/shared/service/websocket.ts b/ui/src/app/shared/service/websocket.ts
index a79deefeb77..6df2b0d368b 100644
--- a/ui/src/app/shared/service/websocket.ts
+++ b/ui/src/app/shared/service/websocket.ts
@@ -1,5 +1,5 @@
// @ts-strict-ignore
-import { Injectable } from "@angular/core";
+import { Injectable, WritableSignal, signal } from "@angular/core";
import { Router } from "@angular/router";
import { TranslateService } from "@ngx-translate/core";
import { CookieService } from "ngx-cookie-service";
@@ -18,6 +18,7 @@ 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 { States } from "../ngrx-store/states";
import { Language } from "../type/language";
import { Pagination } from "./pagination";
import { Service } from "./service";
@@ -40,6 +41,8 @@ export class Websocket implements WebsocketInterface {
| "failed" // connection failed
= "initial";
+ public state: WritableSignal = signal(States.WEBSOCKET_NOT_YET_CONNECTED);
+
private readonly wsdata = new WsData();
private socket: WebSocketSubject;
@@ -68,6 +71,7 @@ export class Websocket implements WebsocketInterface {
public login(request: AuthenticateWithPasswordRequest | AuthenticateWithTokenRequest): Promise {
return new Promise((resolve) => {
this.sendRequest(request).then(r => {
+ this.state.set(States.AUTHENTICATED);
const authenticateResponse = (r as AuthenticateResponse).result;
const language = Language.getByKey(localStorage.DEMO_LANGUAGE ?? authenticateResponse.user.language.toLocaleLowerCase());
@@ -202,10 +206,12 @@ export class Websocket implements WebsocketInterface {
* Opens a connection using a stored token. Called once by constructor
*/
private connect() {
+ this.state.set(States.WEBSOCKET_NOT_YET_CONNECTED);
if (this.status != "initial") {
return;
}
// trying to connect
+ this.state.set(States.WEBSOCKET_CONNECTING);
this.status = "connecting";
if (environment.debugMode) {
@@ -219,6 +225,7 @@ export class Websocket implements WebsocketInterface {
url: environment.url,
openObserver: {
next: (value) => {
+ this.state.set(States.WEBSOCKET_NOT_YET_CONNECTED);
// Websocket connection is open
if (environment.debugMode) {
console.info("Websocket connection opened");
@@ -226,6 +233,7 @@ export class Websocket implements WebsocketInterface {
const token = this.cookieService.get("token");
if (token) {
+ this.state.set(States.AUTHENTICATING_WITH_TOKEN);
// Login with Session Token
this.login(new AuthenticateWithTokenRequest({ token: token }));
@@ -233,6 +241,7 @@ export class Websocket implements WebsocketInterface {
} else {
// No Token -> directly ask for Login credentials
+ this.state.set(States.NOT_AUTHENTICATED);
this.status = "waiting for credentials";
this.router.navigate(["login"]);
}
@@ -241,10 +250,12 @@ export class Websocket implements WebsocketInterface {
closeObserver: {
next: (value) => {
// Websocket connection is closed. Auto-Reconnect starts.
+ this.state.set(States.WEBSOCKET_CONNECTION_CLOSED);
if (environment.debugMode) {
console.info("Websocket connection closed");
}
// trying to connect
+ this.state.set(States.WEBSOCKET_CONNECTING);
this.status = "connecting";
},
},
diff --git a/ui/src/app/shared/shared.module.ts b/ui/src/app/shared/shared.module.ts
index 1bf1507d696..2ff830daf99 100644
--- a/ui/src/app/shared/shared.module.ts
+++ b/ui/src/app/shared/shared.module.ts
@@ -31,8 +31,10 @@ import { HistoryDataErrorModule } from "./components/history-data-error/history-
import { PercentageBarComponent } from "./components/percentagebar/percentagebar.component";
import { DirectiveModule } from "./directive/directive";
import { ChartOptionsComponent } from "./legacy/chartoptions/chartoptions.component";
+import { AppStateTracker } from "./ngrx-store/states";
import { PipeModule } from "./pipe/pipe";
import { Logger } from "./service/logger";
+import { PreviousRouteService } from "./service/previousRouteService";
import { Service } from "./service/service";
import { Utils } from "./service/utils";
import { Websocket } from "./shared";
@@ -143,11 +145,13 @@ export function SubnetmaskValidatorMessage(err, field: FormlyFieldConfig) {
FormlyFieldWithLoadingAnimationComponent,
],
providers: [
+ AppStateTracker,
appRoutingProviders,
+ Logger,
+ PreviousRouteService,
Service,
Utils,
Websocket,
- Logger,
],
})
diff --git a/ui/src/app/shared/shared.ts b/ui/src/app/shared/shared.ts
index 4175e96134d..6cf1168edc6 100644
--- a/ui/src/app/shared/shared.ts
+++ b/ui/src/app/shared/shared.ts
@@ -58,6 +58,10 @@ export class EdgePermission {
}, []);
}
+ public static isModbusTcpApiWidgetAllowed(edge: Edge): boolean {
+ return edge?.isVersionAtLeast("2024.9.1");
+ }
+
/**
* Determines if the edge has its channels in the edgeconfig
* or if they should be obtained with a separate request.
@@ -169,6 +173,15 @@ export enum EssStateMachine {
ERROR = 30,
}
+export enum ChannelRegister {
+ "SetActivePowerEquals" = 706,
+ "SetReactivePowerEquals" = 708,
+ "SetActivePowerLessOrEquals" = 710,
+ "SetReactivePowerLessOrEquals" = 712,
+ "SetActivePowerGreaterOrEquals" = 714,
+ "SetReactivePowerGreaterOrEquals" = 716,
+}
+
/**
* Presents a simple
*/
diff --git a/ui/src/app/shared/type/general.ts b/ui/src/app/shared/type/general.ts
index 8394178bfce..8d1d82a528c 100644
--- a/ui/src/app/shared/type/general.ts
+++ b/ui/src/app/shared/type/general.ts
@@ -17,3 +17,8 @@ export enum WorkMode {
TIME = "TIME",
NONE = "NONE",
}
+export enum OverrideStatus {
+ ACTIVE = 0,
+ INACTIVE = 1,
+ ERROR = 2,
+}
diff --git a/ui/src/app/shared/type/language.ts b/ui/src/app/shared/type/language.ts
index 79a88549ab3..4858ceca062 100644
--- a/ui/src/app/shared/type/language.ts
+++ b/ui/src/app/shared/type/language.ts
@@ -4,8 +4,9 @@ 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 { TranslateLoader, TranslateService } from "@ngx-translate/core";
import { Observable, of } from "rxjs";
+import { filter, take } from "rxjs/operators";
import cz from "src/assets/i18n/cz.json";
import de from "src/assets/i18n/de.json";
import en from "src/assets/i18n/en.json";
@@ -13,8 +14,9 @@ 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 { environment } from "src/environments";
-interface Translation {
+export interface Translation {
[key: string]: string | Translation;
}
@@ -107,4 +109,25 @@ export class Language {
return lang?.i18nLocaleKey ?? Language.DEFAULT.i18nLocaleKey;
}
+
+ /**
+ * Sets a additional translation file
+ *
+ * e.g. AdvertismentModule
+ *
+ * @param translationFile the translation file
+ * @returns translations params
+ */
+ public static async setAdditionalTranslationFile(translationFile: any, translate: TranslateService): Promise<{ lang: string; translations: {}; shouldMerge?: boolean; }> {
+ const lang = (await translate.onLangChange.pipe(filter(lang => !!lang), take(1)).toPromise()).lang;
+ let translationKey: string = lang;
+ if (!(lang in translationFile)) {
+
+ if (environment.debugMode) {
+ console.warn(`[Advert] No translation available for Language ${lang}. Implemented languages are: ${Object.keys(translationFile)}`);
+ }
+ translationKey = Language.EN.key;
+ }
+ return { lang: lang, translations: translationFile[translationKey], shouldMerge: true };
+ }
}
diff --git a/ui/src/app/shared/type/widget.ts b/ui/src/app/shared/type/widget.ts
index bd838e1641b..5f72e25e0ce 100644
--- a/ui/src/app/shared/type/widget.ts
+++ b/ui/src/app/shared/type/widget.ts
@@ -1,6 +1,7 @@
// @ts-strict-ignore
import { Edge } from "../components/edge/edge";
import { EdgeConfig } from "../components/edge/edgeconfig";
+import { EdgePermission } from "../shared";
export enum WidgetClass {
"Energymonitor",
@@ -21,6 +22,7 @@ export enum WidgetNature {
}
export enum WidgetFactory {
+ "Controller.Api.ModbusTcp.ReadWrite",
"Controller.Asymmetric.PeakShaving",
"Controller.ChannelThreshold",
"Controller.CHP.SoC",
@@ -104,6 +106,8 @@ export class Widgets {
return config.getComponentIdsByFactory("Controller.ChannelThreshold")?.length > 0;
case "Controller_Io_Digital_Outputs":
return config.getComponentIdsByFactories("Controller.Io.FixDigitalOutput", "Controller.IO.ChannelSingleThreshold")?.length > 0;
+ case "Controller.Api.ModbusTcp.ReadWrite":
+ return EdgePermission.isModbusTcpApiWidgetAllowed(edge);
default:
return false;
}
diff --git a/ui/src/assets/i18n/de.json b/ui/src/assets/i18n/de.json
index 5e45735b3cf..457f5cb15ab 100644
--- a/ui/src/assets/i18n/de.json
+++ b/ui/src/assets/i18n/de.json
@@ -858,6 +858,13 @@
},
"CONFIGURATION_MPPT_SELECTION_NOTE": "Weitere Erzeuger können im Anschluss über das App Center konfiguriert werden."
},
+ "LOADING_SCREEN": {
+ "LOADING": "Wird geladen",
+ "SERVER_NOT_ACCESSIBLE": "Server nicht erreichbar",
+ "SERVER_NOT_ACCESSIBLE_TRY_RELOADING": "Probieren Sie bitte in 10 Minuten den Browser neu zu laden.",
+ "SERVER_NOT_ACCESSIBLE_ACCESS_LOCALLY": "Lokal zugreifen",
+ "SERVER_NOT_ACCESSIBLE_DESCRIPTION": "Der Onlinezugriff auf das Speichersystem ist aktuell nicht möglich. Die Daten werden lokal gespeichert und gehen nicht verloren."
+ },
"Login": {
"title": "Login",
"preamble": "Bitte geben Sie Ihr Passwort ein oder bestätigen Sie die Voreingabe um sich als Gast anzumelden.",
@@ -972,6 +979,24 @@
"MORE_CHANNELS": "Weitere Kanäle hinzufügen",
"CHANNEL": "Kanal"
},
+ "MODBUS_TCP_API_READ_WRITE": {
+ "CURRENT_STATE": "Aktueller Status",
+ "CUMULATED_ACTIVE_TIME": "Externe Vorgaben berücksichtigt",
+ "CUMULATED_INACTIVE_TIME": "Keine externe Vorgabe vorhanden",
+ "NO_OVERRIDDEN_CHANNELS": "Es wurden noch keine Kanäle überschrieben.",
+ "NOT_OVERRIDING": "Keine externe Vorgabe vorhanden",
+ "OVERRIDING": "Externe Vorgabe wird berücksichtigt",
+ "LAST_COMMAND": "Letzter Schreibbefehl",
+ "ACTIVE_POWER_LIMITATIONS": "Wirkleistungsvorgabe",
+ "REGISTER": "Register",
+ "LIMITATION": "Vorgabe",
+ "ACTUAL_VALUE": "Tatsächlicher Wert",
+ "INFO_TEXT": "Tatsächlicher Wert kann von der Vorgabe abweichen. Negative Werte entsprechen Speicherbeladung - postive Speicherentladung. Eine detaillierte Erklärung finden Sie in der Anleitung.",
+ "SET_ACTIVE_POWER_EQUALS": "Vorgabe Be- bzw. Entladeleistung",
+ "SET_ACTIVE_POWER_GREATER_OR_EQUALS": "Minimale Beladeleistung",
+ "SET_ACTIVE_POWER_LESS_OR_EQUALS": "Maximale Beladeleistung",
+ "DOWNLOAD_PROTOCOL": "Protokoll Herunterladen"
+ },
"GRID_STATES": {
"OFF_GRID": "Netzausfall",
"NO_EXTERNAL_LIMITATION": "keine externe Limitierung",
diff --git a/ui/src/assets/i18n/en.json b/ui/src/assets/i18n/en.json
index 3c555925b24..b3f33f87876 100644
--- a/ui/src/assets/i18n/en.json
+++ b/ui/src/assets/i18n/en.json
@@ -860,6 +860,13 @@
},
"CONFIGURATION_MPPT_SELECTION_NOTE": "Additional generators can then be configured via the App Center."
},
+ "LOADING_SCREEN": {
+ "LOADING": "Loading",
+ "SERVER_NOT_ACCESSIBLE": "Server not accessible",
+ "SERVER_NOT_ACCESSIBLE_DESCRIPTION": "Online view of the storage system is currently not possible. The data is saved locally and will not be lost.",
+ "SERVER_NOT_ACCESSIBLE_TRY_RELOADING": "Please try reloading the browser in 10 minutes.",
+ "SERVER_NOT_ACCESSIBLE_ACCESS_LOCALLY": "Access locally"
+ },
"Login": {
"title": "Login",
"preamble": "Please enter your password or submit the default value to login as a guest.",
@@ -975,6 +982,24 @@
"MORE_CHANNELS": "Add More Channels",
"CHANNEL": "Channel"
},
+ "MODBUS_TCP_API_READ_WRITE": {
+ "CURRENT_STATE": "Current state",
+ "CUMULATED_ACTIVE_TIME": "External commands considered",
+ "CUMULATED_INACTIVE_TIME": "No external commands present",
+ "NO_OVERRIDDEN_CHANNELS": "No channels have been overridden yet.",
+ "NOT_OVERRIDING": "No external commands present",
+ "OVERRIDING": "External command is being considered",
+ "LAST_COMMAND": "Last override",
+ "ACTIVE_POWER_LIMITATIONS": "Active power limitations",
+ "REGISTER": "Register",
+ "LIMITATION": "Limitation",
+ "ACTUAL_VALUE": "Actual value",
+ "INFO_TEXT": "Actual value may deviate from the specification. Negative values correspond to storage loading - positive storage discharging. A detailed explanation can be found in the instructions.",
+ "SET_ACTIVE_POWER_EQUALS": "Limitation charing/discharging power",
+ "SET_ACTIVE_POWER_GREATER_OR_EQUALS": "Minimum charging power",
+ "SET_ACTIVE_POWER_LESS_OR_EQUALS": "Maximum charging power",
+ "DOWNLOAD_PROTOCOL": "Download Protocol"
+ },
"GRID_STATES": {
"OFF_GRID": "Power outage",
"NO_EXTERNAL_LIMITATION": "No external limitation",
diff --git a/ui/src/themes/openems/scss/variables.scss b/ui/src/themes/openems/scss/variables.scss
index 936fd07be47..abf1541b28c 100644
--- a/ui/src/themes/openems/scss/variables.scss
+++ b/ui/src/themes/openems/scss/variables.scss
@@ -15,6 +15,7 @@ $font-family: var(--ion-font-family);
--ion-color-primary-contrast: #000000;
--ion-color-primary-contrast-rgb: 0, 0, 0;
--ion-color-primary-shade: #cc995d;
+ --ion-color-primary-shade-rgb: rgb(204, 153, 93);
--ion-color-primary-tint: #eab679;
/** secondary **/
@@ -106,9 +107,13 @@ $font-family: var(--ion-font-family);
}
--ion-color-production: #36aed1;
- --ion-color-production-rgb: 54, 174, 209;
+ --ion-color-production-rgb: 54,
+ 174,
+ 209;
--ion-color-production-contrast: #fff;
- --ion-color-production-contrast-rgb: 255, 255, 255;
+ --ion-color-production-contrast-rgb: 255,
+ 255,
+ 255;
--ion-color-production-shade: #226e84;
--ion-color-production-tint: #41d4ff;