From: Jérôme Benoit Date: Wed, 27 May 2026 22:33:50 +0000 (+0200) Subject: refactor: relocate simulator config to src/utils and enforce barrel discipline X-Git-Tag: cli@v4.8.0~13 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=07fb30ebc3f300f5d8371dcc80e2f4b1a8261f44;p=e-mobility-charging-stations-simulator.git refactor: relocate simulator config to src/utils and enforce barrel discipline - Move ConfigurationSchema/Migrations/Validation from charging-station to utils - Rename ConfigurationUtils.logPrefix to configurationLogPrefix (barrel anti-collision) - Expose public APIs through component barrels (charging-station, ocpp, utils, worker) - Migrate 38 test imports from deep paths to barrels - Document TDZ-cycle exceptions in OCPPError and ConfigurationMigrations --- diff --git a/.serena/memories/project_overview.md b/.serena/memories/project_overview.md index c2dfc8fc..d3b0ecc6 100644 --- a/.serena/memories/project_overview.md +++ b/.serena/memories/project_overview.md @@ -55,13 +55,22 @@ src/ ## Component Boundaries -- `charging-station/` and `ocpp/` are SEPARATE components with their own barrels +- `charging-station/` and `ocpp/` are SEPARATE components with their own barrels (files under `src/charging-station/ocpp/` belong to the `ocpp/` component, not to `charging-station/`) - `ocpp/1.6/` and `ocpp/2.0/` are separate sub-components of ocpp - `ocpp/auth/` is an independent subsystem with its own barrel, interfaces, and strategy pattern - `worker/` is **fully standalone** — zero imports from other local modules. Has its own `sleep()`, `secureRandom()`, `mergeDeepRight()`. Uses `new Error()` (not `BaseError`). Portable to other projects -- `types/` is pure type definitions, depends on nothing except `worker/` (type-only) -- `utils/` depends on `types/` and `charging-station/` (type-only + 1 runtime: `getMessageTypeString`) -- `exception/` — `BaseError` has no imports; `OCPPError` imports from `types/` and `ocpp/OCPPConstants`. The barrel creates a transitive dep chain NOT usable by `utils/` (circular) +- `types/` is pure type definitions; type-only imports from `worker/`, `charging-station/`, and `exception/` are permitted (runtime-elided, no cycle risk) +- `utils/` depends on `types/`, `charging-station/` (type-only + 1 runtime: `getMessageTypeString`), `exception/` (`BaseError` runtime), and `worker/` (constants/enums runtime) +- `exception/`: + - `BaseError` has no imports; `OCPPError` imports `OCPPConstants` via direct path `../charging-station/ocpp/OCPPConstants.js` (TDZ-documented exception — barrel `ocpp/index.js` re-exports `OCPP20ServiceUtils` which transitively imports `OCPPError`, causing a cycle) + - The `exception/index.js` barrel IS usable from `utils/` for files whose loaded chain doesn't include `ConfigurationSchema.ts` accessing `CURRENT_CONFIGURATION_SCHEMA_VERSION` at module top-level. Only `utils/ConfigurationMigrations.ts` requires the direct path `../exception/BaseError.js` (TDZ-documented exception) + +## Import Discipline + +- **Cross-component imports** MUST go through the importee's barrel (`/index.js`) — never deep-import internal files +- **Intra-component imports** use direct relative paths (`./Sibling.js`, `../Parent.js`); never the component's own barrel (`./index.js`) — causes self-cycle +- **Tests** are outside the component they test → MUST import via the component's barrel +- **Documented exceptions** (TDZ cycles): two files use direct cross-component paths with explanatory comments — `src/utils/ConfigurationMigrations.ts:4` (`exception/BaseError.js`) and `src/exception/OCPPError.ts:5` (`charging-station/ocpp/OCPPConstants.js`). Both have a `// Direct path:` comment justifying the deviation ## Design Patterns diff --git a/src/charging-station/index.ts b/src/charging-station/index.ts index c1eb1836..95e0e029 100644 --- a/src/charging-station/index.ts +++ b/src/charging-station/index.ts @@ -1,23 +1,48 @@ +export { AutomaticTransactionGenerator } from './AutomaticTransactionGenerator.js' export { Bootstrap } from './Bootstrap.js' +export { + deleteStateFile, + readStateFile, + reconstructTemplateIndexes, + STATE_FILE_VERSION, + writeStateFile, +} from './BootstrapStateUtils.js' export type { ChargingStation } from './ChargingStation.js' export { addConfigurationKey, buildConfigKey, + deleteConfigurationKey, getConfigurationKey, setConfigurationKeyValue, } from './ConfigurationKeyUtils.js' export { canProceedChargingProfile, checkChargingStationState, + checkConfiguration, + checkStationInfoConnectorStatus, + getBootConnectorStatus, + getChargingStationId, getConnectorChargingProfiles, + getHashId, getIdTagsFile, + getMaxConfiguredNumberOfConnectors, + getMaxNumberOfEvses, + getPhaseRotationValue, hasFeatureProfile, hasPendingReservation, hasPendingReservations, hasReservationExpired, + pickConfiguredNumberOfConnectors, prepareChargingProfileKind, removeExpiredReservations, resetAuthorizeConnectorStatus, resetConnectorStatus, + setChargingStationOptions, + validateStationInfo, } from './Helpers.js' export type { IBootstrap } from './IBootstrap.js' +export { IdTagsCache } from './IdTagsCache.js' +export { SharedLRUCache } from './SharedLRUCache.js' +export { applyMigration, coerceVersion, CURRENT_SCHEMA_VERSION } from './TemplateMigrations.js' +export { StrictTemplateSchema, TemplateSchema } from './TemplateSchema.js' +export { TemplateValidationError, validateTemplate } from './TemplateValidation.js' diff --git a/src/charging-station/ocpp/index.ts b/src/charging-station/ocpp/index.ts index 9a5865c4..00446d7e 100644 --- a/src/charging-station/ocpp/index.ts +++ b/src/charging-station/ocpp/index.ts @@ -1,3 +1,4 @@ +export { OCPP16ServiceUtils } from './1.6/OCPP16ServiceUtils.js' export { OCPP20ServiceUtils } from './2.0/OCPP20ServiceUtils.js' export { OCPPAuthServiceFactory } from './auth/index.js' export { sendAndSetConnectorStatus } from './OCPPConnectorStatusOperations.js' diff --git a/src/charging-station/ui-server/mcp/MCPTools.ts b/src/charging-station/ui-server/mcp/MCPTools.ts index a31b49a5..f772f06f 100644 --- a/src/charging-station/ui-server/mcp/MCPTools.ts +++ b/src/charging-station/ui-server/mcp/MCPTools.ts @@ -5,7 +5,7 @@ import { dirname, join, resolve } from 'node:path' import { z } from 'zod' import { ConfigurationSection, type LogConfiguration } from '../../../types/index.js' -import { Configuration } from '../../../utils/Configuration.js' +import { Configuration } from '../../../utils/index.js' const MAX_TAIL_LINES = 5000 const DEFAULT_TAIL_LINES = 200 diff --git a/src/exception/OCPPError.ts b/src/exception/OCPPError.ts index a72ea69f..f29f14f2 100644 --- a/src/exception/OCPPError.ts +++ b/src/exception/OCPPError.ts @@ -2,6 +2,7 @@ import type { ErrorType, IncomingRequestCommand, JsonType, RequestCommand } from '../types/index.js' +// Direct path: the `ocpp/index.js` barrel pulls OCPP20ServiceUtils which transitively imports OCPPError, causing a TDZ cycle. import { OCPPConstants } from '../charging-station/ocpp/OCPPConstants.js' import { BaseError } from './BaseError.js' diff --git a/src/types/ConfigurationData.ts b/src/types/ConfigurationData.ts index 5678fbf3..8e738b81 100644 --- a/src/types/ConfigurationData.ts +++ b/src/types/ConfigurationData.ts @@ -7,7 +7,7 @@ import type { StorageConfigurationSchema, UIServerConfigurationSchema, WorkerConfigurationSchema, -} from '../charging-station/ConfigurationSchema.js' +} from '../utils/index.js' export enum ApplicationProtocolVersion { VERSION_11 = '1.1', diff --git a/src/utils/Configuration.ts b/src/utils/Configuration.ts index 59bd7f5c..1774b604 100644 --- a/src/utils/Configuration.ts +++ b/src/utils/Configuration.ts @@ -4,11 +4,6 @@ import { dirname, join } from 'node:path' import { env } from 'node:process' import { fileURLToPath } from 'node:url' -import { CURRENT_CONFIGURATION_SCHEMA_VERSION } from '../charging-station/ConfigurationMigrations.js' -import { - ConfigurationValidationError, - validateConfiguration, -} from '../charging-station/ConfigurationValidation.js' import { BaseError } from '../exception/index.js' import { ApplicationProtocol, @@ -31,11 +26,13 @@ import { DEFAULT_WORKER_START_DELAY_MS, WorkerProcessType, } from '../worker/index.js' +import { CURRENT_CONFIGURATION_SCHEMA_VERSION } from './ConfigurationMigrations.js' import { buildPerformanceUriFilePath, + configurationLogPrefix, getDefaultPerformanceStorageUri, - logPrefix, } from './ConfigurationUtils.js' +import { ConfigurationValidationError, validateConfiguration } from './ConfigurationValidation.js' import { Constants } from './Constants.js' import { ensureError, handleFileException } from './ErrorUtils.js' import { logger } from './Logger.js' @@ -109,7 +106,7 @@ export class Configuration { Configuration.configurationFile = configurationFile } else { console.error( - `${chalk.green(logPrefix())} ${chalk.red( + `${chalk.green(configurationLogPrefix())} ${chalk.red( "Configuration file './src/assets/config.json' not found, using default configuration" )}` ) @@ -161,7 +158,9 @@ export class Configuration { validationError instanceof ConfigurationValidationError || validationError instanceof BaseError ) { - console.error(`${chalk.green(logPrefix())} ${chalk.red(validationError.message)}`) + console.error( + `${chalk.green(configurationLogPrefix())} ${chalk.red(validationError.message)}` + ) process.exit(1) } throw validationError @@ -172,7 +171,7 @@ export class Configuration { Configuration.configurationFile, FileType.Configuration, ensureError(error), - logPrefix(), + configurationLogPrefix(), { consoleOut: true } ) } @@ -342,13 +341,16 @@ export class Configuration { Configuration.configurationFileReloading = true const consoleWarnOnce = once(console.warn) consoleWarnOnce( - `${chalk.green(logPrefix())} ${chalk.yellow( + `${chalk.green(configurationLogPrefix())} ${chalk.yellow( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions `${FileType.Configuration} ${Configuration.configurationFile} file has changed, reload` )}` ) Configuration.runReloadLoop().catch((error: unknown) => { - logger.error(`${logPrefix()} Configuration reload loop error:`, ensureError(error)) + logger.error( + `${configurationLogPrefix()} Configuration reload loop error:`, + ensureError(error) + ) }) }) } catch (error) { @@ -356,7 +358,7 @@ export class Configuration { Configuration.configurationFile, FileType.Configuration, ensureError(error), - logPrefix(), + configurationLogPrefix(), { consoleOut: true } ) } @@ -396,7 +398,7 @@ export class Configuration { await Configuration.configurationChangeCallback() } catch (callbackError) { logger.error( - `${logPrefix()} Configuration change callback error:`, + `${configurationLogPrefix()} Configuration change callback error:`, ensureError(callbackError) ) } @@ -404,12 +406,12 @@ export class Configuration { } catch (error) { if (error instanceof ConfigurationValidationError || error instanceof BaseError) { logger.error( - `${logPrefix()} Configuration hot-reload failed; rolling back to previous configuration:`, + `${configurationLogPrefix()} Configuration hot-reload failed; rolling back to previous configuration:`, error ) } else { logger.error( - `${logPrefix()} Configuration hot-reload failed with unexpected error; rolling back:`, + `${configurationLogPrefix()} Configuration hot-reload failed with unexpected error; rolling back:`, ensureError(error) ) } diff --git a/src/charging-station/ConfigurationMigrations.ts b/src/utils/ConfigurationMigrations.ts similarity index 100% rename from src/charging-station/ConfigurationMigrations.ts rename to src/utils/ConfigurationMigrations.ts diff --git a/src/charging-station/ConfigurationSchema.ts b/src/utils/ConfigurationSchema.ts similarity index 100% rename from src/charging-station/ConfigurationSchema.ts rename to src/utils/ConfigurationSchema.ts diff --git a/src/utils/ConfigurationUtils.ts b/src/utils/ConfigurationUtils.ts index 2c1839c8..3a0a7896 100644 --- a/src/utils/ConfigurationUtils.ts +++ b/src/utils/ConfigurationUtils.ts @@ -5,7 +5,7 @@ import { StorageType } from '../types/index.js' import { Constants } from './Constants.js' import { logPrefix as utilsLogPrefix } from './Utils.js' -export const logPrefix = (): string => { +export const configurationLogPrefix = (): string => { return utilsLogPrefix(' Simulator configuration |') } diff --git a/src/charging-station/ConfigurationValidation.ts b/src/utils/ConfigurationValidation.ts similarity index 95% rename from src/charging-station/ConfigurationValidation.ts rename to src/utils/ConfigurationValidation.ts index 11dfc5d0..72496bbf 100644 --- a/src/charging-station/ConfigurationValidation.ts +++ b/src/utils/ConfigurationValidation.ts @@ -6,9 +6,6 @@ import type { ConfigurationData } from '../types/index.js' import type { FieldError } from './ConfigurationMigrations.js' import { BaseError } from '../exception/index.js' -import { logPrefix } from '../utils/ConfigurationUtils.js' -// Direct path: the `utils/index.js` barrel re-exports Configuration, causing a TDZ cycle. -import { isEmpty } from '../utils/Utils.js' import { applyConfigurationMigration, coerceConfigurationVersion, @@ -16,6 +13,8 @@ import { remapDeprecatedKeys, } from './ConfigurationMigrations.js' import { ConfigurationSchema } from './ConfigurationSchema.js' +import { configurationLogPrefix } from './ConfigurationUtils.js' +import { isEmpty } from './Utils.js' const moduleName = 'ConfigurationValidation' @@ -115,7 +114,7 @@ export const validateConfiguration = (parsed: unknown, filePath: string): Config : `use '${canonicalDestination}' instead` // console.warn: logger.warn would recurse via Configuration → validateConfiguration. console.warn( - `${chalk.green(logPrefix())} ${chalk.yellow( + `${chalk.green(configurationLogPrefix())} ${chalk.yellow( `${moduleName}: deprecated configuration key '${sourceKey}' detected in '${filePath}'; ${guidance}` )}` ) diff --git a/src/utils/index.ts b/src/utils/index.ts index 0840b634..104338c9 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -8,6 +8,29 @@ export { buildEvsesStatus, } from './ChargingStationConfigurationUtils.js' export { Configuration } from './Configuration.js' +export { + applyConfigurationMigration, + coerceConfigurationVersion, + CURRENT_CONFIGURATION_SCHEMA_VERSION, + DEPRECATED_KEY_REMAPPINGS, + type FieldError, + remapDeprecatedKeys, +} from './ConfigurationMigrations.js' +export { + ConfigurationSchema, + LogConfigurationSchema, + StationTemplateUrlSchema, + StorageConfigurationSchema, + UIServerAuthenticationSchema, + UIServerConfigurationSchema, + WorkerConfigurationSchema, +} from './ConfigurationSchema.js' +export { + buildPerformanceUriFilePath, + configurationLogPrefix, + getDefaultPerformanceStorageUri, +} from './ConfigurationUtils.js' +export { ConfigurationValidationError, validateConfiguration } from './ConfigurationValidation.js' export { Constants } from './Constants.js' export { ACElectricUtils, DCElectricUtils } from './ElectricUtils.js' export { @@ -51,12 +74,15 @@ export { formatLogPrefix, generateUUID, getMessageTypeString, + getRandomFloat, getRandomFloatFluctuatedRounded, getRandomFloatRounded, getWebSocketCloseEventStatusString, has, + insertAt, isArraySorted, isAsyncFunction, + isCFEnvironment, isEmpty, isJsonObject, isNotEmptyArray, @@ -67,6 +93,7 @@ export { mergeDeepRight, once, promiseWithTimeout, + queueMicrotaskErrorThrowing, roundTo, secureRandom, sleep, diff --git a/src/worker/index.ts b/src/worker/index.ts index 310bcb98..c0f9c655 100644 --- a/src/worker/index.ts +++ b/src/worker/index.ts @@ -15,3 +15,4 @@ export { WorkerMessageEvents, WorkerProcessType, } from './WorkerTypes.js' +export { defaultErrorHandler, defaultExitHandler, randomizeDelay, sleep } from './WorkerUtils.js' diff --git a/tests/charging-station/AutomaticTransactionGenerator.test.ts b/tests/charging-station/AutomaticTransactionGenerator.test.ts index ba5bbae2..68516e7a 100644 --- a/tests/charging-station/AutomaticTransactionGenerator.test.ts +++ b/tests/charging-station/AutomaticTransactionGenerator.test.ts @@ -19,10 +19,10 @@ import { afterEach, describe, it } from 'node:test' import type { ChargingStation } from '../../src/charging-station/index.js' -import { AutomaticTransactionGenerator } from '../../src/charging-station/AutomaticTransactionGenerator.js' +import { AutomaticTransactionGenerator } from '../../src/charging-station/index.js' import { BaseError } from '../../src/exception/index.js' import { type StartTransactionResult } from '../../src/types/index.js' -import { Constants } from '../../src/utils/Constants.js' +import { Constants } from '../../src/utils/index.js' import { flushMicrotasks, standardCleanup } from '../helpers/TestLifecycleHelpers.js' import { createMockChargingStation } from './helpers/StationHelpers.js' diff --git a/tests/charging-station/BootstrapStateUtils.test.ts b/tests/charging-station/BootstrapStateUtils.test.ts index 18decf1e..e8c8bf39 100644 --- a/tests/charging-station/BootstrapStateUtils.test.ts +++ b/tests/charging-station/BootstrapStateUtils.test.ts @@ -16,7 +16,7 @@ import { reconstructTemplateIndexes, STATE_FILE_VERSION, writeStateFile, -} from '../../src/charging-station/BootstrapStateUtils.js' +} from '../../src/charging-station/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' await describe('BootstrapStateUtils', async () => { diff --git a/tests/charging-station/ChargingStation-Connectors.test.ts b/tests/charging-station/ChargingStation-Connectors.test.ts index 894c5f13..6796c66b 100644 --- a/tests/charging-station/ChargingStation-Connectors.test.ts +++ b/tests/charging-station/ChargingStation-Connectors.test.ts @@ -7,7 +7,7 @@ import { afterEach, beforeEach, describe, it } from 'node:test' import type { ChargingStation } from '../../src/charging-station/index.js' -import { resetConnectorStatus } from '../../src/charging-station/Helpers.js' +import { resetConnectorStatus } from '../../src/charging-station/index.js' import { RegistrationStatusEnumType } from '../../src/types/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' import { TEST_ONE_HOUR_MS } from './ChargingStationTestConstants.js' diff --git a/tests/charging-station/ChargingStation-Transactions.test.ts b/tests/charging-station/ChargingStation-Transactions.test.ts index 4e6cb488..fae0ae75 100644 --- a/tests/charging-station/ChargingStation-Transactions.test.ts +++ b/tests/charging-station/ChargingStation-Transactions.test.ts @@ -7,8 +7,8 @@ import { afterEach, beforeEach, describe, it } from 'node:test' import type { ChargingStation } from '../../src/charging-station/index.js' -import { OCPP16ServiceUtils } from '../../src/charging-station/ocpp/1.6/OCPP16ServiceUtils.js' -import { OCPP20ServiceUtils } from '../../src/charging-station/ocpp/2.0/OCPP20ServiceUtils.js' +import { OCPP16ServiceUtils } from '../../src/charging-station/ocpp/index.js' +import { OCPP20ServiceUtils } from '../../src/charging-station/ocpp/index.js' import { OCPPVersion } from '../../src/types/index.js' import { setupConnectorWithTransaction, diff --git a/tests/charging-station/ConfigurationKeyUtils.test.ts b/tests/charging-station/ConfigurationKeyUtils.test.ts index 1b97a03a..8477b3d9 100644 --- a/tests/charging-station/ConfigurationKeyUtils.test.ts +++ b/tests/charging-station/ConfigurationKeyUtils.test.ts @@ -11,7 +11,7 @@ import { deleteConfigurationKey, getConfigurationKey, setConfigurationKeyValue, -} from '../../src/charging-station/ConfigurationKeyUtils.js' +} from '../../src/charging-station/index.js' import { OCPP20ComponentName, OCPPVersion, StandardParametersKey } from '../../src/types/index.js' import { logger } from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' diff --git a/tests/charging-station/Helpers.test.ts b/tests/charging-station/Helpers.test.ts index 668de1d3..d9f7ecb5 100644 --- a/tests/charging-station/Helpers.test.ts +++ b/tests/charging-station/Helpers.test.ts @@ -23,7 +23,7 @@ import { resetConnectorStatus, setChargingStationOptions, validateStationInfo, -} from '../../src/charging-station/Helpers.js' +} from '../../src/charging-station/index.js' import { AvailabilityType, type ChargingProfile, diff --git a/tests/charging-station/IdTagsCache.test.ts b/tests/charging-station/IdTagsCache.test.ts index 82b92db3..6893dd4c 100644 --- a/tests/charging-station/IdTagsCache.test.ts +++ b/tests/charging-station/IdTagsCache.test.ts @@ -17,8 +17,8 @@ import { afterEach, describe, it } from 'node:test' import type { ChargingStation } from '../../src/charging-station/index.js' -import { getIdTagsFile } from '../../src/charging-station/Helpers.js' -import { IdTagsCache } from '../../src/charging-station/IdTagsCache.js' +import { getIdTagsFile } from '../../src/charging-station/index.js' +import { IdTagsCache } from '../../src/charging-station/index.js' import { IdTagDistribution } from '../../src/types/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' import { createMockChargingStation } from './helpers/StationHelpers.js' diff --git a/tests/charging-station/SharedLRUCache.test.ts b/tests/charging-station/SharedLRUCache.test.ts index 79c3e69f..caae6409 100644 --- a/tests/charging-station/SharedLRUCache.test.ts +++ b/tests/charging-station/SharedLRUCache.test.ts @@ -17,10 +17,10 @@ import type { ChargingStationTemplate, } from '../../src/types/index.js' -import { Bootstrap } from '../../src/charging-station/Bootstrap.js' -import { SharedLRUCache } from '../../src/charging-station/SharedLRUCache.js' +import { Bootstrap } from '../../src/charging-station/index.js' +import { SharedLRUCache } from '../../src/charging-station/index.js' import { StandardParametersKey } from '../../src/types/index.js' -import { Constants } from '../../src/utils/Constants.js' +import { Constants } from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' interface BootstrapStatic { diff --git a/tests/charging-station/TemplateMigrations.test.ts b/tests/charging-station/TemplateMigrations.test.ts index bd3d9b84..abb128b6 100644 --- a/tests/charging-station/TemplateMigrations.test.ts +++ b/tests/charging-station/TemplateMigrations.test.ts @@ -10,7 +10,7 @@ import { applyMigration, coerceVersion, CURRENT_SCHEMA_VERSION, -} from '../../src/charging-station/TemplateMigrations.js' +} from '../../src/charging-station/index.js' import { logger } from '../../src/utils/index.js' import { mockLoggerWarnDebug, standardCleanup } from '../helpers/TestLifecycleHelpers.js' import { buildLegacyTemplate } from './helpers/TemplateFixtures.js' diff --git a/tests/charging-station/TemplateSchema.test.ts b/tests/charging-station/TemplateSchema.test.ts index 3ba1e7c8..0210b9e9 100644 --- a/tests/charging-station/TemplateSchema.test.ts +++ b/tests/charging-station/TemplateSchema.test.ts @@ -6,8 +6,8 @@ import assert from 'node:assert/strict' import { afterEach, describe, it } from 'node:test' -import { CURRENT_SCHEMA_VERSION } from '../../src/charging-station/TemplateMigrations.js' -import { TemplateSchema } from '../../src/charging-station/TemplateSchema.js' +import { CURRENT_SCHEMA_VERSION } from '../../src/charging-station/index.js' +import { TemplateSchema } from '../../src/charging-station/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' import { TEST_CHARGING_STATION_BASE_NAME } from './ChargingStationTestConstants.js' import { buildMinimalTemplate } from './helpers/TemplateFixtures.js' diff --git a/tests/charging-station/TemplateValidation.test.ts b/tests/charging-station/TemplateValidation.test.ts index ab7397ff..9ca19d96 100644 --- a/tests/charging-station/TemplateValidation.test.ts +++ b/tests/charging-station/TemplateValidation.test.ts @@ -7,11 +7,8 @@ import assert from 'node:assert/strict' import { afterEach, describe, it } from 'node:test' import { ZodError } from 'zod' -import { CURRENT_SCHEMA_VERSION } from '../../src/charging-station/TemplateMigrations.js' -import { - TemplateValidationError, - validateTemplate, -} from '../../src/charging-station/TemplateValidation.js' +import { CURRENT_SCHEMA_VERSION } from '../../src/charging-station/index.js' +import { TemplateValidationError, validateTemplate } from '../../src/charging-station/index.js' import { BaseError } from '../../src/exception/index.js' import { logger } from '../../src/utils/index.js' import { mockLoggerWarnDebug, standardCleanup } from '../helpers/TestLifecycleHelpers.js' diff --git a/tests/exception/BaseError.test.ts b/tests/exception/BaseError.test.ts index 34f86910..a985cc84 100644 --- a/tests/exception/BaseError.test.ts +++ b/tests/exception/BaseError.test.ts @@ -5,7 +5,7 @@ import assert from 'node:assert/strict' import { afterEach, describe, it } from 'node:test' -import { BaseError } from '../../src/exception/BaseError.js' +import { BaseError } from '../../src/exception/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' await describe('BaseError', async () => { diff --git a/tests/exception/OCPPError.test.ts b/tests/exception/OCPPError.test.ts index 2d336ec9..62f85f78 100644 --- a/tests/exception/OCPPError.test.ts +++ b/tests/exception/OCPPError.test.ts @@ -5,9 +5,9 @@ import assert from 'node:assert/strict' import { afterEach, describe, it } from 'node:test' -import { OCPPConstants } from '../../src/charging-station/ocpp/OCPPConstants.js' -import { BaseError } from '../../src/exception/BaseError.js' -import { OCPPError } from '../../src/exception/OCPPError.js' +import { OCPPConstants } from '../../src/charging-station/ocpp/index.js' +import { BaseError } from '../../src/exception/index.js' +import { OCPPError } from '../../src/exception/index.js' import { ErrorType, RequestCommand } from '../../src/types/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' diff --git a/tests/utils/AsyncLock.test.ts b/tests/utils/AsyncLock.test.ts index 5b5422a6..119dced8 100644 --- a/tests/utils/AsyncLock.test.ts +++ b/tests/utils/AsyncLock.test.ts @@ -5,7 +5,7 @@ import assert from 'node:assert/strict' import { afterEach, describe, it } from 'node:test' -import { AsyncLock, AsyncLockType } from '../../src/utils/AsyncLock.js' +import { AsyncLock, AsyncLockType } from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' await describe('AsyncLock', async () => { diff --git a/tests/utils/ChargingStationConfigurationUtils.test.ts b/tests/utils/ChargingStationConfigurationUtils.test.ts index a8e00983..b9a8aa69 100644 --- a/tests/utils/ChargingStationConfigurationUtils.test.ts +++ b/tests/utils/ChargingStationConfigurationUtils.test.ts @@ -19,8 +19,8 @@ import { buildConnectorsStatus, buildEvseEntries, buildEvsesStatus, -} from '../../src/utils/ChargingStationConfigurationUtils.js' -import { Constants } from '../../src/utils/Constants.js' +} from '../../src/utils/index.js' +import { Constants } from '../../src/utils/index.js' import { cleanupChargingStation, createMockChargingStation, diff --git a/tests/utils/Configuration-hot-reload.test.ts b/tests/utils/Configuration-hot-reload.test.ts index 437c85c4..44e9bade 100644 --- a/tests/utils/Configuration-hot-reload.test.ts +++ b/tests/utils/Configuration-hot-reload.test.ts @@ -10,15 +10,15 @@ import { afterEach, describe, it } from 'node:test' import type { ConfigurationData } from '../../src/types/index.js' -import { ConfigurationValidationError } from '../../src/charging-station/ConfigurationValidation.js' import { BaseError } from '../../src/exception/index.js' import { ConfigurationSection } from '../../src/types/index.js' +import { ConfigurationValidationError } from '../../src/utils/index.js' import { Configuration, logger } from '../../src/utils/index.js' +import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' import { buildInvalidJsonString, buildMinimalConfiguration, -} from '../charging-station/helpers/ConfigurationFixtures.js' -import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' +} from './helpers/ConfigurationFixtures.js' interface ConfigurationInternals { configurationChangeCallback?: () => Promise diff --git a/tests/utils/Configuration.test.ts b/tests/utils/Configuration.test.ts index 6b9b93f8..c44123f9 100644 --- a/tests/utils/Configuration.test.ts +++ b/tests/utils/Configuration.test.ts @@ -21,7 +21,6 @@ import type { WorkerConfiguration, } from '../../src/types/index.js' -import { CURRENT_CONFIGURATION_SCHEMA_VERSION } from '../../src/charging-station/ConfigurationMigrations.js' import { ApplicationProtocol, ApplicationProtocolVersion, @@ -29,6 +28,7 @@ import { StorageType, SupervisionUrlDistribution, } from '../../src/types/index.js' +import { CURRENT_CONFIGURATION_SCHEMA_VERSION } from '../../src/utils/index.js' import { Configuration } from '../../src/utils/index.js' import { WorkerProcessType } from '../../src/worker/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' diff --git a/tests/charging-station/ConfigurationMigrations.test.ts b/tests/utils/ConfigurationMigrations.test.ts similarity index 99% rename from tests/charging-station/ConfigurationMigrations.test.ts rename to tests/utils/ConfigurationMigrations.test.ts index ad865d35..63d0db75 100644 --- a/tests/charging-station/ConfigurationMigrations.test.ts +++ b/tests/utils/ConfigurationMigrations.test.ts @@ -14,7 +14,7 @@ import { CURRENT_CONFIGURATION_SCHEMA_VERSION, DEPRECATED_KEY_REMAPPINGS, remapDeprecatedKeys, -} from '../../src/charging-station/ConfigurationMigrations.js' +} from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' import { buildLegacyConfiguration, diff --git a/tests/charging-station/ConfigurationSchema.test.ts b/tests/utils/ConfigurationSchema.test.ts similarity index 99% rename from tests/charging-station/ConfigurationSchema.test.ts rename to tests/utils/ConfigurationSchema.test.ts index dff29dad..ca9b436f 100644 --- a/tests/charging-station/ConfigurationSchema.test.ts +++ b/tests/utils/ConfigurationSchema.test.ts @@ -10,11 +10,8 @@ import { afterEach, describe, it } from 'node:test' import { CURRENT_CONFIGURATION_SCHEMA_VERSION, DEPRECATED_KEY_REMAPPINGS, -} from '../../src/charging-station/ConfigurationMigrations.js' -import { - ConfigurationSchema, - WorkerConfigurationSchema, -} from '../../src/charging-station/ConfigurationSchema.js' +} from '../../src/utils/index.js' +import { ConfigurationSchema, WorkerConfigurationSchema } from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' import { BAD_FIXTURES, diff --git a/tests/utils/ConfigurationUtils.test.ts b/tests/utils/ConfigurationUtils.test.ts index 7f0ff508..ce6d38c6 100644 --- a/tests/utils/ConfigurationUtils.test.ts +++ b/tests/utils/ConfigurationUtils.test.ts @@ -8,9 +8,9 @@ import { afterEach, describe, it } from 'node:test' import { StorageType } from '../../src/types/index.js' import { buildPerformanceUriFilePath, + configurationLogPrefix, getDefaultPerformanceStorageUri, - logPrefix, -} from '../../src/utils/ConfigurationUtils.js' +} from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' await describe('ConfigurationUtils', async () => { @@ -19,7 +19,7 @@ await describe('ConfigurationUtils', async () => { }) await it('should return log prefix with simulator configuration', () => { - assert.ok(logPrefix().includes(' Simulator configuration |')) + assert.ok(configurationLogPrefix().includes(' Simulator configuration |')) }) await it('should build file URI path for performance storage', () => { diff --git a/tests/charging-station/ConfigurationValidation-perf.test.ts b/tests/utils/ConfigurationValidation-perf.test.ts similarity index 96% rename from tests/charging-station/ConfigurationValidation-perf.test.ts rename to tests/utils/ConfigurationValidation-perf.test.ts index ec521a96..23bd476c 100644 --- a/tests/charging-station/ConfigurationValidation-perf.test.ts +++ b/tests/utils/ConfigurationValidation-perf.test.ts @@ -10,7 +10,7 @@ import { performance } from 'node:perf_hooks' import { afterEach, describe, it } from 'node:test' import { fileURLToPath } from 'node:url' -import { validateConfiguration } from '../../src/charging-station/ConfigurationValidation.js' +import { validateConfiguration } from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' /** p99 must stay within Nx of the median (relative threshold absorbs CI noise). */ diff --git a/tests/charging-station/ConfigurationValidation.test.ts b/tests/utils/ConfigurationValidation.test.ts similarity index 98% rename from tests/charging-station/ConfigurationValidation.test.ts rename to tests/utils/ConfigurationValidation.test.ts index df85ebeb..187fd0ff 100644 --- a/tests/charging-station/ConfigurationValidation.test.ts +++ b/tests/utils/ConfigurationValidation.test.ts @@ -9,15 +9,12 @@ import { join } from 'node:path' import { afterEach, describe, it } from 'node:test' import { ZodError } from 'zod' +import { BaseError } from '../../src/exception/index.js' import { CURRENT_CONFIGURATION_SCHEMA_VERSION, DEPRECATED_KEY_REMAPPINGS, -} from '../../src/charging-station/ConfigurationMigrations.js' -import { - ConfigurationValidationError, - validateConfiguration, -} from '../../src/charging-station/ConfigurationValidation.js' -import { BaseError } from '../../src/exception/index.js' +} from '../../src/utils/index.js' +import { ConfigurationValidationError, validateConfiguration } from '../../src/utils/index.js' import { logger } from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' import { diff --git a/tests/utils/ElectricUtils.test.ts b/tests/utils/ElectricUtils.test.ts index f7ab0a4b..84c04e9f 100644 --- a/tests/utils/ElectricUtils.test.ts +++ b/tests/utils/ElectricUtils.test.ts @@ -5,7 +5,7 @@ import assert from 'node:assert/strict' import { afterEach, describe, it } from 'node:test' -import { ACElectricUtils, DCElectricUtils } from '../../src/utils/ElectricUtils.js' +import { ACElectricUtils, DCElectricUtils } from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' const COS_PHI_RESIDENTIAL = 0.85 diff --git a/tests/utils/ErrorUtils.test.ts b/tests/utils/ErrorUtils.test.ts index fab07259..a2e181bf 100644 --- a/tests/utils/ErrorUtils.test.ts +++ b/tests/utils/ErrorUtils.test.ts @@ -21,7 +21,7 @@ import { handleSendMessageError, handleUncaughtException, handleUnhandledRejection, -} from '../../src/utils/ErrorUtils.js' +} from '../../src/utils/index.js' import { logger } from '../../src/utils/index.js' import { TEST_CHARGING_STATION_BASE_NAME } from '../charging-station/ChargingStationTestConstants.js' import { createMockChargingStation } from '../charging-station/helpers/StationHelpers.js' diff --git a/tests/utils/FileUtils.test.ts b/tests/utils/FileUtils.test.ts index fb0d6923..bc6c6b22 100644 --- a/tests/utils/FileUtils.test.ts +++ b/tests/utils/FileUtils.test.ts @@ -19,7 +19,7 @@ import { join } from 'node:path' import { afterEach, beforeEach, describe, it } from 'node:test' import { FileType } from '../../src/types/index.js' -import { atomicWriteFile, atomicWriteFileSync, watchJsonFile } from '../../src/utils/FileUtils.js' +import { atomicWriteFile, atomicWriteFileSync, watchJsonFile } from '../../src/utils/index.js' import { logger } from '../../src/utils/index.js' import { createLoggerMocks, standardCleanup } from '../helpers/TestLifecycleHelpers.js' diff --git a/tests/utils/MessageChannelUtils.test.ts b/tests/utils/MessageChannelUtils.test.ts index 532be1e2..ae35f7bb 100644 --- a/tests/utils/MessageChannelUtils.test.ts +++ b/tests/utils/MessageChannelUtils.test.ts @@ -18,7 +18,7 @@ import { buildStartedMessage, buildStoppedMessage, buildUpdatedMessage, -} from '../../src/utils/MessageChannelUtils.js' +} from '../../src/utils/index.js' import { cleanupChargingStation, createMockChargingStation, diff --git a/tests/utils/StatisticUtils.test.ts b/tests/utils/StatisticUtils.test.ts index e6e54395..7848efee 100644 --- a/tests/utils/StatisticUtils.test.ts +++ b/tests/utils/StatisticUtils.test.ts @@ -5,7 +5,7 @@ import assert from 'node:assert/strict' import { afterEach, describe, it } from 'node:test' -import { average, max, median, min, percentile, std } from '../../src/utils/StatisticUtils.js' +import { average, max, median, min, percentile, std } from '../../src/utils/index.js' import { standardCleanup } from '../helpers/TestLifecycleHelpers.js' await describe('StatisticUtils', async () => { diff --git a/tests/utils/Utils.test.ts b/tests/utils/Utils.test.ts index 3e84e211..068320e3 100644 --- a/tests/utils/Utils.test.ts +++ b/tests/utils/Utils.test.ts @@ -55,7 +55,7 @@ import { truncateId, validateIdentifierString, validateUUID, -} from '../../src/utils/Utils.js' +} from '../../src/utils/index.js' import { standardCleanup, withMockTimers } from '../helpers/TestLifecycleHelpers.js' await describe('Utils', async () => { diff --git a/tests/charging-station/helpers/ConfigurationFixtures.ts b/tests/utils/helpers/ConfigurationFixtures.ts similarity index 99% rename from tests/charging-station/helpers/ConfigurationFixtures.ts rename to tests/utils/helpers/ConfigurationFixtures.ts index 72692fd8..f85b6f24 100644 --- a/tests/charging-station/helpers/ConfigurationFixtures.ts +++ b/tests/utils/helpers/ConfigurationFixtures.ts @@ -2,7 +2,7 @@ * @file Shared configuration fixtures for schema/migration/validation tests. */ -import { CURRENT_CONFIGURATION_SCHEMA_VERSION } from '../../../src/charging-station/ConfigurationMigrations.js' +import { CURRENT_CONFIGURATION_SCHEMA_VERSION } from '../../../src/utils/index.js' /** * Build a minimal valid configuration at the current schema version. diff --git a/tests/worker/WorkerUtils.test.ts b/tests/worker/WorkerUtils.test.ts index a4b01cf6..c4fca16b 100644 --- a/tests/worker/WorkerUtils.test.ts +++ b/tests/worker/WorkerUtils.test.ts @@ -10,7 +10,7 @@ import { defaultExitHandler, randomizeDelay, sleep, -} from '../../src/worker/WorkerUtils.js' +} from '../../src/worker/index.js' import { standardCleanup, withMockTimers } from '../helpers/TestLifecycleHelpers.js' await describe('WorkerUtils', async () => {