From f2fe22cada0c10ff63eb5d0ee6ca8f79a74de430 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 11 May 2026 20:43:22 +0200 Subject: [PATCH] refactor: remove unnecessary type assertions across monorepo - Remove all @typescript-eslint/no-unnecessary-type-assertion violations - Add assertIsJsonObject/isJsonObject utilities for runtime-safe narrowing - Restructure OCPP16RequestService.buildRequestPayload with proper runtime validation (assertIsJsonObject + OCPPError) replacing unsafe cast - Use _syncResult assignment pattern in OCPPResponseService for no-floating-promises compliance while preserving isAsyncFunction pattern - Refine AsyncLock.runExclusive fn parameter as union of function types for proper isAsyncFunction type guard narrowing - Configure varsIgnorePattern: '^_' for @typescript-eslint/no-unused-vars - Remove unused type imports in test files --- eslint.config.js | 15 ++++++ .../ocpp/1.6/OCPP16IncomingRequestService.ts | 5 +- .../ocpp/1.6/OCPP16RequestService.ts | 49 +++++++++++-------- .../ocpp/1.6/OCPP16ResponseService.ts | 2 +- .../ocpp/1.6/OCPP16ServiceUtils.ts | 12 ++--- .../ocpp/2.0/OCPP20CertificateManager.ts | 6 +-- .../ocpp/2.0/OCPP20IncomingRequestService.ts | 9 ++-- .../ocpp/2.0/OCPP20RequestService.ts | 1 - .../ocpp/2.0/OCPP20ResponseService.ts | 2 +- .../ocpp/2.0/OCPP20VariableRegistry.ts | 2 +- .../OCPP20RequestServiceTestable.ts | 2 +- .../ocpp/OCPPResponseService.ts | 8 +-- src/charging-station/ocpp/OCPPServiceUtils.ts | 18 +++---- .../ocpp/auth/adapters/OCPP20AuthAdapter.ts | 2 +- src/performance/storage/MongoDBStorage.ts | 2 +- src/utils/AsyncLock.ts | 7 ++- .../ChargingStationConfigurationUtils.ts | 2 +- src/utils/Utils.ts | 39 ++++++++++++--- src/utils/index.ts | 2 + .../ChargingStation-Resilience.test.ts | 2 +- .../ConfigurationKeyUtils.test.ts | 10 ++-- tests/charging-station/Helpers.test.ts | 19 +++---- tests/charging-station/SharedLRUCache.test.ts | 2 +- .../helpers/StationHelpers.ts | 2 +- .../OCPP16RequestService-CallChain.test.ts | 6 +-- ...PP16ResponseService-SimpleHandlers.test.ts | 2 +- .../OCPP16ServiceUtils-MeterValues.test.ts | 8 +-- .../ocpp/1.6/OCPP16ServiceUtils.test.ts | 4 +- .../ocpp/1.6/OCPP16TestUtils.ts | 20 ++------ ...ngRequestService-CertificateSigned.test.ts | 2 +- ...equestService-GetTransactionStatus.test.ts | 4 +- ...mingRequestService-RemoteStartAuth.test.ts | 3 +- ...mingRequestService-UnlockConnector.test.ts | 2 +- ...omingRequestService-UpdateFirmware.test.ts | 6 +-- .../OCPP20RequestService-CallChain.test.ts | 2 +- .../OCPP20RequestService-NotifyReport.test.ts | 2 +- ...20ResponseService-BootNotification.test.ts | 6 +-- ...PP20ResponseService-SimpleHandlers.test.ts | 17 +++---- ...0ServiceUtils-PostTransactionDelay.test.ts | 2 +- .../ocpp/2.0/OCPP20VariableManager.test.ts | 12 ++--- .../ocpp/OCPPServiceOperations.test.ts | 8 +-- .../ocpp/OCPPServiceUtils-pure.test.ts | 5 +- .../ui-server/UIHttpServer.test.ts | 2 +- .../ui-server/UIMCPServer.test.ts | 9 +--- .../storage/MikroOrmStorage.test.ts | 2 +- .../storage/MongoDBStorage.test.ts | 6 +-- .../performance/storage/StorageTestHelpers.ts | 2 +- .../ChargingStationConfigurationUtils.test.ts | 36 +++++++------- tests/utils/Configuration.test.ts | 2 +- ui/cli/src/client/ws-adapter.ts | 2 +- ui/cli/src/commands/atg.ts | 4 +- ui/cli/src/commands/ocpp.ts | 2 +- ui/cli/src/commands/station.ts | 4 +- ui/cli/src/commands/supervision.ts | 2 +- ui/cli/src/config/loader.ts | 2 +- ui/cli/tests/format.test.ts | 2 +- ui/cli/tests/helpers.ts | 4 +- ui/cli/tests/ws-adapter.test.ts | 2 +- ui/common/src/client/WebSocketClient.ts | 2 +- ui/common/src/client/adapter.ts | 2 +- ui/common/tests/adapter.test.ts | 10 ++-- ui/common/tests/browser-adapter.test.ts | 14 +++--- .../unit/shared/composables/useTheme.test.ts | 2 +- .../unit/skins/modern/ConnectorRow.test.ts | 4 +- .../tests/unit/skins/modern/Dialogs.test.ts | 4 +- 65 files changed, 225 insertions(+), 227 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index ab053f25..0a32bbc9 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -200,6 +200,21 @@ export default defineConfig([ ...neostandard({ ts: true, }), + { + files: ['**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts', '**/*.vue'], + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { + args: 'none', + caughtErrors: 'none', + ignoreRestSiblings: true, + vars: 'all', + varsIgnorePattern: '^_', + }, + ], + }, + }, { files: [ 'src/charging-station/Bootstrap.ts', diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index 090458b7..f65bc5ac 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -597,10 +597,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { chargingStation: ChargingStation, commandName: IncomingRequestCommand ): boolean { - return isIncomingRequestCommandSupported( - chargingStation, - commandName as OCPP16IncomingRequestCommand - ) + return isIncomingRequestCommandSupported(chargingStation, commandName) } private composeCompositeSchedule ( diff --git a/src/charging-station/ocpp/1.6/OCPP16RequestService.ts b/src/charging-station/ocpp/1.6/OCPP16RequestService.ts index 01662f6e..43e34113 100644 --- a/src/charging-station/ocpp/1.6/OCPP16RequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16RequestService.ts @@ -7,7 +7,6 @@ import { OCPPError } from '../../../exception/index.js' import { ChargePointErrorCode, ErrorType, - type JsonObject, type JsonType, OCPP16ChargePointStatus, type OCPP16MeterValue, @@ -17,7 +16,7 @@ import { OCPPVersion, type RequestParams, } from '../../../types/index.js' -import { generateUUID, logger } from '../../../utils/index.js' +import { assertIsJsonObject, generateUUID, logger } from '../../../utils/index.js' import { sendAndSetConnectorStatus } from '../OCPPConnectorStatusOperations.js' import { OCPPRequestService } from '../OCPPRequestService.js' import { createPayloadValidatorMap, isRequestCommandSupported } from '../OCPPServiceUtils.js' @@ -170,16 +169,10 @@ export class OCPP16RequestService extends OCPPRequestService { ): Request { let connectorId: number | undefined let energyActiveImportRegister: number - commandParams = commandParams as JsonObject logger.debug( `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building '${commandName}' payload` ) switch (commandName) { - case OCPP16RequestCommand.AUTHORIZE: - return { - idTag: OCPP16Constants.OCPP_DEFAULT_IDTAG, - ...commandParams, - } as unknown as Request case OCPP16RequestCommand.BOOT_NOTIFICATION: case OCPP16RequestCommand.DATA_TRANSFER: case OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION: @@ -188,41 +181,57 @@ export class OCPP16RequestService extends OCPPRequestService { return commandParams as unknown as Request case OCPP16RequestCommand.HEARTBEAT: return OCPP16Constants.OCPP_REQUEST_EMPTY as unknown as Request + } + assertIsJsonObject( + commandParams, + new OCPPError( + ErrorType.PROTOCOL_ERROR, + `'${commandName}' command requires object parameters`, + commandName + ) + ) + const params = commandParams + switch (commandName) { + case OCPP16RequestCommand.AUTHORIZE: + return { + idTag: OCPP16Constants.OCPP_DEFAULT_IDTAG, + ...params, + } as unknown as Request case OCPP16RequestCommand.START_TRANSACTION: return { idTag: OCPP16Constants.OCPP_DEFAULT_IDTAG, meterStart: chargingStation.getEnergyActiveImportRegisterByConnectorId( - commandParams.connectorId as number, + params.connectorId as number, true ), timestamp: new Date(), ...(OCPP16ServiceUtils.hasReservation( chargingStation, - commandParams.connectorId as number, - commandParams.idTag as string + params.connectorId as number, + params.idTag as string ) && { reservationId: chargingStation.getReservationBy( 'connectorId', chargingStation.getConnectorStatus(0)?.status === OCPP16ChargePointStatus.Reserved ? 0 - : (commandParams.connectorId as number) + : (params.connectorId as number) )?.reservationId, }), - ...commandParams, + ...params, } as unknown as Request case OCPP16RequestCommand.STATUS_NOTIFICATION: return OCPP16ServiceUtils.buildStatusNotificationRequest({ errorCode: ChargePointErrorCode.NO_ERROR, - ...commandParams, - } as unknown as OCPP16StatusNotificationRequest) as unknown as Request + ...params, + } as OCPP16StatusNotificationRequest) as unknown as Request case OCPP16RequestCommand.STOP_TRANSACTION: ;(chargingStation.stationInfo?.transactionDataMeterValues === true || OCPP16ServiceUtils.isSigningEnabled(chargingStation)) && (connectorId = chargingStation.getConnectorIdByTransactionId( - commandParams.transactionId as number + params.transactionId as number )) energyActiveImportRegister = chargingStation.getEnergyActiveImportRegisterByTransactionId( - commandParams.transactionId as number, + params.transactionId as number, true ) { @@ -261,11 +270,11 @@ export class OCPP16RequestService extends OCPPRequestService { } } return { - idTag: chargingStation.getTransactionIdTag(commandParams.transactionId as number), + idTag: chargingStation.getTransactionIdTag(params.transactionId as number), meterStop: energyActiveImportRegister, timestamp: new Date(), ...(transactionData != null && { transactionData }), - ...commandParams, + ...params, } as unknown as Request } default: { @@ -274,7 +283,7 @@ export class OCPP16RequestService extends OCPPRequestService { logger.error( `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: ${errorMsg}` ) - throw new OCPPError(ErrorType.NOT_SUPPORTED, errorMsg, commandName, commandParams) + throw new OCPPError(ErrorType.NOT_SUPPORTED, errorMsg, commandName, params) } } } diff --git a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts index a2a5d1a9..c046a819 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ResponseService.ts @@ -178,7 +178,7 @@ export class OCPP16ResponseService extends OCPPResponseService { chargingStation: ChargingStation, commandName: RequestCommand ): boolean { - return isRequestCommandSupported(chargingStation, commandName as OCPP16RequestCommand) + return isRequestCommandSupported(chargingStation, commandName) } private handleResponseAuthorize ( diff --git a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts index c0e2068d..5f3cd21b 100644 --- a/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts +++ b/src/charging-station/ocpp/1.6/OCPP16ServiceUtils.ts @@ -889,7 +889,7 @@ export class OCPP16ServiceUtils { connectorId, meterValue: [transactionEndMeterValue], transactionId, - } as MeterValuesRequest) + }) } return await chargingStation.ocppRequestService.requestHandler< Partial, @@ -1016,10 +1016,7 @@ export class OCPP16ServiceUtils { } return schedulePeriod }), - duration: differenceInSeconds( - chargingScheduleInterval.end, - compositeInterval.start as Date - ), + duration: differenceInSeconds(chargingScheduleInterval.end, compositeInterval.start), startSchedule: compositeInterval.start as Date, } } @@ -1032,10 +1029,7 @@ export class OCPP16ServiceUtils { compositeInterval ) ), - duration: differenceInSeconds( - compositeInterval.end as Date, - chargingScheduleInterval.start - ), + duration: differenceInSeconds(compositeInterval.end, chargingScheduleInterval.start), } } return chargingSchedule diff --git a/src/charging-station/ocpp/2.0/OCPP20CertificateManager.ts b/src/charging-station/ocpp/2.0/OCPP20CertificateManager.ts index 5f86dfba..689ef983 100644 --- a/src/charging-station/ocpp/2.0/OCPP20CertificateManager.ts +++ b/src/charging-station/ocpp/2.0/OCPP20CertificateManager.ts @@ -148,20 +148,20 @@ export class OCPP20CertificateManager { issuerPublicKeyDer = issuerCert.publicKey.export({ format: 'der', type: 'spki', - }) as Buffer + }) } else if (this.isSelfSignedCertificate(x509)) { // Self-signed certificate: issuer = subject, use the certificate's own public key issuerPublicKeyDer = x509.publicKey.export({ format: 'der', type: 'spki', - }) as Buffer + }) } else { // Non-self-signed without issuer cert: use subject's public key as fallback // This is technically incorrect per RFC 6960 but maintains backward compatibility issuerPublicKeyDer = x509.publicKey.export({ format: 'der', type: 'spki', - }) as Buffer + }) } const issuerKeyHash = hash(algorithmName, issuerPublicKeyDer, 'hex') diff --git a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts index b37ec067..6e063f93 100644 --- a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts +++ b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts @@ -977,10 +977,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { chargingStation: ChargingStation, commandName: IncomingRequestCommand ): boolean { - return isIncomingRequestCommandSupported( - chargingStation, - commandName as OCPP20IncomingRequestCommand - ) + return isIncomingRequestCommandSupported(chargingStation, commandName) } private async authorizeToken ( @@ -3689,8 +3686,8 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { // L01.FR.04: Simulate signature verification const simulateFailure = OCPP20ServiceUtils.readVariableAsBoolean( chargingStation, - OCPP20ComponentName.FirmwareCtrlr as string, - OCPP20VendorVariableName.SimulateSignatureVerificationFailure as string, + OCPP20ComponentName.FirmwareCtrlr, + OCPP20VendorVariableName.SimulateSignatureVerificationFailure, false ) diff --git a/src/charging-station/ocpp/2.0/OCPP20RequestService.ts b/src/charging-station/ocpp/2.0/OCPP20RequestService.ts index fd1d2797..5021ae37 100644 --- a/src/charging-station/ocpp/2.0/OCPP20RequestService.ts +++ b/src/charging-station/ocpp/2.0/OCPP20RequestService.ts @@ -148,7 +148,6 @@ export class OCPP20RequestService extends OCPPRequestService { commandName: OCPP20RequestCommand, commandParams?: JsonType ): Request { - commandParams = commandParams as JsonObject logger.debug( `${chargingStation.logPrefix()} ${moduleName}.buildRequestPayload: Building '${commandName}' payload` ) diff --git a/src/charging-station/ocpp/2.0/OCPP20ResponseService.ts b/src/charging-station/ocpp/2.0/OCPP20ResponseService.ts index facc618a..fb230a47 100644 --- a/src/charging-station/ocpp/2.0/OCPP20ResponseService.ts +++ b/src/charging-station/ocpp/2.0/OCPP20ResponseService.ts @@ -190,7 +190,7 @@ export class OCPP20ResponseService extends OCPPResponseService { chargingStation: ChargingStation, commandName: RequestCommand ): boolean { - return isRequestCommandSupported(chargingStation, commandName as OCPP20RequestCommand) + return isRequestCommandSupported(chargingStation, commandName) } private handleResponseAuthorize ( diff --git a/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts b/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts index cd700ca2..7cc9ec95 100644 --- a/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts +++ b/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts @@ -2588,7 +2588,7 @@ export function getVariableMetadata ( } return VARIABLE_REGISTRY_LOOKUP_CI[ buildCaseInsensitiveCompositeKey(component, undefined, variable) - ] as undefined | VariableMetadata + ] } /** diff --git a/src/charging-station/ocpp/2.0/__testable__/OCPP20RequestServiceTestable.ts b/src/charging-station/ocpp/2.0/__testable__/OCPP20RequestServiceTestable.ts index 60ddd640..6a04c01b 100644 --- a/src/charging-station/ocpp/2.0/__testable__/OCPP20RequestServiceTestable.ts +++ b/src/charging-station/ocpp/2.0/__testable__/OCPP20RequestServiceTestable.ts @@ -132,7 +132,7 @@ export function createTestableRequestService ( // Create typed wrapper for the mock const sendMessageMock: SendMessageMock = { - fn: mockFn as unknown as SendMessageFn, + fn: mockFn, mock: mockFn.mock as unknown as SendMessageMock['mock'], } diff --git a/src/charging-station/ocpp/OCPPResponseService.ts b/src/charging-station/ocpp/OCPPResponseService.ts index 2a276db7..21d248cc 100644 --- a/src/charging-station/ocpp/OCPPResponseService.ts +++ b/src/charging-station/ocpp/OCPPResponseService.ts @@ -81,13 +81,7 @@ export abstract class OCPPResponseService { if (isAsyncFunction(responseHandler)) { await responseHandler(chargingStation, payload, requestPayload) } else { - ;( - responseHandler as ( - chargingStation: ChargingStation, - payload: JsonType, - requestPayload?: JsonType - ) => void - )(chargingStation, payload, requestPayload) + const _syncResult = responseHandler(chargingStation, payload, requestPayload) } logger.debug( `${chargingStation.logPrefix()} ${this.moduleName}.responseHandler: '${commandName}' response processed successfully` diff --git a/src/charging-station/ocpp/OCPPServiceUtils.ts b/src/charging-station/ocpp/OCPPServiceUtils.ts index eaefda7b..beac5cc1 100644 --- a/src/charging-station/ocpp/OCPPServiceUtils.ts +++ b/src/charging-station/ocpp/OCPPServiceUtils.ts @@ -212,7 +212,7 @@ export const convertDateToISOString = (object: T): void => { const item = value[i] if (isDate(item)) { try { - value[i] = item.toISOString() as unknown as typeof item + value[i] = item.toISOString() } catch { // Ignore date conversion error } @@ -1351,7 +1351,7 @@ const getLimitFromSampledValueTemplateCustomValue = ( const isMeasurandSupported = (measurand: MeterValueMeasurand): boolean => { const supportedMeasurands = OCPPConstants.OCPP_MEASURANDS_SUPPORTED as readonly string[] - return supportedMeasurands.includes(measurand as string) + return supportedMeasurands.includes(measurand) } /** @@ -1476,18 +1476,12 @@ export const resolveSampledValueFields = ( value: number } => { const sampledValueMeasurand = - (sampledValueTemplate.measurand as MeterValueMeasurand | undefined) ?? - MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER + sampledValueTemplate.measurand ?? MeterValueMeasurand.ENERGY_ACTIVE_IMPORT_REGISTER return { - context: - context ?? - (sampledValueTemplate.context as MeterValueContext | undefined) ?? - MeterValueContext.SAMPLE_PERIODIC, - location: - (sampledValueTemplate.location as MeterValueLocation | undefined) ?? - getMeasurandDefaultLocation(sampledValueMeasurand), + context: context ?? sampledValueTemplate.context ?? MeterValueContext.SAMPLE_PERIODIC, + location: sampledValueTemplate.location ?? getMeasurandDefaultLocation(sampledValueMeasurand), measurand: sampledValueMeasurand, - phase: phase ?? (sampledValueTemplate.phase as MeterValuePhase | undefined), + phase: phase ?? sampledValueTemplate.phase, unit: (sampledValueTemplate.unit as MeterValueUnit | undefined) ?? getMeasurandDefaultUnit(sampledValueMeasurand), diff --git a/src/charging-station/ocpp/auth/adapters/OCPP20AuthAdapter.ts b/src/charging-station/ocpp/auth/adapters/OCPP20AuthAdapter.ts index b983d457..05d694a2 100644 --- a/src/charging-station/ocpp/auth/adapters/OCPP20AuthAdapter.ts +++ b/src/charging-station/ocpp/auth/adapters/OCPP20AuthAdapter.ts @@ -174,7 +174,7 @@ export class OCPP20AuthAdapter implements OCPPAuthAdapter { return { additionalIdToken: value, type: 'string', - } as AdditionalInfoType + } } }) : undefined diff --git a/src/performance/storage/MongoDBStorage.ts b/src/performance/storage/MongoDBStorage.ts index b00280aa..c030591f 100644 --- a/src/performance/storage/MongoDBStorage.ts +++ b/src/performance/storage/MongoDBStorage.ts @@ -50,7 +50,7 @@ export class MongoDBStorage extends Storage { .collection(Constants.PERFORMANCE_RECORDS_TABLE) .replaceOne( { id: performanceStatistics.id }, - this.serializePerformanceStatistics(performanceStatistics) as unknown as Statistics, + this.serializePerformanceStatistics(performanceStatistics), { upsert: true } ) } catch (error) { diff --git a/src/utils/AsyncLock.ts b/src/utils/AsyncLock.ts index 0c829858..4813d958 100644 --- a/src/utils/AsyncLock.ts +++ b/src/utils/AsyncLock.ts @@ -21,13 +21,16 @@ export class AsyncLock { this.resolveQueue = new Queue() } - public static async runExclusive(type: AsyncLockType, fn: () => Promise | T): Promise { + public static async runExclusive( + type: AsyncLockType, + fn: (() => Promise) | (() => T) + ): Promise { try { await AsyncLock.acquire(type) if (isAsyncFunction(fn)) { return await fn() } else { - return fn() as T + return fn() } } finally { AsyncLock.release(type) diff --git a/src/utils/ChargingStationConfigurationUtils.ts b/src/utils/ChargingStationConfigurationUtils.ts index e9fd082a..cc2f516c 100644 --- a/src/utils/ChargingStationConfigurationUtils.ts +++ b/src/utils/ChargingStationConfigurationUtils.ts @@ -128,7 +128,7 @@ export const buildEvsesStatus = ( { ...evseStatusRest, connectorsStatus, - } as EvseStatusConfiguration, + }, ] as [number, EvseStatusConfiguration] }) .toArray() diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index 88d58011..eb2de87a 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -15,6 +15,7 @@ import { getRandomValues, randomBytes, randomUUID } from 'node:crypto' import { env } from 'node:process' import { + type JsonObject, type JsonType, MapStringifyFormat, MessageType, @@ -55,7 +56,7 @@ export const has = (property: PropertyKey, object: unknown): boolean => { if (object == null || (typeof object !== 'object' && typeof object !== 'function')) { return false } - return Object.hasOwn(object as Record, property) + return Object.hasOwn(object, property) } const type = (value: unknown): string => { @@ -70,6 +71,30 @@ const isObject = (value: unknown): value is object => { return type(value) === 'Object' } +export const isJsonObject = (value: unknown): value is JsonObject => { + return value != null && typeof value === 'object' && !Array.isArray(value) +} + +/** + * Asserts that the given value is a JSON object (non-null, non-array object). + * @param value - Value to assert. + * @param error - Optional custom error or context message. + * @throws {Error | TypeError} The provided error, or a TypeError with the context message. + */ +export function assertIsJsonObject ( + value: unknown, + error?: Error | string +): asserts value is JsonObject { + if (value == null || typeof value !== 'object' || Array.isArray(value)) { + if (error instanceof Error) { + throw error + } + throw new TypeError( + error != null ? `Expected a JSON object: ${error}` : 'Expected a JSON object' + ) + } +} + export const isEmpty = (value: unknown): boolean => { if ( value == null || @@ -93,7 +118,7 @@ export const mergeDeepRight = (target: T, so const output: Record = { ...(target as Record) } if (isObject(target) && isObject(source)) { - Object.keys(source as Record).forEach(key => { + Object.keys(source).forEach(key => { const sourceValue = (source as Record)[key] const targetValue = (target as Record)[key] if (isObject(sourceValue) && isObject(targetValue)) { @@ -487,11 +512,11 @@ export const getWebSocketCloseEventStatusString = (code: number): string => { return '(For applications)' } } - if ( - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - WebSocketCloseEventStatusString[code as keyof typeof WebSocketCloseEventStatusString] != null - ) { - return WebSocketCloseEventStatusString[code as keyof typeof WebSocketCloseEventStatusString] + const statusString = ( + WebSocketCloseEventStatusString as Readonly> + )[code] + if (statusString != null) { + return statusString } return '(Unknown)' } diff --git a/src/utils/index.ts b/src/utils/index.ts index e6050e88..799d80b5 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -31,6 +31,7 @@ export { } from './MessageChannelUtils.js' export { average, max, median, min, percentile, std } from './StatisticUtils.js' export { + assertIsJsonObject, clampToSafeTimerValue, clone, computeExponentialBackOffDelay, @@ -51,6 +52,7 @@ export { isArraySorted, isAsyncFunction, isEmpty, + isJsonObject, isNotEmptyArray, isNotEmptyString, isValidDate, diff --git a/tests/charging-station/ChargingStation-Resilience.test.ts b/tests/charging-station/ChargingStation-Resilience.test.ts index e31462ed..bf562745 100644 --- a/tests/charging-station/ChargingStation-Resilience.test.ts +++ b/tests/charging-station/ChargingStation-Resilience.test.ts @@ -267,7 +267,7 @@ await describe('ChargingStation Resilience', async () => { // Set up a heartbeat timer (simulated) station.heartbeatSetInterval = setInterval(() => { /* empty */ - }, TEST_HEARTBEAT_INTERVAL_MS) as unknown as NodeJS.Timeout + }, TEST_HEARTBEAT_INTERVAL_MS) // Act - Cleanup station cleanupChargingStation(station) diff --git a/tests/charging-station/ConfigurationKeyUtils.test.ts b/tests/charging-station/ConfigurationKeyUtils.test.ts index f395ff5a..1b97a03a 100644 --- a/tests/charging-station/ConfigurationKeyUtils.test.ts +++ b/tests/charging-station/ConfigurationKeyUtils.test.ts @@ -5,8 +5,6 @@ import assert from 'node:assert/strict' import { afterEach, describe, it } from 'node:test' -import type { ChargingStationOcppConfiguration } from '../../src/types/index.js' - import { addConfigurationKey, buildConfigKey, @@ -36,7 +34,7 @@ await describe('ConfigurationKeyUtils', async () => { // Arrange const { station: cs } = createMockChargingStation() // Simulate missing configurationKey array - cs.ocppConfiguration = {} as Partial + cs.ocppConfiguration = {} // Act & Assert assert.strictEqual(getConfigurationKey(cs, TEST_KEY_1), undefined) @@ -167,7 +165,7 @@ await describe('ConfigurationKeyUtils', async () => { // Arrange const { station: cs } = createMockChargingStation() // Simulate missing configurationKey array - cs.ocppConfiguration = {} as Partial + cs.ocppConfiguration = {} // Act addConfigurationKey(cs, TEST_KEY_1, VALUE_A) @@ -490,7 +488,7 @@ await describe('ConfigurationKeyUtils', async () => { // Arrange const { station: cs } = createMockChargingStation() // Simulate missing configurationKey array - cs.ocppConfiguration = {} as Partial + cs.ocppConfiguration = {} const errorMock = t.mock.method(logger, 'error') // Act @@ -551,7 +549,7 @@ await describe('ConfigurationKeyUtils', async () => { // Arrange const { station: cs } = createMockChargingStation() // Simulate missing configurationKey array - cs.ocppConfiguration = {} as Partial + cs.ocppConfiguration = {} // Act const res = deleteConfigurationKey(cs, TEST_KEY_1) diff --git a/tests/charging-station/Helpers.test.ts b/tests/charging-station/Helpers.test.ts index 22f7eefd..9c5b8001 100644 --- a/tests/charging-station/Helpers.test.ts +++ b/tests/charging-station/Helpers.test.ts @@ -27,13 +27,11 @@ import { AvailabilityType, type ChargingProfile, ChargingProfilePurposeType, - type ChargingStationConfiguration, type ChargingStationInfo, type ChargingStationOptions, type ChargingStationTemplate, type ConnectorStatus, ConnectorStatusEnum, - type MeterValue, OCPPVersion, type Reservation, type SampledValueTemplate, @@ -58,13 +56,12 @@ await describe('Helpers', async () => { }) // Helper to create test reservations with configurable expiry - const createTestReservation = (expired = false): Reservation => - ({ - connectorId: 1, - expiryDate: new Date(Date.now() + (expired ? -60000 : 60000)), - idTag: 'tag1', - reservationId: 1, - }) as Reservation + const createTestReservation = (expired = false): Reservation => ({ + connectorId: 1, + expiryDate: new Date(Date.now() + (expired ? -60000 : 60000)), + idTag: 'tag1', + reservationId: 1, + }) await it('should return formatted charging station ID with index', () => { assert.strictEqual( @@ -668,7 +665,7 @@ await describe('Helpers', async () => { assert.strictEqual(errorMock.mock.calls.length, 1) assert.throws( () => { - checkConfiguration({} as ChargingStationConfiguration, 'log prefix |', 'configuration.json') + checkConfiguration({}, 'log prefix |', 'configuration.json') }, { message: /Empty charging station configuration from file configuration\.json/ } ) @@ -905,7 +902,7 @@ await describe('Helpers', async () => { const connectorStatus: ConnectorStatus = { availability: AvailabilityType.Operative, MeterValues: [], - transactionBeginMeterValue: { sampledValue: [], timestamp: new Date() } as MeterValue, + transactionBeginMeterValue: { sampledValue: [], timestamp: new Date() }, transactionDeauthorized: true, transactionDeauthorizedEnergyWh: 500, transactionEnergyActiveImportRegisterValue: 1234, diff --git a/tests/charging-station/SharedLRUCache.test.ts b/tests/charging-station/SharedLRUCache.test.ts index 3d5cc305..79c3e69f 100644 --- a/tests/charging-station/SharedLRUCache.test.ts +++ b/tests/charging-station/SharedLRUCache.test.ts @@ -54,7 +54,7 @@ function createTemplate (hash: string): ChargingStationTemplate { chargePointModel: 'test-model', chargePointVendor: 'test-vendor', templateHash: hash, - } as ChargingStationTemplate + } } /** diff --git a/tests/charging-station/helpers/StationHelpers.ts b/tests/charging-station/helpers/StationHelpers.ts index a0701607..c973c9d8 100644 --- a/tests/charging-station/helpers/StationHelpers.ts +++ b/tests/charging-station/helpers/StationHelpers.ts @@ -278,7 +278,7 @@ export function createConnectorStatus ( transactionRemoteStarted: false, transactionStart: undefined, transactionStarted: false, - } as unknown as ConnectorStatus + } } /** diff --git a/tests/charging-station/ocpp/1.6/OCPP16RequestService-CallChain.test.ts b/tests/charging-station/ocpp/1.6/OCPP16RequestService-CallChain.test.ts index 8d180eb9..6cba65d5 100644 --- a/tests/charging-station/ocpp/1.6/OCPP16RequestService-CallChain.test.ts +++ b/tests/charging-station/ocpp/1.6/OCPP16RequestService-CallChain.test.ts @@ -65,7 +65,7 @@ await describe('OCPP 1.6 Request Call Chain — requestHandler → buildRequestP await requestService.requestHandler(station, OCPP16RequestCommand.STATUS_NOTIFICATION, { connectorId: 1, status: OCPP16ChargePointStatus.Available, - } as unknown as JsonType) + }) assert.strictEqual(sendMessageMock.mock.callCount(), 1) const sentPayload = sendMessageMock.mock.calls[0] @@ -81,7 +81,7 @@ await describe('OCPP 1.6 Request Call Chain — requestHandler → buildRequestP await requestService.requestHandler(station, OCPP16RequestCommand.START_TRANSACTION, { connectorId: 1, idTag: 'TEST001', - } as unknown as JsonType) + }) assert.strictEqual(sendMessageMock.mock.callCount(), 1) const sentPayload = sendMessageMock.mock.calls[0] @@ -103,7 +103,7 @@ await describe('OCPP 1.6 Request Call Chain — requestHandler → buildRequestP await requestService.requestHandler(station, OCPP16RequestCommand.STOP_TRANSACTION, { transactionId: 12345, - } as unknown as JsonType) + }) assert.strictEqual(sendMessageMock.mock.callCount(), 1) const sentPayload = sendMessageMock.mock.calls[0].arguments[2] as OCPP16StopTransactionRequest diff --git a/tests/charging-station/ocpp/1.6/OCPP16ResponseService-SimpleHandlers.test.ts b/tests/charging-station/ocpp/1.6/OCPP16ResponseService-SimpleHandlers.test.ts index a78b7895..c8e72c92 100644 --- a/tests/charging-station/ocpp/1.6/OCPP16ResponseService-SimpleHandlers.test.ts +++ b/tests/charging-station/ocpp/1.6/OCPP16ResponseService-SimpleHandlers.test.ts @@ -44,7 +44,7 @@ function createSimpleHandlerStation (): MockChargingStation { }, websocketPingInterval: Constants.DEFAULT_WS_PING_INTERVAL_SECONDS, }) - return station as MockChargingStation + return station } await describe('OCPP16ResponseService — SimpleHandlers', async () => { diff --git a/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils-MeterValues.test.ts b/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils-MeterValues.test.ts index 0e61e1c3..23371f69 100644 --- a/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils-MeterValues.test.ts +++ b/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils-MeterValues.test.ts @@ -154,11 +154,11 @@ await describe('OCPP16ServiceUtils — MeterValues', async () => { const beginMeterValue: OCPP16MeterValue = { sampledValue: [{ context: OCPP16MeterValueContext.TRANSACTION_BEGIN, value: '0' }], timestamp: new Date('2025-01-01T00:00:00Z'), - } as OCPP16MeterValue + } const endMeterValue: OCPP16MeterValue = { sampledValue: [{ context: OCPP16MeterValueContext.TRANSACTION_END, value: '100' }], timestamp: new Date('2025-01-01T01:00:00Z'), - } as OCPP16MeterValue + } // Act const result = OCPP16ServiceUtils.buildTransactionDataMeterValues( @@ -176,11 +176,11 @@ await describe('OCPP16ServiceUtils — MeterValues', async () => { const beginMeterValue: OCPP16MeterValue = { sampledValue: [], timestamp: new Date(), - } as OCPP16MeterValue + } const endMeterValue: OCPP16MeterValue = { sampledValue: [], timestamp: new Date(), - } as OCPP16MeterValue + } const result1 = OCPP16ServiceUtils.buildTransactionDataMeterValues( beginMeterValue, diff --git a/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils.test.ts b/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils.test.ts index dbd9bc57..94293e6c 100644 --- a/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils.test.ts +++ b/tests/charging-station/ocpp/1.6/OCPP16ServiceUtils.test.ts @@ -72,7 +72,7 @@ await describe('OCPP16ServiceUtils — pure functions', async () => { chargingSchedulePeriod: [{ limit: 1000, startPeriod: 0 }], }, stackLevel, - } as OCPP16ChargingProfile + } } await it('should return false for undefined profiles array', () => { @@ -276,7 +276,7 @@ await describe('OCPP16ServiceUtils — pure functions', async () => { chargingSchedulePeriod: [{ limit, startPeriod: 0 }], duration: durationSeconds, startSchedule: start, - } as OCPP16ChargingSchedule + } } await it('should return undefined when both schedules are undefined', () => { diff --git a/tests/charging-station/ocpp/1.6/OCPP16TestUtils.ts b/tests/charging-station/ocpp/1.6/OCPP16TestUtils.ts index c77b1ee6..4c2abf1c 100644 --- a/tests/charging-station/ocpp/1.6/OCPP16TestUtils.ts +++ b/tests/charging-station/ocpp/1.6/OCPP16TestUtils.ts @@ -11,12 +11,10 @@ import type { ChargingStation } from '../../../../src/charging-station/index.js' import type { ChargingStationInfo, ConfigurationKey, - IncomingRequestCommand, JsonObject, OCPP16ChargingProfile, OCPP16ChargingSchedulePeriod, OCPP16SampledValue, - RequestCommand, SampledValueTemplate, } from '../../../../src/types/index.js' @@ -99,12 +97,9 @@ export function createCommandsSupport (config: { outgoingCommands?: Record }): NonNullable { return { - incomingCommands: (config.incomingCommands ?? {}) as unknown as Record< - IncomingRequestCommand, - boolean - >, + incomingCommands: config.incomingCommands ?? {}, ...(config.outgoingCommands != null && { - outgoingCommands: config.outgoingCommands as unknown as Record, + outgoingCommands: config.outgoingCommands, }), } } @@ -117,7 +112,7 @@ export function createCommandsSupport (config: { * @returns The entries typed as `SampledValueTemplate[]` */ export function createMeterValuesTemplate (entries: OCPP16SampledValue[]): SampledValueTemplate[] { - return entries as unknown as SampledValueTemplate[] + return entries } /** @@ -261,7 +256,7 @@ export function createStandardStation ( websocketPingInterval: Constants.DEFAULT_WS_PING_INTERVAL_SECONDS, }) - return station as MockChargingStation + return station } /** @@ -280,12 +275,7 @@ export async function dispatchResponse ( payload: JsonObject, requestPayload: JsonObject = {} ): Promise { - await responseService.responseHandler( - station, - command, - payload as unknown as Parameters[2], - requestPayload as unknown as Parameters[3] - ) + await responseService.responseHandler(station, command, payload, requestPayload) } /** diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-CertificateSigned.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-CertificateSigned.test.ts index ee58d328..2e7f4299 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-CertificateSigned.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-CertificateSigned.test.ts @@ -335,7 +335,7 @@ await describe('I04 - CertificateSigned', async () => { assert.strictEqual(response.statusInfo?.reasonCode, 'InvalidCertificate') assert.ok( response.statusInfo.additionalInfo?.includes( - OCPP20OptionalVariableName.MaxCertificateChainSize as string + OCPP20OptionalVariableName.MaxCertificateChainSize ) ) }) diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-GetTransactionStatus.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-GetTransactionStatus.test.ts index a43f7062..a87938d5 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-GetTransactionStatus.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-GetTransactionStatus.test.ts @@ -56,7 +56,7 @@ await describe('D14 - GetTransactionStatus', async () => { await it('should not include ongoingIndicator when active transaction exists but no transactionId (E14.FR.06)', () => { const transactionId = 'txn-12345' setupConnectorWithTransaction(station, 1, { - transactionId: transactionId as unknown as number, + transactionId, }) const response = testableService.handleRequestGetTransactionStatus(station, {}) @@ -81,7 +81,7 @@ await describe('D14 - GetTransactionStatus', async () => { await it('should return ongoingIndicator true when specific transactionId exists', () => { const transactionId = 'txn-67890' setupConnectorWithTransaction(station, 2, { - transactionId: transactionId as unknown as number, + transactionId, }) const response = testableService.handleRequestGetTransactionStatus(station, { diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RemoteStartAuth.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RemoteStartAuth.test.ts index 6e3b8543..b3557abf 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RemoteStartAuth.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RemoteStartAuth.test.ts @@ -206,8 +206,7 @@ await describe('G03 - Remote Start Pre-Authorization', async () => { // Given: Request without evseId (undefined) const request: OCPP20RequestStartTransactionRequest = { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any -- testing invalid undefined input - evseId: undefined as any, + evseId: undefined, idToken: { idToken: 'VALID_TOKEN_006', type: OCPP20IdTokenEnumType.ISO14443, diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-UnlockConnector.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-UnlockConnector.test.ts index b9f9af98..6a4352d4 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-UnlockConnector.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-UnlockConnector.test.ts @@ -49,7 +49,7 @@ function createUnlockConnectorStation (): { }, websocketPingInterval: Constants.DEFAULT_WS_PING_INTERVAL_SECONDS, }) - return { mockStation: station as MockChargingStation, requestHandlerMock } + return { mockStation: station, requestHandlerMock } } await describe('F05 - UnlockConnector', async () => { diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-UpdateFirmware.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-UpdateFirmware.test.ts index b5d056f2..21867669 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-UpdateFirmware.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-UpdateFirmware.test.ts @@ -549,7 +549,7 @@ await describe('L01/L02 - UpdateFirmware', async () => { { attributeType: AttributeEnumType.Actual, attributeValue: 'false', - component: { name: OCPP20ComponentName.ChargingStation as string }, + component: { name: OCPP20ComponentName.ChargingStation }, variable: { name: 'AllowNewSessionsPendingFirmwareUpdate' }, }, ]) @@ -746,7 +746,7 @@ await describe('L01/L02 - UpdateFirmware', async () => { { attributeType: AttributeEnumType.Actual, attributeValue: 'true', - component: { name: OCPP20ComponentName.FirmwareCtrlr as string }, + component: { name: OCPP20ComponentName.FirmwareCtrlr }, variable: { name: 'SimulateSignatureVerificationFailure' }, }, ]) @@ -824,7 +824,7 @@ await describe('L01/L02 - UpdateFirmware', async () => { { attributeType: AttributeEnumType.Actual, attributeValue: 'false', - component: { name: OCPP20ComponentName.FirmwareCtrlr as string }, + component: { name: OCPP20ComponentName.FirmwareCtrlr }, variable: { name: 'SimulateSignatureVerificationFailure' }, }, ]) diff --git a/tests/charging-station/ocpp/2.0/OCPP20RequestService-CallChain.test.ts b/tests/charging-station/ocpp/2.0/OCPP20RequestService-CallChain.test.ts index 38b9848e..e2d412a8 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20RequestService-CallChain.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20RequestService-CallChain.test.ts @@ -197,7 +197,7 @@ await describe('OCPP 2.0 Request Call Chain — requestHandler → buildRequestP await service.requestHandler( station, OCPP20RequestCommand.TRANSACTION_EVENT, - preBuiltPayload as unknown as OCPP20TransactionEventRequest, + preBuiltPayload, { rawPayload: true } ) diff --git a/tests/charging-station/ocpp/2.0/OCPP20RequestService-NotifyReport.test.ts b/tests/charging-station/ocpp/2.0/OCPP20RequestService-NotifyReport.test.ts index 03bc7dbf..db57ff4e 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20RequestService-NotifyReport.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20RequestService-NotifyReport.test.ts @@ -535,7 +535,7 @@ await describe('B07/B08 - NotifyReport', async () => { // Verify no additional properties are added const expectedKeys = ['generatedAt', 'reportData', 'requestId', 'seqNo', 'tbc'] - const actualKeys = Object.keys(payload as object).sort() + const actualKeys = Object.keys(payload).sort() expectedKeys.sort() assert.deepStrictEqual(actualKeys, expectedKeys) }) diff --git a/tests/charging-station/ocpp/2.0/OCPP20ResponseService-BootNotification.test.ts b/tests/charging-station/ocpp/2.0/OCPP20ResponseService-BootNotification.test.ts index a5d43d37..6192be62 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20ResponseService-BootNotification.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20ResponseService-BootNotification.test.ts @@ -50,7 +50,7 @@ function createBootNotificationStation (): MockChargingStation { }, websocketPingInterval: Constants.DEFAULT_WS_PING_INTERVAL_SECONDS, }) - return station as MockChargingStation + return station } await describe('B01 - BootNotificationResponse handler', async () => { @@ -76,8 +76,8 @@ await describe('B01 - BootNotificationResponse handler', async () => { await responseService.responseHandler( mockStation, OCPP20RequestCommand.BOOT_NOTIFICATION, - payload as unknown as Parameters[2], - {} as Parameters[3] + payload, + {} ) } diff --git a/tests/charging-station/ocpp/2.0/OCPP20ResponseService-SimpleHandlers.test.ts b/tests/charging-station/ocpp/2.0/OCPP20ResponseService-SimpleHandlers.test.ts index cb348d0c..9656026d 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20ResponseService-SimpleHandlers.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20ResponseService-SimpleHandlers.test.ts @@ -36,7 +36,7 @@ function createSimpleHandlerStation (): MockChargingStation { }, websocketPingInterval: Constants.DEFAULT_WS_PING_INTERVAL_SECONDS, }) - return station as MockChargingStation + return station } await describe('Simple response handlers', async () => { @@ -57,12 +57,7 @@ await describe('Simple response handlers', async () => { await it('should handle Heartbeat response without throwing', async () => { const payload: OCPP20HeartbeatResponse = { currentTime: new Date() } await assert.doesNotReject( - responseService.responseHandler( - mockStation, - OCPP20RequestCommand.HEARTBEAT, - payload as unknown as Parameters[2], - {} as Parameters[3] - ) + responseService.responseHandler(mockStation, OCPP20RequestCommand.HEARTBEAT, payload, {}) ) }) }) @@ -74,8 +69,8 @@ await describe('Simple response handlers', async () => { responseService.responseHandler( mockStation, OCPP20RequestCommand.NOTIFY_REPORT, - payload as unknown as Parameters[2], - {} as Parameters[3] + payload, + {} ) ) }) @@ -88,8 +83,8 @@ await describe('Simple response handlers', async () => { responseService.responseHandler( mockStation, OCPP20RequestCommand.STATUS_NOTIFICATION, - payload as unknown as Parameters[2], - {} as Parameters[3] + payload, + {} ) ) }) diff --git a/tests/charging-station/ocpp/2.0/OCPP20ServiceUtils-PostTransactionDelay.test.ts b/tests/charging-station/ocpp/2.0/OCPP20ServiceUtils-PostTransactionDelay.test.ts index 81d226cb..4344088a 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20ServiceUtils-PostTransactionDelay.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20ServiceUtils-PostTransactionDelay.test.ts @@ -31,7 +31,7 @@ await describe('OCPP20ServiceUtils — PostTransactionDelay', async () => { const result = createMockChargingStation({ connectorsCount: 1, ocppRequestService: { - requestHandler: requestHandler as (...args: unknown[]) => Promise, + requestHandler, }, ocppVersion: OCPPVersion.VERSION_20, started: true, diff --git a/tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts b/tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts index dda53fac..58785921 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts @@ -217,8 +217,8 @@ await describe('B05 - OCPP20VariableManager', async () => { await it('should handle invalid component gracefully', () => { const request: OCPP20GetVariableDataType[] = [ { - component: { name: 'InvalidComponent' as unknown as OCPP20ComponentName }, - variable: { name: 'SomeVariable' as unknown as OCPP20OptionalVariableName }, + component: { name: 'InvalidComponent' }, + variable: { name: 'SomeVariable' }, }, ] @@ -474,7 +474,7 @@ await describe('B05 - OCPP20VariableManager', async () => { await it('should reject unknown variables', () => { const component: ComponentType = { name: OCPP20ComponentName.OCPPCommCtrlr } const variable: VariableType = { - name: 'UnknownVariable' as unknown as OCPP20OptionalVariableName, + name: 'UnknownVariable', } const isSupported = testable.isVariableSupported(component, variable) @@ -520,7 +520,7 @@ await describe('B05 - OCPP20VariableManager', async () => { const request: OCPP20SetVariableDataType[] = [ { attributeValue: '20', - component: { name: 'InvalidComponent' as unknown as OCPP20ComponentName }, + component: { name: 'InvalidComponent' }, variable: { name: OCPP20OptionalVariableName.WebSocketPingInterval }, }, ] @@ -537,7 +537,7 @@ await describe('B05 - OCPP20VariableManager', async () => { { attributeValue: '10', component: { name: OCPP20ComponentName.OCPPCommCtrlr }, - variable: { name: 'UnknownVariable' as unknown as VariableType['name'] }, + variable: { name: 'UnknownVariable' }, }, ] @@ -610,7 +610,7 @@ await describe('B05 - OCPP20VariableManager', async () => { { attributeValue: '10', component: { name: OCPP20ComponentName.OCPPCommCtrlr }, - variable: { name: 'InvalidVariable' as unknown as VariableType['name'] }, + variable: { name: 'InvalidVariable' }, }, { attributeType: AttributeEnumType.Target, diff --git a/tests/charging-station/ocpp/OCPPServiceOperations.test.ts b/tests/charging-station/ocpp/OCPPServiceOperations.test.ts index 3b4b82d8..525f1a93 100644 --- a/tests/charging-station/ocpp/OCPPServiceOperations.test.ts +++ b/tests/charging-station/ocpp/OCPPServiceOperations.test.ts @@ -70,7 +70,7 @@ await describe('OCPPServiceOperations', async () => { requestHandler.mock.calls.length >= 1, 'request handler should have been called at least once' ) - assert.strictEqual(requestHandler.mock.calls[0].arguments[1] as string, 'StopTransaction') + assert.strictEqual(requestHandler.mock.calls[0].arguments[1], 'StopTransaction') }) await it('should send TransactionEvent(Ended) for OCPP 2.0 stations and return accepted: true', async () => { @@ -90,7 +90,7 @@ await describe('OCPPServiceOperations', async () => { requestHandler.mock.calls.length >= 1, 'request handler should have been called at least once' ) - assert.strictEqual(requestHandler.mock.calls[0].arguments[1] as string, 'TransactionEvent') + assert.strictEqual(requestHandler.mock.calls[0].arguments[1], 'TransactionEvent') }) await it('should throw OCPPError for unsupported OCPP version in stopTransactionOnConnector', async () => { @@ -209,7 +209,7 @@ await describe('OCPPServiceOperations', async () => { requestHandler.mock.calls.length >= 1, 'request handler should have been called at least once' ) - assert.strictEqual(requestHandler.mock.calls[0].arguments[1] as string, 'StartTransaction') + assert.strictEqual(requestHandler.mock.calls[0].arguments[1], 'StartTransaction') }) await it('should send TransactionEvent(Started) for OCPP 2.0 stations and return accepted: true', async () => { @@ -228,7 +228,7 @@ await describe('OCPPServiceOperations', async () => { requestHandler.mock.calls.length >= 1, 'request handler should have been called at least once' ) - assert.strictEqual(requestHandler.mock.calls[0].arguments[1] as string, 'TransactionEvent') + assert.strictEqual(requestHandler.mock.calls[0].arguments[1], 'TransactionEvent') }) await it('should generate transactionId for OCPP 2.0 when not pre-populated', async () => { diff --git a/tests/charging-station/ocpp/OCPPServiceUtils-pure.test.ts b/tests/charging-station/ocpp/OCPPServiceUtils-pure.test.ts index 40ba2ca7..146e6f1a 100644 --- a/tests/charging-station/ocpp/OCPPServiceUtils-pure.test.ts +++ b/tests/charging-station/ocpp/OCPPServiceUtils-pure.test.ts @@ -121,10 +121,7 @@ await describe('OCPPServiceUtils — pure functions', async () => { const obj = { nested: { deep: { created: date } } } as unknown as JsonType convertDateToISOString(obj) assert.deepStrictEqual( - ((obj as Record).nested as Record).deep as Record< - string, - unknown - >, + ((obj as Record).nested as Record).deep, { created: '2025-06-01T12:00:00.000Z' } ) }) diff --git a/tests/charging-station/ui-server/UIHttpServer.test.ts b/tests/charging-station/ui-server/UIHttpServer.test.ts index 7ca34ca3..075a42b1 100644 --- a/tests/charging-station/ui-server/UIHttpServer.test.ts +++ b/tests/charging-station/ui-server/UIHttpServer.test.ts @@ -33,7 +33,7 @@ class TestableUIHttpServer extends UIHttpServer { } public getAcceptsGzip (): Map { - return Reflect.get(this, 'acceptsGzip') as Map + return Reflect.get(this, 'acceptsGzip') } public getResponseHandlersSize (): number { diff --git a/tests/charging-station/ui-server/UIMCPServer.test.ts b/tests/charging-station/ui-server/UIMCPServer.test.ts index 6b86bac1..c7a3aedd 100644 --- a/tests/charging-station/ui-server/UIMCPServer.test.ts +++ b/tests/charging-station/ui-server/UIMCPServer.test.ts @@ -127,14 +127,7 @@ class TestableUIMCPServer extends UIMCPServer { timeout: ReturnType } > { - return Reflect.get(this, 'pendingMcpRequests') as Map< - string, - { - reject: (error: Error) => void - resolve: (payload: ResponsePayload) => void - timeout: ReturnType - } - > + return Reflect.get(this, 'pendingMcpRequests') } public getPendingMcpRequestsSize (): number { diff --git a/tests/performance/storage/MikroOrmStorage.test.ts b/tests/performance/storage/MikroOrmStorage.test.ts index 54b4375b..76af0572 100644 --- a/tests/performance/storage/MikroOrmStorage.test.ts +++ b/tests/performance/storage/MikroOrmStorage.test.ts @@ -249,7 +249,7 @@ await describe('MikroOrmStorage', async () => { stats.statisticsData.set('StatusNotification', { requestCount: 50, responseCount: 50, - } as unknown as Record) + }) // Act await storage.storePerformanceStatistics(stats) diff --git a/tests/performance/storage/MongoDBStorage.test.ts b/tests/performance/storage/MongoDBStorage.test.ts index 66fff99f..33b91f36 100644 --- a/tests/performance/storage/MongoDBStorage.test.ts +++ b/tests/performance/storage/MongoDBStorage.test.ts @@ -37,7 +37,7 @@ class TestableMongoDBStorage extends MongoDBStorage { } public getOpened (): boolean { - return Reflect.get(this, 'opened') as boolean + return Reflect.get(this, 'opened') } public setClient (client: MockMongoClient): void { @@ -349,7 +349,7 @@ await describe('MongoDBStorage', async () => { stats.statisticsData.set('StatusNotification', { requestCount: 50, responseCount: 50, - } as unknown as Record) + }) // Act await storage.storePerformanceStatistics(stats) @@ -395,7 +395,7 @@ await describe('MongoDBStorage', async () => { const failingClient: MockMongoClient = { close: async () => Promise.resolve(), connect: async () => Promise.resolve(), - db: () => ({ collection: () => failingCollection }) as unknown as MockDb, + db: () => ({ collection: () => failingCollection }), } storage.setClient(failingClient) storage.setOpened(true) diff --git a/tests/performance/storage/StorageTestHelpers.ts b/tests/performance/storage/StorageTestHelpers.ts index 79240f09..ae7b63c3 100644 --- a/tests/performance/storage/StorageTestHelpers.ts +++ b/tests/performance/storage/StorageTestHelpers.ts @@ -27,5 +27,5 @@ export function buildTestStatistics (id: string, name?: string): Statistics { name: name ?? `cs-${id}`, statisticsData: statsData, uri: 'ws://localhost:8080', - } as unknown as Statistics + } } diff --git a/tests/utils/ChargingStationConfigurationUtils.test.ts b/tests/utils/ChargingStationConfigurationUtils.test.ts index 0fefb460..a8e00983 100644 --- a/tests/utils/ChargingStationConfigurationUtils.test.ts +++ b/tests/utils/ChargingStationConfigurationUtils.test.ts @@ -64,15 +64,15 @@ await describe('ChargingStationConfigurationUtils', async () => { internals.connectors.set(0, { availability: AvailabilityType.Operative, MeterValues: [], - } as ConnectorStatus) + }) internals.connectors.set(1, { availability: AvailabilityType.Operative, bootStatus: 'Available', MeterValues: [], transactionEndedMeterValues: [{ sampledValue: [], timestamp: new Date() }], - transactionEndedMeterValuesSetInterval: interval2 as unknown as NodeJS.Timeout, + transactionEndedMeterValuesSetInterval: interval2, transactionEventQueue: [], - transactionUpdatedMeterValuesSetInterval: interval1 as unknown as NodeJS.Timeout, + transactionUpdatedMeterValuesSetInterval: interval1, } as unknown as ConnectorStatus) const result = buildConnectorsStatus(station) @@ -133,11 +133,11 @@ await describe('ChargingStationConfigurationUtils', async () => { internals.connectors.set(0, { availability: AvailabilityType.Operative, MeterValues: [], - } as ConnectorStatus) + }) internals.connectors.set(3, { availability: AvailabilityType.Inoperative, MeterValues: [], - } as ConnectorStatus) + }) const result = buildConnectorsStatus(station) @@ -164,7 +164,7 @@ await describe('ChargingStationConfigurationUtils', async () => { MeterValues: [], transactionEventQueue: [], transactionUpdatedMeterValuesSetInterval: undefined, - } as unknown as ConnectorStatus) + }) internals.evses.set(0, { availability: AvailabilityType.Operative, @@ -204,7 +204,7 @@ await describe('ChargingStationConfigurationUtils', async () => { transactionEndedMeterValuesSetInterval: undefined, transactionEventQueue: [], transactionUpdatedMeterValuesSetInterval: undefined, - } as unknown as ConnectorStatus) + }) internals.evses.set(0, { availability: AvailabilityType.Operative, @@ -242,17 +242,17 @@ await describe('ChargingStationConfigurationUtils', async () => { evseConnectors.set(1, { availability: AvailabilityType.Operative, MeterValues: [], - } as ConnectorStatus) + }) evseConnectors.set(2, { availability: AvailabilityType.Inoperative, MeterValues: [], - } as ConnectorStatus) + }) const evse0Connectors = new Map() evse0Connectors.set(0, { availability: AvailabilityType.Operative, MeterValues: [], - } as ConnectorStatus) + }) internals.evses.set(0, { availability: AvailabilityType.Operative, @@ -451,7 +451,7 @@ await describe('ChargingStationConfigurationUtils', async () => { internals.connectors.set(0, { availability: AvailabilityType.Operative, MeterValues: [], - } as ConnectorStatus) + }) internals.connectors.set(1, { availability: AvailabilityType.Operative, MeterValues: [], @@ -459,7 +459,7 @@ await describe('ChargingStationConfigurationUtils', async () => { transactionEndedMeterValuesSetInterval: undefined, transactionEventQueue: [], transactionUpdatedMeterValuesSetInterval: undefined, - } as unknown as ConnectorStatus) + }) const result = buildConnectorEntries(station) @@ -491,15 +491,15 @@ await describe('ChargingStationConfigurationUtils', async () => { internals.connectors.set(0, { availability: AvailabilityType.Operative, MeterValues: [], - } as ConnectorStatus) + }) internals.connectors.set(3, { availability: AvailabilityType.Operative, MeterValues: [], - } as ConnectorStatus) + }) internals.connectors.set(7, { availability: AvailabilityType.Inoperative, MeterValues: [], - } as ConnectorStatus) + }) const result = buildConnectorEntries(station) @@ -529,7 +529,7 @@ await describe('ChargingStationConfigurationUtils', async () => { transactionEndedMeterValuesSetInterval: undefined, transactionEventQueue: [], transactionUpdatedMeterValuesSetInterval: undefined, - } as unknown as ConnectorStatus) + }) internals.evses.set(0, { availability: AvailabilityType.Operative, @@ -580,11 +580,11 @@ await describe('ChargingStationConfigurationUtils', async () => { evse2Connectors.set(2, { availability: AvailabilityType.Operative, MeterValues: [], - } as ConnectorStatus) + }) evse2Connectors.set(5, { availability: AvailabilityType.Inoperative, MeterValues: [], - } as ConnectorStatus) + }) internals.evses.set(0, { availability: AvailabilityType.Operative, diff --git a/tests/utils/Configuration.test.ts b/tests/utils/Configuration.test.ts index 67ff6c25..f64cb8ed 100644 --- a/tests/utils/Configuration.test.ts +++ b/tests/utils/Configuration.test.ts @@ -150,7 +150,7 @@ await describe('Configuration', async () => { const originalData = internals.configurationData internals.configurationData = { stationTemplateUrls: [], - } as ConfigurationData + } try { const distribution = Configuration.getSupervisionUrlDistribution() diff --git a/ui/cli/src/client/ws-adapter.ts b/ui/cli/src/client/ws-adapter.ts index 2b505057..7b88c480 100644 --- a/ui/cli/src/client/ws-adapter.ts +++ b/ui/cli/src/client/ws-adapter.ts @@ -12,7 +12,7 @@ const toDataString = (data: WsWebSocket.Data): string => { return Buffer.from(data).toString('utf-8') } if (Array.isArray(data)) { - return Buffer.concat(data as Buffer[]).toString('utf-8') + return Buffer.concat(data).toString('utf-8') } return data } diff --git a/ui/cli/src/commands/atg.ts b/ui/cli/src/commands/atg.ts index 8afabef7..ce37e56d 100644 --- a/ui/cli/src/commands/atg.ts +++ b/ui/cli/src/commands/atg.ts @@ -21,7 +21,7 @@ export const createAtgCommands = (program: Command): Command => { .option('--connector-ids ', 'comma-separated connector IDs', parseCommaSeparatedInts) .action(async (hashIds: string[], options: { connectorIds?: number[] }) => { const payload: RequestPayload = { - ...(pickPresent(options as Record, ['connectorIds']) as RequestPayload), + ...(pickPresent(options, ['connectorIds']) as RequestPayload), ...buildHashIdsPayload(hashIds), } await runAction(program, ProcedureName.START_AUTOMATIC_TRANSACTION_GENERATOR, payload) @@ -33,7 +33,7 @@ export const createAtgCommands = (program: Command): Command => { .option('--connector-ids ', 'comma-separated connector IDs', parseCommaSeparatedInts) .action(async (hashIds: string[], options: { connectorIds?: number[] }) => { const payload: RequestPayload = { - ...(pickPresent(options as Record, ['connectorIds']) as RequestPayload), + ...(pickPresent(options, ['connectorIds']) as RequestPayload), ...buildHashIdsPayload(hashIds), } await runAction(program, ProcedureName.STOP_AUTOMATIC_TRANSACTION_GENERATOR, payload) diff --git a/ui/cli/src/commands/ocpp.ts b/ui/cli/src/commands/ocpp.ts index d8c67310..6ab5a406 100644 --- a/ui/cli/src/commands/ocpp.ts +++ b/ui/cli/src/commands/ocpp.ts @@ -64,7 +64,7 @@ export const createOcppCommands = (program: Command): Command => { options: { data?: string; messageId?: string; payload?: string; vendorId?: string } ) => { const payload: RequestPayload = { - ...pickDefined(options as Record, { + ...pickDefined(options, { data: 'data', messageId: 'messageId', vendorId: 'vendorId', diff --git a/ui/cli/src/commands/station.ts b/ui/cli/src/commands/station.ts index 3e029c48..8a49f89d 100644 --- a/ui/cli/src/commands/station.ts +++ b/ui/cli/src/commands/station.ts @@ -60,7 +60,7 @@ export const createStationCommands = (program: Command): Command => { }) => { const payload: RequestPayload = { numberOfStations: options.count, - options: pickDefined(options as Record, { + options: pickDefined(options, { autoStart: 'autoStart', baseName: 'baseName', fixedName: 'fixedName', @@ -83,7 +83,7 @@ export const createStationCommands = (program: Command): Command => { .option('--delete-config', 'delete station configuration files') .action(async (hashIds: string[], options: { deleteConfig?: true }) => { const payload: RequestPayload = { - ...(pickDefined(options as Record, { + ...(pickDefined(options, { deleteConfig: 'deleteConfiguration', }) as RequestPayload), ...buildHashIdsPayload(hashIds), diff --git a/ui/cli/src/commands/supervision.ts b/ui/cli/src/commands/supervision.ts index 57962819..a0839bd7 100644 --- a/ui/cli/src/commands/supervision.ts +++ b/ui/cli/src/commands/supervision.ts @@ -24,7 +24,7 @@ export const createSupervisionCommands = (program: Command): Command => { ) => { const payload: RequestPayload = { url: options.supervisionUrl, - ...pickDefined(options as Record, { + ...pickDefined(options, { supervisionPassword: 'supervisionPassword', supervisionUser: 'supervisionUser', }), diff --git a/ui/cli/src/config/loader.ts b/ui/cli/src/config/loader.ts index 135f2156..fdaa277f 100644 --- a/ui/cli/src/config/loader.ts +++ b/ui/cli/src/config/loader.ts @@ -63,7 +63,7 @@ const loadConfigFile = async ( if (typeof uiServer !== 'object') { throw new Error('Config uiServer must be an object') } - return uiServer as Partial + return uiServer } throw new Error(`Config file '${targetPath}' must contain a JSON object`) } catch (error: unknown) { diff --git a/ui/cli/tests/format.test.ts b/ui/cli/tests/format.test.ts index c9831794..02c19110 100644 --- a/ui/cli/tests/format.test.ts +++ b/ui/cli/tests/format.test.ts @@ -266,7 +266,7 @@ await describe('format helpers', async () => { connectorId: 1, connectorStatus: { availability: OCPP16AvailabilityType.OPERATIVE, - status: undefined as unknown as OCPP16ChargePointStatus, + status: undefined, }, }, ] diff --git a/ui/cli/tests/helpers.ts b/ui/cli/tests/helpers.ts index 74721a1b..014e8bf0 100644 --- a/ui/cli/tests/helpers.ts +++ b/ui/cli/tests/helpers.ts @@ -4,10 +4,10 @@ export const captureStream = (stream: 'stderr' | 'stdout', fn: () => void): stri const target = stream === 'stdout' ? process.stdout : process.stderr const chunks: string[] = [] const original = target.write.bind(target) - target.write = ((chunk: string): boolean => { + target.write = (chunk: string): boolean => { chunks.push(chunk) return true - }) as typeof target.write + } try { fn() } finally { diff --git a/ui/cli/tests/ws-adapter.test.ts b/ui/cli/tests/ws-adapter.test.ts index 2a38f635..fada4dea 100644 --- a/ui/cli/tests/ws-adapter.test.ts +++ b/ui/cli/tests/ws-adapter.test.ts @@ -171,7 +171,7 @@ await describe('WS Adapter', async () => { adapter.onerror = event => { receivedMessage = event.message } - mockWs.onerror?.(42 as unknown as Error) + mockWs.onerror?.(42) assert.strictEqual(receivedMessage, 'Unknown error') }) diff --git a/ui/common/src/client/WebSocketClient.ts b/ui/common/src/client/WebSocketClient.ts index cfa2d8e8..1109c48f 100644 --- a/ui/common/src/client/WebSocketClient.ts +++ b/ui/common/src/client/WebSocketClient.ts @@ -166,7 +166,7 @@ export class WebSocketClient { responsePayload == null || typeof responsePayload !== 'object' || !('status' in responsePayload) || - typeof (responsePayload as { status: unknown }).status !== 'string' + typeof responsePayload.status !== 'string' ) { this.settleHandler(uuid, handler) handler.reject(new Error('Server sent malformed response payload')) diff --git a/ui/common/src/client/adapter.ts b/ui/common/src/client/adapter.ts index c6eb457a..737c2679 100644 --- a/ui/common/src/client/adapter.ts +++ b/ui/common/src/client/adapter.ts @@ -86,7 +86,7 @@ export const createWsAdapter = (ws: RawWebSocket, options: WsAdapterOptions): We }, get readyState (): WebSocketReadyState { - return ws.readyState as WebSocketReadyState + return ws.readyState }, send (data: string): void { diff --git a/ui/common/tests/adapter.test.ts b/ui/common/tests/adapter.test.ts index e0c8cf27..d8f0c16b 100644 --- a/ui/common/tests/adapter.test.ts +++ b/ui/common/tests/adapter.test.ts @@ -29,7 +29,7 @@ const createMockRawWs = (): MockRawWs => ({ await describe('generic WebSocket adapter factory', async () => { await it('should apply dataConverter to message data', () => { const mockWs = createMockRawWs() - const adapter = createWsAdapter(mockWs as never, { + const adapter = createWsAdapter(mockWs, { dataConverter: data => `converted:${String(data)}`, }) let receivedData: string | undefined @@ -42,7 +42,7 @@ await describe('generic WebSocket adapter factory', async () => { await it('should use custom errorDefault in onerror fallback', () => { const mockWs = createMockRawWs() - const adapter = createWsAdapter(mockWs as never, { + const adapter = createWsAdapter(mockWs, { dataConverter: data => data as string, errorDefault: 'Custom fallback', }) @@ -56,7 +56,7 @@ await describe('generic WebSocket adapter factory', async () => { await it('should default errorDefault to WebSocket error', () => { const mockWs = createMockRawWs() - const adapter = createWsAdapter(mockWs as never, { + const adapter = createWsAdapter(mockWs, { dataConverter: data => data as string, }) let receivedMessage: string | undefined @@ -78,7 +78,7 @@ await describe('generic WebSocket adapter factory', async () => { sentData = data } mockWs.readyState = WebSocketReadyState.CONNECTING - const adapter = createWsAdapter(mockWs as never, { + const adapter = createWsAdapter(mockWs, { dataConverter: data => data as string, }) adapter.close(1000) @@ -90,7 +90,7 @@ await describe('generic WebSocket adapter factory', async () => { await it('should forward onclose and onopen events', () => { const mockWs = createMockRawWs() - const adapter = createWsAdapter(mockWs as never, { + const adapter = createWsAdapter(mockWs, { dataConverter: data => data as string, }) let closeCode: number | undefined diff --git a/ui/common/tests/browser-adapter.test.ts b/ui/common/tests/browser-adapter.test.ts index 869afc85..772d5daa 100644 --- a/ui/common/tests/browser-adapter.test.ts +++ b/ui/common/tests/browser-adapter.test.ts @@ -30,7 +30,7 @@ await describe('browser WebSocket adapter', async () => { // Test: MessageEvent data extraction await it('should extract data from MessageEvent in onmessage', () => { const mockWs = createMockBrowserWs() - const adapter = createBrowserWsAdapter(mockWs as never) + const adapter = createBrowserWsAdapter(mockWs) let receivedData: string | undefined adapter.onmessage = event => { receivedData = event.data @@ -42,7 +42,7 @@ await describe('browser WebSocket adapter', async () => { // Test: onerror produces WebSocketLike error shape await it('should produce error shape from browser Event in onerror', () => { const mockWs = createMockBrowserWs() - const adapter = createBrowserWsAdapter(mockWs as never) + const adapter = createBrowserWsAdapter(mockWs) let receivedError: unknown let receivedMessage: string | undefined adapter.onerror = event => { @@ -57,7 +57,7 @@ await describe('browser WebSocket adapter', async () => { // Test: onclose extracts code and reason await it('should extract code and reason from CloseEvent in onclose', () => { const mockWs = createMockBrowserWs() - const adapter = createBrowserWsAdapter(mockWs as never) + const adapter = createBrowserWsAdapter(mockWs) let receivedCode: number | undefined let receivedReason: string | undefined adapter.onclose = event => { @@ -72,7 +72,7 @@ await describe('browser WebSocket adapter', async () => { // Test: onopen forwarded await it('should forward onopen callback', () => { const mockWs = createMockBrowserWs() - const adapter = createBrowserWsAdapter(mockWs as never) + const adapter = createBrowserWsAdapter(mockWs) let opened = false adapter.onopen = () => { opened = true @@ -88,7 +88,7 @@ await describe('browser WebSocket adapter', async () => { mockWs.send = (data: string) => { sentData = data } - const adapter = createBrowserWsAdapter(mockWs as never) + const adapter = createBrowserWsAdapter(mockWs) adapter.send('{"test":1}') assert.strictEqual(sentData, '{"test":1}') }) @@ -97,7 +97,7 @@ await describe('browser WebSocket adapter', async () => { await it('should delegate readyState to browser WebSocket', () => { const mockWs = createMockBrowserWs() mockWs.readyState = WebSocketReadyState.CONNECTING - const adapter = createBrowserWsAdapter(mockWs as never) + const adapter = createBrowserWsAdapter(mockWs) assert.strictEqual(adapter.readyState, WebSocketReadyState.CONNECTING) }) @@ -108,7 +108,7 @@ await describe('browser WebSocket adapter', async () => { mockWs.close = (code?: number) => { closedCode = code } - const adapter = createBrowserWsAdapter(mockWs as never) + const adapter = createBrowserWsAdapter(mockWs) adapter.close(1000) assert.strictEqual(closedCode, 1000) }) diff --git a/ui/web/tests/unit/shared/composables/useTheme.test.ts b/ui/web/tests/unit/shared/composables/useTheme.test.ts index a80838cb..d226e54f 100644 --- a/ui/web/tests/unit/shared/composables/useTheme.test.ts +++ b/ui/web/tests/unit/shared/composables/useTheme.test.ts @@ -70,7 +70,7 @@ describe('useTheme', () => { it('should ignore invalid theme name', () => { const { activeThemeId, switchTheme } = useTheme() const before = activeThemeId.value - const switchThemeUntyped = switchTheme as (name: string) => void + const switchThemeUntyped = switchTheme switchThemeUntyped('nonexistent') expect(activeThemeId.value).toBe(before) }) diff --git a/ui/web/tests/unit/skins/modern/ConnectorRow.test.ts b/ui/web/tests/unit/skins/modern/ConnectorRow.test.ts index d8bdc976..077c6be6 100644 --- a/ui/web/tests/unit/skins/modern/ConnectorRow.test.ts +++ b/ui/web/tests/unit/skins/modern/ConnectorRow.test.ts @@ -147,7 +147,7 @@ describe('ConnectorRow', () => { }) it('should label "Stop ATG" when running', () => { - wrapper = mountRow({ atgStatus: { start: true } as Status }) + wrapper = mountRow({ atgStatus: { start: true } }) expect(wrapper.text()).toContain('Stop ATG') }) @@ -160,7 +160,7 @@ describe('ConnectorRow', () => { }) it('should call stopAutomaticTransactionGenerator when stopping', async () => { - wrapper = mountRow({ atgStatus: { start: true } as Status }) + wrapper = mountRow({ atgStatus: { start: true } }) const chip = wrapper.find('.modern-btn--chip') await chip.trigger('click') await flushPromises() diff --git a/ui/web/tests/unit/skins/modern/Dialogs.test.ts b/ui/web/tests/unit/skins/modern/Dialogs.test.ts index 1eefad84..2762f1e9 100644 --- a/ui/web/tests/unit/skins/modern/Dialogs.test.ts +++ b/ui/web/tests/unit/skins/modern/Dialogs.test.ts @@ -371,7 +371,7 @@ describe('Dialogs', () => { }, ], status: ResponseStatus.FAILURE, - } as never) + }) ) await wrapper.find('#modern-tx-idtag').setValue('BAD-TAG') await wrapper.findAll('.stub-modal__foot button')[1].trigger('click') @@ -429,7 +429,7 @@ describe('Dialogs', () => { }, ], status: ResponseStatus.FAILURE, - } as never) + }) ) await wrapper.find('#modern-auth-tag').setValue('BAD') await wrapper.findAll('.stub-modal__foot button')[1].trigger('click') -- 2.43.0