refactor: cleanup null checks and helpers
authorJérôme Benoit <jerome.benoit@sap.com>
Sun, 16 Jul 2023 15:31:53 +0000 (17:31 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sun, 16 Jul 2023 15:31:53 +0000 (17:31 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/ChargingStationConfigurationUtils.ts
src/charging-station/ChargingStationUtils.ts
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
ui/web/src/components/charging-stations/CSConnector.vue
ui/web/src/components/charging-stations/CSData.vue
ui/web/src/composables/UIClient.ts
ui/web/src/composables/Utils.ts

index 52972a2aee3c35300540e80a67b47c47c42c1e8d..b56411e310b13e32473afb4a3bc3290a786f87cc 100644 (file)
@@ -89,9 +89,9 @@ export class ChargingStationConfigurationUtils {
       key,
       caseInsensitive,
     );
-    if (keyFound && chargingStation.ocppConfiguration?.configurationKey) {
-      chargingStation.ocppConfiguration.configurationKey[
-        chargingStation.ocppConfiguration.configurationKey.indexOf(keyFound)
+    if (keyFound) {
+      chargingStation.ocppConfiguration!.configurationKey![
+        chargingStation.ocppConfiguration!.configurationKey!.indexOf(keyFound)
       ].value = value;
       chargingStation.saveOcppConfiguration();
     } else {
index 4fdfe230a38360b5917f3d8627bdcb9860ea66d9..0fae41f7ddd259b209d7d1a8132e3a00a8f9dbb7 100644 (file)
@@ -565,7 +565,6 @@ const getConfiguredNumberOfConnectors = (stationTemplate: ChargingStationTemplat
       ? getMaxNumberOfConnectors(stationTemplate.Connectors) - 1
       : getMaxNumberOfConnectors(stationTemplate.Connectors);
   } else if (stationTemplate.Evses && !stationTemplate.Connectors) {
-    configuredMaxConnectors = 0;
     for (const evse in stationTemplate.Evses) {
       if (evse === '0') {
         continue;
index b151dc5ac5a2f09d052a1c414aef6dda674d3a2a..6e58309546f82caeec20b64a5b54223855940a0e 100644 (file)
@@ -472,11 +472,8 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
   ): GetConfigurationResponse {
     const configurationKey: OCPPConfigurationKey[] = [];
     const unknownKey: string[] = [];
-    if (
-      chargingStation.ocppConfiguration?.configurationKey &&
-      isUndefined(commandPayload.key) === true
-    ) {
-      for (const configuration of chargingStation.ocppConfiguration.configurationKey) {
+    if (isUndefined(commandPayload.key) === true) {
+      for (const configuration of chargingStation.ocppConfiguration!.configurationKey!) {
         if (isUndefined(configuration.visible) === true) {
           configuration.visible = true;
         }
@@ -489,8 +486,8 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
           value: configuration.value,
         });
       }
-    } else if (commandPayload.key && isNotEmptyArray(commandPayload.key) === true) {
-      for (const key of commandPayload.key) {
+    } else if (isNotEmptyArray(commandPayload.key) === true) {
+      for (const key of commandPayload.key!) {
         const keyFound = ChargingStationConfigurationUtils.getConfigurationKey(
           chargingStation,
           key,
index 05980e4105ffbb58d76ba72778f9e5a9f34ce825..3cf324c977817b370134885e728c753446932b39 100644 (file)
@@ -9,7 +9,7 @@
       :visibility="state.isIdTagModalVisible"
       :id-tag="state.idTag"
       @close="hideIdTagModal()"
-      @done="Utils.compose(state.transaction, hideIdTagModal)()"
+      @done="compose(state.transaction, hideIdTagModal)()"
     >
       Start Transaction
     </IdTagInputModal> -->
@@ -28,7 +28,7 @@ import Button from '../buttons/Button.vue';
 // import IdTagInputModal from './IdTagInputModal.vue';
 import type { ConnectorStatus } from '@/types';
 import UIClient from '@/composables/UIClient';
-// import Utils from '@/composables/Utils';
+// import { compose } from '@/composables/Utils';
 
 const props = defineProps<{
   hashId: string;
index 040ba02b59476d3d19c17a325879ded93c851bfa..ab9c8208a453d820dab67318bd68415c8bc52de2 100644 (file)
@@ -21,7 +21,7 @@
 // import { reactive } from 'vue';
 import CSConnector from './CSConnector.vue';
 import type { ChargingStationData, ChargingStationInfo, ConnectorStatus } from '@/types';
-import Utils from '@/composables/Utils';
+import { ifUndefined } from '@/composables/Utils';
 
 const props = defineProps<{
   chargingStation: ChargingStationData;
@@ -59,7 +59,7 @@ function getHashId(): string {
   return getInfo().hashId;
 }
 function getId(): string {
-  return Utils.ifUndefined<string>(getInfo().chargingStationId, 'Ø');
+  return ifUndefined<string>(getInfo().chargingStationId, 'Ø');
 }
 function getModel(): string {
   return getInfo().chargePointModel;
@@ -68,7 +68,7 @@ function getVendor(): string {
   return getInfo().chargePointVendor;
 }
 function getFirmwareVersion(): string {
-  return Utils.ifUndefined<string>(getInfo().firmwareVersion, 'Ø');
+  return ifUndefined<string>(getInfo().firmwareVersion, 'Ø');
 }
 function getStarted(): string {
   return props.chargingStation.started === true ? 'Yes' : 'No';
index 3e7856e483115bb6911a76a345efff0430638566..ccd16c215565855d99ec0fa400bb7da0f8dd89bc 100644 (file)
@@ -1,4 +1,4 @@
-import Utils from './Utils';
+import { promiseWithTimeout } from './Utils';
 import {
   ProcedureName,
   type ProtocolResponse,
@@ -146,7 +146,7 @@ export default class UIClient {
     data: RequestPayload
   ): Promise<ResponsePayload> {
     let uuid: string;
-    return Utils.promiseWithTimeout(
+    return promiseWithTimeout(
       new Promise((resolve, reject) => {
         uuid = crypto.randomUUID();
         const msg = JSON.stringify([uuid, command, data]);
index ac217a70746088ac9e53e6f6ed5ec7ecf755e0c4..cf4baf5d5fe9c8b569359d248daea9b82160e917 100644 (file)
@@ -1,56 +1,52 @@
 import util from 'node:util';
 
-export default class Utils {
-  // STATE
-  public static isUndefined(value: unknown): boolean {
-    return typeof value === 'undefined';
+const isUndefined = (value: unknown): boolean => {
+  return typeof value === 'undefined';
+};
+
+export const ifUndefined = <T>(value: T | undefined, isValue: T): T => {
+  if (isUndefined(value) === true) return isValue;
+  return value as T;
+};
+
+// const isIterable = <T>(obj: T): boolean => {
+//   if (obj === null || obj === undefined) {
+//     return false;
+//   }
+//   return typeof (obj as unknown as Iterable<T>)[Symbol.iterator] === 'function';
+// };
+
+// const ifNotIterableDo = <T>(obj: T, cb: () => void): void => {
+//   if (isIterable(obj) === false) cb();
+// };
+
+const isPromisePending = (promise: Promise<unknown>): boolean => {
+  return util.inspect(promise).includes('pending');
+};
+
+export const promiseWithTimeout = <T>(
+  promise: Promise<T>,
+  timeoutMs: number,
+  timeoutError: Error,
+  timeoutCallback: () => void = () => {
+    /* This is intentional */
   }
-
-  public static ifUndefined<T>(value: T | undefined, isValue: T): T {
-    if (Utils.isUndefined(value) === true) return isValue;
-    return value as T;
-  }
-
-  public static isIterable<T>(obj: T): boolean {
-    if (obj === null || obj === undefined) {
-      return false;
-    }
-    return typeof (obj as unknown as Iterable<T>)[Symbol.iterator] === 'function';
-  }
-
-  // public static ifNotIterableDo<T>(obj: T, cb: () => void): void {
-  //   if (this.isIterable(obj) === false) cb();
-  // }
-
-  public static isPromisePending(promise: Promise<unknown>): boolean {
-    return util.inspect(promise).includes('pending');
-  }
-
-  public static async promiseWithTimeout<T>(
-    promise: Promise<T>,
-    timeoutMs: number,
-    timeoutError: Error,
-    timeoutCallback: () => void = () => {
-      /* This is intentional */
-    }
-  ): Promise<T> {
-    // Create a timeout promise that rejects in timeout milliseconds
-    const timeoutPromise = new Promise<never>((_, reject) => {
-      setTimeout(() => {
-        if (Utils.isPromisePending(promise)) {
-          timeoutCallback();
-          // FIXME: The original promise shall be canceled
-        }
-        reject(timeoutError);
-      }, timeoutMs);
-    });
-
-    // Returns a race between timeout promise and the passed promise
-    return Promise.race<T>([promise, timeoutPromise]);
-  }
-
-  // FUNCTIONAL
-  // public static compose<T>(...fns: ((arg: T) => T)[]): (x: T) => T {
-  //   return (x: T) => fns.reduceRight((y, fn) => fn(y), x);
-  // }
-}
+): Promise<T> => {
+  // Create a timeout promise that rejects in timeout milliseconds
+  const timeoutPromise = new Promise<never>((_, reject) => {
+    setTimeout(() => {
+      if (isPromisePending(promise)) {
+        timeoutCallback();
+        // FIXME: The original promise shall be canceled
+      }
+      reject(timeoutError);
+    }, timeoutMs);
+  });
+
+  // Returns a race between timeout promise and the passed promise
+  return Promise.race<T>([promise, timeoutPromise]);
+};
+
+// export const compose = <T>(...fns: ((arg: T) => T)[]): ((x: T) => T) => {
+//   return (x: T) => fns.reduceRight((y, fn) => fn(y), x);
+// };