]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
refactor: relocate simulator config to src/utils and enforce barrel discipline
authorJérôme Benoit <jerome.benoit@sap.com>
Wed, 27 May 2026 22:33:50 +0000 (00:33 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Wed, 27 May 2026 22:33:50 +0000 (00:33 +0200)
- 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

43 files changed:
.serena/memories/project_overview.md
src/charging-station/index.ts
src/charging-station/ocpp/index.ts
src/charging-station/ui-server/mcp/MCPTools.ts
src/exception/OCPPError.ts
src/types/ConfigurationData.ts
src/utils/Configuration.ts
src/utils/ConfigurationMigrations.ts [moved from src/charging-station/ConfigurationMigrations.ts with 100% similarity]
src/utils/ConfigurationSchema.ts [moved from src/charging-station/ConfigurationSchema.ts with 100% similarity]
src/utils/ConfigurationUtils.ts
src/utils/ConfigurationValidation.ts [moved from src/charging-station/ConfigurationValidation.ts with 95% similarity]
src/utils/index.ts
src/worker/index.ts
tests/charging-station/AutomaticTransactionGenerator.test.ts
tests/charging-station/BootstrapStateUtils.test.ts
tests/charging-station/ChargingStation-Connectors.test.ts
tests/charging-station/ChargingStation-Transactions.test.ts
tests/charging-station/ConfigurationKeyUtils.test.ts
tests/charging-station/Helpers.test.ts
tests/charging-station/IdTagsCache.test.ts
tests/charging-station/SharedLRUCache.test.ts
tests/charging-station/TemplateMigrations.test.ts
tests/charging-station/TemplateSchema.test.ts
tests/charging-station/TemplateValidation.test.ts
tests/exception/BaseError.test.ts
tests/exception/OCPPError.test.ts
tests/utils/AsyncLock.test.ts
tests/utils/ChargingStationConfigurationUtils.test.ts
tests/utils/Configuration-hot-reload.test.ts
tests/utils/Configuration.test.ts
tests/utils/ConfigurationMigrations.test.ts [moved from tests/charging-station/ConfigurationMigrations.test.ts with 99% similarity]
tests/utils/ConfigurationSchema.test.ts [moved from tests/charging-station/ConfigurationSchema.test.ts with 99% similarity]
tests/utils/ConfigurationUtils.test.ts
tests/utils/ConfigurationValidation-perf.test.ts [moved from tests/charging-station/ConfigurationValidation-perf.test.ts with 96% similarity]
tests/utils/ConfigurationValidation.test.ts [moved from tests/charging-station/ConfigurationValidation.test.ts with 98% similarity]
tests/utils/ElectricUtils.test.ts
tests/utils/ErrorUtils.test.ts
tests/utils/FileUtils.test.ts
tests/utils/MessageChannelUtils.test.ts
tests/utils/StatisticUtils.test.ts
tests/utils/Utils.test.ts
tests/utils/helpers/ConfigurationFixtures.ts [moved from tests/charging-station/helpers/ConfigurationFixtures.ts with 99% similarity]
tests/worker/WorkerUtils.test.ts

index c2dfc8fc9776f08b29e8b13f50d5eac64d34fb68..d3b0ecc69620d9484813886eadb2916122ce9c7d 100644 (file)
@@ -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 (`<component>/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
 
index c1eb1836e093591018c57d8e6b0ecfb26c699bc2..95e0e029ee42a19260769678df9fdc139a16d622 100644 (file)
@@ -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'
index 9a5865c4fcbae53a05964521c527890c6207fa41..00446d7ec737b4e438cc18a953f2c9c86c22787f 100644 (file)
@@ -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'
index a31b49a5add95fc571c43a365ace748f512dd9e7..f772f06f298181b02ea99100e71a3461ebfe08b1 100644 (file)
@@ -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
index a72ea69f10649fa4ab4a120a85da2206a167785b..f29f14f20eb80b95ad10356822046f1f61917c86 100644 (file)
@@ -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'
 
index 5678fbf3b3ef37626f9971ced67d636c12515c14..8e738b818130fa9b87e26b75aa5b35e68e0496f5 100644 (file)
@@ -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',
index 59bd7f5c9dfc5acc2a7341da4c056eb3384ef664..1774b604607a2909ca9c9bed7bc9bb073ce7e2d3 100644 (file)
@@ -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)
         )
       }
index 2c1839c864b978ed3476020b65072238a5a0876a..3a0a78967af2b0377f92bebffcbb985359578a53 100644 (file)
@@ -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 |')
 }
 
similarity index 95%
rename from src/charging-station/ConfigurationValidation.ts
rename to src/utils/ConfigurationValidation.ts
index 11dfc5d00e4c79437d3d912f531255bffde524d9..72496bbf438ff96a4ac61b2acb8d28f88d7ca91a 100644 (file)
@@ -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}`
       )}`
     )
index 0840b6340fb7cea2198baa012bb4bc1ad49c26e9..104338c9eec24fda5dfdf5daeaf545a4851d9ee5 100644 (file)
@@ -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,
index 310bcb9813d03046b9356f0ffd76c9980a828218..c0f9c65556e7b2e7055345c9a6e3e5008e96b560 100644 (file)
@@ -15,3 +15,4 @@ export {
   WorkerMessageEvents,
   WorkerProcessType,
 } from './WorkerTypes.js'
+export { defaultErrorHandler, defaultExitHandler, randomizeDelay, sleep } from './WorkerUtils.js'
index ba5bbae2302f1ce73a4270284ce21b1badf5a0d5..68516e7a5c11a699b60a0e17690879cb4b9b1558 100644 (file)
@@ -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'
 
index 18decf1e9628b4ec29b5b1183215af87f7a87f12..e8c8bf39b70c82c3b51b4a2d0b6cedd5df8bbf2b 100644 (file)
@@ -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 () => {
index 894c5f1364d2c146a16739c177e448e382428f2e..6796c66bd947cd169918a2616493cf3c6b1d8018 100644 (file)
@@ -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'
index 4e6cb488baff1122ed580fe9082307ac8c7faefe..fae0ae75ac70d9693cee71df824d075f74938fdd 100644 (file)
@@ -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,
index 1b97a03a331f933264d2b7ec9709e2ba87540691..8477b3d9f102c40df7e908edbf69a9d25432b5a9 100644 (file)
@@ -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'
index 668de1d315ef6798c29db41cf7148b13c121f757..d9f7ecb5443cc275bbbcfaf9264ca95400b8acbd 100644 (file)
@@ -23,7 +23,7 @@ import {
   resetConnectorStatus,
   setChargingStationOptions,
   validateStationInfo,
-} from '../../src/charging-station/Helpers.js'
+} from '../../src/charging-station/index.js'
 import {
   AvailabilityType,
   type ChargingProfile,
index 82b92db3bc7f1e1c3ee33c7d451e9f547c3df1e3..6893dd4c5db9a77f2a30b9a3ddce2f034910734d 100644 (file)
@@ -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'
index 79c3e69fcac22e13cad8b5ee0e336f3e09cddd94..caae640984f1bf03dfd7ba6c080e0eec2b5397d8 100644 (file)
@@ -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 {
index bd3d9b8432a5c01f156d44ff51920c18e6f33fa0..abb128b6d57743f38b0782f9e841e7e161e8d354 100644 (file)
@@ -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'
index 3ba1e7c82cc5151abf852c2edc32dbfeae314986..0210b9e9c6c16c87f7d4aecd249115af372f0160 100644 (file)
@@ -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'
index ab7397ff7090185a4ed32311875f2dbd23f46b20..9ca19d965157f4ae582392ac09363dd2c7b60612 100644 (file)
@@ -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'
index 34f8691009f37df99e1cd13e33bbb496384b89f2..a985cc849ffb73d7a6a17e96212eb10323e6ddc5 100644 (file)
@@ -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 () => {
index 2d336ec9dd8567a3fc1f5635b7e964bd33f52d34..62f85f788983d3fd0fb181ffa8f8db1a72ab6a9d 100644 (file)
@@ -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'
 
index 5b5422a663e5901e306f8d5eeb1041e25135740f..119dced8ff7d6bd092ba6c7fbfeabfdfc9448e63 100644 (file)
@@ -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 () => {
index a8e0098366e1183b3b50765faf53cb00d6cad250..b9a8aa69a41126c0bdc8a98c5bb02e78d7b09e4c 100644 (file)
@@ -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,
index 437c85c448a0462f5f5843274e19b6005dda8d84..44e9bade9529b00c17be373c5c22a7eeb71ef53f 100644 (file)
@@ -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<void>
index 6b9b93f8926c28ce5ccfa95681b5ff292e7f5b7e..c44123f96389df15fec4deeed5e25b7a2f47915e 100644 (file)
@@ -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'
similarity index 99%
rename from tests/charging-station/ConfigurationMigrations.test.ts
rename to tests/utils/ConfigurationMigrations.test.ts
index ad865d35db4022281e05f75d8aa6208793252ea7..63d0db752bc059380ca74af9cd2632e27185734e 100644 (file)
@@ -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,
similarity index 99%
rename from tests/charging-station/ConfigurationSchema.test.ts
rename to tests/utils/ConfigurationSchema.test.ts
index dff29dad7d391c6062b7b87cc6312e22def40a6d..ca9b436ffc05fd97bf13b87370df5cd09313d843 100644 (file)
@@ -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,
index 7f0ff5081c73727cdc5f94cb698eb4935af8156c..ce6d38c67befeaaf3e6b553c1fc7527bface662f 100644 (file)
@@ -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', () => {
similarity index 96%
rename from tests/charging-station/ConfigurationValidation-perf.test.ts
rename to tests/utils/ConfigurationValidation-perf.test.ts
index ec521a9685b3643e99caa3e664e1cae041205ce4..23bd476c1b3c390a90c7ac9dfa9cae518ac24c87 100644 (file)
@@ -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). */
similarity index 98%
rename from tests/charging-station/ConfigurationValidation.test.ts
rename to tests/utils/ConfigurationValidation.test.ts
index df85ebeb530cf15626c30fb47de2e874638f1ba7..187fd0ff59657a72756b52396055387bd8fda087 100644 (file)
@@ -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 {
index f7ab0a4bff16c7d93a2d60ec3ff8c208827cd8ce..84c04e9fe451e1e957e701cf48e0253ddddf12f0 100644 (file)
@@ -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
index fab07259ba8f27b49b9b5c0d6a8a1c00234e0087..a2e181bf1108292dd604f6ea4aca3ff681c05759 100644 (file)
@@ -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'
index fb0d692374903c8e63f97c9bfdd2f33c7150f904..bc6c6b22ae1e8b3175953c06b35738bd09e23376 100644 (file)
@@ -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'
 
index 532be1e290b7cded6eb96affb68df70851d46eca..ae35f7bb2104c2c16ea82daca878cfb2f7ee85f9 100644 (file)
@@ -18,7 +18,7 @@ import {
   buildStartedMessage,
   buildStoppedMessage,
   buildUpdatedMessage,
-} from '../../src/utils/MessageChannelUtils.js'
+} from '../../src/utils/index.js'
 import {
   cleanupChargingStation,
   createMockChargingStation,
index e6e54395bfdbd9398777c13d9f65f41eac8fb0d9..7848efee517ae8cc32bfe4939437dbf547759ab5 100644 (file)
@@ -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 () => {
index 3e84e211d0462d126ccbd3cc9a62c4a0ace0d4f7..068320e38d25636462119f2026f7f77126579f83 100644 (file)
@@ -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 () => {
similarity index 99%
rename from tests/charging-station/helpers/ConfigurationFixtures.ts
rename to tests/utils/helpers/ConfigurationFixtures.ts
index 72692fd883d07666120618ff4b9dffd1588361a6..f85b6f241bcdc09e3b2d597ad2a758cfb3ac4c52 100644 (file)
@@ -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.
index a4b01cf6c74b0503c4cdd6335d8ba6b20c5c2577..c4fca16b941e054c8fa5fcc32c06efc52ef155c7 100644 (file)
@@ -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 () => {