feat: print deprecation warnings once
authorJérôme Benoit <jerome.benoit@sap.com>
Sat, 2 Sep 2023 18:58:17 +0000 (20:58 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sat, 2 Sep 2023 18:58:17 +0000 (20:58 +0200)
closes #630

Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/ChargingStation.ts
src/utils/Configuration.ts
src/utils/Utils.ts
src/utils/index.ts
test/utils/Utils.test.ts

index f1e0e022ce842c023c962714805c93d271627bbf..a8da873b82b974b0be2ab44bfc0bd2a6775d8633 100644 (file)
@@ -144,6 +144,7 @@ import {
   isUndefined,
   logPrefix,
   logger,
+  once,
   roundTo,
   secureRandom,
   sleep,
@@ -1126,7 +1127,8 @@ export class ChargingStation {
   private getStationInfoFromTemplate(): ChargingStationInfo {
     const stationTemplate: ChargingStationTemplate = this.getTemplateFromFile()!;
     checkTemplate(stationTemplate, this.logPrefix(), this.templateFile);
-    warnTemplateKeysDeprecation(stationTemplate, this.logPrefix(), this.templateFile);
+    const warnTemplateKeysDeprecationOnce = once(warnTemplateKeysDeprecation, this);
+    warnTemplateKeysDeprecationOnce(stationTemplate, this.logPrefix(), this.templateFile);
     if (stationTemplate?.Connectors) {
       checkConnectorsConfiguration(stationTemplate, this.logPrefix(), this.templateFile);
     }
index e9ec68846c6f8f1f1e7e62dc4b372455330aa041..4e908a5e0579dcf505f1bfbf8346c4e8f7010bce 100644 (file)
@@ -6,7 +6,7 @@ import chalk from 'chalk';
 import merge from 'just-merge';
 
 import { Constants } from './Constants';
-import { hasOwnProp, isCFEnvironment, isNotEmptyString, isUndefined } from './Utils';
+import { hasOwnProp, isCFEnvironment, isNotEmptyString, isUndefined, once } from './Utils';
 import {
   ApplicationProtocol,
   type ConfigurationData,
@@ -75,7 +75,11 @@ export class Configuration {
   }
 
   public static getStationTemplateUrls(): StationTemplateUrl[] | undefined {
-    Configuration.checkDeprecatedConfigurationKeys();
+    const checkDeprecatedConfigurationKeysOnce = once(
+      Configuration.checkDeprecatedConfigurationKeys.bind(Configuration),
+      this,
+    );
+    checkDeprecatedConfigurationKeysOnce();
     return Configuration.getConfigurationData()?.stationTemplateUrls;
   }
 
index 9b8074214a3440fee1201c40c297af2e15c6f784..58e9094c7a601bcd587cf59e6fd79b32a8823b95 100644 (file)
@@ -382,3 +382,18 @@ export const isArraySorted = <T>(array: T[], compareFn: (a: T, b: T) => number):
   }
   return true;
 };
+
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+export const once = <T, A extends any[], R>(
+  fn: (...args: A) => R,
+  context: T,
+): ((...args: A) => R) => {
+  let result: R;
+  return (...args: A) => {
+    if (fn) {
+      result = fn.apply<T, A, R>(context, args);
+      (fn as unknown as undefined) = (context as unknown as undefined) = undefined;
+    }
+    return result;
+  };
+};
index 5915ae774afb0bb58f928b7cd7b13cebbb5aff35..f8fbe0e1f59c2b02f3a55ce09acec771bb00d012 100644 (file)
@@ -49,6 +49,7 @@ export {
   isUndefined,
   isValidTime,
   logPrefix,
+  once,
   promiseWithTimeout,
   roundTo,
   secureRandom,
index 80aec47bac8c952b23239629a560d5866e54680b..4a98277511875280e84d24bd7dc135477617d061 100644 (file)
@@ -26,6 +26,7 @@ import {
   isObject,
   isUndefined,
   isValidTime,
+  once,
   roundTo,
   secureRandom,
   sleep,
@@ -431,4 +432,19 @@ describe('Utils test suite', () => {
     expect(isArraySorted<number>([1, 2, 3, 5, 4], (a, b) => a - b)).toBe(false);
     expect(isArraySorted<number>([2, 1, 3, 4, 5], (a, b) => a - b)).toBe(false);
   });
+
+  it('Verify once()', () => {
+    let called = 0;
+    const fn = () => ++called;
+    const onceFn = once(fn, this);
+    const result1 = onceFn();
+    expect(called).toBe(1);
+    expect(result1).toBe(1);
+    const result2 = onceFn();
+    expect(called).toBe(1);
+    expect(result2).toBe(1);
+    const result3 = onceFn();
+    expect(called).toBe(1);
+    expect(result3).toBe(1);
+  });
 });