diff --git a/.eslintrc.json b/.eslintrc.json index 751bf56d..9d40203b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -16,7 +16,7 @@ }, "parserOptions": { "sourceType": "module", - "ecmaVersion": 2018, + "ecmaVersion": 2020, "ecmaFeatures": { "globalReturn": true } diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f7e61de..5f306611 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ _This release is scheduled to be released on 2022-07-01._ ### Added +- Added the notification emitting from the weather module on infromation updated. + ### Updated ### Fixed diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 350c4f2d..6a02d182 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -154,6 +154,15 @@ Module.register("weather", { if (this.weatherProvider.currentWeather()) { this.sendNotification("CURRENTWEATHER_TYPE", { type: this.weatherProvider.currentWeather().weatherType.replace("-", "_") }); } + + const notificationPayload = { + currentWeather: this.weatherProvider?.currentWeatherObject?.simpleClone() ?? null, + forecastArray: this.weatherProvider?.weatherForecastArray?.map((ar) => ar.simpleClone()) ?? [], + hourlyArray: this.weatherProvider?.weatherHourlyArray?.map((ar) => ar.simpleClone()) ?? [], + locationName: this.weatherProvider?.fetchedLocationName, + providerName: this.weatherProvider.providerName + }; + this.sendNotification("WEATHER_UPDATED", notificationPayload); }, scheduleUpdate: function (delay = null) { diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index e9359345..c2e6727b 100755 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -146,6 +146,23 @@ class WeatherObject { this.sunrise = moment(times.sunrise, "X"); this.sunset = moment(times.sunset, "X"); } + + /** + * Clone to simple object to prevent mutating and deprecation of legacy library. + * + * Before being handed to other modules, mutable values must be cloned safely. + * Especially 'moment' object is not immutable, so original 'date', 'sunrise', 'sunset' could be corrupted or changed by other modules. + * + * @returns {object} plained object clone of original weatherObject + */ + simpleClone() { + const toFlat = ["date", "sunrise", "sunset"]; + let clone = { ...this }; + for (const prop of toFlat) { + clone[prop] = clone?.[prop]?.valueOf() ?? clone?.[prop]; + } + return clone; + } } /*************** DO NOT EDIT THE LINE BELOW ***************/