]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
fix: ensure portable path handling in configuration tunables
authorJérôme Benoit <jerome.benoit@sap.com>
Wed, 13 Aug 2025 16:33:51 +0000 (18:33 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Wed, 13 Aug 2025 16:33:51 +0000 (18:33 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/utils/ConfigurationUtils.ts
src/utils/FileUtils.ts

index e76aa18c9b842ff78fec13e94f2bcddb8c2453ba..034de130af91da69b495a097ed5f58650039bcdb 100644 (file)
@@ -1,6 +1,6 @@
 import chalk from 'chalk'
 import { dirname, join, resolve } from 'node:path'
-import { fileURLToPath } from 'node:url'
+import { fileURLToPath, pathToFileURL } from 'node:url'
 
 import { type ElementsPerWorkerType, type FileType, StorageType } from '../types/index.js'
 import { WorkerProcessType } from '../worker/index.js'
@@ -12,18 +12,24 @@ export const logPrefix = (): string => {
 }
 
 export const buildPerformanceUriFilePath = (file: string): string => {
-  return `file://${join(resolve(dirname(fileURLToPath(import.meta.url)), '../'), file)}`
+  return pathToFileURL(resolve(dirname(fileURLToPath(import.meta.url)), '..', file)).toString()
 }
 
 export const getDefaultPerformanceStorageUri = (storageType: StorageType): string => {
   switch (storageType) {
     case StorageType.JSON_FILE:
       return buildPerformanceUriFilePath(
-        `${Constants.DEFAULT_PERFORMANCE_DIRECTORY}/${Constants.DEFAULT_PERFORMANCE_RECORDS_FILENAME}`
+        join(
+          Constants.DEFAULT_PERFORMANCE_DIRECTORY,
+          Constants.DEFAULT_PERFORMANCE_RECORDS_FILENAME
+        )
       )
     case StorageType.SQLITE:
       return buildPerformanceUriFilePath(
-        `${Constants.DEFAULT_PERFORMANCE_DIRECTORY}/${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`
+        join(
+          Constants.DEFAULT_PERFORMANCE_DIRECTORY,
+          `${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`
+        )
       )
     default:
       throw new Error(`Unsupported storage type '${storageType}'`)
@@ -45,12 +51,24 @@ export const handleFileException = (
     case 'EEXIST':
       logMsg = `${fileType} file ${file} already exists: `
       break
+    case 'EISDIR':
+      logMsg = `${fileType} file ${file} is a directory: `
+      break
     case 'ENOENT':
       logMsg = `${fileType} file ${file} not found: `
       break
+    case 'ENOSPC':
+      logMsg = `${fileType} file ${file} no space left on device: `
+      break
+    case 'ENOTDIR':
+      logMsg = `${fileType} file ${file} parent is not a directory: `
+      break
     case 'EPERM':
       logMsg = `${fileType} file ${file} permission denied: `
       break
+    case 'EROFS':
+      logMsg = `${fileType} file ${file} read-only file system: `
+      break
     default:
       logMsg = `${fileType} file ${file} error: `
   }
@@ -69,20 +87,17 @@ export const checkWorkerProcessType = (workerProcessType: WorkerProcessType): vo
 export const checkWorkerElementsPerWorker = (
   elementsPerWorker: ElementsPerWorkerType | undefined
 ): void => {
-  if (
-    elementsPerWorker != null &&
-    elementsPerWorker !== 'auto' &&
-    elementsPerWorker !== 'all' &&
-    !Number.isSafeInteger(elementsPerWorker)
-  ) {
+  if (elementsPerWorker == null || elementsPerWorker === 'auto' || elementsPerWorker === 'all') {
+    return
+  }
+  if (!Number.isSafeInteger(elementsPerWorker)) {
     throw new SyntaxError(
       `Invalid number of elements per worker '${elementsPerWorker.toString()}' defined in configuration`
     )
   }
-  if (Number.isSafeInteger(elementsPerWorker) && (elementsPerWorker as number) <= 0) {
-    throw RangeError(
-      // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
-      `Invalid negative or zero number of elements per worker '${elementsPerWorker?.toString()}' defined in configuration`
+  if (elementsPerWorker <= 0) {
+    throw new RangeError(
+      `Invalid negative or zero number of elements per worker '${elementsPerWorker.toString()}' defined in configuration`
     )
   }
 }
index f52a4df7ef3ee5f45f2eeb10c40e1f2b900c9e9b..d2e62036b4257c78f6521f069c73baf62fac2695 100644 (file)
@@ -14,7 +14,7 @@ export const watchJsonFile = <T extends JsonType>(
   listener: WatchListener<string> = (event, filename) => {
     if (isNotEmptyString(filename) && event === 'change') {
       try {
-        logger.debug(`${logPrefix} ${fileType} file ${file} have changed, reload`)
+        logger.debug(`${logPrefix} ${fileType} file ${file} has changed, reload`)
         refreshedVariable != null &&
           (refreshedVariable = JSON.parse(readFileSync(file, 'utf8')) as T)
       } catch (error) {