]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
refactor: eliminate non-null assertions in 8 files (31 of 53 total)
authorJérôme Benoit <jerome.benoit@sap.com>
Tue, 24 Mar 2026 16:19:37 +0000 (17:19 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Tue, 24 Mar 2026 16:19:37 +0000 (17:19 +0100)
- AutomaticTransactionGenerator: extract connector status variables with
  null guards, use optional chaining for stationInfo and ATG config
- ChargingStation: replace stationInfo! with null guards and ?./?? defaults
- Helpers: replace stationInfo!.maximumPower! with ?./?? defaults
- IdTagsCache: replace stationInfo!.hashId with optional chaining
- ChargingStationWorkerBroadcastChannel: replace stationInfo!.hashId
- OCPP16IncomingRequestService: wrap firmware/diagnostics status in
  null guards, replace resetTime!/configurationKey! with safe access
- UIServerFactory: replace options!.host! with optional chaining
- Configuration: replace getConfigurationData()! with null guards

src/charging-station/AutomaticTransactionGenerator.ts
src/charging-station/Helpers.ts
src/charging-station/IdTagsCache.ts
src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/charging-station/ui-server/UIServerFactory.ts
src/utils/Configuration.ts

index 32158dc8d0a223dbc15beb3f8a296c8bb5c41ce8..4b81f25ec433b30257adc32173a1bac2250d710b 100644 (file)
@@ -9,6 +9,7 @@ import { BaseError } from '../exception/index.js'
 import { PerformanceStatistics } from '../performance/index.js'
 import {
   ChargingStationEvents,
+  IdTagDistribution,
   type StartTransactionResult,
   type Status,
   StopTransactionReason,
@@ -53,23 +54,27 @@ export class AutomaticTransactionGenerator {
   }
 
   public static deleteInstance (chargingStation: ChargingStation): boolean {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    return AutomaticTransactionGenerator.instances.delete(chargingStation.stationInfo!.hashId)
+    const hashId = chargingStation.stationInfo?.hashId
+    if (hashId == null) {
+      return false
+    }
+    return AutomaticTransactionGenerator.instances.delete(hashId)
   }
 
   public static getInstance (
     chargingStation: ChargingStation
   ): AutomaticTransactionGenerator | undefined {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    if (!AutomaticTransactionGenerator.instances.has(chargingStation.stationInfo!.hashId)) {
+    const hashId = chargingStation.stationInfo?.hashId
+    if (hashId == null) {
+      return undefined
+    }
+    if (!AutomaticTransactionGenerator.instances.has(hashId)) {
       AutomaticTransactionGenerator.instances.set(
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        chargingStation.stationInfo!.hashId,
+        hashId,
         new AutomaticTransactionGenerator(chargingStation)
       )
     }
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    return AutomaticTransactionGenerator.instances.get(chargingStation.stationInfo!.hashId)
+    return AutomaticTransactionGenerator.instances.get(hashId)
   }
 
   public start (stopAbsoluteDuration?: boolean): void {
@@ -127,17 +132,17 @@ export class AutomaticTransactionGenerator {
       logger.error(`${this.logPrefix(connectorId)} stopping on non existing connector`)
       throw new BaseError(`Connector ${connectorId.toString()} does not exist`)
     }
-    if (this.connectorsStatus.get(connectorId)?.start === true) {
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      this.connectorsStatus.get(connectorId)!.start = false
-    } else if (this.connectorsStatus.get(connectorId)?.start === false) {
+    const connectorStatus = this.connectorsStatus.get(connectorId)
+    if (connectorStatus?.start === true) {
+      connectorStatus.start = false
+    } else if (connectorStatus?.start === false) {
       logger.warn(`${this.logPrefix(connectorId)} is already stopped on connector`)
     }
   }
 
   private canStartConnector (connectorId: number): boolean {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    if (new Date() > this.connectorsStatus.get(connectorId)!.stopDate!) {
+    const stopDate = this.connectorsStatus.get(connectorId)?.stopDate
+    if (stopDate != null && new Date() > stopDate) {
       logger.info(
         `${this.logPrefix(
           connectorId
@@ -187,11 +192,10 @@ export class AutomaticTransactionGenerator {
       throw new BaseError(`Invalid connector id ${connectorId.toString()}`)
     }
     let connectorStatus: Status | undefined
-    if (this.chargingStation.getAutomaticTransactionGeneratorStatuses()?.[statusIndex] != null) {
-      connectorStatus = clone<Status>(
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        this.chargingStation.getAutomaticTransactionGeneratorStatuses()![statusIndex]
-      )
+    const statusEntry =
+      this.chargingStation.getAutomaticTransactionGeneratorStatuses()?.[statusIndex]
+    if (statusEntry != null) {
+      connectorStatus = clone<Status>(statusEntry)
     } else {
       logger.warn(
         `${this.logPrefix(
@@ -237,15 +241,16 @@ export class AutomaticTransactionGenerator {
   }
 
   private handleStartTransactionResult (connectorId: number, result: StartTransactionResult): void {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    ++this.connectorsStatus.get(connectorId)!.startTransactionRequests
+    const connectorStatus = this.connectorsStatus.get(connectorId)
+    if (connectorStatus == null) {
+      return
+    }
+    ++connectorStatus.startTransactionRequests
     if (result.accepted) {
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      ++this.connectorsStatus.get(connectorId)!.acceptedStartTransactionRequests
+      ++connectorStatus.acceptedStartTransactionRequests
     } else {
       logger.warn(`${this.logPrefix(connectorId)} start transaction rejected`)
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      ++this.connectorsStatus.get(connectorId)!.rejectedStartTransactionRequests
+      ++connectorStatus.rejectedStartTransactionRequests
     }
   }
 
@@ -272,14 +277,15 @@ export class AutomaticTransactionGenerator {
     stopAbsoluteDuration?: boolean
   ): Promise<void> {
     this.setStartConnectorStatus(connectorId, stopAbsoluteDuration)
+    const connectorStatus = this.connectorsStatus.get(connectorId)
+    if (connectorStatus == null) {
+      return
+    }
     logger.info(
       `${this.logPrefix(
         connectorId
       )} started on connector and will run for ${formatDurationMilliSeconds(
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        this.connectorsStatus.get(connectorId)!.stopDate!.getTime() -
-          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-          this.connectorsStatus.get(connectorId)!.startDate!.getTime()
+        (connectorStatus.stopDate?.getTime() ?? 0) - (connectorStatus.startDate?.getTime() ?? 0)
       )}`
     )
     while (this.connectorsStatus.get(connectorId)?.start === true) {
@@ -292,12 +298,10 @@ export class AutomaticTransactionGenerator {
       }
       const wait = secondsToMilliseconds(
         randomInt(
-          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-          this.chargingStation.getAutomaticTransactionGeneratorConfiguration()!
-            .minDelayBetweenTwoTransactions,
-          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-          this.chargingStation.getAutomaticTransactionGeneratorConfiguration()!
-            .maxDelayBetweenTwoTransactions + 1
+          this.chargingStation.getAutomaticTransactionGeneratorConfiguration()
+            ?.minDelayBetweenTwoTransactions ?? 0,
+          (this.chargingStation.getAutomaticTransactionGeneratorConfiguration()
+            ?.maxDelayBetweenTwoTransactions ?? 0) + 1
         )
       )
       logger.info(`${this.logPrefix(connectorId)} waiting for ${formatDurationMilliSeconds(wait)}`)
@@ -305,21 +309,20 @@ export class AutomaticTransactionGenerator {
       const start = secureRandom()
       if (
         start <
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        this.chargingStation.getAutomaticTransactionGeneratorConfiguration()!.probabilityOfStart
+        (this.chargingStation.getAutomaticTransactionGeneratorConfiguration()?.probabilityOfStart ??
+          0)
       ) {
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        this.connectorsStatus.get(connectorId)!.skippedConsecutiveTransactions = 0
+        connectorStatus.skippedConsecutiveTransactions = 0
         // Start transaction
         const startResponse = await this.startTransaction(connectorId)
         if (startResponse?.accepted === true) {
           // Wait until end of transaction
           const waitTrxEnd = secondsToMilliseconds(
             randomInt(
-              // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-              this.chargingStation.getAutomaticTransactionGeneratorConfiguration()!.minDuration,
-              // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-              this.chargingStation.getAutomaticTransactionGeneratorConfiguration()!.maxDuration + 1
+              this.chargingStation.getAutomaticTransactionGeneratorConfiguration()?.minDuration ??
+                0,
+              (this.chargingStation.getAutomaticTransactionGeneratorConfiguration()?.maxDuration ??
+                0) + 1
             )
           )
           logger.info(
@@ -332,37 +335,25 @@ export class AutomaticTransactionGenerator {
           await this.stopTransaction(connectorId)
         }
       } else {
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        ++this.connectorsStatus.get(connectorId)!.skippedConsecutiveTransactions
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        ++this.connectorsStatus.get(connectorId)!.skippedTransactions
+        ++connectorStatus.skippedConsecutiveTransactions
+        ++connectorStatus.skippedTransactions
         logger.info(
-          // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
-          `${this.logPrefix(connectorId)} skipped consecutively ${this.connectorsStatus
-            .get(connectorId)
-            ?.skippedConsecutiveTransactions.toString()
-          // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
-          }/${this.connectorsStatus.get(connectorId)?.skippedTransactions.toString()} transaction(s)`
+          `${this.logPrefix(connectorId)} skipped consecutively ${connectorStatus.skippedConsecutiveTransactions.toString()}/${connectorStatus.skippedTransactions.toString()} transaction(s)`
         )
       }
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      this.connectorsStatus.get(connectorId)!.lastRunDate = new Date()
+      connectorStatus.lastRunDate = new Date()
     }
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    this.connectorsStatus.get(connectorId)!.stoppedDate = new Date()
+    connectorStatus.stoppedDate = new Date()
     logger.info(
       `${this.logPrefix(
         connectorId
       )} stopped on connector and lasted for ${formatDurationMilliSeconds(
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        this.connectorsStatus.get(connectorId)!.stoppedDate!.getTime() -
-          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-          this.connectorsStatus.get(connectorId)!.startDate!.getTime()
+        connectorStatus.stoppedDate.getTime() - (connectorStatus.startDate?.getTime() ?? 0)
       )}`
     )
     logger.debug(
       `${this.logPrefix(connectorId)} stopped with connector status: %j`,
-      this.connectorsStatus.get(connectorId)
+      connectorStatus
     )
     this.chargingStation.emitChargingStationEvent(ChargingStationEvents.updated)
   }
@@ -381,28 +372,23 @@ export class AutomaticTransactionGenerator {
     stopAbsoluteDuration = this.chargingStation.getAutomaticTransactionGeneratorConfiguration()
       ?.stopAbsoluteDuration
   ): void {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    this.connectorsStatus.get(connectorId)!.startDate = new Date()
-    if (
-      stopAbsoluteDuration === false ||
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      !isValidDate(this.connectorsStatus.get(connectorId)!.stopDate)
-    ) {
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      this.connectorsStatus.get(connectorId)!.stopDate = new Date(
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        this.connectorsStatus.get(connectorId)!.startDate!.getTime() +
+    const connectorStatus = this.connectorsStatus.get(connectorId)
+    if (connectorStatus == null) {
+      return
+    }
+    connectorStatus.startDate = new Date()
+    if (stopAbsoluteDuration === false || !isValidDate(connectorStatus.stopDate)) {
+      connectorStatus.stopDate = new Date(
+        connectorStatus.startDate.getTime() +
           hoursToMilliseconds(
-            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-            this.chargingStation.getAutomaticTransactionGeneratorConfiguration()!.stopAfterHours
+            this.chargingStation.getAutomaticTransactionGeneratorConfiguration()?.stopAfterHours ??
+              0
           )
       )
     }
-    delete this.connectorsStatus.get(connectorId)?.stoppedDate
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    this.connectorsStatus.get(connectorId)!.skippedConsecutiveTransactions = 0
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    this.connectorsStatus.get(connectorId)!.start = true
+    delete connectorStatus.stoppedDate
+    connectorStatus.skippedConsecutiveTransactions = 0
+    connectorStatus.start = true
     this.chargingStation.emitChargingStationEvent(ChargingStationEvents.updated)
   }
 
@@ -437,8 +423,8 @@ export class AutomaticTransactionGenerator {
     let result: StartTransactionResult | undefined
     if (this.chargingStation.hasIdTags()) {
       const idTag = IdTagsCache.getInstance().getIdTag(
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        this.chargingStation.getAutomaticTransactionGeneratorConfiguration()!.idTagDistribution!,
+        this.chargingStation.getAutomaticTransactionGeneratorConfiguration()?.idTagDistribution ??
+          IdTagDistribution.ROUND_ROBIN,
         this.chargingStation,
         connectorId
       )
@@ -446,19 +432,23 @@ export class AutomaticTransactionGenerator {
         connectorId
       )} start transaction with an idTag '${idTag}'`
       if (this.getRequireAuthorize()) {
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        ++this.connectorsStatus.get(connectorId)!.authorizeRequests
+        const connectorStatus = this.connectorsStatus.get(connectorId)
+        if (connectorStatus != null) {
+          ++connectorStatus.authorizeRequests
+        }
         if (await isIdTagAuthorized(this.chargingStation, connectorId, idTag)) {
-          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-          ++this.connectorsStatus.get(connectorId)!.acceptedAuthorizeRequests
+          if (connectorStatus != null) {
+            ++connectorStatus.acceptedAuthorizeRequests
+          }
           logger.info(startTransactionLogMsg)
           result = await startTransactionOnConnector(this.chargingStation, connectorId, idTag)
           this.handleStartTransactionResult(connectorId, result)
           PerformanceStatistics.endMeasure(measureId, beginId)
           return result
         }
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        ++this.connectorsStatus.get(connectorId)!.rejectedAuthorizeRequests
+        if (connectorStatus != null) {
+          ++connectorStatus.rejectedAuthorizeRequests
+        }
         PerformanceStatistics.endMeasure(measureId, beginId)
         return result
       }
@@ -508,14 +498,14 @@ export class AutomaticTransactionGenerator {
           ?.transactionId?.toString()}`
       )
       result = await stopTransactionOnConnector(this.chargingStation, connectorId, reason)
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      ++this.connectorsStatus.get(connectorId)!.stopTransactionRequests
-      if (result.accepted) {
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        ++this.connectorsStatus.get(connectorId)!.acceptedStopTransactionRequests
-      } else {
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        ++this.connectorsStatus.get(connectorId)!.rejectedStopTransactionRequests
+      const connectorStatus = this.connectorsStatus.get(connectorId)
+      if (connectorStatus != null) {
+        ++connectorStatus.stopTransactionRequests
+        if (result.accepted) {
+          ++connectorStatus.acceptedStopTransactionRequests
+        } else {
+          ++connectorStatus.rejectedStopTransactionRequests
+        }
       }
     } else {
       const transactionId = this.chargingStation.getConnectorStatus(connectorId)?.transactionId
index e30798d039ab0a53d64b731fabf5a7286c886144..36f3ff68dd72fdf87e6aa82cff8be49ed2ec5816 100644 (file)
@@ -787,9 +787,7 @@ export const getChargingStationChargingProfilesLimit = (
     const chargingProfilesLimit = getChargingProfilesLimit(chargingStation, 0, chargingProfiles)
     if (chargingProfilesLimit != null) {
       const limit = buildChargingProfilesLimit(chargingStation, chargingProfilesLimit)
-      const chargingStationMaximumPower =
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        chargingStation.stationInfo!.maximumPower!
+      const chargingStationMaximumPower = chargingStation.stationInfo?.maximumPower ?? 0
       if (limit > chargingStationMaximumPower) {
         logger.error(
           `${chargingStation.logPrefix()} ${moduleName}.getChargingStationChargingProfilesLimit: Charging profile id ${getChargingProfileId(chargingProfilesLimit.chargingProfile)} limit ${limit.toString()} is greater than charging station maximum ${chargingStationMaximumPower.toString()}: %j`,
@@ -853,8 +851,7 @@ export const getConnectorChargingProfilesLimit = (
     if (chargingProfilesLimit != null) {
       const limit = buildChargingProfilesLimit(chargingStation, chargingProfilesLimit)
       const connectorMaximumPower =
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        chargingStation.stationInfo!.maximumPower! / chargingStation.powerDivider!
+        (chargingStation.stationInfo?.maximumPower ?? 0) / (chargingStation.powerDivider ?? 1)
       if (limit > connectorMaximumPower) {
         logger.error(
           `${chargingStation.logPrefix()} ${moduleName}.getConnectorChargingProfilesLimit: Charging profile id ${getChargingProfileId(chargingProfilesLimit.chargingProfile)} limit ${limit.toString()} is greater than connector ${connectorId.toString()} maximum ${connectorMaximumPower.toString()}: %j`,
index 8e982e0d56b33329089bbff707fae33e0e4738ec..a73dcfa989839ab85f37fe9f7b68d322b38ed51f 100644 (file)
@@ -51,10 +51,11 @@ export class IdTagsCache {
     chargingStation: ChargingStation,
     connectorId: number
   ): string {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    const hashId = chargingStation.stationInfo!.hashId
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    const idTagsFile = getIdTagsFile(chargingStation.stationInfo!)!
+    if (chargingStation.stationInfo == null) {
+      return ''
+    }
+    const hashId = chargingStation.stationInfo.hashId
+    const idTagsFile = getIdTagsFile(chargingStation.stationInfo) ?? ''
     switch (distribution) {
       case IdTagDistribution.CONNECTOR_AFFINITY:
         return this.getConnectorAffinityIdTag(chargingStation, connectorId)
@@ -96,21 +97,20 @@ export class IdTagsCache {
   }
 
   private getConnectorAffinityIdTag (chargingStation: ChargingStation, connectorId: number): string {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    const file = getIdTagsFile(chargingStation.stationInfo!)!
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    const idTags = this.getIdTags(file)!
+    if (chargingStation.stationInfo == null) {
+      return ''
+    }
+    const file = getIdTagsFile(chargingStation.stationInfo) ?? ''
+    const idTags = this.getIdTags(file) ?? []
     const addressableKey = this.getIdTagsCacheIndexesAddressableKey(
       file,
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      chargingStation.stationInfo!.hashId
+      chargingStation.stationInfo.hashId
     )
     this.idTagsCachesAddressableIndexes.set(
       addressableKey,
       (chargingStation.index - 1 + (connectorId - 1)) % idTags.length
     )
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    return idTags[this.idTagsCachesAddressableIndexes.get(addressableKey)!]
+    return idTags[this.idTagsCachesAddressableIndexes.get(addressableKey) ?? 0]
   }
 
   private getIdTagsCache (file: string): string[] | undefined {
index d3b5c278a1b3237ecc37c92dcd4ab8a16c7b3766..2b37a86f4216bfe5d27c26d73aff465b5f320a0b 100644 (file)
@@ -486,8 +486,7 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
     const [uuid, command, requestPayload] = validatedMessageEvent.data as BroadcastChannelRequest
     if (
       requestPayload.hashIds != null &&
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      !requestPayload.hashIds.includes(this.chargingStation.stationInfo!.hashId)
+      !requestPayload.hashIds.includes(this.chargingStation.stationInfo?.hashId ?? '')
     ) {
       return
     }
index df6c1536422384f2b07f632b89c69670ef753ee0..4021c0c5da8fd87037c20e848600574fd24d6e09 100644 (file)
@@ -257,8 +257,12 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       ) => {
         if (response.status === GenericStatus.Accepted) {
           const { connectorId, idTag } = request
-          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-          chargingStation.getConnectorStatus(connectorId!)!.transactionRemoteStarted = true
+          if (connectorId != null) {
+            const connectorStatus = chargingStation.getConnectorStatus(connectorId)
+            if (connectorStatus != null) {
+              connectorStatus.transactionRemoteStarted = true
+            }
+          }
           chargingStation.ocppRequestService
             .requestHandler<Partial<OCPP16StartTransactionRequest>, OCPP16StartTransactionResponse>(
               chargingStation,
@@ -306,8 +310,10 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       ) => {
         if (response.status === GenericStatus.Accepted) {
           const { transactionId } = request
-          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-          const connectorId = chargingStation.getConnectorIdByTransactionId(transactionId)!
+          const connectorId = chargingStation.getConnectorIdByTransactionId(transactionId)
+          if (connectorId == null) {
+            return
+          }
           OCPP16ServiceUtils.remoteStopTransaction(chargingStation, connectorId)
             .then(response => {
               if (response.status === GenericStatus.Accepted) {
@@ -679,15 +685,16 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       )
       return OCPP16Constants.OCPP_CANCEL_RESERVATION_RESPONSE_ACCEPTED
     } catch (error) {
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      return handleIncomingRequestError<GenericResponse>(
-        chargingStation,
-        OCPP16IncomingRequestCommand.CANCEL_RESERVATION,
-        ensureError(error),
-        {
-          errorResponse: OCPP16Constants.OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED,
-        }
-      )!
+      return (
+        handleIncomingRequestError<GenericResponse>(
+          chargingStation,
+          OCPP16IncomingRequestCommand.CANCEL_RESERVATION,
+          ensureError(error),
+          {
+            errorResponse: OCPP16Constants.OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED,
+          }
+        ) ?? OCPP16Constants.OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED
+      )
     }
   }
 
@@ -725,8 +732,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
           type
         )
       }
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      return response!
+      return response ?? OCPP16Constants.OCPP_AVAILABILITY_RESPONSE_ACCEPTED
     } else if (
       connectorId > 0 &&
       (chargingStation.isChargingStationAvailable() ||
@@ -734,12 +740,16 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
           type === OCPP16AvailabilityType.Inoperative))
     ) {
       if (chargingStation.getConnectorStatus(connectorId)?.transactionStarted === true) {
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        chargingStation.getConnectorStatus(connectorId)!.availability = type
+        const connectorStatus = chargingStation.getConnectorStatus(connectorId)
+        if (connectorStatus != null) {
+          connectorStatus.availability = type
+        }
         return OCPP16Constants.OCPP_AVAILABILITY_RESPONSE_SCHEDULED
       }
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      chargingStation.getConnectorStatus(connectorId)!.availability = type
+      const connectorStatus = chargingStation.getConnectorStatus(connectorId)
+      if (connectorStatus != null) {
+        connectorStatus.availability = type
+      }
       await OCPP16ServiceUtils.sendAndSetConnectorStatus(chargingStation, {
         connectorId,
         status: chargePointStatus,
@@ -843,8 +853,9 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
   }
 
   private handleRequestClearCache (chargingStation: ChargingStation): ClearCacheResponse {
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    if (chargingStation.idTagsCache.deleteIdTags(getIdTagsFile(chargingStation.stationInfo!)!)) {
+    const idTagsFile =
+      chargingStation.stationInfo != null ? getIdTagsFile(chargingStation.stationInfo) : undefined
+    if (idTagsFile != null && chargingStation.idTagsCache.deleteIdTags(idTagsFile)) {
       return OCPPConstants.OCPP_RESPONSE_ACCEPTED
     }
     return OCPPConstants.OCPP_RESPONSE_REJECTED
@@ -941,13 +952,14 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       }
       return OCPP16Constants.OCPP_DATA_TRANSFER_RESPONSE_ACCEPTED
     } catch (error) {
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      return handleIncomingRequestError<OCPP16DataTransferResponse>(
-        chargingStation,
-        OCPP16IncomingRequestCommand.DATA_TRANSFER,
-        ensureError(error),
-        { errorResponse: OCPP16Constants.OCPP_DATA_TRANSFER_RESPONSE_REJECTED }
-      )!
+      return (
+        handleIncomingRequestError<OCPP16DataTransferResponse>(
+          chargingStation,
+          OCPP16IncomingRequestCommand.DATA_TRANSFER,
+          ensureError(error),
+          { errorResponse: OCPP16Constants.OCPP_DATA_TRANSFER_RESPONSE_REJECTED }
+        ) ?? OCPP16Constants.OCPP_DATA_TRANSFER_RESPONSE_REJECTED
+      )
     }
   }
 
@@ -1045,8 +1057,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     const configurationKey: OCPPConfigurationKey[] = []
     const unknownKey: string[] = []
     if (key == null || isEmpty(key)) {
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      for (const configKey of chargingStation.ocppConfiguration!.configurationKey!) {
+      for (const configKey of chargingStation.ocppConfiguration?.configurationKey ?? []) {
         if (!OCPP16ServiceUtils.isConfigurationKeyVisible(configKey)) {
           continue
         }
@@ -1129,8 +1140,9 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
                 info.bytes / 1024
               ).toString()} bytes transferred from diagnostics archive ${info.name}`
             )
-            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-            chargingStation.stationInfo!.diagnosticsStatus = OCPP16DiagnosticsStatus.Uploading
+            if (chargingStation.stationInfo != null) {
+              chargingStation.stationInfo.diagnosticsStatus = OCPP16DiagnosticsStatus.Uploading
+            }
             chargingStation.ocppRequestService
               .requestHandler<
                 OCPP16DiagnosticsStatusNotificationRequest,
@@ -1158,8 +1170,9 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
             >(chargingStation, OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION, {
               status: OCPP16DiagnosticsStatus.Uploaded,
             })
-            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-            chargingStation.stationInfo!.diagnosticsStatus = OCPP16DiagnosticsStatus.Uploaded
+            if (chargingStation.stationInfo != null) {
+              chargingStation.stationInfo.diagnosticsStatus = OCPP16DiagnosticsStatus.Uploaded
+            }
             ftpClient.close()
             return { fileName: diagnosticsArchive }
           }
@@ -1182,16 +1195,18 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
         >(chargingStation, OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION, {
           status: OCPP16DiagnosticsStatus.UploadFailed,
         })
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        chargingStation.stationInfo!.diagnosticsStatus = OCPP16DiagnosticsStatus.UploadFailed
+        if (chargingStation.stationInfo != null) {
+          chargingStation.stationInfo.diagnosticsStatus = OCPP16DiagnosticsStatus.UploadFailed
+        }
         ftpClient?.close()
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        return handleIncomingRequestError<GetDiagnosticsResponse>(
-          chargingStation,
-          OCPP16IncomingRequestCommand.GET_DIAGNOSTICS,
-          ensureError(error),
-          { errorResponse: OCPP16Constants.OCPP_RESPONSE_EMPTY }
-        )!
+        return (
+          handleIncomingRequestError<GetDiagnosticsResponse>(
+            chargingStation,
+            OCPP16IncomingRequestCommand.GET_DIAGNOSTICS,
+            ensureError(error),
+            { errorResponse: OCPP16Constants.OCPP_RESPONSE_EMPTY }
+          ) ?? OCPP16Constants.OCPP_RESPONSE_EMPTY
+        )
       }
     } else {
       logger.warn(
@@ -1205,8 +1220,9 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       >(chargingStation, OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION, {
         status: OCPP16DiagnosticsStatus.UploadFailed,
       })
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      chargingStation.stationInfo!.diagnosticsStatus = OCPP16DiagnosticsStatus.UploadFailed
+      if (chargingStation.stationInfo != null) {
+        chargingStation.stationInfo.diagnosticsStatus = OCPP16DiagnosticsStatus.UploadFailed
+      }
       return OCPP16Constants.OCPP_RESPONSE_EMPTY
     }
   }
@@ -1332,8 +1348,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     ) {
       return OCPP16Constants.OCPP_RESERVATION_RESPONSE_REJECTED
     }
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    commandPayload.expiryDate = convertToDate(commandPayload.expiryDate)!
+    commandPayload.expiryDate = convertToDate(commandPayload.expiryDate) ?? new Date()
     const { connectorId, idTag, reservationId } = commandPayload
     if (!chargingStation.hasConnector(connectorId)) {
       logger.warn(
@@ -1350,8 +1365,10 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     if (!(await OCPPServiceUtils.isIdTagAuthorizedUnified(chargingStation, connectorId, idTag))) {
       return OCPP16Constants.OCPP_RESERVATION_RESPONSE_REJECTED
     }
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    const connectorStatus = chargingStation.getConnectorStatus(connectorId)!
+    const connectorStatus = chargingStation.getConnectorStatus(connectorId)
+    if (connectorStatus == null) {
+      return OCPP16Constants.OCPP_RESERVATION_RESPONSE_REJECTED
+    }
     resetAuthorizeConnectorStatus(connectorStatus)
     let response: OCPP16ReserveNowResponse
     try {
@@ -1390,15 +1407,18 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
       }
       return response
     } catch (error) {
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      chargingStation.getConnectorStatus(connectorId)!.status = OCPP16ChargePointStatus.Available
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      return handleIncomingRequestError<OCPP16ReserveNowResponse>(
-        chargingStation,
-        OCPP16IncomingRequestCommand.RESERVE_NOW,
-        ensureError(error),
-        { errorResponse: OCPP16Constants.OCPP_RESERVATION_RESPONSE_FAULTED }
-      )!
+      const errorConnectorStatus = chargingStation.getConnectorStatus(connectorId)
+      if (errorConnectorStatus != null) {
+        errorConnectorStatus.status = OCPP16ChargePointStatus.Available
+      }
+      return (
+        handleIncomingRequestError<OCPP16ReserveNowResponse>(
+          chargingStation,
+          OCPP16IncomingRequestCommand.RESERVE_NOW,
+          ensureError(error),
+          { errorResponse: OCPP16Constants.OCPP_RESERVATION_RESPONSE_FAULTED }
+        ) ?? OCPP16Constants.OCPP_RESERVATION_RESPONSE_FAULTED
+      )
     }
   }
 
@@ -1423,8 +1443,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     })
     logger.info(
       `${chargingStation.logPrefix()} ${moduleName}.handleRequestReset: ${type} reset request received, simulating it. The station will be back online in ${formatDurationMilliSeconds(
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        chargingStation.stationInfo!.resetTime!
+        chargingStation.stationInfo?.resetTime ?? 0
       )}`
     )
     return OCPP16Constants.OCPP_RESPONSE_ACCEPTED
@@ -1690,8 +1709,9 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     >(chargingStation, OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION, {
       status: OCPP16FirmwareStatus.Downloading,
     })
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    chargingStation.stationInfo!.firmwareStatus = OCPP16FirmwareStatus.Downloading
+    if (chargingStation.stationInfo != null) {
+      chargingStation.stationInfo.firmwareStatus = OCPP16FirmwareStatus.Downloading
+    }
     if (
       chargingStation.stationInfo?.firmwareUpgrade?.failureStatus ===
       OCPP16FirmwareStatus.DownloadFailed
@@ -1714,8 +1734,9 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     >(chargingStation, OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION, {
       status: OCPP16FirmwareStatus.Downloaded,
     })
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    chargingStation.stationInfo!.firmwareStatus = OCPP16FirmwareStatus.Downloaded
+    if (chargingStation.stationInfo != null) {
+      chargingStation.stationInfo.firmwareStatus = OCPP16FirmwareStatus.Downloaded
+    }
     let wasTransactionsStarted = false
     let transactionsStarted: boolean
     do {
@@ -1772,8 +1793,9 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService {
     >(chargingStation, OCPP16RequestCommand.FIRMWARE_STATUS_NOTIFICATION, {
       status: OCPP16FirmwareStatus.Installing,
     })
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    chargingStation.stationInfo!.firmwareStatus = OCPP16FirmwareStatus.Installing
+    if (chargingStation.stationInfo != null) {
+      chargingStation.stationInfo.firmwareStatus = OCPP16FirmwareStatus.Installing
+    }
     if (
       chargingStation.stationInfo?.firmwareUpgrade?.failureStatus ===
       OCPP16FirmwareStatus.InstallationFailed
index ce8d399363a376d90d0bb2bdbfca5796d7efb08a..e7af6f4d1892a63fce541e0a0a8cf9dae52c0b65 100644 (file)
@@ -42,8 +42,7 @@ export class UIServerFactory {
     }
     if (
       uiServerConfiguration.authentication?.enabled !== true &&
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      !isLoopback(uiServerConfiguration.options!.host!)
+      !isLoopback(uiServerConfiguration.options?.host ?? '')
     ) {
       const logMsg = `Non loopback address in '${ConfigurationSection.uiServer}' configuration section without authentication enabled. This is not recommended`
       logger.warn(`${UIServerFactory.logPrefix()} ${logMsg}`)
index 2048d9914cf13cc040fbcd5e60af34cbbe4fe295..1b1adf92c1cd84e9ca2f64bb6e458e5c9a066442 100644 (file)
@@ -178,10 +178,12 @@ export class Configuration {
     if (
       Configuration.getConfigurationData()?.['supervisionURLs' as keyof ConfigurationData] != null
     ) {
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      Configuration.getConfigurationData()!.supervisionUrls = Configuration.getConfigurationData()![
-        'supervisionURLs' as keyof ConfigurationData
-      ] as string | string[]
+      const configData = Configuration.getConfigurationData()
+      if (configData != null) {
+        configData.supervisionUrls = configData['supervisionURLs' as keyof ConfigurationData] as
+          | string
+          | string[]
+      }
     }
     return Configuration.getConfigurationData()?.supervisionUrls
   }
@@ -262,8 +264,7 @@ export class Configuration {
           Configuration.getConfigurationData()?.performanceStorage?.type === StorageType.SQLITE) &&
           Configuration.getConfigurationData()?.performanceStorage?.uri != null && {
           uri: buildPerformanceUriFilePath(
-            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-            new URL(Configuration.getConfigurationData()!.performanceStorage!.uri!).pathname
+            new URL(Configuration.getConfigurationData()?.performanceStorage?.uri ?? '').pathname
           ),
         }),
       }
@@ -276,14 +277,14 @@ export class Configuration {
     if (has(ConfigurationSection.uiServer, Configuration.getConfigurationData())) {
       uiServerConfiguration = mergeDeepRight<UIServerConfiguration, Partial<UIServerConfiguration>>(
         uiServerConfiguration,
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        Configuration.getConfigurationData()!.uiServer!
+        Configuration.getConfigurationData()?.uiServer ?? defaultUIServerConfiguration
       )
     }
     if (isCFEnvironment()) {
       delete uiServerConfiguration.options?.host
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      uiServerConfiguration.options!.port = Number.parseInt(env.PORT!)
+      if (uiServerConfiguration.options != null) {
+        uiServerConfiguration.options.port = Number.parseInt(env.PORT ?? '')
+      }
     }
     return uiServerConfiguration
   }
@@ -478,14 +479,17 @@ export class Configuration {
       Configuration.warnDeprecatedConfigurationKey(key, section, msg)
     }
     // station template url(s) remapping
-    Configuration.getConfigurationData()?.['stationTemplateURLs' as keyof ConfigurationData] !=
-      null &&
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      (Configuration.getConfigurationData()!.stationTemplateUrls =
-        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-        Configuration.getConfigurationData()![
+    if (
+      Configuration.getConfigurationData()?.['stationTemplateURLs' as keyof ConfigurationData] !=
+      null
+    ) {
+      const configData = Configuration.getConfigurationData()
+      if (configData != null) {
+        configData.stationTemplateUrls = configData[
           'stationTemplateURLs' as keyof ConfigurationData
-        ] as StationTemplateUrl[])
+        ] as StationTemplateUrl[]
+      }
+    }
     Configuration.getConfigurationData()?.stationTemplateUrls.forEach(
       (stationTemplateUrl: StationTemplateUrl) => {
         if (stationTemplateUrl['numberOfStation' as keyof StationTemplateUrl] != null) {
@@ -529,8 +533,7 @@ export class Configuration {
       return watch(Configuration.configurationFile, (event, filename): void => {
         if (
           !Configuration.configurationFileReloading &&
-          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-          filename!.trim().length > 0 &&
+          (filename?.trim().length ?? 0) > 0 &&
           event === 'change'
         ) {
           Configuration.configurationFileReloading = true