From: Jérôme Benoit Date: Wed, 13 Aug 2025 16:33:51 +0000 (+0200) Subject: fix: ensure portable path handling in configuration tunables X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=a53c99b484bb6e419d42d1fa88541694a545f9dd;p=e-mobility-charging-stations-simulator.git fix: ensure portable path handling in configuration tunables Signed-off-by: Jérôme Benoit --- diff --git a/src/utils/ConfigurationUtils.ts b/src/utils/ConfigurationUtils.ts index e76aa18c..034de130 100644 --- a/src/utils/ConfigurationUtils.ts +++ b/src/utils/ConfigurationUtils.ts @@ -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` ) } } diff --git a/src/utils/FileUtils.ts b/src/utils/FileUtils.ts index f52a4df7..d2e62036 100644 --- a/src/utils/FileUtils.ts +++ b/src/utils/FileUtils.ts @@ -14,7 +14,7 @@ export const watchJsonFile = ( listener: WatchListener = (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) {