Add initial support for ESM build
authorJérôme Benoit <jerome.benoit@sap.com>
Fri, 3 Jun 2022 20:06:37 +0000 (22:06 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Fri, 3 Jun 2022 20:06:37 +0000 (22:06 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
docker/Dockerfile
manifest-cf-template.yml
package.json
rollup.config.mjs
src/charging-station/Bootstrap.ts
src/worker/WorkerAbstract.ts
src/worker/WorkerFactory.ts

index 113b4251cdbb273ddb5e98e03e82119b146e0339..c5ac91aaefb97e8526147b0a58947fc697be7bdb 100644 (file)
@@ -30,5 +30,5 @@ COPY README.md LICENSE ./
 COPY docker/autoconfig.sh /autoconfig.sh
 RUN chmod +x /autoconfig.sh
 
-#CMD ["node", "dist/start.js"]
-CMD /autoconfig.sh && node -r source-map-support/register dist/start.js
+#CMD ["node", "dist/start.cjs"]
+CMD /autoconfig.sh && node -r source-map-support/register dist/start.cjs
index d7c5d6df11590b31c9b438101c15ebba4fb199b2..74b5dfb9ac1e3a909bf586db38bc54300b6dac1d 100644 (file)
@@ -9,8 +9,8 @@ applications:
     no-route: true
     health-check-type: process
     health-check-invocation-timeout: 10
-    command: node -r source-map-support/register dist/start.js
-    # command: node -r source-map-support/register dist/httpd/ui/start.js
+    command: node -r source-map-support/register dist/start.cjs
+    # command: node -r source-map-support/register dist/httpd/ui/start.cjs
     env:
       # OPTIMIZE_MEMORY: true
       NODE_OPTIONS: --stack-trace-limit=1024 --max-old-space-size=768
index 87ebe4ec745632ef281c21b3e87db1bde8cd5eed..ff1c06e98c43caf550d63374c8bc32acff31fa85 100644 (file)
@@ -25,7 +25,7 @@
       "url": "http://www.apache.org/licenses/LICENSE-2.0"
     }
   ],
