From: Jérôme Benoit Date: Tue, 24 Mar 2026 16:19:37 +0000 (+0100) Subject: refactor: eliminate non-null assertions in 8 files (31 of 53 total) X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=092b1b4aad1092fd8aed9aec6e54744eaaa7b56c;p=e-mobility-charging-stations-simulator.git refactor: eliminate non-null assertions in 8 files (31 of 53 total) - 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 --- diff --git a/src/charging-station/AutomaticTransactionGenerator.ts b/src/charging-station/AutomaticTransactionGenerator.ts index 32158dc8..4b81f25e 100644 --- a/src/charging-station/AutomaticTransactionGenerator.ts +++ b/src/charging-station/AutomaticTransactionGenerator.ts @@ -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( - // 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(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 { 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 diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index e30798d0..36f3ff68 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -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`, diff --git a/src/charging-station/IdTagsCache.ts b/src/charging-station/IdTagsCache.ts index 8e982e0d..a73dcfa9 100644 --- a/src/charging-station/IdTagsCache.ts +++ b/src/charging-station/IdTagsCache.ts @@ -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 { diff --git a/src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts b/src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts index d3b5c278..2b37a86f 100644 --- a/src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts +++ b/src/charging-station/broadcast-channel/ChargingStationWorkerBroadcastChannel.ts @@ -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 } diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index df6c1536..4021c0c5 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -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, 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( - chargingStation, - OCPP16IncomingRequestCommand.CANCEL_RESERVATION, - ensureError(error), - { - errorResponse: OCPP16Constants.OCPP_CANCEL_RESERVATION_RESPONSE_REJECTED, - } - )! + return ( + handleIncomingRequestError( + 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( - chargingStation, - OCPP16IncomingRequestCommand.DATA_TRANSFER, - ensureError(error), - { errorResponse: OCPP16Constants.OCPP_DATA_TRANSFER_RESPONSE_REJECTED } - )! + return ( + handleIncomingRequestError( + 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( - chargingStation, - OCPP16IncomingRequestCommand.GET_DIAGNOSTICS, - ensureError(error), - { errorResponse: OCPP16Constants.OCPP_RESPONSE_EMPTY } - )! + return ( + handleIncomingRequestError( + 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( - 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( + 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 diff --git a/src/charging-station/ui-server/UIServerFactory.ts b/src/charging-station/ui-server/UIServerFactory.ts index ce8d3993..e7af6f4d 100644 --- a/src/charging-station/ui-server/UIServerFactory.ts +++ b/src/charging-station/ui-server/UIServerFactory.ts @@ -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}`) diff --git a/src/utils/Configuration.ts b/src/utils/Configuration.ts index 2048d991..1b1adf92 100644 --- a/src/utils/Configuration.ts +++ b/src/utils/Configuration.ts @@ -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, - // 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