Prepare the code for ESM support
authorJérôme Benoit <jerome.benoit@sap.com>
Fri, 3 Jun 2022 19:12:41 +0000 (21:12 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Fri, 3 Jun 2022 19:12:41 +0000 (21:12 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
mikro-orm.config-template.ts
rollup.config.mjs
src/charging-station/Bootstrap.ts
src/charging-station/ChargingStation.ts
src/charging-station/ChargingStationUtils.ts
src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts
src/charging-station/ui-server/AbstractUIServer.ts
src/charging-station/ui-server/UIWebSocketServer.ts
src/utils/Configuration.ts
src/utils/Logger.ts

index ab28c40a42d05baff18a1d4834a6a25ae35f965c..5f318c13083b62723b49c0d30cbbfdeee06d11c4 100644 (file)
@@ -2,6 +2,7 @@ import Constants from './src/utils/Constants';
 import { PerformanceData } from './src/types/orm/entities/PerformanceData';
 import { PerformanceRecord } from './src/types/orm/entities/PerformanceRecord';
 import { TsMorphMetadataProvider } from '@mikro-orm/reflection';
+import { fileURLToPath } from 'url';
 import path from 'path';
 
 export default {
@@ -9,7 +10,7 @@ export default {
   entities: [PerformanceRecord, PerformanceData],
   type: 'sqlite',
   clientUrl: `file://${path.join(
-    path.resolve(__dirname),
+    path.resolve(path.dirname(fileURLToPath(import.meta.url))),
     `${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`
   )}`,
 };
index be738ef7d947b67444b9f261c66cd10d5db90d69..7f0e577421bfea9af77707e0ddb060b63ebd55a5 100644 (file)
@@ -40,7 +40,7 @@ export default {
     'uuid',
     'ws',
     'winston-daily-rotate-file',
-    'winston/lib/winston/transports',
+    'winston/lib/winston/transports/index.js',
     'winston',
     'worker_threads',
   ],
index cf7208efef1785057f35ac2ae162b98d8e59a698..1ce68ba2adef6f4021d1f02b551d44ee5277cfd8 100644 (file)
@@ -20,6 +20,7 @@ import Utils from '../utils/Utils';
 import WorkerAbstract from '../worker/WorkerAbstract';
 import WorkerFactory from '../worker/WorkerFactory';
 import chalk from 'chalk';
+import { fileURLToPath } from 'url';
 import { isMainThread } from 'worker_threads';
 import path from 'path';
 import { version } from '../../package.json';
@@ -38,7 +39,7 @@ export default class Bootstrap {
   private constructor() {
     this.started = false;
     this.workerScript = path.join(
-      path.resolve(__dirname, '../'),
+      path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
       'charging-station',
       'ChargingStationWorker.js'
     );
@@ -188,7 +189,7 @@ export default class Bootstrap {
     const workerData: ChargingStationWorkerData = {
       index,
       templateFile: path.join(
-        path.resolve(__dirname, '../'),
+        path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
         'assets',
         'station-templates',
         path.basename(stationTemplateUrl.file)
index 14bb05a10637468dca4f3c0d09a02cc6750215c7..e114da41c951aba7977e9a21fbefe1ea12097fe8 100644 (file)
@@ -39,8 +39,9 @@ import {
   StopTransactionRequest,
   StopTransactionResponse,
 } from '../types/ocpp/Transaction';
+import { URL, fileURLToPath } from 'url';
 import { WSError, WebSocketCloseEventStatusCode } from '../types/WebSocket';
-import WebSocket, { Data, OPEN, RawData } from 'ws';
+import WebSocket, { Data, RawData } from 'ws';
 
 import AutomaticTransactionGenerator from './AutomaticTransactionGenerator';
 import { AutomaticTransactionGeneratorConfiguration } from '../types/AutomaticTransactionGenerator';
@@ -72,7 +73,6 @@ import OCPPRequestService from './ocpp/OCPPRequestService';
 import { OCPPVersion } from '../types/ocpp/OCPPVersion';
 import PerformanceStatistics from '../performance/PerformanceStatistics';
 import { SupervisionUrlDistribution } from '../types/ConfigurationData';
-import { URL } from 'url';
 import Utils from '../utils/Utils';
 import crypto from 'crypto';
 import fs from 'fs';
@@ -180,7 +180,7 @@ export default class ChargingStation {
   }
 
   public isWebSocketConnectionOpened(): boolean {
-    return this?.wsConnection?.readyState === OPEN;
+    return this?.wsConnection?.readyState === WebSocket.OPEN;
   }
 
   public getRegistrationStatus(): RegistrationStatus {
@@ -877,7 +877,7 @@ export default class ChargingStation {
     this.hashId = ChargingStationUtils.getHashId(this.index, this.getTemplateFromFile());
     logger.info(`${this.logPrefix()} Charging station hashId '${this.hashId}'`);
     this.configurationFile = path.join(
-      path.resolve(__dirname, '../'),
+      path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
       'assets',
       'configurations',
       this.hashId + '.json'
index 9eee346630083ee75dc623af9b16c6ff14704d0f..ffe90a776167d0e5535cce7b2057e5c5fe935528 100644 (file)
@@ -22,6 +22,7 @@ import Utils from '../utils/Utils';
 import { WebSocketCloseEventStatusString } from '../types/WebSocket';
 import { WorkerProcessType } from '../types/Worker';
 import crypto from 'crypto';
+import { fileURLToPath } from 'url';
 import fs from 'fs';
 import logger from '../utils/Logger';
 import moment from 'moment';
@@ -545,7 +546,7 @@ export class ChargingStationUtils {
     return (
       stationInfo.authorizationFile &&
       path.join(
-        path.resolve(__dirname, '../'),
+        path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
         'assets',
         path.basename(stationInfo.authorizationFile)
       )
index 1e66f4afb62c096887ec1a7f1bb410d894b597d0..67967fd9718d7a4ac7bb38896b8537d8bf212013 100644 (file)
@@ -58,6 +58,7 @@ import {
   OCPP16StandardParametersKey,
   OCPP16SupportedFeatureProfiles,
 } from '../../../types/ocpp/1.6/Configuration';
+import { URL, fileURLToPath } from 'url';
 
 import type ChargingStation from '../../ChargingStation';
 import { ChargingStationConfigurationUtils } from '../../ChargingStationConfigurationUtils';
@@ -73,7 +74,6 @@ import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
 import { OCPPConfigurationKey } from '../../../types/ocpp/Configuration';
 import OCPPError from '../../../exception/OCPPError';
 import OCPPIncomingRequestService from '../OCPPIncomingRequestService';
-import { URL } from 'url';
 import Utils from '../../../utils/Utils';
 import fs from 'fs';
 import logger from '../../../utils/Logger';
@@ -881,7 +881,7 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
       let ftpClient: Client;
       try {
         const logFiles = fs
-          .readdirSync(path.resolve(__dirname, '../../../../'))
+          .readdirSync(path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../'))
           .filter((file) => file.endsWith('.log'))
           .map((file) => path.join('./', file));
         const diagnosticsArchive = chargingStation.stationInfo.chargingStationId + '_logs.tar.gz';
@@ -910,7 +910,10 @@ export default class OCPP16IncomingRequestService extends OCPPIncomingRequestSer
             });
           });
           uploadResponse = await ftpClient.uploadFrom(
-            path.join(path.resolve(__dirname, '../../../../'), diagnosticsArchive),
+            path.join(
+              path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../'),
+              diagnosticsArchive
+            ),
             uri.pathname + diagnosticsArchive
           );
           if (uploadResponse.code === 226) {
index 92860638192a197a1b29f57cfe7850ce92de9022..1c8ed1b54113b86f5ed47df93a5f2f948d60b958 100644 (file)
@@ -1,12 +1,12 @@
 import AbstractUIService from './ui-services/AbstractUIService';
 import { Server as HttpServer } from 'http';
 import { ProtocolVersion } from '../../types/UIProtocol';
-import { Server as WSServer } from 'ws';
+import WebSocket from 'ws';
 
 export abstract class AbstractUIServer {
   public readonly chargingStations: Set<string>;
   protected readonly uiServices: Map<ProtocolVersion, AbstractUIService>;
-  protected server: WSServer | HttpServer;
+  protected server: WebSocket.Server | HttpServer;
 
   public constructor() {
     this.chargingStations = new Set<string>();
index f71f404b28b3bce0c11126eb607ba56381b693f6..c67da00e1f6c8643e0f35032ff759d6bfe0cb0f0 100644 (file)
@@ -1,5 +1,4 @@
 import { Protocol, ProtocolVersion } from '../../types/UIProtocol';
-import WebSocket, { OPEN, Server } from 'ws';
 
 import { AbstractUIServer } from './AbstractUIServer';
 import Configuration from '../../utils/Configuration';
@@ -7,12 +6,13 @@ import { IncomingMessage } from 'http';
 import { ServerOptions } from '../../types/ConfigurationData';
 import UIServiceFactory from './ui-services/UIServiceFactory';
 import Utils from '../../utils/Utils';
+import WebSocket from 'ws';
 import logger from '../../utils/Logger';
 
 export default class UIWebSocketServer extends AbstractUIServer {
   public constructor(options?: ServerOptions) {
     super();
-    this.server = new Server(options ?? Configuration.getUIServer().options);
+    this.server = new WebSocket.Server(options ?? Configuration.getUIServer().options);
   }
 
   public start(): void {
@@ -52,8 +52,8 @@ export default class UIWebSocketServer extends AbstractUIServer {
   }
 
   private broadcastToClients(message: string): void {
-    for (const client of (this.server as Server).clients) {
-      if (client?.readyState === OPEN) {
+    for (const client of (this.server as WebSocket.Server).clients) {
+      if (client?.readyState === WebSocket.OPEN) {
         client.send(message);
       }
     }
index 491c377e9372cf7543406c67e49cda1d6f454005..716e53095b8f7d76a4572751b7d04b9fc428d017 100644 (file)
@@ -15,12 +15,13 @@ import type { WorkerChoiceStrategy } from 'poolifier';
 import WorkerConstants from '../worker/WorkerConstants';
 import { WorkerProcessType } from '../types/Worker';
 import chalk from 'chalk';
+import { fileURLToPath } from 'url';
 import fs from 'fs';
 import path from 'path';
 
 export default class Configuration {
   private static configurationFile = path.join(
-    path.resolve(__dirname, '../'),
+    path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
     'assets',
     'config.json'
   );
@@ -370,11 +371,14 @@ export default class Configuration {
     switch (storageType) {
       case StorageType.JSON_FILE:
         return `file://${path.join(
-          path.resolve(__dirname, '../../'),
+          path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../'),
           Constants.DEFAULT_PERFORMANCE_RECORDS_FILENAME
         )}`;
       case StorageType.SQLITE:
-        return `file://${path.join(path.resolve(__dirname, '../../'), SQLiteFileName)}`;
+        return `file://${path.join(
+          path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../'),
+          SQLiteFileName
+        )}`;
       default:
         throw new Error(`Performance storage URI is mandatory with storage type '${storageType}'`);
     }
index 5a98ed990dad3117e9c0257013fb2e43c80d0b98..aba00c742633c0422a6091f593ab1b8329790fe6 100644 (file)
@@ -1,9 +1,9 @@
-import { Console, File } from 'winston/lib/winston/transports';
 import { Logger, createLogger, format, transport } from 'winston';
 
 import Configuration from './Configuration';
 import DailyRotateFile from 'winston-daily-rotate-file';
 import { Format } from 'logform';
+import TransportType from 'winston/lib/winston/transports/index.js';
 import Utils from './Utils';
 
 let transports: transport[];
@@ -30,8 +30,8 @@ if (Configuration.getLogRotate()) {
   ];
 } else {
   transports = [
-    new File({ filename: Configuration.getLogErrorFile(), level: 'error' }),
-    new File({ filename: Configuration.getLogFile() }),
+    new TransportType.File({ filename: Configuration.getLogErrorFile(), level: 'error' }),
+    new TransportType.File({ filename: Configuration.getLogFile() }),
   ];
 }
 
@@ -47,7 +47,7 @@ const logger: Logger = createLogger({
 //
 if (Configuration.getLogConsole()) {
   logger.add(
-    new Console({
+    new TransportType.Console({
       format: format.combine(
         format.splat(),
         (format[Configuration.getLogFormat()] as () => Format)()