-  "main": "./dist/start.js",
+  "main": "./dist/start.cjs",
   "lint-staged": {
     "src/**/*.{js,ts}": [
       "prettier --write",
   "scripts": {
     "prepare": "node prepare.js",
     "prestart": "npm run build",
-    "start": "cross-env NODE_ENV=production node -r source-map-support/register dist/start.js",
-    "start:server": "npm run build && cross-env NODE_ENV=production node -r source-map-support/register dist/ui/httpd/start.js",
-    "start:debug": "cross-env NODE_ENV=production node -r source-map-support/register --inspect dist/start.js",
-    "start:dev": "npm run build:dev && cross-env NODE_ENV=development node -r source-map-support/register dist/start.js",
-    "start:dev:debug": "npm run build:dev && cross-env NODE_ENV=development node -r source-map-support/register --inspect dist/start.js",
-    "start:prof": "cross-env NODE_ENV=production node -r source-map-support/register --prof dist/start.js",
-    "start:doctorprof": "cross-env NODE_ENV=production clinic doctor -- node -r source-map-support/register dist/start.js",
-    "start:flameprof": "cross-env NODE_ENV=production clinic flame -- node -r source-map-support/register dist/start.js",
-    "start:bubbleprof": "cross-env NODE_ENV=production clinic bubbleprof -- node -r source-map-support/register dist/start.js",
-    "start:heapprofiler": "cross-env NODE_ENV=production clinic heapprofiler -- node -r source-map-support/register dist/start.js",
+    "start": "cross-env NODE_ENV=production node -r source-map-support/register dist/start.cjs",
+    "start:esm": "cross-env NODE_ENV=production node -r source-map-support/register dist/start.mjs",
+    "start:server": "npm run build && cross-env NODE_ENV=production node -r source-map-support/register dist/ui/httpd/start.cjs",
+    "start:debug": "cross-env NODE_ENV=production node -r source-map-support/register --inspect dist/start.cjs",
+    "start:dev": "npm run build:dev && cross-env NODE_ENV=development node -r source-map-support/register dist/start.cjs",
+    "start:dev:debug": "npm run build:dev && cross-env NODE_ENV=development node -r source-map-support/register --inspect dist/start.cjs",
+    "start:prof": "cross-env NODE_ENV=production node -r source-map-support/register --prof dist/start.cjs",
+    "start:doctorprof": "cross-env NODE_ENV=production clinic doctor -- node -r source-map-support/register dist/start.cjs",
+    "start:flameprof": "cross-env NODE_ENV=production clinic flame -- node -r source-map-support/register dist/start.cjs",
+    "start:bubbleprof": "cross-env NODE_ENV=production clinic bubbleprof -- node -r source-map-support/register dist/start.cjs",
+    "start:heapprofiler": "cross-env NODE_ENV=production clinic heapprofiler -- node -r source-map-support/register dist/start.cjs",
     "rollup": "rollup --config",
     "build": "npm run rollup",
     "build:dev": "npm run rollup -- --environment BUILD:development",
index 7f0e577421bfea9af77707e0ddb060b63ebd55a5..bdc96d661e2eb2d0f0c41ee078bfad4d551cd95a 100644 (file)
@@ -10,15 +10,28 @@ const isDevelopmentBuild = process.env.BUILD === 'development';
 
 export default {
   input: ['src/start.ts', 'src/ui/httpd/start.ts', 'src/charging-station/ChargingStationWorker.ts'],
-  output: {
-    dir: 'dist',
-    format: 'cjs',
-    exports: 'auto',
-    sourcemap: true,
-    preserveModules: true,
-    preserveModulesRoot: 'src',
-    ...(!isDevelopmentBuild && { plugins: [terser({ numWorkers: 2 })] }),
-  },
+  output: [
+    {
+      dir: 'dist',
+      format: 'es',
+      exports: 'auto',
+      sourcemap: true,
+      preserveModules: true,
+      preserveModulesRoot: 'src',
+      entryFileNames: '[name].mjs',
+      ...(!isDevelopmentBuild && { plugins: [terser({ numWorkers: 2 })] }),
+    },
+    {
+      dir: 'dist',
+      format: 'cjs',
+      exports: 'auto',
+      sourcemap: true,
+      preserveModules: true,
+      preserveModulesRoot: 'src',
+      entryFileNames: '[name].cjs',
+      ...(!isDevelopmentBuild && { plugins: [terser({ numWorkers: 2 })] }),
+    },
+  ],
   external: [
     'basic-ftp',
     'chalk',
index 1ce68ba2adef6f4021d1f02b551d44ee5277cfd8..82aef5cd28c65a1c4be1246c6a6a2ac9fc2b6443 100644 (file)
@@ -41,7 +41,7 @@ export default class Bootstrap {
     this.workerScript = path.join(
       path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../'),
       'charging-station',
-      'ChargingStationWorker.js'
+      'ChargingStationWorker' + path.extname(fileURLToPath(import.meta.url))
     );
     this.initialize();
     this.initWorkerImplementation();
index bfb7933639eb1e3445e6bd71cafeef12807f2b3e..1dd064fbf893023ed4f41b91c411f298de1cd1b1 100644 (file)
@@ -1,6 +1,7 @@
 import { WorkerData, WorkerOptions } from '../types/Worker';
 
 import WorkerConstants from './WorkerConstants';
+import fs from 'fs';
 
 export default abstract class WorkerAbstract<T extends WorkerData> {
   protected readonly workerScript: string;
@@ -28,6 +29,12 @@ export default abstract class WorkerAbstract<T extends WorkerData> {
       },
     }
   ) {
+    if (!workerScript) {
+      throw new Error('Worker script is not defined');
+    }
+    if (!fs.existsSync(workerScript)) {
+      throw new Error('Worker script file does not exist');
+    }
     this.workerScript = workerScript;
     this.workerOptions = workerOptions;
   }
index b297f42b231715643ef14761ca1c45a93295a5cf..d95f4d326f6dff656b9be314cecf1683ff1110b0 100644 (file)
@@ -19,7 +19,7 @@ export default class WorkerFactory {
     workerOptions?: WorkerOptions
   ): WorkerAbstract<T> | null {
     if (!isMainThread) {
-      throw new Error('Trying to get a worker implementation outside the main thread');
+      throw new Error('Cannot get a worker implementation outside the main thread');
     }
     workerOptions = workerOptions ?? ({} as WorkerOptions);
     workerOptions.workerStartDelay =