From ef172592b8b1657a92ceea5a56b6b0629abf6046 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Thu, 21 Sep 2017 16:38:18 +0200 Subject: [PATCH 01/79] A first setup of the new Weather Module --- modules/default/defaultmodules.js | 3 +- .../weather/providers/openweathermap.js | 120 ++++++++++++++++ modules/default/weather/weather.js | 62 ++++++++ modules/default/weather/weatherday.js | 24 ++++ modules/default/weather/weatherprovider.js | 135 ++++++++++++++++++ 5 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 modules/default/weather/providers/openweathermap.js create mode 100644 modules/default/weather/weather.js create mode 100644 modules/default/weather/weatherday.js create mode 100644 modules/default/weather/weatherprovider.js diff --git a/modules/default/defaultmodules.js b/modules/default/defaultmodules.js index fccf3c5249..656ba6b8af 100644 --- a/modules/default/defaultmodules.js +++ b/modules/default/defaultmodules.js @@ -16,7 +16,8 @@ var defaultModules = [ "helloworld", "newsfeed", "weatherforecast", - "updatenotification" + "updatenotification", + "weather" ]; /*************** DO NOT EDIT THE LINE BELOW ***************/ diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js new file mode 100644 index 0000000000..4f3651a60d --- /dev/null +++ b/modules/default/weather/providers/openweathermap.js @@ -0,0 +1,120 @@ +/* global WeatherProvider, WeatherDay */ + +/* Magic Mirror + * Module: Weather + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + * + * This class is the blueprint for a weather provider. + */ + +WeatherProvider.register("openweathermap", { + + // Set the name of the provider. + // This isn't strictly nessecery, since it will fallback to the provider identifier + // But for debugging (and future alerts) it would be nice to have the real name. + providerName: "OpenWeatherMap", + + // Overwrite the fetchCurrentWeather method. + fetchCurrentWeather: function() { + var apiVersion = "2.5" + var apiBase = "http://api.openweathermap.org/data/" + var weatherEndpoint = "weather" + + var url = apiBase + apiVersion + "/" + weatherEndpoint + this.getParams() + + this.fetchData(url) + .then(data => { + Log.log(data) + + if (!data || !data.main || typeof data.main.temp === "undefined") { + // Did not receive usable new data. + // Maybe this needs a better check? + return; + } + + var currentWeather = this.generateWeatherDayFromCurrentWeather(data) + this.setCurrentWeather(currentWeather) + }) + .catch(function(request) { + Log.error("Could not load data ... ", request) + }) + }, + + + /** OpenWeatherMap Specific Methods - These are not part of the default provider methods */ + + + /* + * Generate a WeatherDay based on currentWeatherInformation + */ + generateWeatherDayFromCurrentWeather: function(currentWeatherData) { + var currentWeather = new WeatherDay() + + currentWeather.humidity = parseFloat(currentWeatherData.main.humidity) + currentWeather.temperature = parseFloat(currentWeatherData.main.temp) + currentWeather.windSpeed = parseFloat(currentWeatherData.wind.speed) + currentWeather.windDirection = currentWeatherData.wind.deg + currentWeather.weatherType = this.convertWeatherType(currentWeatherData.weather[0].icon) + currentWeather.sunrise = new Date(currentWeatherData.sys.sunrise * 1000) + currentWeather.sunset = new Date(currentWeatherData.sys.sunset * 1000) + + return currentWeather + }, + + /* + * Convert the OpenWeatherMap icons to a more usable name. + */ + convertWeatherType: function(weatherType) { + var weatherTypes = { + "01d": "day-sunny", + "02d": "day-cloudy", + "03d": "cloudy", + "04d": "cloudy-windy", + "09d": "showers", + "10d": "rain", + "11d": "thunderstorm", + "13d": "snow", + "50d": "fog", + "01n": "night-clear", + "02n": "night-cloudy", + "03n": "night-cloudy", + "04n": "night-cloudy", + "09n": "night-showers", + "10n": "night-rain", + "11n": "night-thunderstorm", + "13n": "night-snow", + "50n": "night-alt-cloudy-windy" + } + + return weatherTypes.hasOwnProperty(weatherType) ? weatherTypes[weatherType] : null + }, + + /* getParams(compliments) + * Generates an url with api parameters based on the config. + * + * return String - URL params. + */ + getParams: function() { + var params = "?"; + if(this.config.locationID) { + params += "id=" + this.config.locationID; + } else if(this.config.location) { + params += "q=" + this.config.location; + } else if (this.firstEvent && this.firstEvent.geo) { + params += "lat=" + this.firstEvent.geo.lat + "&lon=" + this.firstEvent.geo.lon + } else if (this.firstEvent && this.firstEvent.location) { + params += "q=" + this.firstEvent.location; + } else { + this.hide(this.config.animationSpeed, {lockString:this.identifier}); + return; + } + + params += "&units=" + this.config.units; + params += "&lang=" + this.config.lang; + params += "&APPID=" + this.config.apiKey; + + return params; + }, +}); \ No newline at end of file diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js new file mode 100644 index 0000000000..2be3ff0bc2 --- /dev/null +++ b/modules/default/weather/weather.js @@ -0,0 +1,62 @@ +/* global Module, WeatherProvider */ + +/* Magic Mirror + * Module: Weather + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + */ + +Module.register("weather",{ + + // Default module config. + defaults: { + foo: "bar", + weatherProvider: "openweathermap" + }, + + // Module properties. + weatherProvider: null, + + // Return the scripts that are nessecery for the weather module. + getScripts: function () { + var scripts = [ + "weatherprovider.js", + "weatherday.js" + ]; + + // Add the provider file to the required scripts. + scripts.push(this.file("providers/" + this.config.weatherProvider.toLowerCase() + ".js")) + + return scripts + }, + + // Start the weather module. + start: function () { + // Initialize the weather provider. + this.weatherProvider = WeatherProvider.initialize(this.config.weatherProvider, this) + + // Let the weather provider know we are starting. + this.weatherProvider.start() + + // Fetch the current weather. This is something we need to schedule. + this.weatherProvider.fetchCurrentWeather() + }, + + // Generate the dom. This is now pretty simple for debugging. + getDom: function() { + var wrapper = document.createElement("div") + + wrapper.innerHTML += "Name: " + this.weatherProvider.providerName + "
" + wrapper.innerHTML += JSON.stringify(this.weatherProvider.currentWeather()) + + return wrapper + }, + + // What to do when the weather provider has new information available? + updateAvailable: function() { + Log.log("New weather information available.") + console.info(this.weatherProvider.currentWeather()) + this.updateDom(0); + } +}); diff --git a/modules/default/weather/weatherday.js b/modules/default/weather/weatherday.js new file mode 100644 index 0000000000..c8f63057a4 --- /dev/null +++ b/modules/default/weather/weatherday.js @@ -0,0 +1,24 @@ +/* global Class */ + +/* Magic Mirror + * Module: Weather + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + * + * This class is the blueprint for a day which includes weather information. + */ + +// Currently this is focused on the information which is nessecery for the current weather. +// As soon as we start implementing the forecast, mode properties will be added. + +class WeatherDay { + constructor() { + this.windSpeed = null + this.windDirection = null + this.sunrise = null + this.sunset = null + this.temperature = null + this.weatherType = null + } +}; \ No newline at end of file diff --git a/modules/default/weather/weatherprovider.js b/modules/default/weather/weatherprovider.js new file mode 100644 index 0000000000..08489aebb6 --- /dev/null +++ b/modules/default/weather/weatherprovider.js @@ -0,0 +1,135 @@ +/* global Class */ + +/* Magic Mirror + * Module: Weather + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + * + * This class is the blueprint for a weather provider. + */ + + +/** + * Base BluePrint for the WeatherProvider + */ +var WeatherProvider = Class.extend({ + // Weather Provider Properties + providerName: null, + + // The following properties have accestor methods. + // Try to not access them directly. + currentWeatherDay: null, + weatherForecastArray: null, + + // The following properties will be set automaticly. + // You do not need to overwrite these properties. + config: null, + delegate: null, + providerIdentifier: null, + + + // Weather Provider Methods + // All the following methods can be overwrited, although most are good as they are. + + // Called when a weather provider is initialized. + init: function(config) { + this.config = config; + Log.info("Weather provider: " + this.providerName + " initialized.") + }, + + // Called to set the config, this config is the same as the weather module's config. + setConfig: function(config) { + this.config = config + Log.info("Weather provider: " + this.providerName + " config set.", this.config) + }, + + // Called when the weather provider is about to start. + start: function(config) { + Log.info("Weather provider: " + this.providerName + " started.") + }, + + // This method should start the API request to fetch the current weather. + // This method should definetly be overwritten in the provider. + fetchCurrentWeather: function() { + Log.warn("Weather provider: " + this.providerName + " does not subclass the fetchCurrentWeather method.") + }, + + // This method should start the API request to fetch the weather forecast. + // This method should definetly be overwritten in the provider. + fetchWeatherForeCast: function() { + Log.warn("Weather provider: " + this.providerName + " does not subclass the fetchWeatherForeCast method.") + }, + + // This returns a WeatherDay object for the current weather. + currentWeather: function() { + return this.currentWeatherDay + }, + + // This returns an array of WeatherDay objects for the weather forecast. + weatherForecast: function() { + return this.weatherForecastArray + }, + + // Set the currentWeather and notify the delegate that new information is availabe. + setCurrentWeather: function(currentWeatherDay) { + // We should check here if we are passing a WeatherDay + this.currentWeatherDay = currentWeatherDay + + this.updateAvailable() + }, + + // Notify the delegate that new weather is available. + updateAvailable: function() { + this.delegate.updateAvailable(this) + }, + + // A convinience function to make requests. It returns a promise. + fetchData: function(url, method = "GET", data = null) { + return new Promise(function(resolve, reject) { + var request = new XMLHttpRequest(); + request.open(method, url, true); + request.onreadystatechange = function() { + if (this.readyState === 4) { + if (this.status === 200) { + resolve(JSON.parse(this.response)); + } else { + reject(request) + } + } + }; + request.send(); + }) + } +}); + +/** + * Collection of registered weather providers. + */ +WeatherProvider.providers = [] + +/** + * Static method to register a new weather provider. + */ +WeatherProvider.register = function(providerIdentifier, providerDetails) { + WeatherProvider.providers[providerIdentifier.toLowerCase()] = WeatherProvider.extend(providerDetails) +} + +/** + * Static method to initialize a new weather provider. + */ +WeatherProvider.initialize = function(providerIdentifier, delegate) { + providerIdentifier = providerIdentifier.toLowerCase() + + var provider = new WeatherProvider.providers[providerIdentifier]() + + provider.delegate = delegate + provider.setConfig(delegate.config) + + provider.providerIdentifier = providerIdentifier; + if (!provider.providerName) { + provider.providerName = providerIdentifier + } + + return provider; +} \ No newline at end of file From 7f2e643e6249f8e91be1bfc7e8edfa66b4ed385f Mon Sep 17 00:00:00 2001 From: Nicholas Hubbard Date: Thu, 21 Sep 2017 20:06:42 -0400 Subject: [PATCH 02/79] Add Dark Sky Module --- modules/default/weather/providers/darksky.js | 61 ++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 modules/default/weather/providers/darksky.js diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js new file mode 100644 index 0000000000..43a87fd1fc --- /dev/null +++ b/modules/default/weather/providers/darksky.js @@ -0,0 +1,61 @@ +/* global WeatherProvider, WeatherDay */ + +/* Magic Mirror + * Module: Weather + * Provider: Dark Sky + * + * By Nicholas Hubbard https://github.com/nhubbard + * MIT Licensed + * + * This class is a provider for Dark Sky. + */ +WeatherProvider.register("darksky", { + // Set the name of the provider. + // Not strictly required, but helps for debugging. + providerName: "Dark Sky", + // Implement fetchCurrentWeather. + fetchCurrentWeather: function() { + // Create a URL from the config and base URL. + var url = `https://api.darksky.net/forecast/${this.config.apiKey}/${this.config.latLong}`; + // Run the request. + this.fetchData(url).then(data => { + Log.log(data); + if(!data || !data.main || typeof data.main.temp === "undefined") { + // No usable data? + return; + } + var currentWeather = this.generateWeatherDayFromCurrentWeather(data); + this.setCurrentWeather(currentWeather); + }).catch(function(request) { + Log.error("Could not load data!", request); + }); + }, + // Implement WeatherDay generator. + generateWeatherDayFromCurrentWeather: function(currentWeatherData) { + var currentWeather = new WeatherDay(); + currentWeather.humidity = parseFloat(currentWeatherData.currently.humidity); + currentWeather.temperature = parseFloat(currentWeatherData.currently.temperature); + currentWeather.windSpeed = parseFloat(currentWeatherData.currently.windSpeed); + currentWeather.windDirection = currentWeatherData.currently.windBearing; + currentWeather.weatherType = this.currentWeatherType(currentWeatherData.currently.icon); + currentWeather.sunrise = new Date(currentWeatherData.daily.data[0].sunriseTime); + currentWeather.sunset = new Date(currentWeatherData.daily.data[0].sunsetTime); + return currentWeather; + }, + // Map icons from Dark Sky to our icons. + convertWeatherType: function(weatherType) { + var weatherTypes = { + "clear-day": "day-sunny", + "clear-night": "night-clear", + "rain": "rain", + "snow": "snow", + "sleet": "snow", + "wind": "wind", + "fog": "fog", + "cloudy": "cloudy", + "partly-cloudy-day": "day-cloudy", + "partly-cloudy-night": "night-cloudy" + }; + return weatherTypes.hasOwnProperty(weatherType) ? weatherTypes[weatherType] : null; + } +}); \ No newline at end of file From 2bf18d8bdab364636b2589a981c7e7fb395bc669 Mon Sep 17 00:00:00 2001 From: Nicholas Hubbard Date: Thu, 21 Sep 2017 20:12:25 -0400 Subject: [PATCH 03/79] Fix Indentation? --- js/class.js | 24 +++++++++---------- .../updatenotification/updatenotification.js | 4 +--- tests/configs/check_config.js | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/js/class.js b/js/class.js index 3c44250e7b..d054a73eda 100644 --- a/js/class.js +++ b/js/class.js @@ -31,22 +31,22 @@ // Check if we're overwriting an existing function prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn) { - return function() { - var tmp = this._super; + return function() { + var tmp = this._super; - // Add a new ._super() method that is the same method - // but on the super-class - this._super = _super[name]; + // Add a new ._super() method that is the same method + // but on the super-class + this._super = _super[name]; - // The method only need to be bound temporarily, so we - // remove it when we're done executing - var ret = fn.apply(this, arguments); - this._super = tmp; + // The method only need to be bound temporarily, so we + // remove it when we're done executing + var ret = fn.apply(this, arguments); + this._super = tmp; - return ret; - }; - })(name, prop[name]) : prop[name]; + return ret; + }; + })(name, prop[name]) : prop[name]; } // The dummy class constructor diff --git a/modules/default/updatenotification/updatenotification.js b/modules/default/updatenotification/updatenotification.js index f663f59383..9772f06bc4 100644 --- a/modules/default/updatenotification/updatenotification.js +++ b/modules/default/updatenotification/updatenotification.js @@ -58,9 +58,7 @@ Module.register("updatenotification", { wrapper.appendChild(message); var subtext = document.createElement("div"); - subtext.innerHTML = this.translate("UPDATE_INFO") - .replace("COMMIT_COUNT", this.status.behind + " " + ((this.status.behind == 1)? "commit" : "commits")) - .replace("BRANCH_NAME", this.status.current); + subtext.innerHTML = this.translate("UPDATE_INFO").replace("COMMIT_COUNT", this.status.behind + " " + ((this.status.behind == 1)? "commit" : "commits")).replace("BRANCH_NAME", this.status.current); subtext.className = "xsmall dimmed"; wrapper.appendChild(subtext); } diff --git a/tests/configs/check_config.js b/tests/configs/check_config.js index fa294761e8..85cc6a4811 100644 --- a/tests/configs/check_config.js +++ b/tests/configs/check_config.js @@ -48,7 +48,7 @@ try { // In case the there errors show messages and // return console.info(Utils.colors.info("Checking file... ", configFileName)); - // I'm not sure if all ever is utf-8 +// I'm not sure if all ever is utf-8 fs.readFile(configFileName, "utf-8", function(err, data) { if (err) {throw err;} v.JSHINT(data); // Parser by jshint From 5b1462a3e878fac01ba930cb1c934ac77456a3f2 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Fri, 22 Sep 2017 10:37:39 +0200 Subject: [PATCH 04/79] Add readme. --- modules/default/weather/README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 modules/default/weather/README.md diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md new file mode 100644 index 0000000000..325732cc8f --- /dev/null +++ b/modules/default/weather/README.md @@ -0,0 +1,17 @@ +# Weather Module + +This module is aimed to be the replacement for the current `currentweather` and `weatherforcast` modules. The module will be configurable to be used as a current weather view, or to show the forecast. This way the module can be used twice to fullfil both purposes. + +The biggest cange is the use of weather providers. This way we are not bound to one API source. And users can choose which API they want to use as their source. Initially the current OpenWeatherMap will be added as the first source, but more will follow soon. + +The module is in a very early stage, and needs a lot of work. It's API isn't set in stone, so keep that in mind when you want to contribute. + +## TODO + +- [ ] Add Current Weather View +- [ ] Add Weather Forecast View +- [ ] Add Forecast API Call +- [ ] Add all original configuration options +- [ ] Add more providers +- [ ] Finish thi Todo list +- [ ] Write the documentation \ No newline at end of file From 713111254b3241b63b1178872dc670611a068c7c Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Fri, 22 Sep 2017 12:26:47 +0200 Subject: [PATCH 05/79] First implementation of the currentWeatherView --- .../weather/providers/openweathermap.js | 26 ++--- modules/default/weather/weather.css | 46 ++++++++ modules/default/weather/weather.js | 103 ++++++++++++++++-- modules/default/weather/weatherday.js | 24 ---- modules/default/weather/weatherobject.js | 60 ++++++++++ modules/default/weather/weatherprovider.js | 8 +- 6 files changed, 214 insertions(+), 53 deletions(-) create mode 100644 modules/default/weather/weather.css delete mode 100644 modules/default/weather/weatherday.js create mode 100644 modules/default/weather/weatherobject.js diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index 4f3651a60d..edc276571b 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -1,4 +1,4 @@ -/* global WeatherProvider, WeatherDay */ +/* global WeatherProvider, WeatherObject */ /* Magic Mirror * Module: Weather @@ -34,7 +34,7 @@ WeatherProvider.register("openweathermap", { return; } - var currentWeather = this.generateWeatherDayFromCurrentWeather(data) + var currentWeather = this.generateWeatherObjectFromCurrentWeather(data) this.setCurrentWeather(currentWeather) }) .catch(function(request) { @@ -47,18 +47,18 @@ WeatherProvider.register("openweathermap", { /* - * Generate a WeatherDay based on currentWeatherInformation + * Generate a WeatherObject based on currentWeatherInformation */ - generateWeatherDayFromCurrentWeather: function(currentWeatherData) { - var currentWeather = new WeatherDay() - - currentWeather.humidity = parseFloat(currentWeatherData.main.humidity) - currentWeather.temperature = parseFloat(currentWeatherData.main.temp) - currentWeather.windSpeed = parseFloat(currentWeatherData.wind.speed) - currentWeather.windDirection = currentWeatherData.wind.deg - currentWeather.weatherType = this.convertWeatherType(currentWeatherData.weather[0].icon) - currentWeather.sunrise = new Date(currentWeatherData.sys.sunrise * 1000) - currentWeather.sunset = new Date(currentWeatherData.sys.sunset * 1000) + generateWeatherObjectFromCurrentWeather: function(currentWeatherData) { + var currentWeather = new WeatherObject() + + currentWeather.humidity = currentWeatherData.main.humidity ? parseFloat(currentWeatherData.main.humidity) : null + currentWeather.temperature = currentWeatherData.main.temp ? parseFloat(currentWeatherData.main.temp) : null + currentWeather.windSpeed = currentWeatherData.wind.speed ? parseFloat(currentWeatherData.wind.speed) : null + currentWeather.windDirection = currentWeatherData.wind.deg ? currentWeatherData.wind.deg : null + currentWeather.weatherType = currentWeatherData.weather[0].icon ? this.convertWeatherType(currentWeatherData.weather[0].icon) : null + currentWeather.sunrise = currentWeatherData.sys.sunrise ? new Date(currentWeatherData.sys.sunrise * 1000) : null + currentWeather.sunset = currentWeatherData.sys.sunset ? new Date(currentWeatherData.sys.sunset * 1000) : null return currentWeather }, diff --git a/modules/default/weather/weather.css b/modules/default/weather/weather.css new file mode 100644 index 0000000000..febc777c68 --- /dev/null +++ b/modules/default/weather/weather.css @@ -0,0 +1,46 @@ +.weather .weathericon, +.weather .fa-home { + font-size: 75%; + line-height: 65px; + display: inline-block; + -ms-transform: translate(0, -3px); /* IE 9 */ + -webkit-transform: translate(0, -3px); /* Safari */ + transform: translate(0, -3px); +} + +.weather .humidityIcon { + padding-right: 4px; +} + +.weather .humidity-padding { + padding-bottom: 6px; +} + + +.weather .day { + padding-left: 0; + padding-right: 25px; +} + +.weather .weather-icon { + padding-right: 30px; + text-align: center; +} + +.weather .min-temp { + padding-left: 20px; + padding-right: 0; +} + +.weather .rain { + padding-left: 20px; + padding-right: 0; +} + +.weather tr.colored .min-temp { + color: #BCDDFF; +} + +.weather tr.colored .max-temp { + color: #FF8E99; +} diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 2be3ff0bc2..a5c410b2d4 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -11,18 +11,25 @@ Module.register("weather",{ // Default module config. defaults: { - foo: "bar", - weatherProvider: "openweathermap" + updateInterval: 10 * 60 * 1000, + weatherProvider: "openweathermap", + units: config.units, + roundTemp: false }, // Module properties. weatherProvider: null, + // Define required scripts. + getStyles: function() { + return ["weather-icons.css", "weather.css"]; + }, + // Return the scripts that are nessecery for the weather module. getScripts: function () { var scripts = [ "weatherprovider.js", - "weatherday.js" + "weatherobject.js" ]; // Add the provider file to the required scripts. @@ -39,24 +46,96 @@ Module.register("weather",{ // Let the weather provider know we are starting. this.weatherProvider.start() - // Fetch the current weather. This is something we need to schedule. - this.weatherProvider.fetchCurrentWeather() + // Schedule the first update. + this.scheduleUpdate(0) }, // Generate the dom. This is now pretty simple for debugging. getDom: function() { - var wrapper = document.createElement("div") - - wrapper.innerHTML += "Name: " + this.weatherProvider.providerName + "
" - wrapper.innerHTML += JSON.stringify(this.weatherProvider.currentWeather()) - - return wrapper + return this.currentWeatherView(this.weatherProvider.currentWeather()) }, // What to do when the weather provider has new information available? updateAvailable: function() { Log.log("New weather information available.") console.info(this.weatherProvider.currentWeather()) - this.updateDom(0); + this.updateDom(0) + this.scheduleUpdate() + }, + + scheduleUpdate: function(delay = null) { + var nextLoad = this.config.updateInterval; + if (delay !== null && delay >= 0) { + nextLoad = delay; + } + + setTimeout(() => { + // Currently we are fetching the currentWeather. + // In the future, it depends what we want to show. + // So there needs to be some logic here... + // if config.weatherType == 'current', do this... + // if config.weatherType === 'forecast, do that ... + this.weatherProvider.fetchCurrentWeather() + }, nextLoad); + }, + + /* Views */ + + // Generate the current weather view + currentWeatherView: function (currentWeather) { + var wrapper = document.createElement("div") + + if (currentWeather === null) { + return wrapper + } + + // Detail bar. + + var detailBar = document.createElement("div") + + this.addValueToWrapper(detailBar, null, "wi wi-strong-wind dimmed", "span", true) // Wind Icon + this.addValueToWrapper(detailBar, currentWeather.windSpeed ? Math.round(currentWeather.windSpeed) : null) // WindSpeed + this.addValueToWrapper(detailBar, currentWeather.windDirection ? this.translate(currentWeather.cardinalWindDirection()) + "  " : null, "", "sup") // WindDirection + + var now = new Date(); + var sunriseSunsetTime = (currentWeather.sunrise < now && currentWeather.sunset > now) ? currentWeather.sunset : currentWeather.sunrise + var sunriseSunsetIcon = (currentWeather.sunrise < now && currentWeather.sunset > now) ? "wi-sunset" : "wi-sunrise" + this.addValueToWrapper(detailBar, null, "wi dimmed " + sunriseSunsetIcon, "span", true) // Sunrise / Sunset Icon + this.addValueToWrapper(detailBar, moment(sunriseSunsetTime).format("HH:mm")) // Sunrise / Sunset Time + + detailBar.className = "normal medium" + wrapper.appendChild(detailBar) + + // Main info + + var mainInfo = document.createElement("div") + + this.addValueToWrapper(mainInfo, null, "weathericon wi wi-" + currentWeather.weatherType, "span", true) // Wind Icon + this.addValueToWrapper(mainInfo, parseFloat(currentWeather.temperature).toFixed(this.config.roundTemp ? 0 : 1) + "°", "bright" ) // WindSpeed + + mainInfo.className = "large light" + wrapper.appendChild(mainInfo) + + return wrapper + }, + + // A convenience function to add an element to a wrapper with a specific value and class. + addValueToWrapper: function(wrapper, value, classNames, element = "span", forceAdd = false, addSpacer = true) { + if (value === null && !forceAdd) { + return + } + + var valueWrapper = document.createElement(element) + valueWrapper.className = classNames + if (addSpacer) { + valueWrapper.innerHTML = " " + } + + if (value !== null) { + valueWrapper.innerHTML += value + } + + wrapper.appendChild(valueWrapper) } + }); diff --git a/modules/default/weather/weatherday.js b/modules/default/weather/weatherday.js deleted file mode 100644 index c8f63057a4..0000000000 --- a/modules/default/weather/weatherday.js +++ /dev/null @@ -1,24 +0,0 @@ -/* global Class */ - -/* Magic Mirror - * Module: Weather - * - * By Michael Teeuw http://michaelteeuw.nl - * MIT Licensed. - * - * This class is the blueprint for a day which includes weather information. - */ - -// Currently this is focused on the information which is nessecery for the current weather. -// As soon as we start implementing the forecast, mode properties will be added. - -class WeatherDay { - constructor() { - this.windSpeed = null - this.windDirection = null - this.sunrise = null - this.sunset = null - this.temperature = null - this.weatherType = null - } -}; \ No newline at end of file diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js new file mode 100644 index 0000000000..2525eb6ed3 --- /dev/null +++ b/modules/default/weather/weatherobject.js @@ -0,0 +1,60 @@ +/* global Class */ + +/* Magic Mirror + * Module: Weather + * + * By Michael Teeuw http://michaelteeuw.nl + * MIT Licensed. + * + * This class is the blueprint for a day which includes weather information. + */ + +// Currently this is focused on the information which is nessecery for the current weather. +// As soon as we start implementing the forecast, mode properties will be added. + +class WeatherObject { + constructor() { + this.windSpeed = null + this.windDirection = null + this.sunrise = null + this.sunset = null + this.temperature = null + this.weatherType = null + } + + cardinalWindDirection () { + if (this.windDirection>11.25 && this.windDirection<=33.75){ + return "NNE"; + } else if (this.windDirection > 33.75 && this.windDirection <= 56.25) { + return "NE"; + } else if (this.windDirection > 56.25 && this.windDirection <= 78.75) { + return "ENE"; + } else if (this.windDirection > 78.75 && this.windDirection <= 101.25) { + return "E"; + } else if (this.windDirection > 101.25 && this.windDirection <= 123.75) { + return "ESE"; + } else if (this.windDirection > 123.75 && this.windDirection <= 146.25) { + return "SE"; + } else if (this.windDirection > 146.25 && this.windDirection <= 168.75) { + return "SSE"; + } else if (this.windDirection > 168.75 && this.windDirection <= 191.25) { + return "S"; + } else if (this.windDirection > 191.25 && this.windDirection <= 213.75) { + return "SSW"; + } else if (this.windDirection > 213.75 && this.windDirection <= 236.25) { + return "SW"; + } else if (this.windDirection > 236.25 && this.windDirection <= 258.75) { + return "WSW"; + } else if (this.windDirection > 258.75 && this.windDirection <= 281.25) { + return "W"; + } else if (this.windDirection > 281.25 && this.windDirection <= 303.75) { + return "WNW"; + } else if (this.windDirection > 303.75 && this.windDirection <= 326.25) { + return "NW"; + } else if (this.windDirection > 326.25 && this.windDirection <= 348.75) { + return "NNW"; + } else { + return "N"; + } + } +}; \ No newline at end of file diff --git a/modules/default/weather/weatherprovider.js b/modules/default/weather/weatherprovider.js index 08489aebb6..a7ca4cba39 100644 --- a/modules/default/weather/weatherprovider.js +++ b/modules/default/weather/weatherprovider.js @@ -19,7 +19,7 @@ var WeatherProvider = Class.extend({ // The following properties have accestor methods. // Try to not access them directly. - currentWeatherDay: null, + currentWeatherObject: null, weatherForecastArray: null, // The following properties will be set automaticly. @@ -63,7 +63,7 @@ var WeatherProvider = Class.extend({ // This returns a WeatherDay object for the current weather. currentWeather: function() { - return this.currentWeatherDay + return this.currentWeatherObject }, // This returns an array of WeatherDay objects for the weather forecast. @@ -72,9 +72,9 @@ var WeatherProvider = Class.extend({ }, // Set the currentWeather and notify the delegate that new information is availabe. - setCurrentWeather: function(currentWeatherDay) { + setCurrentWeather: function(currentWeatherObject) { // We should check here if we are passing a WeatherDay - this.currentWeatherDay = currentWeatherDay + this.currentWeatherObject = currentWeatherObject this.updateAvailable() }, From ff9c6bac0a40e5241890067ea63417a45dcbd4e7 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Fri, 22 Sep 2017 13:26:44 +0200 Subject: [PATCH 06/79] Add a small forecast example. --- .../weather/providers/openweathermap.js | 24 ++++++ modules/default/weather/weather.js | 74 ++++++++++++++++--- modules/default/weather/weatherobject.js | 3 + modules/default/weather/weatherprovider.js | 14 +++- 4 files changed, 101 insertions(+), 14 deletions(-) diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index edc276571b..c9e56d2c43 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -42,6 +42,28 @@ WeatherProvider.register("openweathermap", { }) }, + // Overwrite the fetchCurrentWeather method. + fetchWeatherForecast: function() { + + // I haven't yet implemented the real api call, so let's just generate some random data. + + var forecast = [] + var today = moment() + + for (var i = 0; i < 5; i++ ) { + var weatherObject = new WeatherObject() + + weatherObject.date = moment(today).add(i, "days") + weatherObject.minTemperature = Math.random() * 10 + 10 + weatherObject.maxTemperature = Math.random() * 15 + 10 + + forecast.push(weatherObject) + } + + this.setWeatherForecast(forecast) + }, + + /** OpenWeatherMap Specific Methods - These are not part of the default provider methods */ @@ -52,6 +74,8 @@ WeatherProvider.register("openweathermap", { generateWeatherObjectFromCurrentWeather: function(currentWeatherData) { var currentWeather = new WeatherObject() + currentWeather.date = new Date + currentWeather.humidity = currentWeatherData.main.humidity ? parseFloat(currentWeatherData.main.humidity) : null currentWeather.temperature = currentWeatherData.main.temp ? parseFloat(currentWeatherData.main.temp) : null currentWeather.windSpeed = currentWeatherData.wind.speed ? parseFloat(currentWeatherData.wind.speed) : null diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index a5c410b2d4..7f33ffa82d 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -14,7 +14,8 @@ Module.register("weather",{ updateInterval: 10 * 60 * 1000, weatherProvider: "openweathermap", units: config.units, - roundTemp: false + roundTemp: false, + displayType: "full" //current, forecast, full }, // Module properties. @@ -52,7 +53,17 @@ Module.register("weather",{ // Generate the dom. This is now pretty simple for debugging. getDom: function() { - return this.currentWeatherView(this.weatherProvider.currentWeather()) + switch (this.config.displayType) { + case "current": + return this.currentWeatherView() + break; + case "forecast": + return this.weatherForecastView() + break; + default: + return this.fullWeatherView() + break; + } }, // What to do when the weather provider has new information available? @@ -70,19 +81,27 @@ Module.register("weather",{ } setTimeout(() => { - // Currently we are fetching the currentWeather. - // In the future, it depends what we want to show. - // So there needs to be some logic here... - // if config.weatherType == 'current', do this... - // if config.weatherType === 'forecast, do that ... - this.weatherProvider.fetchCurrentWeather() + switch (this.config.displayType) { + case "current": + this.weatherProvider.fetchCurrentWeather() + break; + case "forecast": + this.weatherProvider.fetchWeatherForecast() + break; + default: + this.weatherProvider.fetchCurrentWeather() + this.weatherProvider.fetchWeatherForecast() + break; + } }, nextLoad); }, /* Views */ // Generate the current weather view - currentWeatherView: function (currentWeather) { + currentWeatherView: function () { + + var currentWeather = this.weatherProvider.currentWeather() var wrapper = document.createElement("div") if (currentWeather === null) { @@ -95,7 +114,7 @@ Module.register("weather",{ this.addValueToWrapper(detailBar, null, "wi wi-strong-wind dimmed", "span", true) // Wind Icon this.addValueToWrapper(detailBar, currentWeather.windSpeed ? Math.round(currentWeather.windSpeed) : null) // WindSpeed - this.addValueToWrapper(detailBar, currentWeather.windDirection ? this.translate(currentWeather.cardinalWindDirection()) + "  " : null, "", "sup") // WindDirection + this.addValueToWrapper(detailBar, currentWeather.windDirection ? this.translate(currentWeather.cardinalWindDirection()) + "  " : " ", "", "sup") // WindDirection var now = new Date(); var sunriseSunsetTime = (currentWeather.sunrise < now && currentWeather.sunset > now) ? currentWeather.sunset : currentWeather.sunrise @@ -111,7 +130,7 @@ Module.register("weather",{ var mainInfo = document.createElement("div") this.addValueToWrapper(mainInfo, null, "weathericon wi wi-" + currentWeather.weatherType, "span", true) // Wind Icon - this.addValueToWrapper(mainInfo, parseFloat(currentWeather.temperature).toFixed(this.config.roundTemp ? 0 : 1) + "°", "bright" ) // WindSpeed + this.addValueToWrapper(mainInfo, currentWeather.temperature.toFixed(this.config.roundTemp ? 0 : 1) + "°", "bright" ) // WindSpeed mainInfo.className = "large light" wrapper.appendChild(mainInfo) @@ -119,6 +138,39 @@ Module.register("weather",{ return wrapper }, + weatherForecastView: function() { + // This is just a dummy view to test it ... it needs A LOT of work :) + // Currently it outputs a div, it should be a table. + + var wrapper = document.createElement("div") + wrapper.className = "small" + + if (this.weatherProvider.weatherForecast() === null) { + return wrapper + } + + this.weatherProvider.weatherForecast().forEach((weatherObject) => { + var day = document.createElement("div") + + this.addValueToWrapper(day, moment(weatherObject.date).format("dd")) + this.addValueToWrapper(day, weatherObject.maxTemperature ? weatherObject.maxTemperature.toFixed(this.config.roundTemp ? 0 : 1) : null, "bright") + this.addValueToWrapper(day, weatherObject.minTemperature ? weatherObject.minTemperature.toFixed(this.config.roundTemp ? 0 : 1) : null, "dimmed") + + wrapper.appendChild(day) + }); + + return wrapper + }, + + fullWeatherView: function() { + var wrapper = document.createElement("div") + + wrapper.appendChild(this.currentWeatherView()) + wrapper.appendChild(this.weatherForecastView()) + + return wrapper + }, + // A convenience function to add an element to a wrapper with a specific value and class. addValueToWrapper: function(wrapper, value, classNames, element = "span", forceAdd = false, addSpacer = true) { if (value === null && !forceAdd) { diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index 2525eb6ed3..7448d11832 100644 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -14,11 +14,14 @@ class WeatherObject { constructor() { + this.date = null this.windSpeed = null this.windDirection = null this.sunrise = null this.sunset = null this.temperature = null + this.minTemperature = null, + this.maxTemperature = null, this.weatherType = null } diff --git a/modules/default/weather/weatherprovider.js b/modules/default/weather/weatherprovider.js index a7ca4cba39..f31b22b7e1 100644 --- a/modules/default/weather/weatherprovider.js +++ b/modules/default/weather/weatherprovider.js @@ -57,8 +57,8 @@ var WeatherProvider = Class.extend({ // This method should start the API request to fetch the weather forecast. // This method should definetly be overwritten in the provider. - fetchWeatherForeCast: function() { - Log.warn("Weather provider: " + this.providerName + " does not subclass the fetchWeatherForeCast method.") + fetchWeatherForecast: function() { + Log.warn("Weather provider: " + this.providerName + " does not subclass the fetchWeatherForecast method.") }, // This returns a WeatherDay object for the current weather. @@ -71,7 +71,7 @@ var WeatherProvider = Class.extend({ return this.weatherForecastArray }, - // Set the currentWeather and notify the delegate that new information is availabe. + // Set the currentWeather and notify the delegate that new information is available. setCurrentWeather: function(currentWeatherObject) { // We should check here if we are passing a WeatherDay this.currentWeatherObject = currentWeatherObject @@ -79,6 +79,14 @@ var WeatherProvider = Class.extend({ this.updateAvailable() }, + // Set the weatherForecastArray and notify the delegate that new information is available. + setWeatherForecast: function(weatherForecastArray) { + // We should check here if we are passing a WeatherDay + this.weatherForecastArray = weatherForecastArray + + this.updateAvailable() + }, + // Notify the delegate that new weather is available. updateAvailable: function() { this.delegate.updateAvailable(this) From 837e275bfd238b10433731454280d414cce78218 Mon Sep 17 00:00:00 2001 From: Nicholas Hubbard Date: Fri, 29 Sep 2017 10:11:46 -0400 Subject: [PATCH 07/79] Update fork --- modules/default/weather/providers/darksky.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js index 43a87fd1fc..3164d7c8f0 100644 --- a/modules/default/weather/providers/darksky.js +++ b/modules/default/weather/providers/darksky.js @@ -30,9 +30,23 @@ WeatherProvider.register("darksky", { Log.error("Could not load data!", request); }); }, + fetchWeatherForecast: function() { + // Also, fake data. + var forecast = []; + var today = moment(); + for(var i = 0; i < 5; i++) { + var weatherObject = new WeatherObject(); + weatherObject.date = moment(today).add(i, "days"); + weatherObject.minTemperature = Math.random() * 10 + 10; + weatherObject.maxTemperature = Math.random() * 15 + 10; + forecast.push(weatherObject); + } + this.setWeatherForecast(); + }, // Implement WeatherDay generator. generateWeatherDayFromCurrentWeather: function(currentWeatherData) { - var currentWeather = new WeatherDay(); + var currentWeather = new WeatherObject(); + currentWeather.date = new Date(); currentWeather.humidity = parseFloat(currentWeatherData.currently.humidity); currentWeather.temperature = parseFloat(currentWeatherData.currently.temperature); currentWeather.windSpeed = parseFloat(currentWeatherData.currently.windSpeed); From cd129fb05527b09f64ec8ffabc61314529906979 Mon Sep 17 00:00:00 2001 From: Nicholas Hubbard Date: Sat, 30 Sep 2017 19:44:54 -0400 Subject: [PATCH 08/79] Revert "Fix Indentation?" This reverts commit 2bf18d8bdab364636b2589a981c7e7fb395bc669. --- js/class.js | 24 +++++++++---------- .../updatenotification/updatenotification.js | 4 +++- tests/configs/check_config.js | 2 +- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/js/class.js b/js/class.js index d054a73eda..3c44250e7b 100644 --- a/js/class.js +++ b/js/class.js @@ -31,22 +31,22 @@ // Check if we're overwriting an existing function prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn) { - return function() { - var tmp = this._super; + return function() { + var tmp = this._super; - // Add a new ._super() method that is the same method - // but on the super-class - this._super = _super[name]; + // Add a new ._super() method that is the same method + // but on the super-class + this._super = _super[name]; - // The method only need to be bound temporarily, so we - // remove it when we're done executing - var ret = fn.apply(this, arguments); - this._super = tmp; + // The method only need to be bound temporarily, so we + // remove it when we're done executing + var ret = fn.apply(this, arguments); + this._super = tmp; - return ret; - }; - })(name, prop[name]) : prop[name]; + return ret; + }; + })(name, prop[name]) : prop[name]; } // The dummy class constructor diff --git a/modules/default/updatenotification/updatenotification.js b/modules/default/updatenotification/updatenotification.js index 9772f06bc4..f663f59383 100644 --- a/modules/default/updatenotification/updatenotification.js +++ b/modules/default/updatenotification/updatenotification.js @@ -58,7 +58,9 @@ Module.register("updatenotification", { wrapper.appendChild(message); var subtext = document.createElement("div"); - subtext.innerHTML = this.translate("UPDATE_INFO").replace("COMMIT_COUNT", this.status.behind + " " + ((this.status.behind == 1)? "commit" : "commits")).replace("BRANCH_NAME", this.status.current); + subtext.innerHTML = this.translate("UPDATE_INFO") + .replace("COMMIT_COUNT", this.status.behind + " " + ((this.status.behind == 1)? "commit" : "commits")) + .replace("BRANCH_NAME", this.status.current); subtext.className = "xsmall dimmed"; wrapper.appendChild(subtext); } diff --git a/tests/configs/check_config.js b/tests/configs/check_config.js index 85cc6a4811..fa294761e8 100644 --- a/tests/configs/check_config.js +++ b/tests/configs/check_config.js @@ -48,7 +48,7 @@ try { // In case the there errors show messages and // return console.info(Utils.colors.info("Checking file... ", configFileName)); -// I'm not sure if all ever is utf-8 + // I'm not sure if all ever is utf-8 fs.readFile(configFileName, "utf-8", function(err, data) { if (err) {throw err;} v.JSHINT(data); // Parser by jshint From 99e3a47dde1163eae3aa241bbc35d7ba061f787c Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Sun, 1 Oct 2017 13:50:15 +0200 Subject: [PATCH 09/79] Use templates to render weather. --- modules/default/weather/current.html | 16 ++++ modules/default/weather/forecast.html | 3 + modules/default/weather/weather.js | 126 +++----------------------- 3 files changed, 34 insertions(+), 111 deletions(-) create mode 100644 modules/default/weather/current.html create mode 100644 modules/default/weather/forecast.html diff --git a/modules/default/weather/current.html b/modules/default/weather/current.html new file mode 100644 index 0000000000..949d2fbcf8 --- /dev/null +++ b/modules/default/weather/current.html @@ -0,0 +1,16 @@ +
+ + + {{current.windSpeed}} + {{current.cardinalWindDirection()}} + + + 00:00 +
+
+ + {{current.temperature}}°
+ + + + \ No newline at end of file diff --git a/modules/default/weather/forecast.html b/modules/default/weather/forecast.html new file mode 100644 index 0000000000..514a96dff3 --- /dev/null +++ b/modules/default/weather/forecast.html @@ -0,0 +1,3 @@ +
Forecast template not yet implemented.
+ +
{{forecast | dump}}
\ No newline at end of file diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 7f33ffa82d..51eb8e759a 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -15,7 +15,7 @@ Module.register("weather",{ weatherProvider: "openweathermap", units: config.units, roundTemp: false, - displayType: "full" //current, forecast, full + type: "current" //current, forecast }, // Module properties. @@ -51,18 +51,17 @@ Module.register("weather",{ this.scheduleUpdate(0) }, - // Generate the dom. This is now pretty simple for debugging. - getDom: function() { - switch (this.config.displayType) { - case "current": - return this.currentWeatherView() - break; - case "forecast": - return this.weatherForecastView() - break; - default: - return this.fullWeatherView() - break; + // Select the template depending on the display type. + getTemplate: function () { + return this.config.type.toLowerCase() + ".html" + }, + + // Add all the data to the template. + getTemplateData: function () { + return { + config: this.config, + current: this.weatherProvider.currentWeather(), + forecast: this.weatherProvider.weatherForecast() } }, @@ -81,113 +80,18 @@ Module.register("weather",{ } setTimeout(() => { - switch (this.config.displayType) { - case "current": - this.weatherProvider.fetchCurrentWeather() - break; + switch (this.config.type) { case "forecast": this.weatherProvider.fetchWeatherForecast() break; default: + case "current": this.weatherProvider.fetchCurrentWeather() - this.weatherProvider.fetchWeatherForecast() break; } }, nextLoad); }, - /* Views */ - - // Generate the current weather view - currentWeatherView: function () { - - var currentWeather = this.weatherProvider.currentWeather() - var wrapper = document.createElement("div") - - if (currentWeather === null) { - return wrapper - } - - // Detail bar. - - var detailBar = document.createElement("div") - - this.addValueToWrapper(detailBar, null, "wi wi-strong-wind dimmed", "span", true) // Wind Icon - this.addValueToWrapper(detailBar, currentWeather.windSpeed ? Math.round(currentWeather.windSpeed) : null) // WindSpeed - this.addValueToWrapper(detailBar, currentWeather.windDirection ? this.translate(currentWeather.cardinalWindDirection()) + "  " : " ", "", "sup") // WindDirection - - var now = new Date(); - var sunriseSunsetTime = (currentWeather.sunrise < now && currentWeather.sunset > now) ? currentWeather.sunset : currentWeather.sunrise - var sunriseSunsetIcon = (currentWeather.sunrise < now && currentWeather.sunset > now) ? "wi-sunset" : "wi-sunrise" - this.addValueToWrapper(detailBar, null, "wi dimmed " + sunriseSunsetIcon, "span", true) // Sunrise / Sunset Icon - this.addValueToWrapper(detailBar, moment(sunriseSunsetTime).format("HH:mm")) // Sunrise / Sunset Time - - detailBar.className = "normal medium" - wrapper.appendChild(detailBar) - - // Main info - - var mainInfo = document.createElement("div") - - this.addValueToWrapper(mainInfo, null, "weathericon wi wi-" + currentWeather.weatherType, "span", true) // Wind Icon - this.addValueToWrapper(mainInfo, currentWeather.temperature.toFixed(this.config.roundTemp ? 0 : 1) + "°", "bright" ) // WindSpeed - - mainInfo.className = "large light" - wrapper.appendChild(mainInfo) - - return wrapper - }, - - weatherForecastView: function() { - // This is just a dummy view to test it ... it needs A LOT of work :) - // Currently it outputs a div, it should be a table. - - var wrapper = document.createElement("div") - wrapper.className = "small" - - if (this.weatherProvider.weatherForecast() === null) { - return wrapper - } - - this.weatherProvider.weatherForecast().forEach((weatherObject) => { - var day = document.createElement("div") - - this.addValueToWrapper(day, moment(weatherObject.date).format("dd")) - this.addValueToWrapper(day, weatherObject.maxTemperature ? weatherObject.maxTemperature.toFixed(this.config.roundTemp ? 0 : 1) : null, "bright") - this.addValueToWrapper(day, weatherObject.minTemperature ? weatherObject.minTemperature.toFixed(this.config.roundTemp ? 0 : 1) : null, "dimmed") - - wrapper.appendChild(day) - }); - - return wrapper - }, - - fullWeatherView: function() { - var wrapper = document.createElement("div") - - wrapper.appendChild(this.currentWeatherView()) - wrapper.appendChild(this.weatherForecastView()) - - return wrapper - }, - - // A convenience function to add an element to a wrapper with a specific value and class. - addValueToWrapper: function(wrapper, value, classNames, element = "span", forceAdd = false, addSpacer = true) { - if (value === null && !forceAdd) { - return - } - - var valueWrapper = document.createElement(element) - valueWrapper.className = classNames - if (addSpacer) { - valueWrapper.innerHTML = " " - } - - if (value !== null) { - valueWrapper.innerHTML += value - } - - wrapper.appendChild(valueWrapper) - } + }); From ad240cf52fb16174783a08fca1f281146ec53a49 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Sun, 1 Oct 2017 16:19:14 +0200 Subject: [PATCH 10/79] Fix lint errors. --- modules/default/weather/weather.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 51eb8e759a..614c3243a2 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -8,7 +8,6 @@ */ Module.register("weather",{ - // Default module config. defaults: { updateInterval: 10 * 60 * 1000, @@ -90,8 +89,5 @@ Module.register("weather",{ break; } }, nextLoad); - }, - - - + } }); From 0776dfc80e62b9316bcc4facf1c55788c5fd9ead Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Wed, 18 Oct 2017 11:58:45 +0200 Subject: [PATCH 11/79] Minor changes. --- modules/default/weather/current.html | 28 ++++++++++---------- modules/default/weather/weather.js | 38 ++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/modules/default/weather/current.html b/modules/default/weather/current.html index 949d2fbcf8..416926b254 100644 --- a/modules/default/weather/current.html +++ b/modules/default/weather/current.html @@ -1,16 +1,18 @@ -
- - - {{current.windSpeed}} - {{current.cardinalWindDirection()}} - - - 00:00 -
-
- - {{current.temperature}}°
- +{% if current %} +
+ + + {{current.windSpeed}} + {{current.cardinalWindDirection()}} + + + 00:00 +
+
+ + {{current.temperature | round(1)}}°
+ +{% endif %} \ No newline at end of file diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 614c3243a2..6a0eec5424 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -14,7 +14,40 @@ Module.register("weather",{ weatherProvider: "openweathermap", units: config.units, roundTemp: false, - type: "current" //current, forecast + type: "current", //current, forecast + + // + + location: false, + locationID: false, + appid: "", + units: config.units, + updateInterval: 10 * 60 * 1000, // every 10 minutes + animationSpeed: 1000, + timeFormat: config.timeFormat, + showPeriod: true, + showPeriodUpper: false, + showWindDirection: true, + showWindDirectionAsArrow: false, + useBeaufort: true, + lang: config.language, + showHumidity: false, + degreeLabel: false, + showIndoorTemperature: false, + showIndoorHumidity: false, + + initialLoadDelay: 0, // 0 seconds delay + retryDelay: 2500, + + apiVersion: "2.5", + apiBase: "http://api.openweathermap.org/data/", + weatherEndpoint: "weather", + + appendLocationNameToHeader: true, + calendarClass: "calendar", + + onlyTemp: false, + roundTemp: false }, // Module properties. @@ -60,7 +93,8 @@ Module.register("weather",{ return { config: this.config, current: this.weatherProvider.currentWeather(), - forecast: this.weatherProvider.weatherForecast() + forecast: this.weatherProvider.weatherForecast(), + myBoolean: true } }, From 241ff5cb6e869035c35c21e9ae3b19c7d0bf94a3 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Wed, 18 Oct 2017 12:19:02 +0200 Subject: [PATCH 12/79] Set temperature rounding. --- modules/default/weather/current.html | 2 +- modules/default/weather/weather.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/default/weather/current.html b/modules/default/weather/current.html index 416926b254..1e618306c7 100644 --- a/modules/default/weather/current.html +++ b/modules/default/weather/current.html @@ -10,7 +10,7 @@
- {{current.temperature | round(1)}}°
+ {{current.temperature | round(0 if config.roundTemp else 1)}}° {% endif %} diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 6a0eec5424..f2993605b1 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -93,8 +93,7 @@ Module.register("weather",{ return { config: this.config, current: this.weatherProvider.currentWeather(), - forecast: this.weatherProvider.weatherForecast(), - myBoolean: true + forecast: this.weatherProvider.weatherForecast() } }, From ab732b5435c649da8e1724bfe61b00bc7f569da7 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Wed, 18 Oct 2017 13:38:56 +0200 Subject: [PATCH 13/79] Make all visiable values dynamic. --- modules/default/weather/current.html | 48 ++++++++++++++++++---- modules/default/weather/weather.js | 26 +++++++++++- modules/default/weather/weatherobject.js | 21 +++++++++- modules/default/weather/weatherprovider.js | 2 +- 4 files changed, 84 insertions(+), 13 deletions(-) diff --git a/modules/default/weather/current.html b/modules/default/weather/current.html index 1e618306c7..56f8a91b95 100644 --- a/modules/default/weather/current.html +++ b/modules/default/weather/current.html @@ -1,13 +1,43 @@ +{# + TODO: + - Show Humidity + - Show Units + _ Show Indoor Temperature + _ Show Indoor Humidity +#} + {% if current %} -
- - - {{current.windSpeed}} - {{current.cardinalWindDirection()}} - - - 00:00 -
+ {% if not config.onlyTemp %} +
+ + + {% if config.useBeaufort %} + {{current.beaufortWindSpeed() | round}} + {% else %} + {{current.windSpeed | round}} + {% endif %} + + {% if config.showWindDirection %} + + {% if config.showWindDirectionAsArrow %} + + {% else %} + {{current.cardinalWindDirection()}} + {% endif %} +   + + {% endif %} + + + + {% if current.nextSunAction() == "sunset" %} + {{current.sunset | formatTime}} + {% else %} + {{current.sunrise | formatTime}} + {% endif %} + +
+ {% endif %}
{{current.temperature | round(0 if config.roundTemp else 1)}}°
diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index f2993605b1..75cb1060ca 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -55,7 +55,7 @@ Module.register("weather",{ // Define required scripts. getStyles: function() { - return ["weather-icons.css", "weather.css"]; + return ["font-awesome.css", "weather-icons.css", "weather.css"]; }, // Return the scripts that are nessecery for the weather module. @@ -79,6 +79,9 @@ Module.register("weather",{ // Let the weather provider know we are starting. this.weatherProvider.start() + // Add custom filters + this.addFilters() + // Schedule the first update. this.scheduleUpdate(0) }, @@ -122,5 +125,26 @@ Module.register("weather",{ break; } }, nextLoad); + }, + + addFilters() { + var self = this + this.nunjucksEnvironment().addFilter("formatTime", function(date) { + date = moment(date) + + if (self.config.timeFormat !== 24) { + if (self.config.showPeriod) { + if (self.config.showPeriodUpper) { + return date.format("h:mm A") + } else { + return date.format("h:mm a") + } + } else { + return date.format("h:mm") + } + } + + return date.format("HH:mm") + }); } }); diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index 7448d11832..4ccc4bac75 100644 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -5,11 +5,11 @@ * * By Michael Teeuw http://michaelteeuw.nl * MIT Licensed. - * + * * This class is the blueprint for a day which includes weather information. */ -// Currently this is focused on the information which is nessecery for the current weather. +// Currently this is focused on the information which is necessary for the current weather. // As soon as we start implementing the forecast, mode properties will be added. class WeatherObject { @@ -60,4 +60,21 @@ class WeatherObject { return "N"; } } + + beaufortWindSpeed () { + var kmh = this.windSpeed * 60 * 60 / 1000; + var speeds = [1, 5, 11, 19, 28, 38, 49, 61, 74, 88, 102, 117, 1000]; + for (var beaufort in speeds) { + var speed = speeds[beaufort]; + if (speed > kmh) { + return beaufort; + } + } + return 12; + } + + nextSunAction () { + var now = new Date(); + return (this.sunrise < now && this.sunset > now) ? "sunset" : "sunrise"; + } }; \ No newline at end of file diff --git a/modules/default/weather/weatherprovider.js b/modules/default/weather/weatherprovider.js index f31b22b7e1..bb5598f43c 100644 --- a/modules/default/weather/weatherprovider.js +++ b/modules/default/weather/weatherprovider.js @@ -5,7 +5,7 @@ * * By Michael Teeuw http://michaelteeuw.nl * MIT Licensed. - * + * * This class is the blueprint for a weather provider. */ From a79e1b6ca113403d315589cf369dca91772225f1 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Wed, 18 Oct 2017 13:52:11 +0200 Subject: [PATCH 14/79] Rename templates to .njk files to allow syntax highlighting. --- modules/default/weather/{current.html => current.njk} | 0 modules/default/weather/{forecast.html => forecast.njk} | 0 modules/default/weather/weather.js | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename modules/default/weather/{current.html => current.njk} (100%) rename modules/default/weather/{forecast.html => forecast.njk} (100%) diff --git a/modules/default/weather/current.html b/modules/default/weather/current.njk similarity index 100% rename from modules/default/weather/current.html rename to modules/default/weather/current.njk diff --git a/modules/default/weather/forecast.html b/modules/default/weather/forecast.njk similarity index 100% rename from modules/default/weather/forecast.html rename to modules/default/weather/forecast.njk diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 75cb1060ca..8ef86a3a7a 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -88,7 +88,7 @@ Module.register("weather",{ // Select the template depending on the display type. getTemplate: function () { - return this.config.type.toLowerCase() + ".html" + return this.config.type.toLowerCase() + ".njk" }, // Add all the data to the template. From 22a50b72fdf41856bcc3e5d2bd0df04d070b2eb8 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Thu, 19 Oct 2017 16:43:12 +0200 Subject: [PATCH 15/79] Show unit. --- modules/default/weather/current.njk | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index 56f8a91b95..b5e4a04fc2 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -1,7 +1,6 @@ {# TODO: - Show Humidity - - Show Units _ Show Indoor Temperature _ Show Indoor Humidity #} @@ -22,7 +21,7 @@ {% if config.showWindDirectionAsArrow %} {% else %} - {{current.cardinalWindDirection()}} + {{current.cardinalWindDirection() | translate}} {% endif %}   @@ -40,7 +39,13 @@ {% endif %}
- {{current.temperature | round(0 if config.roundTemp else 1)}}°
+ + {{current.temperature | round(0 if config.roundTemp else 1)}}°{% if config.degreeLabel %} + {% if config.units == "metric" %}C{% endif %} + {% if config.units == "imperial" %}F{% endif %} + {% if config.units == "default" %}K{% endif %} + {% endif %} + {% endif %} From 16c887814eb45f1a77df9a977d812ba89e6fc372 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Thu, 19 Oct 2017 16:51:51 +0200 Subject: [PATCH 16/79] Show humidity. --- modules/default/weather/current.njk | 3 +++ modules/default/weather/weatherobject.js | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index b5e4a04fc2..f578ba2b94 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -27,6 +27,9 @@ {% endif %} + {% if config.showHumidity and current.humidity %} + {{ current.humidity }}  + {% endif %} {% if current.nextSunAction() == "sunset" %} diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index 4ccc4bac75..59d2298a4e 100644 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -20,9 +20,10 @@ class WeatherObject { this.sunrise = null this.sunset = null this.temperature = null - this.minTemperature = null, - this.maxTemperature = null, + this.minTemperature = null + this.maxTemperature = null this.weatherType = null + this.humidity = null } cardinalWindDirection () { From 07d35a85133d039486dc9ead9752a245345a3dc9 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Thu, 19 Oct 2017 16:52:57 +0200 Subject: [PATCH 17/79] Remove todo item. --- modules/default/weather/current.njk | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index f578ba2b94..a830f4c48f 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -1,8 +1,7 @@ {# TODO: - - Show Humidity - _ Show Indoor Temperature - _ Show Indoor Humidity + - Show Indoor Temperature + - Show Indoor Humidity #} {% if current %} From 91ddc00f7e04fc1a168d5f1c6e409b2d3a4dbe41 Mon Sep 17 00:00:00 2001 From: fewieden Date: Mon, 21 May 2018 10:56:46 +0200 Subject: [PATCH 18/79] fix moment, add unit filter --- modules/default/weather/current.njk | 8 +--- modules/default/weather/weather.js | 60 ++++++++++++++++++----------- 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index a830f4c48f..a50c38e740 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -42,14 +42,10 @@
- {{current.temperature | round(0 if config.roundTemp else 1)}}°{% if config.degreeLabel %} - {% if config.units == "metric" %}C{% endif %} - {% if config.units == "imperial" %}F{% endif %} - {% if config.units == "default" %}K{% endif %} - {% endif %} + {{current.temperature | round(0 if config.roundTemp else 1) | unit("temperature")}}
{% endif %} - \ No newline at end of file + diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 8ef86a3a7a..469d5e1295 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -16,8 +16,6 @@ Module.register("weather",{ roundTemp: false, type: "current", //current, forecast - // - location: false, locationID: false, appid: "", @@ -61,12 +59,13 @@ Module.register("weather",{ // Return the scripts that are nessecery for the weather module. getScripts: function () { var scripts = [ + "moment.js", "weatherprovider.js", "weatherobject.js" ]; // Add the provider file to the required scripts. - scripts.push(this.file("providers/" + this.config.weatherProvider.toLowerCase() + ".js")) + scripts.push(this.file("providers/" + this.config.weatherProvider.toLowerCase() + ".js")); return scripts }, @@ -74,16 +73,16 @@ Module.register("weather",{ // Start the weather module. start: function () { // Initialize the weather provider. - this.weatherProvider = WeatherProvider.initialize(this.config.weatherProvider, this) + this.weatherProvider = WeatherProvider.initialize(this.config.weatherProvider, this); // Let the weather provider know we are starting. - this.weatherProvider.start() + this.weatherProvider.start(); // Add custom filters - this.addFilters() + this.addFilters(); // Schedule the first update. - this.scheduleUpdate(0) + this.scheduleUpdate(0); }, // Select the template depending on the display type. @@ -102,10 +101,9 @@ Module.register("weather",{ // What to do when the weather provider has new information available? updateAvailable: function() { - Log.log("New weather information available.") - console.info(this.weatherProvider.currentWeather()) - this.updateDom(0) - this.scheduleUpdate() + Log.log("New weather information available."); + this.updateDom(0); + this.scheduleUpdate(5000); }, scheduleUpdate: function(delay = null) { @@ -117,34 +115,50 @@ Module.register("weather",{ setTimeout(() => { switch (this.config.type) { case "forecast": - this.weatherProvider.fetchWeatherForecast() + this.weatherProvider.fetchWeatherForecast(); break; default: case "current": - this.weatherProvider.fetchCurrentWeather() + this.weatherProvider.fetchCurrentWeather(); break; } }, nextLoad); }, addFilters() { - var self = this this.nunjucksEnvironment().addFilter("formatTime", function(date) { - date = moment(date) + date = moment(date); - if (self.config.timeFormat !== 24) { - if (self.config.showPeriod) { - if (self.config.showPeriodUpper) { - return date.format("h:mm A") + if (this.config.timeFormat !== 24) { + if (this.config.showPeriod) { + if (this.config.showPeriodUpper) { + return date.format("h:mm A"); } else { - return date.format("h:mm a") + return date.format("h:mm a"); } } else { - return date.format("h:mm") + return date.format("h:mm"); + } + } + + return date.format("HH:mm"); + }.bind(this)); + + this.nunjucksEnvironment().addFilter("unit", function (value, type) { + if (type === "temperature") { + value += "°"; + if (this.config.scale || this.config.degreeLabel) { + if (this.config.units === "metric") { + value += "C"; + } else if (this.config.units === "imperial") { + value += "F"; + } else { + value += "K"; + } } } - return date.format("HH:mm") - }); + return value; + }.bind(this)); } }); From 3341c9e3bf80867cded2dc81ff2eabb50fec7c40 Mon Sep 17 00:00:00 2001 From: fewieden Date: Mon, 21 May 2018 10:57:22 +0200 Subject: [PATCH 19/79] start with forecast template --- modules/default/weather/forecast.njk | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index 514a96dff3..892b1b7534 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -1,3 +1,21 @@ -
Forecast template not yet implemented.
+{% if forecast %} +
+ + {% for f in forecast %} + + + + + + + {% endfor %} +
{{f.day}} + {{f.maxTemperature | round(0 if config.roundTemp else 1) | unit("temperature")}} + + {{f.minTemperature | round(0 if config.roundTemp else 1) | unit("temperature")}} +
+
+{% endif %} -
{{forecast | dump}}
\ No newline at end of file + + From 66ceafd010a30999fc4160f1308960e9115009db Mon Sep 17 00:00:00 2001 From: fewieden Date: Sat, 16 Jun 2018 10:53:17 +0200 Subject: [PATCH 20/79] show indoor data, add loading message --- modules/default/weather/current.njk | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index a50c38e740..b9b8036598 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -1,9 +1,3 @@ -{# - TODO: - - Show Indoor Temperature - - Show Indoor Humidity -#} - {% if current %} {% if not config.onlyTemp %}
@@ -44,6 +38,22 @@ {{current.temperature | round(0 if config.roundTemp else 1) | unit("temperature")}} + {% if config.showIndoorTemperature and indoor.temperature %} + + + {{indoor.temperature | round(0 if config.roundTemp else 1) | unit("temperature")}} + + {% endif %} + {% if config.showIndoorHumidity and indoor.humidity %} + + + {{indoor.humidity | round(0 if config.roundTemp else 1)}}% + + {% endif %} +
+{% else %} +
+ {{"LOADING" | translate}}
{% endif %} From 0fe79b5288c1c6ad864211e6a0c512cbf923ebb9 Mon Sep 17 00:00:00 2001 From: fewieden Date: Mon, 2 Jul 2018 15:43:24 +0200 Subject: [PATCH 21/79] indoor data, new filter, small cleanup --- modules/default/weather/current.njk | 6 +-- modules/default/weather/forecast.njk | 6 ++- modules/default/weather/weather.js | 57 ++++++++++++++++++++++++---- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index b9b8036598..a788bcc261 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -36,18 +36,18 @@
- {{current.temperature | round(0 if config.roundTemp else 1) | unit("temperature")}} + {{current.temperature | roundValue | unit("temperature")}} {% if config.showIndoorTemperature and indoor.temperature %} - {{indoor.temperature | round(0 if config.roundTemp else 1) | unit("temperature")}} + {{indoor.temperature | roundValue | unit("temperature")}} {% endif %} {% if config.showIndoorHumidity and indoor.humidity %} - {{indoor.humidity | round(0 if config.roundTemp else 1)}}% + {{indoor.humidity | roundValue}}% {% endif %}
diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index 892b1b7534..66e7e427a0 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -6,15 +6,17 @@ {{f.day}} - {{f.maxTemperature | round(0 if config.roundTemp else 1) | unit("temperature")}} + {{f.maxTemperature | roundValue | unit("temperature")}} - {{f.minTemperature | round(0 if config.roundTemp else 1) | unit("temperature")}} + {{f.minTemperature | roundValue | unit("temperature")}} {% endfor %} +{% else %} + {{"LOADING" | translate}} {% endif %} diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 469d5e1295..598263a19b 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -85,6 +85,38 @@ Module.register("weather",{ this.scheduleUpdate(0); }, + // Override notification handler. + notificationReceived: function(notification, payload, sender) { + if (notification === "DOM_OBJECTS_CREATED") { + if (this.config.appendLocationNameToHeader) { + this.hide(0, {lockString: this.identifier}); + } + } + if (notification === "CALENDAR_EVENTS") { + var senderClasses = sender.data.classes.toLowerCase().split(" "); + if (senderClasses.indexOf(this.config.calendarClass.toLowerCase()) !== -1) { + this.firstEvent = false; + + for (var e in payload) { + var event = payload[e]; + if (event.location || event.geo) { + this.firstEvent = event; + //Log.log("First upcoming event with location: ", event); + break; + } + } + } + } + if (notification === "INDOOR_TEMPERATURE") { + this.indoorTemperature = this.roundValue(payload); + this.updateDom(300); + } + if (notification === "INDOOR_HUMIDITY") { + this.indoorHumidity = this.roundValue(payload); + this.updateDom(300); + } + }, + // Select the template depending on the display type. getTemplate: function () { return this.config.type.toLowerCase() + ".njk" @@ -95,14 +127,18 @@ Module.register("weather",{ return { config: this.config, current: this.weatherProvider.currentWeather(), - forecast: this.weatherProvider.weatherForecast() + forecast: this.weatherProvider.weatherForecast(), + indoor: { + humidity: this.indoorHumidity, + temperature: this.indoorTemperature + } } }, // What to do when the weather provider has new information available? updateAvailable: function() { Log.log("New weather information available."); - this.updateDom(0); + this.updateDom(300); this.scheduleUpdate(5000); }, @@ -113,18 +149,19 @@ Module.register("weather",{ } setTimeout(() => { - switch (this.config.type) { - case "forecast": + if (this.config.type === "forecast") { this.weatherProvider.fetchWeatherForecast(); - break; - default: - case "current": + } else { this.weatherProvider.fetchCurrentWeather(); - break; } }, nextLoad); }, + roundValue: function(temperature) { + var decimals = this.config.roundTemp ? 0 : 1; + return parseFloat(temperature).toFixed(decimals); + } + addFilters() { this.nunjucksEnvironment().addFilter("formatTime", function(date) { date = moment(date); @@ -160,5 +197,9 @@ Module.register("weather",{ return value; }.bind(this)); + + this.nunjucksEnvironment().addFilter("roundValue", function(value) { + return this.roundValue(value); + }.bind(this)); } }); From 5eb0b77a8a785b2bd98f07c78ec7f554ef239d9a Mon Sep 17 00:00:00 2001 From: Teddy Payet Date: Sat, 8 Sep 2018 23:40:39 +0200 Subject: [PATCH 22/79] Merge upstream/develop --- package-lock.json | 2212 +++++++++++++++++++++++---------------------- package.json | 10 +- 2 files changed, 1145 insertions(+), 1077 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3376a2e3fa..621c0c7888 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,9 +38,9 @@ } }, "@types/node": { - "version": "8.10.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.14.tgz", - "integrity": "sha512-TKQqQIaYNO+8MrOsFgobkt3fbMzkfXhBFKcg20Nip5Omptw1HOY/IEvYiFtMwIbr7Me/Y2H/JO+TgNUMJ9NGjA==" + "version": "8.10.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.21.tgz", + "integrity": "sha512-87XkD9qDXm8fIax+5y7drx84cXsu34ZZqfB7Cial3Q/2lxSoJ/+DRaWckkCbxP41wFSIrrb939VhzaNxj4eY1w==" }, "JSV": { "version": "4.0.2", @@ -85,20 +85,12 @@ } }, "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", + "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", "dev": true, "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } + "acorn": "^5.0.3" } }, "after": { @@ -138,9 +130,9 @@ "dev": true }, "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, "ansi-regex": { @@ -170,9 +162,9 @@ "dev": true }, "archiver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", - "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", + "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", "dev": true, "requires": { "archiver-utils": "^1.3.0", @@ -182,17 +174,16 @@ "lodash": "^4.8.0", "readable-stream": "^2.0.0", "tar-stream": "^1.5.0", - "walkdir": "^0.0.11", - "zip-stream": "^1.1.0" + "zip-stream": "^1.2.0" }, "dependencies": { "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "^4.14.0" + "lodash": "^4.17.10" } }, "isarray": { @@ -202,30 +193,36 @@ "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -254,30 +251,36 @@ "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -353,9 +356,9 @@ "dev": true }, "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, "arrify": { "version": "1.0.1", @@ -369,10 +372,9 @@ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assertion-error": { "version": "1.0.2", @@ -389,8 +391,7 @@ "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, "asynckit": { "version": "0.4.0", @@ -398,9 +399,9 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", - "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, "autoprefixer": { @@ -418,15 +419,14 @@ } }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" }, "babel-code-frame": { "version": "6.26.0", @@ -471,13 +471,21 @@ } }, "babel-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } } }, "backo2": { @@ -507,9 +515,9 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -536,12 +544,13 @@ } }, "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { - "readable-stream": "^2.0.5" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" }, "dependencies": { "isarray": { @@ -550,25 +559,31 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -639,15 +654,6 @@ } } }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -677,7 +683,8 @@ "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true }, "browserslist": { "version": "2.4.0", @@ -689,12 +696,39 @@ "electron-to-chromium": "^1.3.18" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -833,6 +867,12 @@ "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=", "dev": true }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -928,20 +968,17 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, "component-bind": { "version": "1.0.0", @@ -959,9 +996,9 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, "compress-commons": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", - "integrity": "sha1-WFhwku8g03y1i68AARLJJ4/3O58=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", "dev": true, "requires": { "buffer-crc32": "^0.2.1", @@ -976,25 +1013,31 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -1008,10 +1051,11 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { + "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" @@ -1022,24 +1066,29 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" } @@ -1117,25 +1166,31 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -1144,34 +1199,35 @@ } }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } } }, "css": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", - "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", + "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", "dev": true, "requires": { "inherits": "^2.0.1", "source-map": "^0.1.38", - "source-map-resolve": "^0.3.0", + "source-map-resolve": "^0.5.1", "urix": "^0.1.0" } }, @@ -1318,13 +1374,6 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "dasherize": { @@ -1363,9 +1412,9 @@ } }, "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -1385,10 +1434,16 @@ "map-obj": "^1.0.0" } }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { "version": "0.1.3", @@ -1397,11 +1452,29 @@ "dev": true }, "deepmerge": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz", - "integrity": "sha1-FmNpFinU2/42T6EqKk8KqGqjoFA=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", + "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==", "dev": true }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + }, + "dependencies": { + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + } + } + }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", @@ -1439,9 +1512,9 @@ "dev": true }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "dir-glob": { "version": "2.0.0", @@ -1571,21 +1644,75 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", - "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", + "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", "dev": true }, "electron": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.0.tgz", - "integrity": "sha512-FCcVzHgoBmNTPUEhKN7yUxjluCRNAQsHNOfdtFEWKL3DPYEdLdyQW8CpmJEMqIXha5qZ+qdKVAtwvvuJs+b/PQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.4.tgz", + "integrity": "sha512-rtg6aW2IpWfiwMRk9gqr+a/xOrFlch9sgLNg0UJzCmtUUEGTrbaLxqANr3Ahlx+ODmh/V+WfF7IdEpD76bbssA==", "requires": { "@types/node": "^8.0.24", "electron-download": "^3.0.1", "extract-zip": "^1.0.3" } }, + "electron-chromedriver": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-1.8.0.tgz", + "integrity": "sha512-m1f3nle5MaGp94bcDTtMZZMMOgPO54+TXoPBlTbBSUjfINR5SJ46yQXLfuE79/qsFfJKslZB1UzWURDDFIRmpQ==", + "dev": true, + "requires": { + "electron-download": "^4.1.0", + "extract-zip": "^1.6.5" + }, + "dependencies": { + "electron-download": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.0.tgz", + "integrity": "sha1-v5MsdG8vh//MCdHdRy8v9rkYeEU=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "env-paths": "^1.0.0", + "fs-extra": "^2.0.0", + "minimist": "^1.2.0", + "nugget": "^2.0.0", + "path-exists": "^3.0.0", + "rc": "^1.1.2", + "semver": "^5.3.0", + "sumchecker": "^2.0.1" + } + }, + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + } + } + }, "electron-download": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", @@ -1623,65 +1750,72 @@ } }, "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "engine.io": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.1.tgz", - "integrity": "sha1-CAUf+5UZB6MmfnLgvLPQ83fkZgs=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", + "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", "requires": { - "accepts": "1.3.3", + "accepts": "~1.3.4", "base64id": "1.0.0", "cookie": "0.3.1", - "debug": "~2.6.4", + "debug": "~3.1.0", "engine.io-parser": "~2.1.0", - "uws": "~0.14.4", - "ws": "~2.3.1" + "ws": "~3.3.1" }, "dependencies": { - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "mime-types": "~2.1.11", - "negotiator": "0.6.1" + "ms": "2.0.0" } } } }, "engine.io-client": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz", - "integrity": "sha1-QVqYUrrbFPoAj6PvHjFgjbZ2EyU=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", - "debug": "~2.6.4", + "debug": "~3.1.0", "engine.io-parser": "~2.1.1", "has-cors": "1.1.0", "indexof": "0.0.1", - "parsejson": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "ws": "~2.3.1", - "xmlhttprequest-ssl": "1.5.3", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } } }, "engine.io-parser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz", - "integrity": "sha1-4Ps/DgRi9/WLt3waUun1p+JuRmg=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", "requires": { "after": "0.8.2", - "arraybuffer.slice": "0.0.6", + "arraybuffer.slice": "~0.0.7", "base64-arraybuffer": "0.1.5", "blob": "0.0.4", "has-binary2": "~1.0.2" @@ -1707,6 +1841,30 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, "es6-promise": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.2.tgz", @@ -1760,62 +1918,70 @@ } }, "eslint": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.16.0.tgz", - "integrity": "sha512-YVXV4bDhNoHHcv0qzU4Meof7/P26B4EuaktMi5L1Tnt52Aov85KmYA8c5D+xyZr/BkhvwUqr011jDSD/QTULxg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.1.0.tgz", + "integrity": "sha512-DyH6JsoA1KzA5+OSWFjg56DFJT+sDLO0yokaPZ9qY0UEmYrPA1gEX/G1MnVkmRDsksG4H1foIVz2ZXXM3hHYvw==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", + "cross-spawn": "^6.0.5", "debug": "^3.1.0", "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.2", - "esquery": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", "functional-red-black-tree": "^1.0.1", "glob": "^7.1.2", - "globals": "^11.0.1", + "globals": "^11.7.0", "ignore": "^3.3.3", "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", "path-is-inside": "^1.0.2", "pluralize": "^7.0.0", "progress": "^2.0.0", + "regexpp": "^1.1.0", "require-uncached": "^1.0.3", - "semver": "^5.3.0", + "semver": "^5.5.0", + "string.prototype.matchall": "^2.0.0", "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "^4.0.1", - "text-table": "~0.2.0" + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" }, "dependencies": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -1823,23 +1989,23 @@ "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.1.0", + "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "supports-color": "^5.3.0" } }, "debug": { @@ -1857,26 +2023,44 @@ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, - "globals": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz", - "integrity": "sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ==", + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "minimist": { @@ -1894,6 +2078,31 @@ "minimist": "0.0.8" } }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -1904,26 +2113,46 @@ } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "requires": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" } } } }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1931,19 +2160,19 @@ "dev": true }, "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", + "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", "dev": true, "requires": { - "acorn": "^5.2.1", - "acorn-jsx": "^3.0.0" + "acorn": "^5.6.0", + "acorn-jsx": "^4.1.1" }, "dependencies": { "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", "dev": true } } @@ -1955,22 +2184,21 @@ "dev": true }, "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { "estraverse": "^4.0.0" } }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "^4.1.0", - "object-assign": "^4.0.1" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -2215,14 +2443,14 @@ } }, "external-editor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", - "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { + "chardet": "^0.4.0", "iconv-lite": "^0.4.17", - "jschardet": "^1.4.2", - "tmp": "^0.0.31" + "tmp": "^0.0.33" } }, "extglob": { @@ -2235,29 +2463,14 @@ } }, "extract-zip": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.5.tgz", - "integrity": "sha1-maBnNbbqIOqbcF13ms/8yHz/BEA=", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", "requires": { - "concat-stream": "1.6.0", - "debug": "2.2.0", - "mkdirp": "0.5.0", + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", "yauzl": "2.4.1" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - } } }, "extsprintf": { @@ -2266,9 +2479,9 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, "fast-json-stable-stringify": { "version": "2.0.0", @@ -2397,6 +2610,12 @@ "for-in": "^1.0.1" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "foreachasync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", @@ -2408,13 +2627,12 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", + "combined-stream": "1.0.6", "mime-types": "^2.1.12" } }, @@ -2423,6 +2641,12 @@ "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz", "integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk=" }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", @@ -2446,6 +2670,12 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -2453,9 +2683,9 @@ "dev": true }, "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "requires": { "globule": "^1.0.0" @@ -2490,13 +2720,6 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "git-config-path": { @@ -2542,6 +2765,12 @@ "is-glob": "^2.0.0" } }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", @@ -2563,20 +2792,20 @@ "dev": true }, "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", "dev": true, "requires": { "glob": "~7.1.1", - "lodash": "~4.17.4", + "lodash": "~4.17.10", "minimatch": "~3.0.2" }, "dependencies": { "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true } } @@ -2603,20 +2832,15 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" }, "grunt": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", - "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.3.tgz", + "integrity": "sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g==", "dev": true, "requires": { "coffeescript": "~1.10.0", @@ -2627,14 +2851,15 @@ "glob": "~7.0.0", "grunt-cli": "~1.2.0", "grunt-known-options": "~1.1.0", - "grunt-legacy-log": "~1.0.0", - "grunt-legacy-util": "~1.0.0", + "grunt-legacy-log": "~2.0.0", + "grunt-legacy-util": "~1.1.1", "iconv-lite": "~0.4.13", "js-yaml": "~3.5.2", "minimatch": "~3.0.2", + "mkdirp": "~0.5.1", "nopt": "~3.0.6", "path-is-absolute": "~1.0.0", - "rimraf": "~2.2.8" + "rimraf": "~2.6.2" }, "dependencies": { "glob": { @@ -2663,22 +2888,40 @@ "resolve": "~1.1.0" } }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } } } }, "grunt-eslint": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-20.1.0.tgz", - "integrity": "sha512-VZlDOLrB2KKefDDcx/wR8rEEz7smDwDKVblmooa+itdt/2jWw3ee2AiZB5Ap4s4AoRY0pbHRjZ3HHwY8uKR9Rw==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-21.0.0.tgz", + "integrity": "sha512-HJocD9P35lpCvy6pPPCTgzBavzckrT1nt7lpqV55Vy8E6LQJv4RortXoH1jJTYhO5DYY7RPATv7Uc4383PUYqQ==", "dev": true, "requires": { "chalk": "^2.1.0", - "eslint": "^4.0.0" + "eslint": "^5.0.0" }, "dependencies": { "ansi-styles": { @@ -2691,9 +2934,9 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -2708,9 +2951,9 @@ "dev": true }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -2735,69 +2978,97 @@ "dev": true }, "grunt-legacy-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.1.tgz", - "integrity": "sha512-rwuyqNKlI0IPz0DvxzJjcEiQEBaBNVeb1LFoZKxSmHLETFUwhwUrqOsPIxURTKSwNZHZ4ht1YLBYmVU0YZAzHQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", + "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", "dev": true, "requires": { "colors": "~1.1.2", - "grunt-legacy-log-utils": "~1.0.0", + "grunt-legacy-log-utils": "~2.0.0", "hooker": "~0.2.3", - "lodash": "~4.17.5", - "underscore.string": "~3.3.4" + "lodash": "~4.17.5" }, "dependencies": { "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true } } }, "grunt-legacy-log-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", - "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", + "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", "dev": true, "requires": { - "chalk": "~1.1.1", - "lodash": "~4.3.0" + "chalk": "~2.4.1", + "lodash": "~4.17.10" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "grunt-legacy-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", - "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", + "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", "dev": true, "requires": { "async": "~1.5.2", "exit": "~0.1.1", "getobject": "~0.1.0", "hooker": "~0.2.3", - "lodash": "~4.3.0", - "underscore.string": "~3.2.3", - "which": "~1.2.1" + "lodash": "~4.17.10", + "underscore.string": "~3.3.4", + "which": "~1.3.0" }, "dependencies": { "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - }, - "underscore.string": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", - "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true } } @@ -2836,9 +3107,9 @@ } }, "grunt-stylelint": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.9.0.tgz", - "integrity": "sha512-+eC6pRdt+6ZupNFbDYVBB7DtEdohjTNf3BRAXhCqMk2eqEYg/q+Bl3r6lFC6qGRNxmpfHR+qWnzb+KKCqKalaw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.10.0.tgz", + "integrity": "sha512-1HC3H1CZlK3niJGORr+1nmcdtogoSiZex7ej9MtJPXVmxrvWvXTVhZppKoPVVQgHRvNozmtGCZTZr7c9kMPO5g==", "dev": true, "requires": { "chalk": "1.1.3" @@ -2889,19 +3160,39 @@ } }, "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -2914,9 +3205,9 @@ } }, "has-binary2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", - "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", "requires": { "isarray": "2.0.1" }, @@ -2945,17 +3236,11 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true }, "he": { "version": "1.1.1", @@ -3000,16 +3285,10 @@ "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz", "integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys=" }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, "home-path": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.5.tgz", - "integrity": "sha1-eIspgVsS1Tus9XVkhHbm+QQdEz8=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", + "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==" }, "homedir-polyfill": { "version": "1.0.1", @@ -3101,12 +3380,11 @@ } }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^0.2.0", + "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } @@ -3202,22 +3480,21 @@ "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^2.0.4", + "external-editor": "^2.1.0", "figures": "^2.0.0", "lodash": "^4.3.0", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", + "rxjs": "^5.5.2", "string-width": "^2.1.0", "strip-ansi": "^4.0.0", "through": "^2.3.6" @@ -3230,25 +3507,42 @@ "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.1.0", + "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "supports-color": "^5.3.0" } }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -3256,9 +3550,9 @@ "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "string-width": { @@ -3281,12 +3575,21 @@ } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "^3.0.0" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" } } } @@ -3348,6 +3651,18 @@ "builtin-modules": "^1.0.0" } }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-decimal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.1.tgz", @@ -3481,6 +3796,15 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -3505,6 +3829,12 @@ "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=", "dev": true }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -3588,12 +3918,6 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, - "jschardet": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", - "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", - "dev": true - }, "jsdom": { "version": "11.6.2", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz", @@ -3790,11 +4114,6 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" - }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -3840,13 +4159,6 @@ "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "kind-of": { @@ -3881,25 +4193,31 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3976,51 +4294,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=" - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, "lodash.find": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", @@ -4033,32 +4312,12 @@ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, "lodash.isobject": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", "dev": true }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", @@ -4125,16 +4384,6 @@ "signal-exit": "^3.0.0" } }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -4270,9 +4519,9 @@ } }, "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" }, @@ -4365,85 +4614,63 @@ } }, "mocha-logger": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mocha-logger/-/mocha-logger-1.0.5.tgz", - "integrity": "sha1-nolqtBDo2NQGEdgcEfZCPIh89eM=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mocha-logger/-/mocha-logger-1.0.6.tgz", + "integrity": "sha512-D7Z3r1RkyaJOnlgokODdzt9p4ut0m3DVzEKp3r3tgeXIpdxp54z049Vc0EEh5hkhudfRN0dfUD10Fcj2WuOO3w==", "requires": { - "mocha": "^3.2.0" + "mocha": "^5.1.1" }, "dependencies": { + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { "ms": "2.0.0" } }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", + "glob": "7.1.2", + "growl": "1.10.5", "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", + "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "3.1.2" + "supports-color": "5.4.0" } }, "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "^1.0.0" + "has-flag": "^3.0.0" } } } }, "moment": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.0.tgz", - "integrity": "sha512-1muXCh8jb1N/gHRbn9VDUBr0GYb8A/aVcHlII9QSB68a50spqEVLIGN6KVmCOnSvJrUhC0edGgKU5ofnGXdYdg==" + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" }, "ms": { "version": "2.0.0", @@ -4467,6 +4694,12 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, "nocache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", @@ -4808,14 +5041,6 @@ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "requires": { - "better-assert": "~1.0.0" - } - }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -4851,6 +5076,12 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -4878,10 +5109,9 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "2.3.0", @@ -5209,7 +5439,8 @@ "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true }, "progress": { "version": "2.0.0", @@ -5232,28 +5463,21 @@ "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "q": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystring": { "version": "0.2.0", @@ -5330,11 +5554,11 @@ } }, "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { - "deep-extend": "~0.4.0", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -5405,6 +5629,21 @@ "is-equal-shallow": "^0.1.3" } }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, "remark": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz", @@ -5510,9 +5749,9 @@ "dev": true }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.6.0", @@ -5522,7 +5761,6 @@ "forever-agent": "~0.6.1", "form-data": "~2.3.1", "har-validator": "~5.0.3", - "hawk": "~6.0.2", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -5532,135 +5770,9 @@ "performance-now": "^2.1.0", "qs": "~6.5.1", "safe-buffer": "^5.1.1", - "stringstream": "~0.0.5", "tough-cookie": "~2.3.3", "tunnel-agent": "^0.6.0", "uuid": "^3.1.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.x.x" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.x.x" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.x.x" - } - } - } - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "requires": { - "hoek": "4.x.x" - } - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "^1.4.1" - } - } } }, "request-promise-core": { @@ -5754,9 +5866,9 @@ "dev": true }, "rgb2hex": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.0.tgz", - "integrity": "sha1-zNVfhgrgxcTqN1BLlY5ELY0SMls=", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.8.tgz", + "integrity": "sha512-kPH3Zm3UrBIfJv17AtJJGLRxak+Hvvz6SnsTBIajqB2Zbh+A4EEjkMWKkmGhms0cJlzOOjZcu1LX5K3vnON7ug==", "dev": true }, "rimraf": { @@ -5781,12 +5893,6 @@ "is-promise": "^2.1.0" } }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", @@ -5802,6 +5908,15 @@ "rx-lite": "*" } }, + "rxjs": { + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -5895,47 +6010,27 @@ "version": "0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } + "dev": true }, "socket.io": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", - "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", "requires": { - "debug": "~2.6.6", - "engine.io": "~3.1.0", + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.0.4", - "socket.io-parser": "~3.1.1" + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" }, "dependencies": { - "socket.io-client": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", - "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~2.6.4", - "engine.io-client": "~3.1.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.1.1", - "to-array": "0.1.4" + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" } } } @@ -5945,17 +6040,55 @@ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" }, - "socket.io-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", - "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "~2.6.4", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", "isarray": "2.0.1" }, "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", @@ -5973,21 +6106,22 @@ } }, "source-map-resolve": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", - "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "~1.1.0", - "resolve-url": "~0.2.1", - "source-map-url": "~0.3.0", - "urix": "~0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-url": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", - "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "spdx-correct": { @@ -6015,70 +6149,16 @@ "dev": true }, "spectron": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/spectron/-/spectron-3.7.2.tgz", - "integrity": "sha1-hvQTBqm3DtbuFQD399Otw4mvtEY=", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/spectron/-/spectron-3.8.0.tgz", + "integrity": "sha512-fQ7gFp6UuEaONjXFLifLeIUI022pOsm3b+NFAm696r2umUkSZ9IbnEgHwrvBX+pJ3QUDyCEs5bPHUieYU7FvaQ==", "dev": true, "requires": { "dev-null": "^0.1.1", - "electron-chromedriver": "~1.7.1", + "electron-chromedriver": "~1.8.0", "request": "^2.81.0", "split": "^1.0.0", "webdriverio": "^4.8.0" - }, - "dependencies": { - "electron-chromedriver": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-1.7.1.tgz", - "integrity": "sha1-AIyXl2AHqk6xhJHuCV6U0X7kdhA=", - "dev": true, - "requires": { - "electron-download": "^4.1.0", - "extract-zip": "^1.6.5" - } - }, - "electron-download": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.0.tgz", - "integrity": "sha1-v5MsdG8vh//MCdHdRy8v9rkYeEU=", - "dev": true, - "requires": { - "debug": "^2.2.0", - "env-paths": "^1.0.0", - "fs-extra": "^2.0.0", - "minimist": "^1.2.0", - "nugget": "^2.0.0", - "path-exists": "^3.0.0", - "rc": "^1.1.2", - "semver": "^5.3.0", - "sumchecker": "^2.0.1" - } - }, - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "sumchecker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", - "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", - "dev": true, - "requires": { - "debug": "^2.2.0" - } - } } }, "speedometer": { @@ -6102,9 +6182,9 @@ "dev": true }, "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -6113,14 +6193,8 @@ "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "state-toggle": { @@ -6150,6 +6224,19 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.matchall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", + "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "regexp.prototype.flags": "^1.2.0" + } + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -6167,11 +6254,6 @@ "is-hexadecimal": "^1.0.0" } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -6626,6 +6708,12 @@ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", "dev": true }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", @@ -6686,14 +6774,17 @@ } }, "tar-stream": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", "dev": true, "requires": { "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.0", "xtend": "^4.0.0" }, "dependencies": { @@ -6703,25 +6794,31 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -6795,12 +6892,12 @@ "dev": true }, "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "~1.0.1" + "os-tmpdir": "~1.0.2" } }, "to-array": { @@ -6808,11 +6905,16 @@ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "tough-cookie": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "dev": true, "requires": { "punycode": "^1.4.1" } @@ -7019,6 +7121,23 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -7059,12 +7178,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, - "uws": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz", - "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=", - "optional": true - }, "valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -7079,12 +7192,6 @@ "spdx-expression-parse": "~1.0.0" } }, - "validator": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-7.0.0.tgz", - "integrity": "sha1-x03rgGNRL6w1VHk45vCxUEooL9I=", - "dev": true - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -7093,13 +7200,6 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } } }, "vfile": { @@ -7150,91 +7250,110 @@ } }, "walk": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.13.tgz", - "integrity": "sha512-78SMe7To9U7kqVhSoGho3GfspA089ZDBIj2f8jElg2hi6lUCoagtDJ8sSMFNlpAh5Ib8Jt1gQ6Y7gh9mzHtFng==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", + "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", "requires": { "foreachasync": "^3.0.0" } }, - "walkdir": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", - "dev": true - }, "wdio-dot-reporter": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.9.tgz", - "integrity": "sha1-kpsq2v1J1rBTT9oGjocxm0fjj+U=", + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz", + "integrity": "sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg==", "dev": true }, "webdriverio": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.8.0.tgz", - "integrity": "sha1-1Skpt0kID4mWf24WFAUcvIFy0TI=", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.13.1.tgz", + "integrity": "sha1-Yk70ylafPJpejpsRMCtEMe2h+4o=", "dev": true, "requires": { - "archiver": "~1.3.0", - "babel-runtime": "~6.23.0", - "css-parse": "~2.0.0", + "archiver": "~2.1.0", + "babel-runtime": "^6.26.0", + "css-parse": "^2.0.0", "css-value": "~0.0.1", - "deepmerge": "~1.3.2", + "deepmerge": "~2.0.1", "ejs": "~2.5.6", "gaze": "~1.1.2", "glob": "~7.1.1", - "inquirer": "~3.0.6", + "inquirer": "~3.3.0", "json-stringify-safe": "~5.0.1", "mkdirp": "~0.5.1", "npm-install-package": "~2.1.0", "optimist": "~0.6.1", "q": "~1.5.0", - "request": "~2.81.0", - "rgb2hex": "~0.1.0", - "safe-buffer": "~5.0.1", - "supports-color": "~3.2.3", + "request": "^2.83.0", + "rgb2hex": "~0.1.4", + "safe-buffer": "~5.1.1", + "supports-color": "~5.0.0", "url": "~0.11.0", - "validator": "~7.0.0", "wdio-dot-reporter": "~0.0.8", "wgxpath": "~1.0.0" }, "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "inquirer": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", - "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "chalk": "^1.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^2.0.1", + "external-editor": "^2.0.4", "figures": "^2.0.0", "lodash": "^4.3.0", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rx": "^4.1.0", - "string-width": "^2.0.0", - "strip-ansi": "^3.0.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", "through": "^2.3.6" } }, @@ -7245,60 +7364,9 @@ "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "string-width": { @@ -7309,26 +7377,32 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" } }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", + "integrity": "sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "^2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + } } } } @@ -7374,9 +7448,9 @@ } }, "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -7430,19 +7504,13 @@ } }, "ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "requires": { - "safe-buffer": "~5.0.1", + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", "ultron": "~1.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" - } } }, "x-is-function": { @@ -7469,9 +7537,9 @@ "dev": true }, "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" }, "xtend": { "version": "2.1.2", @@ -7487,12 +7555,6 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, "yauzl": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", @@ -7525,30 +7587,36 @@ "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" diff --git a/package.json b/package.json index 2aae05eb73..5359fc5091 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "jshint": "^2.9.5", "mocha": "^4.1.0", "mocha-each": "^1.1.0", - "spectron": "3.7.x", + "spectron": "^3.8.0", "stylelint": "^8.4.0", "stylelint-config-standard": "latest", "time-grunt": "latest" @@ -57,18 +57,18 @@ "dependencies": { "body-parser": "^1.18.2", "colors": "^1.1.2", - "electron": "^2.0.0", + "electron": "^2.0.4", "express": "^4.16.2", "express-ipfilter": "0.3.1", "feedme": "latest", "helmet": "^3.9.0", "iconv-lite": "latest", - "mocha-logger": "^1.0.5", + "mocha-logger": "^1.0.6", "moment": "latest", - "request": "^2.83.0", + "request": "^2.87.0", "rrule-alt": "^2.2.7", "simple-git": "^1.85.0", - "socket.io": "^2.0.4", + "socket.io": "^2.1.1", "valid-url": "latest", "walk": "latest" } From d4fe01f9b99a6da31b59dd1fb9ef33e2725b9018 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Mon, 1 Oct 2018 08:20:15 +0200 Subject: [PATCH 23/79] Prepare for 2.6.0-dev. --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b19efad3d6..bc50dfa492 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). --- + +## [2.6.0] - Unreleased + +*This release is scheduled to be released on 2018-10-01.* + +### Added + +### Fixed + +### Updated + ## [2.5.0] - 2018-10-01 ### Added diff --git a/package-lock.json b/package-lock.json index 928d17635a..5dbbb73076 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.5.0", + "version": "2.6.0-dev", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ab9735f28c..31ebb80428 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.5.0", + "version": "2.6.0-dev", "description": "The open source modular smart mirror platform.", "main": "js/electron.js", "scripts": { From 39619d5277863244a489ef80eeb20c55e35cf4f9 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Wed, 3 Oct 2018 22:03:50 +0200 Subject: [PATCH 24/79] Allow to parse recurring calendar events where the start date is before 1970 Some birthday calendar events have a start date before 1970. --- modules/default/calendar/calendarfetcher.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js index 4492462b76..bca687db02 100644 --- a/modules/default/calendar/calendarfetcher.js +++ b/modules/default/calendar/calendarfetcher.js @@ -173,6 +173,14 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri if (typeof event.rrule != "undefined" && !isFacebookBirthday) { var rule = event.rrule; + + // can cause problems with birthdays before 1970 + if(rule.origOptions && rule.origOptions.dtstart && rule.origOptions.dtstart.getFullYear() < 1970 || + rule.options && rule.options.dtstart && rule.options.dtstart.getFullYear() < 1970){ + rule.origOptions.dtstart.setYear(1970); + rule.options.dtstart.setYear(1970); + } + var dates = rule.between(today, future, true, limitFunction); for (var d in dates) { From 3f083862e7c247b3d5c5c3fa9551e312b3ba855d Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Wed, 3 Oct 2018 22:05:51 +0200 Subject: [PATCH 25/79] Allow to parse recurring calendar events where the start date is before 1970 Some birthday calendar events have a start date before 1970. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc50dfa492..05f75a3743 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added ### Fixed +- Allow to parse recurring calendar events where the start date is before 1970 ### Updated From 007b2f0c8864ad12030c840dd796f79d5d68e2e3 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Wed, 3 Oct 2018 22:43:29 +0200 Subject: [PATCH 26/79] Allow to parse recurring calendar events where the start date is before 1900 Some birthday calendar events have a start date before 1900. --- CHANGELOG.md | 2 +- modules/default/calendar/README.md | 1 - modules/default/calendar/calendarfetcher.js | 10 +++++----- package.json | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05f75a3743..46cf3261d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added ### Fixed -- Allow to parse recurring calendar events where the start date is before 1970 +- Allow to parse recurring calendar events where the start date is before 1900 ### Updated diff --git a/modules/default/calendar/README.md b/modules/default/calendar/README.md index ae516a6332..6181400aea 100755 --- a/modules/default/calendar/README.md +++ b/modules/default/calendar/README.md @@ -1,7 +1,6 @@ # Module: Calendar The `calendar` module is one of the default modules of the MagicMirror. This module displays events from a public .ical calendar. It can combine multiple calendars. -Note that calendars may not contain any entry before 1st January 1970, otherwise the calendar won't be displayed and the module will crash. ## Using the module diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js index bca687db02..d9106853ed 100644 --- a/modules/default/calendar/calendarfetcher.js +++ b/modules/default/calendar/calendarfetcher.js @@ -174,11 +174,11 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri if (typeof event.rrule != "undefined" && !isFacebookBirthday) { var rule = event.rrule; - // can cause problems with birthdays before 1970 - if(rule.origOptions && rule.origOptions.dtstart && rule.origOptions.dtstart.getFullYear() < 1970 || - rule.options && rule.options.dtstart && rule.options.dtstart.getFullYear() < 1970){ - rule.origOptions.dtstart.setYear(1970); - rule.options.dtstart.setYear(1970); + // can cause problems with e.g. birthdays before 1900 + if(rule.origOptions && rule.origOptions.dtstart && rule.origOptions.dtstart.getFullYear() < 1900 || + rule.options && rule.options.dtstart && rule.options.dtstart.getFullYear() < 1900){ + rule.origOptions.dtstart.setYear(1900); + rule.options.dtstart.setYear(1900); } var dates = rule.between(today, future, true, limitFunction); diff --git a/package.json b/package.json index 31ebb80428..8d94ec2ed7 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "mocha-logger": "^1.0.5", "moment": "latest", "request": "^2.83.0", - "rrule-alt": "^2.2.7", + "rrule-alt": "^2.2.8", "simple-git": "^1.85.0", "socket.io": "^2.0.4", "valid-url": "latest", From 3b48f1d0423003c42c25db25545b1db8d99a2cb5 Mon Sep 17 00:00:00 2001 From: Teddy Payet Date: Thu, 4 Oct 2018 02:07:08 +0200 Subject: [PATCH 27/79] - Possibility to add classes to the cell of symbol, title and time of the events of calendar. --- CHANGELOG.md | 1 + modules/default/calendar/README.md | 3 ++ modules/default/calendar/calendar.js | 72 ++++++++++++++++++++++++---- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc50dfa492..f6065222f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). *This release is scheduled to be released on 2018-10-01.* ### Added +- Possibility to add classes to the cell of symbol, title and time of the events of calendar. ### Fixed diff --git a/modules/default/calendar/README.md b/modules/default/calendar/README.md index ae516a6332..e2cf3ff9de 100755 --- a/modules/default/calendar/README.md +++ b/modules/default/calendar/README.md @@ -86,6 +86,9 @@ config: { | `maximumEntries` | The maximum number of events shown. Overrides global setting. **Possible values:** `0` - `100` | `maximumNumberOfDays` | The maximum number of days in the future. Overrides global setting | `auth` | The object containing options for authentication against the calendar. +| `symbolClass` | Add a class to the cell of symbol. +| `titleClass` | Add a class to the title's cell. +| `timeClass` | Add a class to the time's cell. #### Calendar authentication options: diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 3bb5a03b6c..b9f67bb29f 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -82,6 +82,15 @@ Module.register("calendar", { maximumEntries: calendar.maximumEntries, maximumNumberOfDays: calendar.maximumNumberOfDays }; + if (calendar.symbolClass === "undefined" || calendar.symbolClass === null) { + calendarConfig.symbolClass = ""; + } + if (calendar.titleClass === "undefined" || calendar.titleClass === null) { + calendarConfig.titleClass = ""; + } + if (calendar.timeClass === "undefined" || calendar.timeClass === null) { + calendarConfig.timeClass = ""; + } // we check user and password here for backwards compatibility with old configs if(calendar.user && calendar.pass) { @@ -143,7 +152,7 @@ Module.register("calendar", { if(this.config.timeFormat === "dateheaders"){ if(lastSeenDate !== dateAsString){ var dateRow = document.createElement("tr"); - dateRow.className = "normal" + dateRow.className = "normal"; var dateCell = document.createElement("td"); dateCell.colSpan = "3"; @@ -172,7 +181,9 @@ Module.register("calendar", { symbolWrapper.style.cssText = "color:" + this.colorForUrl(event.url); } - symbolWrapper.className = "symbol align-right"; + var symbolClass = this.symbolClassForUrl(event.url); + symbolWrapper.className = "symbol align-right " + symbolClass; + var symbols = this.symbolsForUrl(event.url); if(typeof symbols === "string") { symbols = [symbols]; @@ -189,7 +200,7 @@ Module.register("calendar", { eventWrapper.appendChild(symbolWrapper); }else if(this.config.timeFormat === "dateheaders"){ var blankCell = document.createElement("td"); - blankCell.innerHTML = "   " + blankCell.innerHTML = "   "; eventWrapper.appendChild(blankCell); } @@ -210,10 +221,12 @@ Module.register("calendar", { titleWrapper.innerHTML = this.titleTransform(event.title) + repeatingCountTitle; + var titleClass = this.titleClassForUrl(event.url); + if (!this.config.colored) { - titleWrapper.className = "title bright"; + titleWrapper.className = "title bright " + titleClass; } else { - titleWrapper.className = "title"; + titleWrapper.className = "title " + titleClass; } if(this.config.timeFormat === "dateheaders"){ @@ -223,8 +236,10 @@ Module.register("calendar", { titleWrapper.align = "left"; }else{ + + var timeClass = this.timeClassForUrl(event.url); var timeWrapper = document.createElement("td"); - timeWrapper.className = "time light"; + timeWrapper.className = "time light " + timeClass; timeWrapper.align = "left"; timeWrapper.style.paddingLeft = "2px"; var timeFormatString = ""; @@ -343,7 +358,8 @@ Module.register("calendar", { } //timeWrapper.innerHTML += ' - '+ moment(event.startDate,'x').format('lll'); //console.log(event); - timeWrapper.className = "time light"; + var timeClass = this.timeClassForUrl(event.url); + timeWrapper.className = "time light " + timeClass; eventWrapper.appendChild(timeWrapper); } @@ -472,11 +488,15 @@ Module.register("calendar", { maximumEntries: calendarConfig.maximumEntries || this.config.maximumEntries, maximumNumberOfDays: calendarConfig.maximumNumberOfDays || this.config.maximumNumberOfDays, fetchInterval: this.config.fetchInterval, + symbolClass: calendarConfig.symbolClass, + titleClass: calendarConfig.titleClass, + timeClass: calendarConfig.timeClass, auth: auth }); }, - /* symbolsForUrl(url) + /** + * symbolsForUrl(url) * Retrieves the symbols for a specific url. * * argument url string - Url to look for. @@ -487,6 +507,42 @@ Module.register("calendar", { return this.getCalendarProperty(url, "symbol", this.config.defaultSymbol); }, + /** + * symbolClassForUrl(url) + * Retrieves the symbolClass for a specific url. + * + * @param url string - Url to look for. + * + * @returns string + */ + symbolClassForUrl: function (url) { + return this.getCalendarProperty(url, "symbolClass", ""); + }, + + /** + * titleClassForUrl(url) + * Retrieves the titleClass for a specific url. + * + * @param url string - Url to look for. + * + * @returns string + */ + titleClassForUrl: function (url) { + return this.getCalendarProperty(url, "titleClass", ""); + }, + + /** + * timeClassForUrl(url) + * Retrieves the timeClass for a specific url. + * + * @param url string - Url to look for. + * + * @returns string + */ + timeClassForUrl: function (url) { + return this.getCalendarProperty(url, "timeClass", ""); + }, + /* colorForUrl(url) * Retrieves the color for a specific url. * From 9a8add780cbc974ce5100a165b77fb37c82866c2 Mon Sep 17 00:00:00 2001 From: Dennis Glasberg Date: Wed, 3 Oct 2018 21:20:38 -0400 Subject: [PATCH 28/79] Update README.md --- modules/default/weatherforecast/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/weatherforecast/README.md b/modules/default/weatherforecast/README.md index a487734f2d..1d8bd23e0a 100644 --- a/modules/default/weatherforecast/README.md +++ b/modules/default/weatherforecast/README.md @@ -28,7 +28,7 @@ The following properties can be configured: | Option | Description | ---------------------------- | ----------- | `location` | The location used for weather information.

**Example:** `'Amsterdam,Netherlands'`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. -| `locationID` | Location ID from [OpenWeatherMap](http://openweathermap.org/help/city_list.txt) **This will override anything you put in location.**
Leave blank if you want to use location.
**Example:** `1234567`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. +| `locationID` | Location ID from [OpenWeatherMap](https://openweathermap.org/find) **This will override anything you put in location.**
Leave blank if you want to use location.
**Example:** `1234567`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. | `appid` | The [OpenWeatherMap](https://home.openweathermap.org) API key, which can be obtained by creating an OpenWeatherMap account.

This value is **REQUIRED** | `units` | What units to use. Specified by config.js

**Possible values:** `config.units` = Specified by config.js, `default` = Kelvin, `metric` = Celsius, `imperial` =Fahrenheit
**Default value:** `config.units` | `roundTemp` | Round temperature values to nearest integer.

**Possible values:** `true` (round to integer) or `false` (display exact value with decimal point)
**Default value:** `false` From d311dbd9d5f2a01778d04c3b264db711ce0ccd37 Mon Sep 17 00:00:00 2001 From: Dennis Glasberg Date: Wed, 3 Oct 2018 21:28:30 -0400 Subject: [PATCH 29/79] Update README.md --- modules/default/currentweather/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/currentweather/README.md b/modules/default/currentweather/README.md index 030b04bfc7..cd5cac1f94 100644 --- a/modules/default/currentweather/README.md +++ b/modules/default/currentweather/README.md @@ -29,7 +29,7 @@ The following properties can be configured: | Option | Description | ---------------------------- | ----------- | `location` | The location used for weather information.

**Example:** `'Amsterdam,Netherlands'`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. -| `locationID` | Location ID from [OpenWeatherMap](http://openweathermap.org/help/city_list.txt) **This will override anything you put in location.**
Leave blank if you want to use location.
**Example:** `1234567`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. +| `locationID` | Location ID from [OpenWeatherMap](https://openweathermap.org/find) **This will override anything you put in location.**
Leave blank if you want to use location.
**Example:** `1234567`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. | `appid` | The [OpenWeatherMap](https://home.openweathermap.org) API key, which can be obtained by creating an OpenWeatherMap account.

This value is **REQUIRED** | `units` | What units to use. Specified by config.js

**Possible values:** `config.units` = Specified by config.js, `default` = Kelvin, `metric` = Celsius, `imperial` =Fahrenheit
**Default value:** `config.units` | `roundTemp` | Round temperature value to nearest integer.

**Possible values:** `true` (round to integer) or `false` (display exact value with decimal point)
**Default value:** `false` From fc89feec4ebf07a8688c4c0511bb22422b1f5165 Mon Sep 17 00:00:00 2001 From: "P-DESK\\P-Storm" Date: Fri, 5 Oct 2018 01:16:25 +0200 Subject: [PATCH 30/79] * Added font awesome 5, keeping shims in place for the calendar app (https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4) * Updated example sample config --- config/config.js.sample | 2 +- modules/default/calendar/calendar.js | 2 +- vendor/package-lock.json | 982 +++------------------------ vendor/package.json | 1 + vendor/vendor.js | 4 +- vendor/yarn.lock | 178 +++++ 6 files changed, 279 insertions(+), 890 deletions(-) diff --git a/config/config.js.sample b/config/config.js.sample index 9ef8780b87..91aa05c93d 100644 --- a/config/config.js.sample +++ b/config/config.js.sample @@ -44,7 +44,7 @@ var config = { config: { calendars: [ { - symbol: "calendar-check-o ", + symbol: "calendar-check", url: "webcal://www.calendarlabs.com/templates/ical/US-Holidays.ics" } ] diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 3bb5a03b6c..d7b2dbac08 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -51,7 +51,7 @@ Module.register("calendar", { // Define required scripts. getStyles: function () { - return ["calendar.css", "font-awesome.css"]; + return ["calendar.css", "font-awesome5.css", "font-awesome5.v4shims.css"]; }, // Define required scripts. diff --git a/vendor/package-lock.json b/vendor/package-lock.json index a326b40268..f0095bedea 100644 --- a/vendor/package-lock.json +++ b/vendor/package-lock.json @@ -19,8 +19,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "optional": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" } }, "arr-diff": { @@ -29,7 +29,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "optional": true, "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "arr-flatten": { @@ -73,7 +73,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "optional": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -83,9 +83,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "optional": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "camelcase": { @@ -99,15 +99,14 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "optional": true, "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" } }, "cliui": { @@ -115,9 +114,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "code-point-at": { @@ -148,7 +147,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "optional": true, "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "expand-range": { @@ -157,7 +156,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "optional": true, "requires": { - "fill-range": "^2.1.0" + "fill-range": "2.2.3" } }, "extglob": { @@ -166,7 +165,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "optional": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "filename-regex": { @@ -181,11 +180,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "optional": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" } }, "font-awesome": { @@ -205,792 +204,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "optional": true, "requires": { - "for-in": "^1.0.1" - } - }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "optional": true, - "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.x.x" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "~1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "optional": true, - "requires": { - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "request": "^2.81.0", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "requires": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - } + "for-in": "1.0.2" } }, "glob-base": { @@ -999,8 +213,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "optional": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "glob-parent": "2.0.0", + "is-glob": "2.0.1" } }, "glob-parent": { @@ -1008,7 +222,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "is-glob": "^2.0.0" + "is-glob": "2.0.1" } }, "graceful-fs": { @@ -1033,7 +247,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "optional": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "1.10.0" } }, "is-buffer": { @@ -1053,7 +267,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "optional": true, "requires": { - "is-primitive": "^2.0.0" + "is-primitive": "2.0.0" } }, "is-extendable": { @@ -1072,7 +286,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-glob": { @@ -1080,7 +294,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "is-number": { @@ -1089,7 +303,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "optional": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-posix-bracket": { @@ -1123,7 +337,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.5" } }, "lcid": { @@ -1131,7 +345,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "micromatch": { @@ -1140,19 +354,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "optional": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } }, "minimatch": { @@ -1161,7 +375,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "optional": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.8" } }, "moment": { @@ -1174,21 +388,15 @@ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.13.tgz", "integrity": "sha1-mc5cfYJyYusPH3AgRBd/YHRde5A=", "requires": { - "moment": ">= 2.9.0" + "moment": "2.18.1" } }, - "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", - "optional": true - }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "number-is-nan": { @@ -1201,10 +409,10 @@ "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.0.1.tgz", "integrity": "sha1-TedKPlULr2+jNwMj89HHwqhr3E0=", "requires": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "chokidar": "^1.6.0", - "yargs": "^3.32.0" + "a-sync-waterfall": "1.0.0", + "asap": "2.0.6", + "chokidar": "1.7.0", + "yargs": "3.32.0" } }, "object.omit": { @@ -1213,8 +421,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "optional": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-own": "0.1.5", + "is-extendable": "0.1.1" } }, "os-locale": { @@ -1222,7 +430,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "^1.0.0" + "lcid": "1.0.0" } }, "parse-glob": { @@ -1231,10 +439,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "optional": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" } }, "path-is-absolute": { @@ -1261,8 +469,8 @@ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "optional": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "is-number": { @@ -1271,7 +479,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "optional": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -1280,7 +488,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "optional": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.5" } } } @@ -1291,7 +499,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "optional": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.5" } } } @@ -1302,13 +510,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "optional": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "readdirp": { @@ -1317,10 +525,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "optional": true, "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" } }, "regex-cache": { @@ -1329,7 +537,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "optional": true, "requires": { - "is-equal-shallow": "^0.1.3" + "is-equal-shallow": "0.1.3" } }, "remove-trailing-separator": { @@ -1364,9 +572,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -1375,7 +583,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } }, "strip-ansi": { @@ -1383,7 +591,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "util-deprecate": { @@ -1407,8 +615,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" } }, "y18n": { @@ -1421,13 +629,13 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" + "camelcase": "2.1.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "string-width": "1.0.2", + "window-size": "0.1.4", + "y18n": "3.2.1" } } } diff --git a/vendor/package.json b/vendor/package.json index 77fddd1d83..d14f8bcb00 100644 --- a/vendor/package.json +++ b/vendor/package.json @@ -10,6 +10,7 @@ "url": "https://github.com/MichMich/MagicMirror/issues" }, "dependencies": { + "@fortawesome/fontawesome-free": "^5.3.1", "font-awesome": "^4.7.0", "moment": "^2.17.1", "moment-timezone": "^0.5.11", diff --git a/vendor/vendor.js b/vendor/vendor.js index dee082d45f..b2993e63eb 100644 --- a/vendor/vendor.js +++ b/vendor/vendor.js @@ -12,7 +12,9 @@ var vendor = { "moment-timezone.js" : "node_modules/moment-timezone/builds/moment-timezone-with-data.js", "weather-icons.css": "node_modules/weathericons/css/weather-icons.css", "weather-icons-wind.css": "node_modules/weathericons/css/weather-icons-wind.css", - "font-awesome.css": "node_modules/font-awesome/css/font-awesome.min.css", + "font-awesome.css": "node_modules/font-awesome/css/font-awesome.min.css", + "font-awesome5.css": "node_modules/@fortawesome/fontawesome-free/css/all.min.css", + "font-awesome5.v4shims.css": "node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css", "nunjucks.js": "node_modules/nunjucks/browser/nunjucks.min.js" }; diff --git a/vendor/yarn.lock b/vendor/yarn.lock index 095f7ed9d2..a04f2b630b 100644 --- a/vendor/yarn.lock +++ b/vendor/yarn.lock @@ -2,17 +2,25 @@ # yarn lockfile v1 +"@fortawesome/fontawesome-free@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.3.1.tgz#5466b8f31c1f493a96754c1426c25796d0633dd9" + integrity sha512-jt6yi7iZVtkY9Jc6zFo+G2vqL4M81pb3IA3WmnnDt9ci7Asz+mPg4gbZL8pjx0nGFBsG0Bmd7BjU9IQkebqxFA== + a-sync-waterfall@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/a-sync-waterfall/-/a-sync-waterfall-1.0.0.tgz#38e8319d79379e24628845b53b96722b29e0e47c" + integrity sha1-OOgxnXk3niRiiEW1O5ZyKyng5Hw= abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" @@ -20,10 +28,12 @@ ajv@^4.9.1: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" @@ -31,10 +41,12 @@ anymatch@^1.3.0: aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -42,78 +54,95 @@ are-we-there-yet@~1.1.2: arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-flatten@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= asap@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + integrity sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40= dependencies: tweetnacl "^0.14.3" binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= dependencies: hoek "2.x.x" brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -121,6 +150,7 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" @@ -129,14 +159,17 @@ braces@^1.8.2: camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= chokidar@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -152,6 +185,7 @@ chokidar@^1.6.0: cliui@^3.0.3: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -160,110 +194,133 @@ cliui@^3.0.3: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= dependencies: delayed-stream "~1.0.0" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= dependencies: boom "2.x.x" dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8= delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + integrity sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= dependencies: jsbn "~0.1.0" expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= dependencies: is-number "^2.1.0" isobject "^2.0.0" @@ -274,24 +331,29 @@ fill-range@^2.1.0: font-awesome@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" + integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -300,10 +362,12 @@ form-data@~2.1.1: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + integrity sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q== dependencies: nan "^2.3.0" node-pre-gyp "^0.6.39" @@ -311,6 +375,7 @@ fsevents@^1.0.0: fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= dependencies: fstream "^1.0.0" inherits "2" @@ -319,6 +384,7 @@ fstream-ignore@^1.0.5: fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -328,6 +394,7 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -341,12 +408,14 @@ gauge@~2.7.3: getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -354,12 +423,14 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob@^7.0.5: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -371,14 +442,17 @@ glob@^7.0.5: graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= dependencies: ajv "^4.9.1" har-schema "^1.0.5" @@ -386,10 +460,12 @@ har-validator@~4.2.1: has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= dependencies: boom "2.x.x" cryptiles "2.x.x" @@ -399,10 +475,12 @@ hawk@3.1.3, hawk@~3.1.3: hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= dependencies: assert-plus "^0.2.0" jsprim "^1.2.2" @@ -411,6 +489,7 @@ http-signature@~1.1.0: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -418,118 +497,143 @@ inflight@^1.0.4: inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -539,24 +643,28 @@ jsprim@^1.2.2: kind-of@^3.0.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" micromatch@^2.1.5: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -575,54 +683,65 @@ micromatch@^2.1.5: mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== mime-types@^2.1.12, mime-types@~2.1.7: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= "mkdirp@>=0.5 0", mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" moment-timezone@^0.5.11: version "0.5.14" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.14.tgz#4eb38ff9538b80108ba467a458f3ed4268ccfcb1" + integrity sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE= dependencies: moment ">= 2.9.0" "moment@>= 2.9.0", moment@^2.17.1: version "2.22.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.0.tgz#7921ade01017dd45186e7fee5f424f0b8663a730" + integrity sha512-1muXCh8jb1N/gHRbn9VDUBr0GYb8A/aVcHlII9QSB68a50spqEVLIGN6KVmCOnSvJrUhC0edGgKU5ofnGXdYdg== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= nan@^2.3.0: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + integrity sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ== dependencies: detect-libc "^1.0.2" hawk "3.1.3" @@ -639,6 +758,7 @@ node-pre-gyp@^0.6.39: nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -646,12 +766,14 @@ nopt@^4.0.1: normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -661,10 +783,12 @@ npmlog@^4.0.2: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nunjucks@^3.0.1: version "3.1.2" resolved "https://registry.yarnpkg.com/nunjucks/-/nunjucks-3.1.2.tgz#85945a66bb8239bb37ecef83dab4cc1f152aabb9" + integrity sha512-pJXncV07mmiuIDL9OqdNkcpvifuDMzMq9qBQT9SHasAS7AEwzNp/r/jHNl+9O0+zsldcdWG9ZtXo/nwu2cTqXA== dependencies: a-sync-waterfall "^1.0.0" asap "^2.0.3" @@ -676,14 +800,17 @@ nunjucks@^3.0.1: oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -691,26 +818,31 @@ object.omit@^2.0.0: once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= dependencies: lcid "^1.0.0" os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -718,6 +850,7 @@ osenv@^0.1.4: parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -727,34 +860,42 @@ parse-glob@^3.0.4: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= postinstall-build@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/postinstall-build/-/postinstall-build-5.0.1.tgz#b917a9079b26178d9a24af5a5cd8cb4a991d11b9" + integrity sha1-uRepB5smF42aJK9aXNjLSpkdEbk= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -762,6 +903,7 @@ randomatic@^1.1.3: rc@^1.1.7: version "1.2.6" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" + integrity sha1-6xiYnG1PTxYsOZ953dKfODVWgJI= dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -771,6 +913,7 @@ rc@^1.1.7: readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: version "2.3.5" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" + integrity sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -783,6 +926,7 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= dependencies: graceful-fs "^4.1.2" minimatch "^3.0.2" @@ -792,24 +936,29 @@ readdirp@^2.0.0: regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= repeat-string@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" @@ -837,38 +986,46 @@ request@2.81.0: rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= dependencies: hoek "2.x.x" sshpk@^1.7.0: version "1.14.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + integrity sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s= dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -883,6 +1040,7 @@ sshpk@^1.7.0: string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -891,26 +1049,31 @@ string-width@^1.0.1, string-width@^1.0.2: string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== dependencies: safe-buffer "~5.1.0" stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + integrity sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg== dependencies: debug "^2.2.0" fstream "^1.0.10" @@ -924,6 +1087,7 @@ tar-pack@^3.4.0: tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= dependencies: block-stream "*" fstream "^1.0.2" @@ -932,34 +1096,41 @@ tar@^2.2.1: tough-cookie@~2.3.0: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== dependencies: punycode "^1.4.1" tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= uuid@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -968,20 +1139,24 @@ verror@1.10.0: weathericons@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/weathericons/-/weathericons-2.1.0.tgz#7453a1a35e200245e389fb5077d527eff30b73b4" + integrity sha1-dFOho14gAkXjiftQd9Un7/MLc7Q= wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== dependencies: string-width "^1.0.2" window-size@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -989,14 +1164,17 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= y18n@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= yargs@^3.32.0: version "3.32.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= dependencies: camelcase "^2.0.1" cliui "^3.0.3" From 66b914774a7acad19ab41aa2ff92ce14b1785eed Mon Sep 17 00:00:00 2001 From: "P-DESK\\P-Storm" Date: Fri, 5 Oct 2018 01:24:47 +0200 Subject: [PATCH 31/79] Updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc50dfa492..bf3c9d8347 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). *This release is scheduled to be released on 2018-10-01.* ### Added +- Added font-awesome 5, still has 4 for backwards compatibility. ### Fixed From 53833ae0c331ba0c6275e8223016a8bf0e2ba3ea Mon Sep 17 00:00:00 2001 From: P-Storm Date: Fri, 5 Oct 2018 01:42:28 +0200 Subject: [PATCH 32/79] Spaces to tab --- vendor/vendor.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/vendor.js b/vendor/vendor.js index b2993e63eb..abbf1423e5 100644 --- a/vendor/vendor.js +++ b/vendor/vendor.js @@ -12,9 +12,9 @@ var vendor = { "moment-timezone.js" : "node_modules/moment-timezone/builds/moment-timezone-with-data.js", "weather-icons.css": "node_modules/weathericons/css/weather-icons.css", "weather-icons-wind.css": "node_modules/weathericons/css/weather-icons-wind.css", - "font-awesome.css": "node_modules/font-awesome/css/font-awesome.min.css", - "font-awesome5.css": "node_modules/@fortawesome/fontawesome-free/css/all.min.css", - "font-awesome5.v4shims.css": "node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css", + "font-awesome.css": "node_modules/font-awesome/css/font-awesome.min.css", + "font-awesome5.css": "node_modules/@fortawesome/fontawesome-free/css/all.min.css", + "font-awesome5.v4shims.css": "node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css", "nunjucks.js": "node_modules/nunjucks/browser/nunjucks.min.js" }; From e7df1c3e564eb99a30e6464cbb4f429ecb6d37aa Mon Sep 17 00:00:00 2001 From: Shade Alabsa Date: Sun, 7 Oct 2018 14:55:07 -0400 Subject: [PATCH 33/79] Added in 5 day forecast screenshot --- CHANGELOG.md | 1 + modules/default/weatherforecast/README.md | 5 +++++ .../weatherforecast/forecast_screenshot.png | Bin 0 -> 86206 bytes 3 files changed, 6 insertions(+) create mode 100644 modules/default/weatherforecast/forecast_screenshot.png diff --git a/CHANGELOG.md b/CHANGELOG.md index bc50dfa492..37de3a4a90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). *This release is scheduled to be released on 2018-10-01.* ### Added +- Screenshot to the weather forecast module ### Fixed diff --git a/modules/default/weatherforecast/README.md b/modules/default/weatherforecast/README.md index a487734f2d..841cf5bd05 100644 --- a/modules/default/weatherforecast/README.md +++ b/modules/default/weatherforecast/README.md @@ -2,6 +2,11 @@ The `weatherforecast` module is one of the default modules of the MagicMirror. This module displays the weather forecast for the coming week, including an an icon to display the current conditions, the minimum temperature and the maximum temperature. +## Screenshots + +- 5 day forecast +![Screenshot of 5 day forecast](forecast_screenshot.png) + ## Using the module To use this module, add it to the modules array in the `config/config.js` file: diff --git a/modules/default/weatherforecast/forecast_screenshot.png b/modules/default/weatherforecast/forecast_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b9022adfba0e5d2a59eed7962b154bb82503b5d6 GIT binary patch literal 86206 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

eXu_6BCJg&AV=|)Qca-RYEgi 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 AP5=M^ literal 0 HcmV?d00001 From 649b78e3f28eaa44575755f9ccfb1ce85f3f0824 Mon Sep 17 00:00:00 2001 From: Shade Alabsa Date: Sun, 7 Oct 2018 15:01:51 -0400 Subject: [PATCH 34/79] Added in screenshot for current weather module. --- CHANGELOG.md | 2 ++ modules/default/currentweather/README.md | 5 +++++ .../currentweather/weather_screenshot.png | Bin 0 -> 38566 bytes 3 files changed, 7 insertions(+) create mode 100644 modules/default/currentweather/weather_screenshot.png diff --git a/CHANGELOG.md b/CHANGELOG.md index bc50dfa492..165fe1dc50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added +- Added in screenshot for the current weather + ### Fixed ### Updated diff --git a/modules/default/currentweather/README.md b/modules/default/currentweather/README.md index 030b04bfc7..9423c24908 100644 --- a/modules/default/currentweather/README.md +++ b/modules/default/currentweather/README.md @@ -2,6 +2,11 @@ The `currentweather` module is one of the default modules of the MagicMirror. This module displays the current weather, including the windspeed, the sunset or sunrise time, the temperature and an icon to display the current conditions. +## Screenshot + +- Current weather screenshot +![Current Weather Screenshot](weather_screenshot.png) + ## Using the module To use this module, add it to the modules array in the `config/config.js` file: diff --git a/modules/default/currentweather/weather_screenshot.png b/modules/default/currentweather/weather_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6e5257928e5750cd88e0396095ab779051725f GIT binary patch literal 38566 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

Wj}2#TxQ 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 literal 0 HcmV?d00001 From a0d92d764bda31194ecb4d671c51df92e5665403 Mon Sep 17 00:00:00 2001 From: Shade Alabsa Date: Sun, 7 Oct 2018 15:12:10 -0400 Subject: [PATCH 35/79] Added in screenshot --- CHANGELOG.md | 2 ++ modules/default/clock/README.md | 5 +++++ modules/default/clock/clock_screenshot.png | Bin 0 -> 30525 bytes 3 files changed, 7 insertions(+) create mode 100644 modules/default/clock/clock_screenshot.png diff --git a/CHANGELOG.md b/CHANGELOG.md index bc50dfa492..cb6e85bfc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added +Added in a screenshot for the clock module + ### Fixed ### Updated diff --git a/modules/default/clock/README.md b/modules/default/clock/README.md index a231d73ce7..27e2ca5df1 100644 --- a/modules/default/clock/README.md +++ b/modules/default/clock/README.md @@ -2,6 +2,11 @@ The `clock` module is one of the default modules of the MagicMirror. This module displays the current date and time. The information will be updated realtime. +## Screenshot + +- Current time +![Current time](clock_screenshot.png) + ## Using the module To use this module, add it to the modules array in the `config/config.js` file: diff --git a/modules/default/clock/clock_screenshot.png b/modules/default/clock/clock_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f30f572f035a6308a4cd6ec3b161d488fb85d2 GIT binary patch literal 30525 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 Date: Sun, 7 Oct 2018 15:16:10 -0400 Subject: [PATCH 36/79] Added in compliments screenshot --- CHANGELOG.md | 2 ++ modules/default/compliments/README.md | 4 ++++ .../compliments/compliments_screenshot.png | Bin 0 -> 26157 bytes 3 files changed, 6 insertions(+) create mode 100644 modules/default/compliments/compliments_screenshot.png diff --git a/CHANGELOG.md b/CHANGELOG.md index bc50dfa492..cd4145d91e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added +- Added in screenshot for the compliments module + ### Fixed ### Updated diff --git a/modules/default/compliments/README.md b/modules/default/compliments/README.md index 7220cd2925..0eb01eec05 100644 --- a/modules/default/compliments/README.md +++ b/modules/default/compliments/README.md @@ -2,6 +2,10 @@ The `compliments` module is one of the default modules of the MagicMirror. This module displays a random compliment. +## Screenshots +- Compliments Screenshot +![Compliments Screenshot](compliments_screenshot.png) + ## Using the module To use this module, add it to the modules array in the `config/config.js` file: diff --git a/modules/default/compliments/compliments_screenshot.png b/modules/default/compliments/compliments_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..12def320906445430b066a3a8186aa72013e6d74 GIT binary patch literal 26157 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 TT!qb982Hmx*H^1laftp8dqkjJ literal 0 HcmV?d00001 From d2b3efacf9be7e698925899353f79ed2a799ef12 Mon Sep 17 00:00:00 2001 From: Shade Alabsa Date: Sun, 7 Oct 2018 15:20:11 -0400 Subject: [PATCH 37/79] Added in screenshot for the newfeed module --- CHANGELOG.md | 2 ++ modules/default/newsfeed/README.md | 4 ++++ .../default/newsfeed/newsfeed_screenshot.png | Bin 0 -> 45375 bytes 3 files changed, 6 insertions(+) create mode 100644 modules/default/newsfeed/newsfeed_screenshot.png diff --git a/CHANGELOG.md b/CHANGELOG.md index bc50dfa492..f0afadc093 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added +- Added in screenshot for the new feed module + ### Fixed ### Updated diff --git a/modules/default/newsfeed/README.md b/modules/default/newsfeed/README.md index f4888ebbfb..c06c3f070b 100644 --- a/modules/default/newsfeed/README.md +++ b/modules/default/newsfeed/README.md @@ -2,6 +2,10 @@ The `newsfeed ` module is one of the default modules of the MagicMirror. This module displays news headlines based on an RSS feed. Scrolling through news headlines happens time-based (````updateInterval````), but can also be controlled by sending news feed specific notifications to the module. +## Screenshot +- News Feed Screenshot using the NYT +![NYT News Feed Screenshot](newsfeed_screenshot.png) + ## Using the module ### Configuration diff --git a/modules/default/newsfeed/newsfeed_screenshot.png b/modules/default/newsfeed/newsfeed_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f4391e7d2f70e810946a38a518c05467820dc157 GIT binary patch literal 45375 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 OOh?mDqw0pk!~X$Q>|log literal 0 HcmV?d00001 From db79e1271e0e58a5fb4c3f9eefe9eeb0823ff2d7 Mon Sep 17 00:00:00 2001 From: Dustin Date: Mon, 8 Oct 2018 21:11:28 +0200 Subject: [PATCH 38/79] (doc) showEnd config Add documentation for showEnd configuration --- modules/default/calendar/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/default/calendar/README.md b/modules/default/calendar/README.md index ae516a6332..d49faf6285 100755 --- a/modules/default/calendar/README.md +++ b/modules/default/calendar/README.md @@ -44,6 +44,7 @@ The following properties can be configured: | `dateFormat` | Format to use for the date of events (when using absolute dates)

**Possible values:** See [Moment.js formats](http://momentjs.com/docs/#/parsing/string-format/)
**Default value:** `MMM Do` (e.g. Jan 18th) | `fullDayEventDateFormat` | Format to use for the date of full day events (when using absolute dates)

**Possible values:** See [Moment.js formats](http://momentjs.com/docs/#/parsing/string-format/)
**Default value:** `MMM Do` (e.g. Jan 18th) | `timeFormat` | Display event times as absolute dates, or relative time, or using absolute date headers with times for each event next to it

**Possible values:** `absolute` or `relative` or `dateheaders`
**Default value:** `relative` +| `showEnd` | Display the end of a date as well

**Possible values:** `true` or `false`
**Default value:** `true` | `getRelative` | How much time (in hours) should be left until calendar events start getting relative?

**Possible values:** `0` (events stay absolute) - `48` (48 hours before the event starts)
**Default value:** `6` | `urgency` | When using a timeFormat of `absolute`, the `urgency` setting allows you to display events within a specific time frame as `relative`. This allows events within a certain time frame to be displayed as relative (in xx days) while others are displayed as absolute dates

**Possible values:** a positive integer representing the number of days for which you want a relative date, for example `7` (for 7 days)

**Default value:** `7` | `broadcastEvents` | If this property is set to true, the calendar will broadcast all the events to all other modules with the notification message: `CALENDAR_EVENTS`. The event objects are stored in an array and contain the following fields: `title`, `startDate`, `endDate`, `fullDayEvent`, `location` and `geo`.

**Possible values:** `true`, `false`

**Default value:** `true` From cdbf022ce0f0d141f1b6a0700d204dc9f76e8957 Mon Sep 17 00:00:00 2001 From: Dustin Date: Mon, 8 Oct 2018 21:19:55 +0200 Subject: [PATCH 39/79] Update CHANGELOG.md --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b19efad3d6..11cc16d059 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). --- +## [2.5.1] - 2018-10-08 + +### Added +- added `showEnd` documentation + +### Fixed + + + ## [2.5.0] - 2018-10-01 ### Added From 676a8a64210d6218f4e51819725a18cc467a3959 Mon Sep 17 00:00:00 2001 From: Shade Alabsa Date: Mon, 8 Oct 2018 19:40:54 -0400 Subject: [PATCH 40/79] Fixed README formatting errors. --- modules/default/compliments/README.md | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/modules/default/compliments/README.md b/modules/default/compliments/README.md index 0eb01eec05..c89a3707f0 100644 --- a/modules/default/compliments/README.md +++ b/modules/default/compliments/README.md @@ -49,22 +49,22 @@ The `compliments` property contains an object with four arrays: morning
Date: Sun, 14 Oct 2018 15:08:55 -0500 Subject: [PATCH 41/79] Fix Broken Link http://www.openweathermap.org/help/city_list.txt is a dead link, suggest replacing with https://openweathermap.org/city --- config/config.js.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.js.sample b/config/config.js.sample index 9ef8780b87..f09b483f33 100644 --- a/config/config.js.sample +++ b/config/config.js.sample @@ -69,7 +69,7 @@ var config = { header: "Weather Forecast", config: { location: "New York", - locationID: "5128581", //ID from http://www.openweathermap.org/help/city_list.txt + locationID: "5128581", //ID from https://openweathermap.org/city appid: "YOUR_OPENWEATHER_API_KEY" } }, From d3798344ddb35170f5750585eaa330a0f9735d75 Mon Sep 17 00:00:00 2001 From: Marcin Bielecki Date: Mon, 22 Oct 2018 14:21:44 +0200 Subject: [PATCH 42/79] fix polish translation --- CHANGELOG.md | 5 +++++ translations/pl.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b19efad3d6..138b9493b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). --- +## [2.5.1] - 2018- + +### Fixed +- Fixed Polish translation for Single Update Info + ## [2.5.0] - 2018-10-01 ### Added diff --git a/translations/pl.json b/translations/pl.json index 617288e971..09f44d882a 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -28,7 +28,7 @@ "UPDATE_NOTIFICATION": "Dostępna jest aktualizacja MagicMirror².", "UPDATE_NOTIFICATION_MODULE": "Dostępna jest aktualizacja modułu {MODULE_NAME}.", - "UPDATE_INFO_SINGLE": "Zainstalowana wersja odbiega o {COMMIT_COUNT} commitów od gałęzi {BRANCH_NAME}.", + "UPDATE_INFO_SINGLE": "Zainstalowana wersja odbiega o {COMMIT_COUNT} commit od gałęzi {BRANCH_NAME}.", "UPDATE_INFO_MULTIPLE": "Zainstalowana wersja odbiega o {COMMIT_COUNT} commitów od gałęzi {BRANCH_NAME}.", "FEELS": "Odczuwalna" From 4fd87aca09c8058a19caf634d3ef6bb773e1385a Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Fri, 26 Oct 2018 15:22:05 +0200 Subject: [PATCH 43/79] Change showEnd default to false. --- CHANGELOG.md | 1 + modules/default/calendar/calendar.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37c459bab3..8dd7227bba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Fixed Polish translation for Single Update Info ### Updated +- The default calendar setting `showEnd` is changed to `false`. ## [2.5.0] - 2018-10-01 diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 43eaeaf94e..34ec254808 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -27,7 +27,7 @@ Module.register("calendar", { dateFormat: "MMM Do", dateEndFormat: "HH:mm", fullDayEventDateFormat: "MMM Do", - showEnd: true, + showEnd: false, getRelative: 6, fadePoint: 0.25, // Start on 1/4th of the list. hidePrivate: false, From 85931155e6f6245e852674376fea80d454fff5a9 Mon Sep 17 00:00:00 2001 From: Thomas Bachmann Date: Mon, 29 Oct 2018 20:26:54 +0100 Subject: [PATCH 44/79] Fixed eslint issues .. as requested in Pull Request #1424 --- modules/default/calendar/calendarfetcher.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js index d9106853ed..bf417afeae 100644 --- a/modules/default/calendar/calendarfetcher.js +++ b/modules/default/calendar/calendarfetcher.js @@ -173,14 +173,14 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri if (typeof event.rrule != "undefined" && !isFacebookBirthday) { var rule = event.rrule; - + // can cause problems with e.g. birthdays before 1900 - if(rule.origOptions && rule.origOptions.dtstart && rule.origOptions.dtstart.getFullYear() < 1900 || + if(rule.origOptions && rule.origOptions.dtstart && rule.origOptions.dtstart.getFullYear() < 1900 || rule.options && rule.options.dtstart && rule.options.dtstart.getFullYear() < 1900){ rule.origOptions.dtstart.setYear(1900); rule.options.dtstart.setYear(1900); } - + var dates = rule.between(today, future, true, limitFunction); for (var d in dates) { From 3bbdd08d24e766db1ac181468fc006ac71e99107 Mon Sep 17 00:00:00 2001 From: EdgardosReis Date: Wed, 7 Nov 2018 00:34:02 +0000 Subject: [PATCH 45/79] Portuguese translation for "Feels" --- CHANGELOG.md | 1 + translations/pt.json | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50e385cc78..4a400836c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Screenshot for the clock module - Screenshot for the current weather - Screenshot for the weather forecast module +- Portuguese translation for "Feels" ### Fixed - Allow to parse recurring calendar events where the start date is before 1900 diff --git a/translations/pt.json b/translations/pt.json index e01d028c50..2199f024e0 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -5,9 +5,9 @@ "DAYAFTERTOMORROW": "O dia depois de amanhã", "RUNNING": "Termina em", "EMPTY": "Sem eventos programados.", - + "WEEK": "Semana {weekNumber}", - + "N": "N", "NNE": "NNE", "NE": "NE", @@ -24,9 +24,11 @@ "WNW": "ONO", "NW": "NO", "NNW": "NNO", - + "UPDATE_NOTIFICATION": "Atualização do MagicMirror² disponível.", "UPDATE_NOTIFICATION_MODULE": "Atualização para o módulo {MODULE_NAME} disponível.", "UPDATE_INFO_SINGLE": "A instalação atual está {COMMIT_COUNT} commit atrasada no branch {BRANCH_NAME}.", - "UPDATE_INFO_MULTIPLE": "A instalação atual está {COMMIT_COUNT} commits atrasada no branch {BRANCH_NAME}." + "UPDATE_INFO_MULTIPLE": "A instalação atual está {COMMIT_COUNT} commits atrasada no branch {BRANCH_NAME}.", + + "FEELS": "Sentida" } From 78daa65d282824f1611692bc509d1b86b53b3177 Mon Sep 17 00:00:00 2001 From: Tom Wardill Date: Wed, 7 Nov 2018 18:44:32 +0000 Subject: [PATCH 46/79] Ignore rrule errors --- modules/default/calendar/calendarfetcher.js | 2 +- modules/default/calendar/vendor/ical.js/node-ical.js | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js index bf417afeae..a1e4aa8d60 100644 --- a/modules/default/calendar/calendarfetcher.js +++ b/modules/default/calendar/calendarfetcher.js @@ -171,7 +171,7 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri var geo = event.geo || false; var description = event.description || false; - if (typeof event.rrule != "undefined" && !isFacebookBirthday) { + if (typeof event.rrule != "undefined" && event.rrule != null && !isFacebookBirthday) { var rule = event.rrule; // can cause problems with e.g. birthdays before 1900 diff --git a/modules/default/calendar/vendor/ical.js/node-ical.js b/modules/default/calendar/vendor/ical.js/node-ical.js index c954e72240..e42ce8950c 100644 --- a/modules/default/calendar/vendor/ical.js/node-ical.js +++ b/modules/default/calendar/vendor/ical.js/node-ical.js @@ -44,7 +44,13 @@ ical.objectHandlers['END'] = function(val, params, curr, stack){ rule += ' EXDATE:' + curr.exdates[i].toISOString().replace(/[-:]/g, ''); rule = rule.replace(/\.[0-9]{3}/, ''); } - curr.rrule = rrulestr(rule); + try { + curr.rrule = rrulestr(rule); + } + catch(err) { + console.log("Unrecognised element in calendar feed, ignoring: " + rule); + curr.rrule = null; + } } return originalEnd.call(this, val, params, curr, stack); } From 390b3b173b2f35ef8e5b2f8e122607b9552cda53 Mon Sep 17 00:00:00 2001 From: Tom Wardill Date: Wed, 7 Nov 2018 18:53:54 +0000 Subject: [PATCH 47/79] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50e385cc78..7d6dc1222b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed - Allow to parse recurring calendar events where the start date is before 1900 - Fixed Polish translation for Single Update Info +- Ignore entries with unparseable details in the calendar module ### Updated - The default calendar setting `showEnd` is changed to `false`. From cc96b86b3a9dbd00c65ebe6b43570f082862c1b5 Mon Sep 17 00:00:00 2001 From: Dirk Date: Wed, 21 Nov 2018 09:32:56 +0100 Subject: [PATCH 48/79] Fading for dateheaders Included fading for dateheaders option Removed unnecessary switch statement in dateheaders option --- modules/default/calendar/calendar.js | 47 ++++++++++++---------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 34ec254808..2897e64f28 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -144,6 +144,15 @@ Module.register("calendar", { return wrapper; } + if (this.config.fade && this.config.fadePoint < 1) { + if (this.config.fadePoint < 0) { + this.config.fadePoint = 0; + } + var startFade = events.length * this.config.fadePoint; + var fadeSteps = events.length - startFade; + } + + var currentFadeStep = 0; var lastSeenDate = ""; for (var e in events) { @@ -160,6 +169,10 @@ Module.register("calendar", { dateRow.appendChild(dateCell); wrapper.appendChild(dateRow); + if (e >= startFade) { //fading + currentFadeStep = e - startFade; + dateRow.style.opacity = 1 - (1 / fadeSteps * currentFadeStep); + } lastSeenDate = dateAsString; } @@ -242,22 +255,7 @@ Module.register("calendar", { timeWrapper.className = "time light " + timeClass; timeWrapper.align = "left"; timeWrapper.style.paddingLeft = "2px"; - var timeFormatString = ""; - switch (config.timeFormat) { - case 12: { - timeFormatString = "h:mm A"; - break; - } - case 24: { - timeFormatString = "HH:mm"; - break; - } - default: { - timeFormatString = "HH:mm"; - break; - } - } - timeWrapper.innerHTML = moment(event.startDate, "x").format(timeFormatString); + timeWrapper.innerHTML = moment(event.startDate, "x").format('LT'); eventWrapper.appendChild(timeWrapper); titleWrapper.align = "right"; } @@ -275,6 +273,8 @@ Module.register("calendar", { var oneHour = oneMinute * 60; var oneDay = oneHour * 24; if (event.fullDayEvent) { + //subtract one second so that fullDayEvents end at 23:59:59, and not at 0:00:00 one the next day + event.endDate -= oneSecond; if (event.today) { timeWrapper.innerHTML = this.capFirst(this.translate("TODAY")); } else if (event.startDate - now < oneDay && event.startDate - now > 0) { @@ -366,19 +366,12 @@ Module.register("calendar", { wrapper.appendChild(eventWrapper); // Create fade effect. - if (this.config.fade && this.config.fadePoint < 1) { - if (this.config.fadePoint < 0) { - this.config.fadePoint = 0; - } - var startingPoint = events.length * this.config.fadePoint; - var steps = events.length - startingPoint; - if (e >= startingPoint) { - var currentStep = e - startingPoint; - eventWrapper.style.opacity = 1 - (1 / steps * currentStep); - } + if (e >= startFade) { + currentFadeStep = e - startFade; + eventWrapper.style.opacity = 1 - (1 / fadeSteps * currentFadeStep); } } - + return wrapper; }, From 07770601f63aedc2cdf17535c498c098dbd6e453 Mon Sep 17 00:00:00 2001 From: Dirk Date: Wed, 21 Nov 2018 10:24:53 +0100 Subject: [PATCH 49/79] Update CHANGELOG.md - Fading for dateheaders timeFormat in Calendar [#1464](https://github.com/MichMich/MagicMirror/issues/1464) - Bug showing FullDayEvents one day too long in calendar fixe --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 302f1215df..aaf036aa6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,11 +19,13 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Screenshot for the current weather - Screenshot for the weather forecast module - Portuguese translation for "Feels" +- Fading for dateheaders timeFormat in Calendar [#1464](https://github.com/MichMich/MagicMirror/issues/1464) ### Fixed - Allow to parse recurring calendar events where the start date is before 1900 - Fixed Polish translation for Single Update Info - Ignore entries with unparseable details in the calendar module +- Bug showing FullDayEvents one day too long in calendar fixed ### Updated - The default calendar setting `showEnd` is changed to `false`. From af459a5a2868fe6dd4b854655dfbcf03813ff49f Mon Sep 17 00:00:00 2001 From: Dirk Date: Wed, 21 Nov 2018 12:10:39 +0100 Subject: [PATCH 50/79] formatting corrected Corrected formatting due to Travis CI errors --- modules/default/calendar/calendar.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 2897e64f28..38b0426979 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -151,7 +151,7 @@ Module.register("calendar", { var startFade = events.length * this.config.fadePoint; var fadeSteps = events.length - startFade; } - + var currentFadeStep = 0; var lastSeenDate = ""; @@ -255,7 +255,7 @@ Module.register("calendar", { timeWrapper.className = "time light " + timeClass; timeWrapper.align = "left"; timeWrapper.style.paddingLeft = "2px"; - timeWrapper.innerHTML = moment(event.startDate, "x").format('LT'); + timeWrapper.innerHTML = moment(event.startDate, "x").format("LT"); eventWrapper.appendChild(timeWrapper); titleWrapper.align = "right"; } @@ -274,7 +274,7 @@ Module.register("calendar", { var oneDay = oneHour * 24; if (event.fullDayEvent) { //subtract one second so that fullDayEvents end at 23:59:59, and not at 0:00:00 one the next day - event.endDate -= oneSecond; + event.endDate -= oneSecond; if (event.today) { timeWrapper.innerHTML = this.capFirst(this.translate("TODAY")); } else if (event.startDate - now < oneDay && event.startDate - now > 0) { @@ -371,7 +371,7 @@ Module.register("calendar", { eventWrapper.style.opacity = 1 - (1 / fadeSteps * currentFadeStep); } } - + return wrapper; }, From 5c549ec6e50c34674ebdff58c8f4ef09893653c0 Mon Sep 17 00:00:00 2001 From: Alexis Iglauer Date: Thu, 22 Nov 2018 23:28:04 +0100 Subject: [PATCH 51/79] Update README.md Typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9459b5db3f..dfb24d160c 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ MagicMirror² focuses on a modular plugin system and uses [Electron](http://elec *Electron*, the app wrapper around MagicMirror², only supports the Raspberry Pi 2/3. The Raspberry Pi 0/1 is currently **not** supported. If you want to run this on a Raspberry Pi 1, use the [server only](#server-only) feature and setup a fullscreen browser yourself. (Yes, people have managed to run MM² also on a Pi0, so if you insist, search in the forums.) -Note that you will need to install the lastest full version of Raspbian, **don't use the Lite version**. +Note that you will need to install the latest full version of Raspbian, **don't use the Lite version**. Execute the following command on your Raspberry Pi to install MagicMirror²: From ae6ab1d20377fd14f867d59c7cb0ecaf3af596c6 Mon Sep 17 00:00:00 2001 From: Stjepan Date: Thu, 6 Dec 2018 10:00:34 +0100 Subject: [PATCH 52/79] Create hr.json Croatian translation. --- translations/hr.json | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 translations/hr.json diff --git a/translations/hr.json b/translations/hr.json new file mode 100644 index 0000000000..d714cc7bf9 --- /dev/null +++ b/translations/hr.json @@ -0,0 +1,35 @@ +{ + "LOADING": "Učitavanje …", + + "TODAY": "Danas", + "TOMORROW": "Sutra", + "DAYAFTERTOMORROW": "Prekosutra", + "RUNNING": "Završava za", + "EMPTY": "Nema nadolazećih događaja.", + + "WEEK": "Tjedan {weekNumber}", + + "N": "N", + "NNE": "NNE", + "NE": "NE", + "ENE": "ENE", + "E": "E", + "ESE": "ESE", + "SE": "SE", + "SSE": "SSE", + "S": "S", + "SSW": "SSW", + "SW": "SW", + "WSW": "WSW", + "W": "W", + "WNW": "WNW", + "NW": "NW", + "NNW": "NNW", + + "UPDATE_NOTIFICATION": "Dostupna je aktualizacija MagicMirror².", + "UPDATE_NOTIFICATION_MODULE": "Dostupna je aktualizacija modula {MODULE_NAME}.", + "UPDATE_INFO_SINGLE": "Instalirana verzija {COMMIT_COUNT} commit kasni za branch-om {BRANCH_NAME}.", + "UPDATE_INFO_MULTIPLE": "Instalirana verzija {COMMIT_COUNT} commit-ova kasni za branch-om {BRANCH_NAME}.", + + "FEELS": "Osjeća" +} From c17f941fb954d3fc3ec05ce570f03f83fd9f8b5d Mon Sep 17 00:00:00 2001 From: Stjepan Date: Thu, 6 Dec 2018 11:38:34 +0100 Subject: [PATCH 53/79] Update CHANGELOG.md Added Croatian translation to the changelog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaf036aa6b..413773d606 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Screenshot for the current weather - Screenshot for the weather forecast module - Portuguese translation for "Feels" +- Croatian translation - Fading for dateheaders timeFormat in Calendar [#1464](https://github.com/MichMich/MagicMirror/issues/1464) ### Fixed From 25610222bcc875914792a6e331e60da841ddebd7 Mon Sep 17 00:00:00 2001 From: Stjepan Date: Thu, 6 Dec 2018 11:41:01 +0100 Subject: [PATCH 54/79] Update translations.js Added Croatian. --- translations/translations.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/translations/translations.js b/translations/translations.js index 2136056e22..6625acdec5 100644 --- a/translations/translations.js +++ b/translations/translations.js @@ -37,7 +37,8 @@ var translations = { "ro" : "translations/ro.json", // Romanian "cy" : "translations/cy.json", // Welsh (Cymraeg) "bg" : "translations/bg.json", // Bulgarian - "cs" : "translations/cs.json" // Czech + "cs" : "translations/cs.json", // Czech + "hr" : "translations/hr.json" // Croatian }; if (typeof module !== "undefined") {module.exports = translations;} From 5b6306671cea8d92d971d5343341dc139188bda3 Mon Sep 17 00:00:00 2001 From: mschmidt Date: Mon, 10 Dec 2018 14:02:50 -0600 Subject: [PATCH 55/79] Initial --- CHANGELOG.md | 3 ++- modules/default/newsfeed/newsfeed.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaf036aa6b..7a3c1b3515 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Allow to parse recurring calendar events where the start date is before 1900 - Fixed Polish translation for Single Update Info - Ignore entries with unparseable details in the calendar module -- Bug showing FullDayEvents one day too long in calendar fixed +- Bug showing FullDayEvents one day too long in calendar fixed +- Bug in newsfeed when `removeStartTags` is used on the description ### Updated - The default calendar setting `showEnd` is changed to `false`. diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 26c3cfdc46..212a6a0fd5 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -138,7 +138,7 @@ Module.register("newsfeed",{ if (this.isShowingDescription) { for (f=0; f Date: Mon, 10 Dec 2018 14:06:55 -0600 Subject: [PATCH 56/79] Add issue number to changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a3c1b3515..041bc20c1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Fixed Polish translation for Single Update Info - Ignore entries with unparseable details in the calendar module - Bug showing FullDayEvents one day too long in calendar fixed -- Bug in newsfeed when `removeStartTags` is used on the description +- Bug in newsfeed when `removeStartTags` is used on the description [#1478](https://github.com/MichMich/MagicMirror/issues/1478) ### Updated - The default calendar setting `showEnd` is changed to `false`. From f0c516e82d86dc4851bd728e7cd598391fe97193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gy=C3=B6rgy=20Bal=C3=A1ssy?= Date: Fri, 14 Dec 2018 11:32:58 +0100 Subject: [PATCH 57/79] CHANGED: The Weather Forecast module by default displays the ° symbol after every numeric value to be consistent with the Current Weather module. --- CHANGELOG.md | 5 +++++ modules/default/weatherforecast/README.md | 5 +++-- modules/default/weatherforecast/weatherforecast.js | 6 +++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaf036aa6b..e8b7d30f3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Screenshot for the weather forecast module - Portuguese translation for "Feels" - Fading for dateheaders timeFormat in Calendar [#1464](https://github.com/MichMich/MagicMirror/issues/1464) +- Documentation for the existing `scale` option in the Weather Forecast module. ### Fixed - Allow to parse recurring calendar events where the start date is before 1900 @@ -30,6 +31,10 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Updated - The default calendar setting `showEnd` is changed to `false`. +### Changed +- The Weather Forecast module by default displays the ° symbol after every numeric value to be consistent with the Current Weather module. + + ## [2.5.0] - 2018-10-01 ### Added diff --git a/modules/default/weatherforecast/README.md b/modules/default/weatherforecast/README.md index 2a41b00388..4be3d9bf35 100644 --- a/modules/default/weatherforecast/README.md +++ b/modules/default/weatherforecast/README.md @@ -51,10 +51,11 @@ The following properties can be configured: | `apiBase` | The OpenWeatherMap base URL.

**Default value:** `'http://api.openweathermap.org/data/'` | `forecastEndpoint` | The OpenWeatherMap API endPoint.

**Default value:** `'forecast/daily'` | `appendLocationNameToHeader` | If set to `true`, the returned location name will be appended to the header of the module, if the header is enabled. This is mainly intresting when using calender based weather.

**Default value:** `true` -| `calendarClass` | The class for the calender module to base the event based weather information on.

**Default value:** `'calendar'` +| `calendarClass` | The class for the calendar module to base the event based weather information on.

**Default value:** `'calendar'` | `tableClass` | Name of the classes issued from `main.css`.

**Possible values:** xsmall, small, medium, large, xlarge.
**Default value:** _small._ | `iconTable` | The conversion table to convert the weather conditions to weather-icons.

**Default value:** view table below - `colored` | If set 'colored' to true the min-temp get a blue tone and the max-temp get a red tone.

**Default value:** `'false'` +| `colored` | If set `colored` to `true` the min-temp gets a blue tone and the max-temp gets a red tone.

**Default value:** `'false'` +| `scale ` | If set to `true` the module will display `C` for Celsius degrees and `F` for Fahrenheit degrees after the number, based on the value of the `units` option, otherwise only the ° character is displayed.

**Default value:** `false` #### Default Icon Table ````javascript diff --git a/modules/default/weatherforecast/weatherforecast.js b/modules/default/weatherforecast/weatherforecast.js index 19e004ffb7..a29abc1631 100644 --- a/modules/default/weatherforecast/weatherforecast.js +++ b/modules/default/weatherforecast/weatherforecast.js @@ -142,14 +142,14 @@ Module.register("weatherforecast",{ icon.className = "wi weathericon " + forecast.icon; iconCell.appendChild(icon); - var degreeLabel = ""; + var degreeLabel = "°"; if(this.config.scale) { switch(this.config.units) { case "metric": - degreeLabel = " °C"; + degreeLabel += " C"; break; case "imperial": - degreeLabel = " °F"; + degreeLabel += " F"; break; case "default": degreeLabel = "K"; From 24e15c0568b4785d0084ce43b6ae2835deb796fa Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Wed, 19 Dec 2018 16:04:52 +0100 Subject: [PATCH 58/79] Add ajv dependency to fix linting error. --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c63dc9fc09..71f5080199 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "time-grunt": "latest" }, "dependencies": { + "ajv": "6.5.5", "body-parser": "^1.18.2", "colors": "^1.1.2", "electron": "^2.0.4", From d0195e050966ee1cf0e447954a8db739c72946a3 Mon Sep 17 00:00:00 2001 From: David Galloway Date: Thu, 20 Dec 2018 11:40:50 -0500 Subject: [PATCH 59/79] Document endTime variables Missed docs in https://github.com/MichMich/MagicMirror/commit/188aa14d82c163344dde23a35cd6f30eae8e95eb Signed-off-by: David Galloway --- modules/default/calendar/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/default/calendar/README.md b/modules/default/calendar/README.md index 8ce9608b74..2d85e8fbd9 100644 --- a/modules/default/calendar/README.md +++ b/modules/default/calendar/README.md @@ -40,6 +40,8 @@ The following properties can be configured: | `titleReplace` | An object of textual replacements applied to the tile of the event. This allow to remove or replace certains words in the title.

**Example:** `{'Birthday of ' : '', 'foo':'bar'}`
**Default value:** `{ "De verjaardag van ": "", "'s birthday": "" }` | `displayRepeatingCountTitle` | Show count title for yearly repeating events (e.g. "X. Birthday", "X. Anniversary")

**Possible values:** `true` or `false`
**Default value:** `false` | `dateFormat` | Format to use for the date of events (when using absolute dates)

**Possible values:** See [Moment.js formats](http://momentjs.com/docs/#/parsing/string-format/)
**Default value:** `MMM Do` (e.g. Jan 18th) +| `dateEndFormat` | Format to use for the end time of events

**Possible values:** See [Moment.js formats](http://momentjs.com/docs/#/parsing/string-format/)
**Default value:** `HH:mm` (e.g. 16:30) +| `showEnd` | Show end time of events

**Possible values:** `true` or `false`
**Default value:** `true` | `fullDayEventDateFormat` | Format to use for the date of full day events (when using absolute dates)

**Possible values:** See [Moment.js formats](http://momentjs.com/docs/#/parsing/string-format/)
**Default value:** `MMM Do` (e.g. Jan 18th) | `timeFormat` | Display event times as absolute dates, or relative time

**Possible values:** `absolute` or `relative`
**Default value:** `relative` | `getRelative` | How much time (in hours) should be left until calendar events start getting relative?

**Possible values:** `0` (events stay absolute) - `48` (48 hours before the event starts)
**Default value:** `6` From 63836185d96a595969557e2f79b4da5d78aab5c6 Mon Sep 17 00:00:00 2001 From: fewieden Date: Thu, 27 Dec 2018 17:13:06 +0100 Subject: [PATCH 60/79] weatherprovider --- modules/default/weather/weatherprovider.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/default/weather/weatherprovider.js b/modules/default/weather/weatherprovider.js index bb5598f43c..0be4566348 100644 --- a/modules/default/weather/weatherprovider.js +++ b/modules/default/weather/weatherprovider.js @@ -21,6 +21,7 @@ var WeatherProvider = Class.extend({ // Try to not access them directly. currentWeatherObject: null, weatherForecastArray: null, + fetchedLocationName: null, // The following properties will be set automaticly. // You do not need to overwrite these properties. @@ -71,6 +72,11 @@ var WeatherProvider = Class.extend({ return this.weatherForecastArray }, + // This returns the name of the fetched location or an empty string + fetchedLocation: function() { + return this.fetchedLocationName || '' + }, + // Set the currentWeather and notify the delegate that new information is available. setCurrentWeather: function(currentWeatherObject) { // We should check here if we are passing a WeatherDay @@ -87,6 +93,11 @@ var WeatherProvider = Class.extend({ this.updateAvailable() }, + // Set the fetched location name + setFetchedLocation: function(name) { + this.fetchedLocationName = name + }, + // Notify the delegate that new weather is available. updateAvailable: function() { this.delegate.updateAvailable(this) From ebee80d10ea57d7b3000eb5ea52dd8c88c0f16f5 Mon Sep 17 00:00:00 2001 From: fewieden Date: Thu, 27 Dec 2018 17:13:49 +0100 Subject: [PATCH 61/79] small improvements --- modules/default/weather/weather.js | 37 ++++++++++++++++++------ modules/default/weather/weatherobject.js | 2 +- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 598263a19b..b3832dd034 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -39,13 +39,15 @@ Module.register("weather",{ apiVersion: "2.5", apiBase: "http://api.openweathermap.org/data/", - weatherEndpoint: "weather", + weatherEndpoint: "/weather", appendLocationNameToHeader: true, calendarClass: "calendar", + tableClass: 'small', onlyTemp: false, - roundTemp: false + roundTemp: false, + showRainAmount: true }, // Module properties. @@ -70,8 +72,18 @@ Module.register("weather",{ return scripts }, + // Override getHeader method. + getHeader: function() { + if (this.config.appendLocationNameToHeader && this.weatherProvider) { + return this.data.header + " " + this.weatherProvider.fetchedLocation(); + } + + return this.data.header; + }, + // Start the weather module. start: function () { + moment.locale(this.config.lang); // Initialize the weather provider. this.weatherProvider = WeatherProvider.initialize(this.config.weatherProvider, this); @@ -87,11 +99,6 @@ Module.register("weather",{ // Override notification handler. notificationReceived: function(notification, payload, sender) { - if (notification === "DOM_OBJECTS_CREATED") { - if (this.config.appendLocationNameToHeader) { - this.hide(0, {lockString: this.identifier}); - } - } if (notification === "CALENDAR_EVENTS") { var senderClasses = sender.data.classes.toLowerCase().split(" "); if (senderClasses.indexOf(this.config.calendarClass.toLowerCase()) !== -1) { @@ -139,7 +146,7 @@ Module.register("weather",{ updateAvailable: function() { Log.log("New weather information available."); this.updateDom(300); - this.scheduleUpdate(5000); + this.scheduleUpdate(60000); }, scheduleUpdate: function(delay = null) { @@ -160,7 +167,7 @@ Module.register("weather",{ roundValue: function(temperature) { var decimals = this.config.roundTemp ? 0 : 1; return parseFloat(temperature).toFixed(decimals); - } + }, addFilters() { this.nunjucksEnvironment().addFilter("formatTime", function(date) { @@ -201,5 +208,17 @@ Module.register("weather",{ this.nunjucksEnvironment().addFilter("roundValue", function(value) { return this.roundValue(value); }.bind(this)); + + this.nunjucksEnvironment().addFilter("formatRain", function(value) { + if (isNaN(value)) { + return ""; + } + + if(this.config.units === "imperial") { + return (parseFloat(value) / 25.4).toFixed(2) + " in"; + } else { + return parseFloat(value).toFixed(1) + " mm"; + } + }.bind(this)); } }); diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index 59d2298a4e..ff0de84194 100644 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -27,7 +27,7 @@ class WeatherObject { } cardinalWindDirection () { - if (this.windDirection>11.25 && this.windDirection<=33.75){ + if (this.windDirection > 11.25 && this.windDirection <= 33.75){ return "NNE"; } else if (this.windDirection > 33.75 && this.windDirection <= 56.25) { return "NE"; From 95adc0aec1b74167d79478be8627da7b75111e66 Mon Sep 17 00:00:00 2001 From: fewieden Date: Thu, 27 Dec 2018 17:14:03 +0100 Subject: [PATCH 62/79] forecast --- modules/default/weather/forecast.njk | 33 +++---- .../weather/providers/openweathermap.js | 87 +++++++++++-------- 2 files changed, 70 insertions(+), 50 deletions(-) diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index 66e7e427a0..edc11115db 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -1,20 +1,23 @@ {% if forecast %} -
+ {% if config.showFeelsLike and not config.onlyTemp %} +
+ + {{ "FEELS" | translate }} {{ current.feelsLike() | roundValue | unit("temperature") }} + +
+ {% endif %} {% else %}
{{"LOADING" | translate}} diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index 8fd1e3befd..caa88b21e5 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -17,7 +17,7 @@ WeatherProvider.register("openweathermap", { providerName: "OpenWeatherMap", // Overwrite the fetchCurrentWeather method. - fetchCurrentWeather: function() { + fetchCurrentWeather() { this.fetchData(this.getUrl()) .then(data => { if (!data || !data.main || typeof data.main.temp === "undefined") { @@ -28,7 +28,7 @@ WeatherProvider.register("openweathermap", { this.setFetchedLocation(`${data.name}, ${data.sys.country}`); - var currentWeather = this.generateWeatherObjectFromCurrentWeather(data); + const currentWeather = this.generateWeatherObjectFromCurrentWeather(data); this.setCurrentWeather(currentWeather); }) .catch(function(request) { @@ -37,7 +37,7 @@ WeatherProvider.register("openweathermap", { }, // Overwrite the fetchCurrentWeather method. - fetchWeatherForecast: function() { + fetchWeatherForecast() { this.fetchData(this.getUrl()) .then(data => { if (!data || !data.list || !data.list.length) { @@ -48,7 +48,7 @@ WeatherProvider.register("openweathermap", { this.setFetchedLocation(`${data.city.name}, ${data.city.country}`); - var forecast = this.generateWeatherObjectsFromForecast(data.list); + const forecast = this.generateWeatherObjectsFromForecast(data.list); this.setWeatherForecast(forecast); }) .catch(function(request) { @@ -62,15 +62,15 @@ WeatherProvider.register("openweathermap", { /* * Gets the complete url for the request */ - getUrl: function() { + getUrl() { return this.config.apiBase + this.config.apiVersion + this.config.weatherEndpoint + this.getParams(); }, /* * Generate a WeatherObject based on currentWeatherInformation */ - generateWeatherObjectFromCurrentWeather: function(currentWeatherData) { - var currentWeather = new WeatherObject(); + generateWeatherObjectFromCurrentWeather(currentWeatherData) { + const currentWeather = new WeatherObject(this.config.units); currentWeather.humidity = currentWeatherData.main.humidity; currentWeather.temperature = currentWeatherData.main.temp; @@ -86,11 +86,11 @@ WeatherProvider.register("openweathermap", { /* * Generate WeatherObjects based on forecast information */ - generateWeatherObjectsFromForecast: function(forecasts) { - var days = []; + generateWeatherObjectsFromForecast(forecasts) { + const days = []; - for (var forecast of forecasts) { - var weather = new WeatherObject(); + for (const forecast of forecasts) { + const weather = new WeatherObject(this.config.units); weather.date = moment(forecast.dt, "X"); weather.minTemperature = forecast.temp.min; @@ -107,8 +107,8 @@ WeatherProvider.register("openweathermap", { /* * Convert the OpenWeatherMap icons to a more usable name. */ - convertWeatherType: function(weatherType) { - var weatherTypes = { + convertWeatherType(weatherType) { + const weatherTypes = { "01d": "day-sunny", "02d": "day-cloudy", "03d": "cloudy", @@ -137,8 +137,8 @@ WeatherProvider.register("openweathermap", { * * return String - URL params. */ - getParams: function() { - var params = "?"; + getParams() { + let params = "?"; if(this.config.locationID) { params += "id=" + this.config.locationID; } else if(this.config.location) { diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 03e15bda93..d2a64749b8 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -46,7 +46,8 @@ Module.register("weather",{ onlyTemp: false, showRainAmount: true, - colored: false + colored: false, + showFeelsLike: true }, // Module properties. diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index a30a415caf..599708c324 100644 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -77,4 +77,23 @@ class WeatherObject { nextSunAction() { return moment().isBetween(this.sunrise, this.sunset) ? "sunset" : "sunrise"; } + + feelsLike() { + const windInMph = this.units === "imperial" ? this.windSpeed : this.windSpeed * 2.23694; + const tempInF = this.units === "imperial" ? this.temperature : this.temperature * 9 / 5 + 32; + let feelsLike = tempInF; + + if (windInMph > 3 && tempInF < 50) { + feelsLike = Math.round(35.74 + 0.6215 * tempInF - 35.75 * Math.pow(windInMph, 0.16) + 0.4275 * tempInF * Math.pow(windInMph, 0.16)); + } else if (tempInF > 80 && this.humidity > 40) { + feelsLike = -42.379 + 2.04901523 * tempInF + 10.14333127 * this.humidity + - 0.22475541 * tempInF * this.humidity - 6.83783 * Math.pow(10, -3) * tempInF * tempInF + - 5.481717 * Math.pow(10, -2) * this.humidity * this.humidity + + 1.22874 * Math.pow(10, -3) * tempInF * tempInF * this.humidity + + 8.5282 * Math.pow(10, -4) * tempInF * this.humidity * this.humidity + - 1.99 * Math.pow(10, -6) * tempInF * tempInF * this.humidity * this.humidity; + } + + return this.units === "imperial" ? feelsLike : (feelsLike - 32) * 5 / 9; + } } From 38fb53b0585230a8bf3ea5e676a08e5b40a500b7 Mon Sep 17 00:00:00 2001 From: Jan-Frode Myklebust Date: Sun, 30 Dec 2018 20:33:16 +0100 Subject: [PATCH 73/79] Update README.md Wrong delimiter used for electronOptions. Use : instead of =. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9459b5db3f..a550ed94e9 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ The following properties can be configured: | `timeFormat` | The form of time notation that will be used. Possible values are `12` or `24`. The default is `24`. | | `units` | The units that will be used in the default weather modules. Possible values are `metric` or `imperial`. The default is `metric`. | | `modules` | An array of active modules. **The array must contain objects. See the next table below for more information.** | -| `electronOptions` | An optional array of Electron (browser) options. This allows configuration of e.g. the browser screen size and position (example: `electronOptions: { fullscreen: false, width: 800, height: 600 }`). Kiosk mode can be enabled by setting `kiosk = true`, `autoHideMenuBar = false` and `fullscreen = false`. More options can be found [here](https://github.com/electron/electron/blob/master/docs/api/browser-window.md). | +| `electronOptions` | An optional array of Electron (browser) options. This allows configuration of e.g. the browser screen size and position (example: `electronOptions: { fullscreen: false, width: 800, height: 600 }`). Kiosk mode can be enabled by setting `kiosk: true`, `autoHideMenuBar: false` and `fullscreen: false`. More options can be found [here](https://github.com/electron/electron/blob/master/docs/api/browser-window.md). | | `customCss` | The path of the `custom.css` stylesheet. The default is `css/custom.css`. | Module configuration: From de04c12d3c89a89738a03aaaf2409b01e21ee2f4 Mon Sep 17 00:00:00 2001 From: fewieden Date: Sun, 30 Dec 2018 20:46:25 +0100 Subject: [PATCH 74/79] fix rain amount information for different units and providers, documentation --- modules/default/weather/forecast.njk | 2 +- modules/default/weather/providers/README.md | 129 ++++++++++++++++++ modules/default/weather/providers/darksky.js | 6 +- .../weather/providers/openweathermap.js | 6 +- modules/default/weather/weather.js | 18 +-- modules/default/weather/weatherobject.js | 1 + modules/default/weather/weatherprovider.js | 6 +- 7 files changed, 150 insertions(+), 18 deletions(-) create mode 100644 modules/default/weather/providers/README.md diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index edc11115db..1f24786702 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -12,7 +12,7 @@ {% if config.showRainAmount %} - {{f.rain | formatRain}} + {{f.rain | unit("rain")}} {% endif %} diff --git a/modules/default/weather/providers/README.md b/modules/default/weather/providers/README.md new file mode 100644 index 0000000000..f204a88adb --- /dev/null +++ b/modules/default/weather/providers/README.md @@ -0,0 +1,129 @@ +# MagicMirror² Weather Module Weather Provider Development Documentation + +This document describes the way to develop your own MagicMirror² weather module weather provider. + +Table of Contents: + +- The weather provider file: yourprovider.js + - [Weather provider methods to implement](#weather-provider-methods-to-implement) + - [Weather Provider instance methods](#weather-provider-instance-methods) + - [WeatherObject](#weatherobject) + +--- + +## The weather provider file: yourprovider.js + +This is the script in which the weather provider will be defined. In it's most simple form, the weather provider must implement the following: + +````javascript +WeatherProvider.register("yourprovider", { + providerName: "YourProvider", + + fetchCurrentWeather() {}, + + fetchWeatherForecast() {} +}); +```` + +### Weather provider methods to implement + +#### `fetchCurrentWeather()` + +This method is called when the weather module tries to fetch the current weather of your provider. The implementation of this method is required. +The implementation can make use of the already implemented function `this.fetchData(url, method, data);`, which is returning a promise. +After the response is processed, the current weather information (as a [WeatherObject](#weatherobject)) needs to be set with `this.setCurrentWeather(currentWeather);`. +It will then automatically refresh the module DOM with the new data. + +#### `fetchWeatherForecast()` + +This method is called when the weather module tries to fetch the weather weather of your provider. The implementation of this method is required. +The implementation can make use of the already implemented function `this.fetchData(url, method, data);`, which is returning a promise. +After the response is processed, the weather forecast information (as an array of [WeatherObject](#weatherobject)s) needs to be set with `this.setCurrentWeather(forecast);`. +It will then automatically refresh the module DOM with the new data. + +### Weather Provider instance methods + +#### `init()` + +Called when a weather provider is initialized. + +#### `setConfig(config)` + +Called to set the config, this config is the same as the weather module's config. + +#### `start()` + +Called when the weather provider is about to start. + +#### `currentWeather()` + +This returns a WeatherDay object for the current weather. + +#### `weatherForecast()` + +This returns an array of WeatherDay objects for the weather forecast. + +#### `fetchedLocation()` + +This returns the name of the fetched location or an empty string. + +#### `setCurrentWeather(currentWeatherObject)` + +Set the currentWeather and notify the delegate that new information is available. + +#### `setWeatherForecast(weatherForecastArray)` + +Set the weatherForecastArray and notify the delegate that new information is available. + +#### `setFetchedLocation(name)` + +Set the fetched location name. + +#### `updateAvailable()` + +Notify the delegate that new weather is available. + +#### `fetchData(url, method, data)` + +A convinience function to make requests. It returns a promise. + +### WeatherObject + +| Property | Type | Value/Unit | +| --- | --- | --- | +| units | `string` | Gets initialized with the constructor.
Possible values: `metric` and `imperial` | +| date | `object` | [Moment.js](https://momentjs.com/) object of the time/date. | +| windSpeed |`number` | Metric: `meter/second`
Imperial: `miles/hour` | +| windDirection |`number` | Direction of the wind in degrees. | +| sunrise |`object` | [Moment.js](https://momentjs.com/) object of sunrise. | +| sunset |`object` | [Moment.js](https://momentjs.com/) object of sunset. | +| temperature | `number` | Current temperature | +| minTemperature | `number` | Lowest temperature of the day. | +| maxTemperature | `number` | Highest temperature of the day. | +| weatherType | `string` | Icon name of the weather type.
Possible values: [WeatherIcons](https://www.npmjs.com/package/weathericons) | +| humidity | `number` | Percentage of humidity | +| rain | `number` | Metric: `millimeters`
Imperial: `inches` | + +#### Current weather + +For the current weather object the following properties are required: + +- humidity +- sunrise +- sunset +- temperature +- units +- weatherType +- windDirection +- windSpeed + +#### Weather forecast + +For the forecast weather object the following properties are required: + +- date +- maxTemperature +- minTemperature +- rain +- units +- weatherType diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js index e4cb78b3f8..4b1bc4ee1f 100644 --- a/modules/default/weather/providers/darksky.js +++ b/modules/default/weather/providers/darksky.js @@ -81,7 +81,11 @@ WeatherProvider.register("darksky", { weather.minTemperature = forecast.temperatureMin; weather.maxTemperature = forecast.temperatureMax; weather.weatherType = this.convertWeatherType(forecast.icon); - weather.rain = forecast.precipAccumulation; + if (this.config.units === "metric" && !isNaN(forecast.precipAccumulation)) { + weather.rain = forecast.precipAccumulation * 10; + } else { + weather.rain = forecast.precipAccumulation; + } days.push(weather); } diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index caa88b21e5..89ccfcf5d0 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -96,7 +96,11 @@ WeatherProvider.register("openweathermap", { weather.minTemperature = forecast.temp.min; weather.maxTemperature = forecast.temp.max; weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); - weather.rain = forecast.rain; + if (this.config.units === "imperial" && !isNaN(forecast.rain)) { + weather.rain = forecast.rain / 25.4 + } else { + weather.rain = forecast.rain; + } days.push(weather); } diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index d2a64749b8..eff3f90e98 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -194,6 +194,12 @@ Module.register("weather",{ value += "K"; } } + } else if (type === "rain") { + if (isNaN(value)) { + value = ""; + } else { + value = `${value.toFixed(2)} ${this.config.units === "imperial" ? "in" : "mm"}`; + } } return value; @@ -202,17 +208,5 @@ Module.register("weather",{ this.nunjucksEnvironment().addFilter("roundValue", function(value) { return this.roundValue(value); }.bind(this)); - - this.nunjucksEnvironment().addFilter("formatRain", function(value) { - if (isNaN(value)) { - return ""; - } - - if(this.config.units === "imperial") { - return `${(parseFloat(value) / 25.4).toFixed(2)} in`; - } else { - return `${parseFloat(value).toFixed(1)} mm`; - } - }.bind(this)); } }); diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index 599708c324..8768d49d76 100644 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -25,6 +25,7 @@ class WeatherObject { this.maxTemperature = null; this.weatherType = null; this.humidity = null; + this.rain = null; } cardinalWindDirection() { diff --git a/modules/default/weather/weatherprovider.js b/modules/default/weather/weatherprovider.js index bb13999182..3465445311 100644 --- a/modules/default/weather/weatherprovider.js +++ b/modules/default/weather/weatherprovider.js @@ -46,7 +46,7 @@ var WeatherProvider = Class.extend({ }, // Called when the weather provider is about to start. - start: function(config) { + start: function() { Log.info(`Weather provider: ${this.providerName} started.`); }, @@ -72,7 +72,7 @@ var WeatherProvider = Class.extend({ return this.weatherForecastArray; }, - // This returns the name of the fetched location or an empty string + // This returns the name of the fetched location or an empty string. fetchedLocation: function() { return this.fetchedLocationName || ""; }, @@ -93,7 +93,7 @@ var WeatherProvider = Class.extend({ this.updateAvailable(); }, - // Set the fetched location name + // Set the fetched location name. setFetchedLocation: function(name) { this.fetchedLocationName = name; }, From 40a30c24a088154533b05a881984cea54783aeff Mon Sep 17 00:00:00 2001 From: fewieden Date: Sun, 30 Dec 2018 20:52:27 +0100 Subject: [PATCH 75/79] link provider readme in module readme --- modules/default/weather/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md index ee9ec7b8bf..89e65de135 100644 --- a/modules/default/weather/README.md +++ b/modules/default/weather/README.md @@ -92,3 +92,7 @@ The following properties can be configured: | `apiKey` | The [DarkSky](https://darksky.net/dev/register) API key, which can be obtained by creating an DarkSky account.

This value is **REQUIRED** | `lat` | The geo coordinate latitude.

This value is **REQUIRED** | `lon` | The geo coordinate longitude.

This value is **REQUIRED** + +## API Provider Development + +If you want to add another API provider checkout the [Guide](providers). From b33663c9f8e8f8c3c56473f4e8eb96ea58aba0db Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Tue, 1 Jan 2019 15:52:29 +0100 Subject: [PATCH 76/79] Prepare for release 2.6.0. --- CHANGELOG.md | 8 +- package-lock.json | 49 ++- package.json | 2 +- vendor/package-lock.json | 664 +++++++++++++++++++++++++++++++++------ 4 files changed, 608 insertions(+), 115 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5068f1ae82..1f7b612cc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,10 @@ This project adheres to [Semantic Versioning](http://semver.org/). --- -## [2.6.0] - Unreleased +## [2.6.0] - 2019-01-01 -*This release is scheduled to be released on 2019-01-01.* - -### Experimental -- New default [module weather](modules/default/weather). +### Experimental ✨ +- New default [module weather](modules/default/weather). This module will eventually replace the current `currentweather` and `weatherforecast` modules. The new module is still pretty experimental, but it's included so you can give it a try and help us improve this module. Please give us you feedback using [this forum post](https://forum.magicmirror.builders/topic/9335/default-weather-module-refactoring). ### Added - Possibility to add classes to the cell of symbol, title and time of the events of calendar. diff --git a/package-lock.json b/package-lock.json index e282ebba0e..5749395282 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.6.0-dev", + "version": "2.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -108,13 +108,26 @@ } }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + } } }, "ajv-keywords": { @@ -5880,9 +5893,9 @@ } }, "rrule-alt": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rrule-alt/-/rrule-alt-2.2.7.tgz", - "integrity": "sha512-z/rwEu9kc+uAw/0BD+0D+qi4PAcOpeACGV7MKmeM9cYs+sSUzhp8lETn7tCHJJB1mOiXJVLXqh8GlaQi+Lyp4g==" + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rrule-alt/-/rrule-alt-2.2.8.tgz", + "integrity": "sha1-oxC23Gy8yKEA5Vgj+T9ia9QbFoA=" }, "run-async": { "version": "2.3.0", @@ -6734,6 +6747,16 @@ "string-width": "^2.0.0" }, "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -7125,7 +7148,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" }, @@ -7133,8 +7155,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" } } }, diff --git a/package.json b/package.json index 71f5080199..cc64ec3f32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.6.0-dev", + "version": "2.6.0", "description": "The open source modular smart mirror platform.", "main": "js/electron.js", "scripts": { diff --git a/vendor/package-lock.json b/vendor/package-lock.json index f0095bedea..9ad15ee58a 100644 --- a/vendor/package-lock.json +++ b/vendor/package-lock.json @@ -3,6 +3,11 @@ "requires": true, "lockfileVersion": 1, "dependencies": { + "@fortawesome/fontawesome-free": { + "version": "5.6.3", + "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.6.3.tgz", + "integrity": "sha512-s5PLdI9NYgjBvfrv6rhirPHlAHWx+Sfo/IjsAeiXYfmemC/GSjwsyz1wLnGPazbLPXWfk62ks980o9AmsxYUEQ==" + }, "a-sync-waterfall": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.0.tgz", @@ -19,8 +24,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "optional": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "arr-diff": { @@ -29,7 +34,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "optional": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -73,7 +78,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "optional": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -83,9 +88,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "optional": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "camelcase": { @@ -99,14 +104,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "optional": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "cliui": { @@ -114,9 +120,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "code-point-at": { @@ -147,7 +153,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "optional": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -156,7 +162,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "optional": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "extglob": { @@ -165,7 +171,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "optional": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "filename-regex": { @@ -180,11 +186,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "optional": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "font-awesome": { @@ -204,7 +210,469 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "optional": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" + } + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } } }, "glob-base": { @@ -213,8 +681,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "optional": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -222,7 +690,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "graceful-fs": { @@ -247,7 +715,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "optional": true, "requires": { - "binary-extensions": "1.10.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -267,7 +735,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "optional": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -286,7 +754,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -294,7 +762,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-number": { @@ -303,7 +771,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "optional": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-posix-bracket": { @@ -337,7 +805,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } }, "lcid": { @@ -345,7 +813,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "micromatch": { @@ -354,19 +822,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "optional": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "minimatch": { @@ -375,7 +843,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "optional": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "moment": { @@ -388,15 +856,21 @@ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.13.tgz", "integrity": "sha1-mc5cfYJyYusPH3AgRBd/YHRde5A=", "requires": { - "moment": "2.18.1" + "moment": ">= 2.9.0" } }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "optional": true + }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "number-is-nan": { @@ -409,10 +883,10 @@ "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.0.1.tgz", "integrity": "sha1-TedKPlULr2+jNwMj89HHwqhr3E0=", "requires": { - "a-sync-waterfall": "1.0.0", - "asap": "2.0.6", - "chokidar": "1.7.0", - "yargs": "3.32.0" + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "chokidar": "^1.6.0", + "yargs": "^3.32.0" } }, "object.omit": { @@ -421,8 +895,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "optional": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "os-locale": { @@ -430,7 +904,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "parse-glob": { @@ -439,10 +913,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "optional": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "path-is-absolute": { @@ -469,8 +943,8 @@ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "optional": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -479,7 +953,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "optional": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -488,7 +962,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "optional": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } } } @@ -499,7 +973,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "optional": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } } } @@ -510,13 +984,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -525,10 +999,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "optional": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "regex-cache": { @@ -537,7 +1011,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "optional": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "remove-trailing-separator": { @@ -572,9 +1046,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -583,7 +1057,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -591,7 +1065,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "util-deprecate": { @@ -615,8 +1089,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "y18n": { @@ -629,13 +1103,13 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "requires": { - "camelcase": "2.1.1", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "os-locale": "1.4.0", - "string-width": "1.0.2", - "window-size": "0.1.4", - "y18n": "3.2.1" + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" } } } From 874d79be36a914ecbed397629848996a308523e1 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Tue, 1 Jan 2019 16:33:59 +0100 Subject: [PATCH 77/79] Upgrade Electron to 2.0.16 --- CHANGELOG.md | 4 +++- package-lock.json | 14 +++++++------- package.json | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f7b612cc8..a2c4a59e75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,9 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [2.6.0] - 2019-01-01 -### Experimental ✨ +ℹ️ **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install` + +### ✨ Experimental ✨ - New default [module weather](modules/default/weather). This module will eventually replace the current `currentweather` and `weatherforecast` modules. The new module is still pretty experimental, but it's included so you can give it a try and help us improve this module. Please give us you feedback using [this forum post](https://forum.magicmirror.builders/topic/9335/default-weather-module-refactoring). ### Added diff --git a/package-lock.json b/package-lock.json index 5749395282..1b0264956e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,9 +38,9 @@ } }, "@types/node": { - "version": "8.10.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.21.tgz", - "integrity": "sha512-87XkD9qDXm8fIax+5y7drx84cXsu34ZZqfB7Cial3Q/2lxSoJ/+DRaWckkCbxP41wFSIrrb939VhzaNxj4eY1w==" + "version": "8.10.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.39.tgz", + "integrity": "sha512-rE7fktr02J8ybFf6eysife+WF+L4sAHWzw09DgdCebEu+qDwMvv4zl6Bc+825ttGZP73kCKxa3dhJOoGJ8+5mA==" }, "JSV": { "version": "4.0.2", @@ -1663,9 +1663,9 @@ "dev": true }, "electron": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.4.tgz", - "integrity": "sha512-rtg6aW2IpWfiwMRk9gqr+a/xOrFlch9sgLNg0UJzCmtUUEGTrbaLxqANr3Ahlx+ODmh/V+WfF7IdEpD76bbssA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.16.tgz", + "integrity": "sha512-mlC91VDuBU8x9tdGGISznrBCsnPKO1tBskXtBQhceBt0zWUZtV6eURVF5RaY5QK5Q+eBzVJbFT4+LUVupNwhSg==", "requires": { "@types/node": "^8.0.24", "electron-download": "^3.0.1", @@ -2668,7 +2668,7 @@ }, "fs-extra": { "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { "graceful-fs": "^4.1.2", diff --git a/package.json b/package.json index cc64ec3f32..5418f47d11 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "ajv": "6.5.5", "body-parser": "^1.18.2", "colors": "^1.1.2", - "electron": "^2.0.4", + "electron": "^2.0.16", "express": "^4.16.2", "express-ipfilter": "0.3.1", "feedme": "latest", From 99febb99f1dcaa62a09bcdeedb01af6f31a92b68 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Tue, 1 Jan 2019 16:48:12 +0100 Subject: [PATCH 78/79] Additional update info. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2c4a59e75..cee21d5645 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [2.6.0] - 2019-01-01 -ℹ️ **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install` +ℹ️ **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install`. If you are having issues updating, make sure you are running the latest version of Node. ### ✨ Experimental ✨ - New default [module weather](modules/default/weather). This module will eventually replace the current `currentweather` and `weatherforecast` modules. The new module is still pretty experimental, but it's included so you can give it a try and help us improve this module. Please give us you feedback using [this forum post](https://forum.magicmirror.builders/topic/9335/default-weather-module-refactoring). From e70e011a9caee58baf7aa092a118329ee542672d Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Tue, 1 Jan 2019 16:57:16 +0100 Subject: [PATCH 79/79] Add dependency. --- package-lock.json | 2 +- package.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 1b0264956e..281f5adada 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2668,7 +2668,7 @@ }, "fs-extra": { "version": "0.30.0", - "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { "graceful-fs": "^4.1.2", diff --git a/package.json b/package.json index 5418f47d11..4c8f24dd08 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "express-ipfilter": "0.3.1", "feedme": "latest", "helmet": "^3.9.0", + "home-path": "^1.0.6", "iconv-lite": "latest", "mocha-logger": "^1.0.6", "moment": "latest",
- - {% for f in forecast %} - - - - + {% endfor %} +
{{f.day}} - {{f.maxTemperature | roundValue | unit("temperature")}} + + {% for f in forecast %} + + + + + + {% if config.showRainAmount %} + - - - {% endfor %} -
{{f.date.format('ddd')}} + {{f.maxTemperature | roundValue | unit("temperature")}} + + {{f.minTemperature | roundValue | unit("temperature")}} + + {{f.rain | formatRain}} - {{f.minTemperature | roundValue | unit("temperature")}} -
- + {% endif %} +
{% else %} {{"LOADING" | translate}} {% endif %} diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index c9e56d2c43..ff58547c61 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -12,28 +12,22 @@ WeatherProvider.register("openweathermap", { // Set the name of the provider. - // This isn't strictly nessecery, since it will fallback to the provider identifier + // This isn't strictly necessary, since it will fallback to the provider identifier // But for debugging (and future alerts) it would be nice to have the real name. providerName: "OpenWeatherMap", // Overwrite the fetchCurrentWeather method. fetchCurrentWeather: function() { - var apiVersion = "2.5" - var apiBase = "http://api.openweathermap.org/data/" - var weatherEndpoint = "weather" - - var url = apiBase + apiVersion + "/" + weatherEndpoint + this.getParams() - - this.fetchData(url) + this.fetchData(this.getUrl()) .then(data => { - Log.log(data) - if (!data || !data.main || typeof data.main.temp === "undefined") { // Did not receive usable new data. // Maybe this needs a better check? return; } + this.setFetchedLocation(data.name + ', ' + data.sys.country) + var currentWeather = this.generateWeatherObjectFromCurrentWeather(data) this.setCurrentWeather(currentWeather) }) @@ -44,29 +38,33 @@ WeatherProvider.register("openweathermap", { // Overwrite the fetchCurrentWeather method. fetchWeatherForecast: function() { + this.fetchData(this.getUrl()) + .then(data => { + if (!data || !data.list || !data.list.length) { + // Did not receive usable new data. + // Maybe this needs a better check? + return; + } - // I haven't yet implemented the real api call, so let's just generate some random data. - - var forecast = [] - var today = moment() - - for (var i = 0; i < 5; i++ ) { - var weatherObject = new WeatherObject() - - weatherObject.date = moment(today).add(i, "days") - weatherObject.minTemperature = Math.random() * 10 + 10 - weatherObject.maxTemperature = Math.random() * 15 + 10 - - forecast.push(weatherObject) - } + this.setFetchedLocation(data.city.name + ', ' + data.city.country) - this.setWeatherForecast(forecast) + var forecast = this.generateWeatherObjectsFromForecast(data.list) + this.setWeatherForecast(forecast) + }) + .catch(function(request) { + Log.error("Could not load data ... ", request) + }) }, /** OpenWeatherMap Specific Methods - These are not part of the default provider methods */ - + /* + * Gets the complete url for the request + */ + getUrl: function() { + return this.config.apiBase + this.config.apiVersion + this.config.weatherEndpoint + this.getParams() + }, /* * Generate a WeatherObject based on currentWeatherInformation @@ -74,19 +72,38 @@ WeatherProvider.register("openweathermap", { generateWeatherObjectFromCurrentWeather: function(currentWeatherData) { var currentWeather = new WeatherObject() - currentWeather.date = new Date - - currentWeather.humidity = currentWeatherData.main.humidity ? parseFloat(currentWeatherData.main.humidity) : null - currentWeather.temperature = currentWeatherData.main.temp ? parseFloat(currentWeatherData.main.temp) : null - currentWeather.windSpeed = currentWeatherData.wind.speed ? parseFloat(currentWeatherData.wind.speed) : null - currentWeather.windDirection = currentWeatherData.wind.deg ? currentWeatherData.wind.deg : null - currentWeather.weatherType = currentWeatherData.weather[0].icon ? this.convertWeatherType(currentWeatherData.weather[0].icon) : null - currentWeather.sunrise = currentWeatherData.sys.sunrise ? new Date(currentWeatherData.sys.sunrise * 1000) : null - currentWeather.sunset = currentWeatherData.sys.sunset ? new Date(currentWeatherData.sys.sunset * 1000) : null + currentWeather.humidity = currentWeatherData.main.humidity + currentWeather.temperature = currentWeatherData.main.temp + currentWeather.windSpeed = currentWeatherData.wind.speed + currentWeather.windDirection = currentWeatherData.wind.deg + currentWeather.weatherType = this.convertWeatherType(currentWeatherData.weather[0].icon) + currentWeather.sunrise = moment(currentWeatherData.sys.sunrise, "X") + currentWeather.sunset = moment(currentWeatherData.sys.sunset, "X") return currentWeather }, + /* + * Generate WeatherObjects based on forecast information + */ + generateWeatherObjectsFromForecast: function(forecasts) { + var days = [] + + for (var forecast of forecasts) { + var weather = new WeatherObject() + + weather.date = moment(forecast.dt, "X") + weather.minTemperature = forecast.temp.min + weather.maxTemperature = forecast.temp.max + weather.weatherType = this.convertWeatherType(forecast.weather[0].icon) + weather.rain = forecast.rain + + days.push(weather) + } + + return days + }, + /* * Convert the OpenWeatherMap icons to a more usable name. */ From 0ed2ba0183b64d93c99ede6c4f4f22f3bfb8e901 Mon Sep 17 00:00:00 2001 From: fewieden Date: Thu, 27 Dec 2018 17:56:34 +0100 Subject: [PATCH 63/79] darksky forecast and darksky current weather fixes --- modules/default/weather/providers/darksky.js | 87 +++++++++++++------- 1 file changed, 57 insertions(+), 30 deletions(-) diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js index 3164d7c8f0..4ce0c89541 100644 --- a/modules/default/weather/providers/darksky.js +++ b/modules/default/weather/providers/darksky.js @@ -13,49 +13,76 @@ WeatherProvider.register("darksky", { // Set the name of the provider. // Not strictly required, but helps for debugging. providerName: "Dark Sky", - // Implement fetchCurrentWeather. + fetchCurrentWeather: function() { - // Create a URL from the config and base URL. - var url = `https://api.darksky.net/forecast/${this.config.apiKey}/${this.config.latLong}`; - // Run the request. - this.fetchData(url).then(data => { - Log.log(data); - if(!data || !data.main || typeof data.main.temp === "undefined") { - // No usable data? - return; - } - var currentWeather = this.generateWeatherDayFromCurrentWeather(data); - this.setCurrentWeather(currentWeather); - }).catch(function(request) { - Log.error("Could not load data!", request); - }); + this.fetchData(this.getUrl()) + .then(data => { + Log.log(data); + if(!data || !data.currently || typeof data.currently.temperature === "undefined") { + // No usable data? + return; + } + var currentWeather = this.generateWeatherDayFromCurrentWeather(data); + this.setCurrentWeather(currentWeather); + }).catch(function(request) { + Log.error("Could not load data!", request); + }); }, + fetchWeatherForecast: function() { - // Also, fake data. - var forecast = []; - var today = moment(); - for(var i = 0; i < 5; i++) { - var weatherObject = new WeatherObject(); - weatherObject.date = moment(today).add(i, "days"); - weatherObject.minTemperature = Math.random() * 10 + 10; - weatherObject.maxTemperature = Math.random() * 15 + 10; - forecast.push(weatherObject); - } - this.setWeatherForecast(); + this.fetchData(this.getUrl()) + .then(data => { + Log.log(data); + if(!data || !data.daily || !data.daily.data.length) { + // No usable data? + return; + } + var forecast = this.generateWeatherObjectsFromForecast(data.daily.data); + this.setWeatherForecast(forecast); + }).catch(function(request) { + Log.error("Could not load data!", request); + }); + }, + + // Create a URL from the config and base URL. + getUrl: function() { + return `https://cors-anywhere.herokuapp.com/https://api.darksky.net/forecast/${this.config.apiKey}/${this.config.lat},${this.config.lon}`; }, + // Implement WeatherDay generator. generateWeatherDayFromCurrentWeather: function(currentWeatherData) { var currentWeather = new WeatherObject(); - currentWeather.date = new Date(); + + currentWeather.date = moment(); currentWeather.humidity = parseFloat(currentWeatherData.currently.humidity); currentWeather.temperature = parseFloat(currentWeatherData.currently.temperature); currentWeather.windSpeed = parseFloat(currentWeatherData.currently.windSpeed); currentWeather.windDirection = currentWeatherData.currently.windBearing; - currentWeather.weatherType = this.currentWeatherType(currentWeatherData.currently.icon); - currentWeather.sunrise = new Date(currentWeatherData.daily.data[0].sunriseTime); - currentWeather.sunset = new Date(currentWeatherData.daily.data[0].sunsetTime); + currentWeather.weatherType = this.convertWeatherType(currentWeatherData.currently.icon); + currentWeather.sunrise = moment(currentWeatherData.daily.data[0].sunriseTime, "X"); + currentWeather.sunset = moment(currentWeatherData.daily.data[0].sunsetTime, "X"); + return currentWeather; }, + + generateWeatherObjectsFromForecast: function(forecasts) { + var days = []; + + for (var forecast of forecasts) { + var weather = new WeatherObject(); + + weather.date = moment(forecast.time, "X"); + weather.minTemperature = forecast.temperatureMin; + weather.maxTemperature = forecast.temperatureMax; + weather.weatherType = this.convertWeatherType(forecast.icon); + weather.rain = forecast.precipAccumulation; + + days.push(weather) + } + + return days + }, + // Map icons from Dark Sky to our icons. convertWeatherType: function(weatherType) { var weatherTypes = { From 1920f8158e21830b1c597a03da4fd925f8af6bd5 Mon Sep 17 00:00:00 2001 From: fewieden Date: Thu, 27 Dec 2018 18:52:35 +0100 Subject: [PATCH 64/79] config options and documentation --- modules/default/weather/README.md | 95 +++++++++++++++++-- modules/default/weather/current.png | Bin 0 -> 8141 bytes modules/default/weather/forecast.png | Bin 0 -> 16385 bytes modules/default/weather/providers/darksky.js | 2 +- modules/default/weather/weather.js | 9 +- 5 files changed, 91 insertions(+), 15 deletions(-) create mode 100644 modules/default/weather/current.png create mode 100644 modules/default/weather/forecast.png diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md index 325732cc8f..d87668240e 100644 --- a/modules/default/weather/README.md +++ b/modules/default/weather/README.md @@ -2,16 +2,93 @@ This module is aimed to be the replacement for the current `currentweather` and `weatherforcast` modules. The module will be configurable to be used as a current weather view, or to show the forecast. This way the module can be used twice to fullfil both purposes. -The biggest cange is the use of weather providers. This way we are not bound to one API source. And users can choose which API they want to use as their source. Initially the current OpenWeatherMap will be added as the first source, but more will follow soon. +The biggest cange is the use of weather providers. This way we are not bound to one API source. And users can choose which API they want to use as their source. The module is in a very early stage, and needs a lot of work. It's API isn't set in stone, so keep that in mind when you want to contribute. -## TODO +## Example -- [ ] Add Current Weather View -- [ ] Add Weather Forecast View -- [ ] Add Forecast API Call -- [ ] Add all original configuration options -- [ ] Add more providers -- [ ] Finish thi Todo list -- [ ] Write the documentation \ No newline at end of file +![Current Weather Screenshot](current.png) ![Weather Forecast Screenshot](forecast.png) + +## Usage + +To use this module, add it to the modules array in the `config/config.js` file: + +````javascript +modules: [ + { + module: "weather", + position: "top_right", + config: { + // See 'Configuration options' for more information. + type: 'current' + } + } +] +```` + +## Configuration options + +The following properties can be configured: + +### General options + +| Option | Description +| ---------------------------- | ----------- +| `weatherProvider` | Which weather provider should be used.

**Possible values:** `openweathermap` and `darksky`
**Default value:** `openweathermap` +| `type` | Which type of weather data should be displayed.

**Possible values:** `current` and `forecast`
**Default value:** `current` +| `units` | What units to use. Specified by config.js

**Possible values:** `config.units` = Specified by config.js, `default` = Kelvin, `metric` = Celsius, `imperial` =Fahrenheit
**Default value:** `config.units` +| `roundTemp` | Round temperature value to nearest integer.

**Possible values:** `true` (round to integer) or `false` (display exact value with decimal point)
**Default value:** `false` +| `degreeLabel` | Show the degree label for your chosen units (Metric = C, Imperial = F, Kelvins = K).

**Possible values:** `true` or `false`
**Default value:** `false` +| `updateInterval` | How often does the content needs to be fetched? (Milliseconds)

**Possible values:** `1000` - `86400000`
**Default value:** `600000` (10 minutes) +| `animationSpeed` | Speed of the update animation. (Milliseconds)

**Possible values:**`0` - `5000`
**Default value:** `1000` (1 second) +| `timeFormat` | Use 12 or 24 hour format.

**Possible values:** `12` or `24`
**Default value:** uses value of _config.timeFormat_ +| `showPeriod` | Show the period (am/pm) with 12 hour format

**Possible values:** `true` or `false`
**Default value:** `true` +| `showPeriodUpper` | Show the period (AM/PM) with 12 hour format as uppercase

**Possible values:** `true` or `false`
**Default value:** `false` +| `lang` | The language of the days.

**Possible values:** `en`, `nl`, `ru`, etc ...
**Default value:** uses value of _config.language_ +| `decimalSymbol` | The decimal symbol to use.

**Possible values:** `.`, `,` or any other symbol.
**Default value:** `.` +| `initialLoadDelay` | The initial delay before loading. If you have multiple modules that use the same API key, you might want to delay one of the requests. (Milliseconds)

**Possible values:** `1000` - `5000`
**Default value:** `0` +| `retryDelay` | The delay before retrying after a request failure. (Milliseconds)

**Possible values:** `1000` - `60000`
**Default value:** `2500` +| `appendLocationNameToHeader` | If set to `true`, the returned location name will be appended to the header of the module, if the header is enabled. This is mainly intresting when using calender based weather.

**Default value:** `true` +| `calendarClass` | The class for the calender module to base the event based weather information on.

**Default value:** `'calendar'` + +#### Current weather options + +| Option | Description +| ---------------------------- | ----------- +| `onlyTemp` | Show only current Temperature and weather icon without windspeed, sunset, sunrise time and feels like.

**Possible values:** `true` or `false`
**Default value:** `false` +| `useBeaufort` | Pick between using the Beaufort scale for wind speed or using the default units.

**Possible values:** `true` or `false`
**Default value:** `true` +| `showWindDirection` | Show the wind direction next to the wind speed.

**Possible values:** `true` or `false`
**Default value:** `true` +| `showWindDirectionAsArrow` | Show the wind direction as an arrow instead of abbreviation

**Possible values:** `true` or `false`
**Default value:** `false` +| `showHumidity` | Show the current humidity

**Possible values:** `true` or `false`
**Default value:** `false` +| `showIndoorTemperature` | If you have another module that emits the `INDOOR_TEMPERATURE` notification, the indoor temperature will be displayed
**Default value:** `false` +| `showIndoorHumidity` | If you have another module that emits the `INDOOR_HUMIDITY` notification, the indoor humidity will be displayed
**Default value:** `false` + +#### Weather forecast options + +| Option | Description +| ---------------------------- | ----------- +| `tableClass` | The class for the forecast table.

**Default value:** `'small'` +| `colored` | If set to `true`, the min and max temperature are color coded.

**Default value:** `false` +| `showRainAmount` | Show the amount of rain in the forecast

**Possible values:** `true` or `false`
**Default value:** `true` + +### Openweathermap options + +| Option | Description +| ---------------------------- | ----------- +| `apiVersion` | The OpenWeatherMap API version to use.

**Default value:** `2.5` +| `apiBase` | The OpenWeatherMap base URL.

**Default value:** `'http://api.openweathermap.org/data/'` +| `weatherEndpoint` | The OpenWeatherMap API endPoint.

**Possible values:** `/weather` or `/forecast/daily`
**Default value:** `'/weather'` +| `locationID` | Location ID from [OpenWeatherMap](https://openweathermap.org/find) **This will override anything you put in location.**
Leave blank if you want to use location.
**Example:** `1234567`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. +| `location` | The location used for weather information.

**Example:** `'Amsterdam,Netherlands'`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. +| `apiKey` | The [OpenWeatherMap](https://home.openweathermap.org) API key, which can be obtained by creating an OpenWeatherMap account.

This value is **REQUIRED** + +### Darksky options + +| Option | Description +| ---------------------------- | ----------- +| `apiBase` | The DarkSky base URL. The darksky api has disabled [cors](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS), therefore a proxy is required.

**Possible value:** `'https://cors-anywhere.herokuapp.com/https://api.darksky.net'`
This value is **REQUIRED** +| `weatherEndpoint` | The DarkSky API endPoint.

**Possible values:** `/forecast`
This value is **REQUIRED** +| `apiKey` | The [DarkSky](https://darksky.net/dev/register) API key, which can be obtained by creating an DarkSky account.

This value is **REQUIRED** +| `lat` | The geo coordinate latitude.

This value is **REQUIRED** +| `lon` | The geo coordinate longitude.

This value is **REQUIRED** diff --git a/modules/default/weather/current.png b/modules/default/weather/current.png new file mode 100644 index 0000000000000000000000000000000000000000..de6c5a39ea341592fcd25d19d6a382457bad9e35 GIT binary patch literal 8141 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 BxD@~Z literal 0 HcmV?d00001 diff --git a/modules/default/weather/forecast.png b/modules/default/weather/forecast.png new file mode 100644 index 0000000000000000000000000000000000000000..1afd31913ffba849a334aeedb0aad2c799a3de20 GIT binary patch literal 16385 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 ZC??9%ZOK#@g4?!_rz8gk6}~VF_+LS8+!_D? literal 0 HcmV?d00001 diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js index 4ce0c89541..e5358a0fc5 100644 --- a/modules/default/weather/providers/darksky.js +++ b/modules/default/weather/providers/darksky.js @@ -46,7 +46,7 @@ WeatherProvider.register("darksky", { // Create a URL from the config and base URL. getUrl: function() { - return `https://cors-anywhere.herokuapp.com/https://api.darksky.net/forecast/${this.config.apiKey}/${this.config.lat},${this.config.lon}`; + return `${this.config.apiBase}${this.config.weatherEndpoint}/${this.config.apiKey}/${this.config.lat},${this.config.lon}`; }, // Implement WeatherDay generator. diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index b3832dd034..d94f774ec1 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -12,7 +12,6 @@ Module.register("weather",{ defaults: { updateInterval: 10 * 60 * 1000, weatherProvider: "openweathermap", - units: config.units, roundTemp: false, type: "current", //current, forecast @@ -43,11 +42,11 @@ Module.register("weather",{ appendLocationNameToHeader: true, calendarClass: "calendar", - tableClass: 'small', + tableClass: "small", onlyTemp: false, - roundTemp: false, - showRainAmount: true + showRainAmount: true, + colored: false }, // Module properties. @@ -191,7 +190,7 @@ Module.register("weather",{ this.nunjucksEnvironment().addFilter("unit", function (value, type) { if (type === "temperature") { value += "°"; - if (this.config.scale || this.config.degreeLabel) { + if (this.config.degreeLabel) { if (this.config.units === "metric") { value += "C"; } else if (this.config.units === "imperial") { From 10bc3264909705fd47bb1c9cc8b408ea1d4ee8ef Mon Sep 17 00:00:00 2001 From: fewieden Date: Thu, 27 Dec 2018 19:37:02 +0100 Subject: [PATCH 65/79] cleanup --- css/main.css | 15 ++--- modules/default/weather/providers/darksky.js | 10 +-- .../weather/providers/openweathermap.js | 64 +++++++++---------- modules/default/weather/weather.css | 37 ++++++----- modules/default/weather/weather.js | 28 ++++---- modules/default/weather/weatherobject.js | 22 +++---- modules/default/weather/weatherprovider.js | 48 +++++++------- 7 files changed, 107 insertions(+), 117 deletions(-) diff --git a/css/main.css b/css/main.css index 49bfe611f0..ae590fdd60 100644 --- a/css/main.css +++ b/css/main.css @@ -95,7 +95,7 @@ body { header { text-transform: uppercase; font-size: 15px; - font-family: "Roboto Condensed"; + font-family: "Roboto Condensed", sans-serif; font-weight: 400; border-bottom: 1px solid #666; line-height: 15px; @@ -151,6 +151,7 @@ sup { .region.right { right: 0; + text-align: right; } .region.top { @@ -161,6 +162,10 @@ sup { margin-bottom: 25px; } +.region.bottom .container { + margin-top: 25px; +} + .region.top .container:empty { margin-bottom: 0; } @@ -185,10 +190,6 @@ sup { bottom: 0; } -.region.bottom .container { - margin-top: 25px; -} - .region.bottom .container:empty { margin-top: 0; } @@ -231,10 +232,6 @@ sup { text-align: left; } -.region.right { - text-align: right; -} - .region table { width: 100%; border-spacing: 0; diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js index e5358a0fc5..74758d6ede 100644 --- a/modules/default/weather/providers/darksky.js +++ b/modules/default/weather/providers/darksky.js @@ -17,30 +17,30 @@ WeatherProvider.register("darksky", { fetchCurrentWeather: function() { this.fetchData(this.getUrl()) .then(data => { - Log.log(data); if(!data || !data.currently || typeof data.currently.temperature === "undefined") { // No usable data? return; } + var currentWeather = this.generateWeatherDayFromCurrentWeather(data); this.setCurrentWeather(currentWeather); }).catch(function(request) { - Log.error("Could not load data!", request); + Log.error("Could not load data ... ", request); }); }, fetchWeatherForecast: function() { this.fetchData(this.getUrl()) .then(data => { - Log.log(data); if(!data || !data.daily || !data.daily.data.length) { // No usable data? return; } + var forecast = this.generateWeatherObjectsFromForecast(data.daily.data); this.setWeatherForecast(forecast); }).catch(function(request) { - Log.error("Could not load data!", request); + Log.error("Could not load data ... ", request); }); }, @@ -99,4 +99,4 @@ WeatherProvider.register("darksky", { }; return weatherTypes.hasOwnProperty(weatherType) ? weatherTypes[weatherType] : null; } -}); \ No newline at end of file +}); diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index ff58547c61..8fd1e3befd 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -26,13 +26,13 @@ WeatherProvider.register("openweathermap", { return; } - this.setFetchedLocation(data.name + ', ' + data.sys.country) + this.setFetchedLocation(`${data.name}, ${data.sys.country}`); - var currentWeather = this.generateWeatherObjectFromCurrentWeather(data) - this.setCurrentWeather(currentWeather) + var currentWeather = this.generateWeatherObjectFromCurrentWeather(data); + this.setCurrentWeather(currentWeather); }) .catch(function(request) { - Log.error("Could not load data ... ", request) + Log.error("Could not load data ... ", request); }) }, @@ -46,13 +46,13 @@ WeatherProvider.register("openweathermap", { return; } - this.setFetchedLocation(data.city.name + ', ' + data.city.country) + this.setFetchedLocation(`${data.city.name}, ${data.city.country}`); - var forecast = this.generateWeatherObjectsFromForecast(data.list) - this.setWeatherForecast(forecast) + var forecast = this.generateWeatherObjectsFromForecast(data.list); + this.setWeatherForecast(forecast); }) .catch(function(request) { - Log.error("Could not load data ... ", request) + Log.error("Could not load data ... ", request); }) }, @@ -63,45 +63,45 @@ WeatherProvider.register("openweathermap", { * Gets the complete url for the request */ getUrl: function() { - return this.config.apiBase + this.config.apiVersion + this.config.weatherEndpoint + this.getParams() + return this.config.apiBase + this.config.apiVersion + this.config.weatherEndpoint + this.getParams(); }, /* * Generate a WeatherObject based on currentWeatherInformation */ generateWeatherObjectFromCurrentWeather: function(currentWeatherData) { - var currentWeather = new WeatherObject() + var currentWeather = new WeatherObject(); - currentWeather.humidity = currentWeatherData.main.humidity - currentWeather.temperature = currentWeatherData.main.temp - currentWeather.windSpeed = currentWeatherData.wind.speed - currentWeather.windDirection = currentWeatherData.wind.deg - currentWeather.weatherType = this.convertWeatherType(currentWeatherData.weather[0].icon) - currentWeather.sunrise = moment(currentWeatherData.sys.sunrise, "X") - currentWeather.sunset = moment(currentWeatherData.sys.sunset, "X") + currentWeather.humidity = currentWeatherData.main.humidity; + currentWeather.temperature = currentWeatherData.main.temp; + currentWeather.windSpeed = currentWeatherData.wind.speed; + currentWeather.windDirection = currentWeatherData.wind.deg; + currentWeather.weatherType = this.convertWeatherType(currentWeatherData.weather[0].icon); + currentWeather.sunrise = moment(currentWeatherData.sys.sunrise, "X"); + currentWeather.sunset = moment(currentWeatherData.sys.sunset, "X"); - return currentWeather + return currentWeather; }, /* * Generate WeatherObjects based on forecast information */ generateWeatherObjectsFromForecast: function(forecasts) { - var days = [] + var days = []; for (var forecast of forecasts) { - var weather = new WeatherObject() + var weather = new WeatherObject(); - weather.date = moment(forecast.dt, "X") - weather.minTemperature = forecast.temp.min - weather.maxTemperature = forecast.temp.max - weather.weatherType = this.convertWeatherType(forecast.weather[0].icon) - weather.rain = forecast.rain + weather.date = moment(forecast.dt, "X"); + weather.minTemperature = forecast.temp.min; + weather.maxTemperature = forecast.temp.max; + weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); + weather.rain = forecast.rain; - days.push(weather) + days.push(weather); } - return days + return days; }, /* @@ -127,9 +127,9 @@ WeatherProvider.register("openweathermap", { "11n": "night-thunderstorm", "13n": "night-snow", "50n": "night-alt-cloudy-windy" - } + }; - return weatherTypes.hasOwnProperty(weatherType) ? weatherTypes[weatherType] : null + return weatherTypes.hasOwnProperty(weatherType) ? weatherTypes[weatherType] : null; }, /* getParams(compliments) @@ -144,7 +144,7 @@ WeatherProvider.register("openweathermap", { } else if(this.config.location) { params += "q=" + this.config.location; } else if (this.firstEvent && this.firstEvent.geo) { - params += "lat=" + this.firstEvent.geo.lat + "&lon=" + this.firstEvent.geo.lon + params += "lat=" + this.firstEvent.geo.lat + "&lon=" + this.firstEvent.geo.lon; } else if (this.firstEvent && this.firstEvent.location) { params += "q=" + this.firstEvent.location; } else { @@ -157,5 +157,5 @@ WeatherProvider.register("openweathermap", { params += "&APPID=" + this.config.apiKey; return params; - }, -}); \ No newline at end of file + } +}); diff --git a/modules/default/weather/weather.css b/modules/default/weather/weather.css index febc777c68..dfa2b12adb 100644 --- a/modules/default/weather/weather.css +++ b/modules/default/weather/weather.css @@ -1,46 +1,45 @@ .weather .weathericon, .weather .fa-home { - font-size: 75%; - line-height: 65px; - display: inline-block; - -ms-transform: translate(0, -3px); /* IE 9 */ - -webkit-transform: translate(0, -3px); /* Safari */ - transform: translate(0, -3px); + font-size: 75%; + line-height: 65px; + display: inline-block; + -ms-transform: translate(0, -3px); /* IE 9 */ + -webkit-transform: translate(0, -3px); /* Safari */ + transform: translate(0, -3px); } .weather .humidityIcon { - padding-right: 4px; + padding-right: 4px; } .weather .humidity-padding { - padding-bottom: 6px; + padding-bottom: 6px; } - .weather .day { - padding-left: 0; - padding-right: 25px; + padding-left: 0; + padding-right: 25px; } .weather .weather-icon { - padding-right: 30px; - text-align: center; + padding-right: 30px; + text-align: center; } .weather .min-temp { - padding-left: 20px; - padding-right: 0; + padding-left: 20px; + padding-right: 0; } .weather .rain { - padding-left: 20px; - padding-right: 0; + padding-left: 20px; + padding-right: 0; } .weather tr.colored .min-temp { - color: #BCDDFF; + color: #bcddff; } .weather tr.colored .max-temp { - color: #FF8E99; + color: #ff8e99; } diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index d94f774ec1..03e15bda93 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -59,16 +59,12 @@ Module.register("weather",{ // Return the scripts that are nessecery for the weather module. getScripts: function () { - var scripts = [ + return [ "moment.js", "weatherprovider.js", - "weatherobject.js" + "weatherobject.js", + this.file("providers/" + this.config.weatherProvider.toLowerCase() + ".js") ]; - - // Add the provider file to the required scripts. - scripts.push(this.file("providers/" + this.config.weatherProvider.toLowerCase() + ".js")); - - return scripts }, // Override getHeader method. @@ -93,7 +89,7 @@ Module.register("weather",{ this.addFilters(); // Schedule the first update. - this.scheduleUpdate(0); + this.scheduleUpdate(this.config.initialLoadDelay); }, // Override notification handler. @@ -112,12 +108,10 @@ Module.register("weather",{ } } } - } - if (notification === "INDOOR_TEMPERATURE") { + } else if (notification === "INDOOR_TEMPERATURE") { this.indoorTemperature = this.roundValue(payload); this.updateDom(300); - } - if (notification === "INDOOR_HUMIDITY") { + } else if (notification === "INDOOR_HUMIDITY") { this.indoorHumidity = this.roundValue(payload); this.updateDom(300); } @@ -125,7 +119,7 @@ Module.register("weather",{ // Select the template depending on the display type. getTemplate: function () { - return this.config.type.toLowerCase() + ".njk" + return `${this.config.type.toLowerCase()}.njk`; }, // Add all the data to the template. @@ -144,8 +138,8 @@ Module.register("weather",{ // What to do when the weather provider has new information available? updateAvailable: function() { Log.log("New weather information available."); - this.updateDom(300); - this.scheduleUpdate(60000); + this.updateDom(0); + this.scheduleUpdate(); }, scheduleUpdate: function(delay = null) { @@ -214,9 +208,9 @@ Module.register("weather",{ } if(this.config.units === "imperial") { - return (parseFloat(value) / 25.4).toFixed(2) + " in"; + return `${(parseFloat(value) / 25.4).toFixed(2)} in`; } else { - return parseFloat(value).toFixed(1) + " mm"; + return `${parseFloat(value).toFixed(1)} mm`; } }.bind(this)); } diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index ff0de84194..b6ee9b955d 100644 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -14,16 +14,16 @@ class WeatherObject { constructor() { - this.date = null - this.windSpeed = null - this.windDirection = null - this.sunrise = null - this.sunset = null - this.temperature = null - this.minTemperature = null - this.maxTemperature = null - this.weatherType = null - this.humidity = null + this.date = null; + this.windSpeed = null; + this.windDirection = null; + this.sunrise = null; + this.sunset = null; + this.temperature = null; + this.minTemperature = null; + this.maxTemperature = null; + this.weatherType = null; + this.humidity = null; } cardinalWindDirection () { @@ -78,4 +78,4 @@ class WeatherObject { var now = new Date(); return (this.sunrise < now && this.sunset > now) ? "sunset" : "sunrise"; } -}; \ No newline at end of file +} diff --git a/modules/default/weather/weatherprovider.js b/modules/default/weather/weatherprovider.js index 0be4566348..bb13999182 100644 --- a/modules/default/weather/weatherprovider.js +++ b/modules/default/weather/weatherprovider.js @@ -36,71 +36,71 @@ var WeatherProvider = Class.extend({ // Called when a weather provider is initialized. init: function(config) { this.config = config; - Log.info("Weather provider: " + this.providerName + " initialized.") + Log.info(`Weather provider: ${this.providerName} initialized.`); }, // Called to set the config, this config is the same as the weather module's config. setConfig: function(config) { - this.config = config - Log.info("Weather provider: " + this.providerName + " config set.", this.config) + this.config = config; + Log.info(`Weather provider: ${this.providerName} config set.`, this.config); }, // Called when the weather provider is about to start. start: function(config) { - Log.info("Weather provider: " + this.providerName + " started.") + Log.info(`Weather provider: ${this.providerName} started.`); }, // This method should start the API request to fetch the current weather. // This method should definetly be overwritten in the provider. fetchCurrentWeather: function() { - Log.warn("Weather provider: " + this.providerName + " does not subclass the fetchCurrentWeather method.") + Log.warn(`Weather provider: ${this.providerName} does not subclass the fetchCurrentWeather method.`); }, // This method should start the API request to fetch the weather forecast. // This method should definetly be overwritten in the provider. fetchWeatherForecast: function() { - Log.warn("Weather provider: " + this.providerName + " does not subclass the fetchWeatherForecast method.") + Log.warn(`Weather provider: ${this.providerName} does not subclass the fetchWeatherForecast method.`); }, // This returns a WeatherDay object for the current weather. currentWeather: function() { - return this.currentWeatherObject + return this.currentWeatherObject; }, // This returns an array of WeatherDay objects for the weather forecast. weatherForecast: function() { - return this.weatherForecastArray + return this.weatherForecastArray; }, // This returns the name of the fetched location or an empty string fetchedLocation: function() { - return this.fetchedLocationName || '' + return this.fetchedLocationName || ""; }, // Set the currentWeather and notify the delegate that new information is available. setCurrentWeather: function(currentWeatherObject) { // We should check here if we are passing a WeatherDay - this.currentWeatherObject = currentWeatherObject + this.currentWeatherObject = currentWeatherObject; - this.updateAvailable() + this.updateAvailable(); }, // Set the weatherForecastArray and notify the delegate that new information is available. setWeatherForecast: function(weatherForecastArray) { // We should check here if we are passing a WeatherDay - this.weatherForecastArray = weatherForecastArray + this.weatherForecastArray = weatherForecastArray; - this.updateAvailable() + this.updateAvailable(); }, // Set the fetched location name setFetchedLocation: function(name) { - this.fetchedLocationName = name + this.fetchedLocationName = name; }, // Notify the delegate that new weather is available. updateAvailable: function() { - this.delegate.updateAvailable(this) + this.delegate.updateAvailable(this); }, // A convinience function to make requests. It returns a promise. @@ -125,30 +125,30 @@ var WeatherProvider = Class.extend({ /** * Collection of registered weather providers. */ -WeatherProvider.providers = [] +WeatherProvider.providers = []; /** * Static method to register a new weather provider. */ WeatherProvider.register = function(providerIdentifier, providerDetails) { - WeatherProvider.providers[providerIdentifier.toLowerCase()] = WeatherProvider.extend(providerDetails) -} + WeatherProvider.providers[providerIdentifier.toLowerCase()] = WeatherProvider.extend(providerDetails); +}; /** * Static method to initialize a new weather provider. */ WeatherProvider.initialize = function(providerIdentifier, delegate) { - providerIdentifier = providerIdentifier.toLowerCase() + providerIdentifier = providerIdentifier.toLowerCase(); - var provider = new WeatherProvider.providers[providerIdentifier]() + var provider = new WeatherProvider.providers[providerIdentifier](); - provider.delegate = delegate - provider.setConfig(delegate.config) + provider.delegate = delegate; + provider.setConfig(delegate.config); provider.providerIdentifier = providerIdentifier; if (!provider.providerName) { - provider.providerName = providerIdentifier + provider.providerName = providerIdentifier; } return provider; -} \ No newline at end of file +}; From b853c00dd45eb8f897c6c1bc928d9f9a2103075b Mon Sep 17 00:00:00 2001 From: fewieden Date: Thu, 27 Dec 2018 23:12:28 +0100 Subject: [PATCH 66/79] Add changelog entry --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5ff3977b1..b65699f9bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,10 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [2.6.0] - Unreleased -*This release is scheduled to be released on 2018-10-01.* +*This release is scheduled to be released on 2019-01-01.* + +### Experimental +- New default [module weather](modules/default/weather). ### Added - Possibility to add classes to the cell of symbol, title and time of the events of calendar. From 8a65bef004298373681a24921c84953bc86d07f9 Mon Sep 17 00:00:00 2001 From: fewieden Date: Fri, 28 Dec 2018 19:39:00 +0100 Subject: [PATCH 67/79] add unit and language handling for weather provider darksky --- modules/default/weather/providers/darksky.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js index 74758d6ede..4a049c70c1 100644 --- a/modules/default/weather/providers/darksky.js +++ b/modules/default/weather/providers/darksky.js @@ -14,6 +14,11 @@ WeatherProvider.register("darksky", { // Not strictly required, but helps for debugging. providerName: "Dark Sky", + units: { + imperial: 'us', + metric: 'ca' + }, + fetchCurrentWeather: function() { this.fetchData(this.getUrl()) .then(data => { @@ -46,7 +51,8 @@ WeatherProvider.register("darksky", { // Create a URL from the config and base URL. getUrl: function() { - return `${this.config.apiBase}${this.config.weatherEndpoint}/${this.config.apiKey}/${this.config.lat},${this.config.lon}`; + var units = this.units[this.config.units] || 'auto'; + return `${this.config.apiBase}${this.config.weatherEndpoint}/${this.config.apiKey}/${this.config.lat},${this.config.lon}?units=${units}&lang=${this.config.lang}`; }, // Implement WeatherDay generator. From 8e28be6558b2040d971fdb6c228ecad1e75f9696 Mon Sep 17 00:00:00 2001 From: devpwnz <46238043+devpwnz@users.noreply.github.com> Date: Sat, 29 Dec 2018 10:00:29 +0200 Subject: [PATCH 68/79] Update ro.json --- translations/ro.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/translations/ro.json b/translations/ro.json index 3584d69f2f..5f8cfebf4e 100644 --- a/translations/ro.json +++ b/translations/ro.json @@ -29,5 +29,7 @@ "UPDATE_NOTIFICATION": "Un update este disponibil pentru MagicMirror².", "UPDATE_NOTIFICATION_MODULE": "Un update este disponibil pentru modulul {MODULE_NAME}.", "UPDATE_INFO_SINGLE": "Există {COMMIT_COUNT} commit-uri noi pe branch-ul {BRANCH_NAME}.", - "UPDATE_INFO_MULTIPLE": "Există {COMMIT_COUNT} commit-uri noi pe branch-ul {BRANCH_NAME}." + "UPDATE_INFO_MULTIPLE": "Există {COMMIT_COUNT} commit-uri noi pe branch-ul {BRANCH_NAME}.", + + "FEELS": "Se simte ca fiind" } From 39994d579753ac863d230099924e591f7b210b12 Mon Sep 17 00:00:00 2001 From: devpwnz <46238043+devpwnz@users.noreply.github.com> Date: Sat, 29 Dec 2018 10:08:57 +0200 Subject: [PATCH 69/79] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b19efad3d6..b53a018d06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [2.5.0] - 2018-10-01 ### Added +- Romanian translation for "Feels" - Support multi-line compliments - Simplified Chinese translation for "Feels" - Polish translate for "Feels" From cc274ffebe2736ac2ab07ca969d57ced911f5b9b Mon Sep 17 00:00:00 2001 From: fewieden Date: Sun, 30 Dec 2018 14:11:16 +0100 Subject: [PATCH 70/79] fixed darksky metric units --- modules/default/weather/providers/darksky.js | 35 ++++++++++---------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js index 4a049c70c1..e4cb78b3f8 100644 --- a/modules/default/weather/providers/darksky.js +++ b/modules/default/weather/providers/darksky.js @@ -16,10 +16,10 @@ WeatherProvider.register("darksky", { units: { imperial: 'us', - metric: 'ca' + metric: 'si' }, - fetchCurrentWeather: function() { + fetchCurrentWeather() { this.fetchData(this.getUrl()) .then(data => { if(!data || !data.currently || typeof data.currently.temperature === "undefined") { @@ -27,14 +27,14 @@ WeatherProvider.register("darksky", { return; } - var currentWeather = this.generateWeatherDayFromCurrentWeather(data); + const currentWeather = this.generateWeatherDayFromCurrentWeather(data); this.setCurrentWeather(currentWeather); }).catch(function(request) { Log.error("Could not load data ... ", request); }); }, - fetchWeatherForecast: function() { + fetchWeatherForecast() { this.fetchData(this.getUrl()) .then(data => { if(!data || !data.daily || !data.daily.data.length) { @@ -42,7 +42,7 @@ WeatherProvider.register("darksky", { return; } - var forecast = this.generateWeatherObjectsFromForecast(data.daily.data); + const forecast = this.generateWeatherObjectsFromForecast(data.daily.data); this.setWeatherForecast(forecast); }).catch(function(request) { Log.error("Could not load data ... ", request); @@ -50,14 +50,14 @@ WeatherProvider.register("darksky", { }, // Create a URL from the config and base URL. - getUrl: function() { - var units = this.units[this.config.units] || 'auto'; + getUrl() { + const units = this.units[this.config.units] || "auto"; return `${this.config.apiBase}${this.config.weatherEndpoint}/${this.config.apiKey}/${this.config.lat},${this.config.lon}?units=${units}&lang=${this.config.lang}`; }, // Implement WeatherDay generator. - generateWeatherDayFromCurrentWeather: function(currentWeatherData) { - var currentWeather = new WeatherObject(); + generateWeatherDayFromCurrentWeather(currentWeatherData) { + const currentWeather = new WeatherObject(this.config.units); currentWeather.date = moment(); currentWeather.humidity = parseFloat(currentWeatherData.currently.humidity); @@ -71,11 +71,11 @@ WeatherProvider.register("darksky", { return currentWeather; }, - generateWeatherObjectsFromForecast: function(forecasts) { - var days = []; + generateWeatherObjectsFromForecast(forecasts) { + const days = []; - for (var forecast of forecasts) { - var weather = new WeatherObject(); + for (const forecast of forecasts) { + const weather = new WeatherObject(this.config.units); weather.date = moment(forecast.time, "X"); weather.minTemperature = forecast.temperatureMin; @@ -83,15 +83,15 @@ WeatherProvider.register("darksky", { weather.weatherType = this.convertWeatherType(forecast.icon); weather.rain = forecast.precipAccumulation; - days.push(weather) + days.push(weather); } - return days + return days; }, // Map icons from Dark Sky to our icons. - convertWeatherType: function(weatherType) { - var weatherTypes = { + convertWeatherType(weatherType) { + const weatherTypes = { "clear-day": "day-sunny", "clear-night": "night-clear", "rain": "rain", @@ -103,6 +103,7 @@ WeatherProvider.register("darksky", { "partly-cloudy-day": "day-cloudy", "partly-cloudy-night": "night-cloudy" }; + return weatherTypes.hasOwnProperty(weatherType) ? weatherTypes[weatherType] : null; } }); From 88d862303ddd7705529f99e99714c8f95a283ae8 Mon Sep 17 00:00:00 2001 From: fewieden Date: Sun, 30 Dec 2018 14:14:17 +0100 Subject: [PATCH 71/79] fixed beaufortwindspeed for imperial units --- modules/default/weather/weatherobject.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index b6ee9b955d..a30a415caf 100644 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -13,7 +13,8 @@ // As soon as we start implementing the forecast, mode properties will be added. class WeatherObject { - constructor() { + constructor(units) { + this.units = units; this.date = null; this.windSpeed = null; this.windDirection = null; @@ -26,7 +27,7 @@ class WeatherObject { this.humidity = null; } - cardinalWindDirection () { + cardinalWindDirection() { if (this.windDirection > 11.25 && this.windDirection <= 33.75){ return "NNE"; } else if (this.windDirection > 33.75 && this.windDirection <= 56.25) { @@ -62,20 +63,18 @@ class WeatherObject { } } - beaufortWindSpeed () { - var kmh = this.windSpeed * 60 * 60 / 1000; - var speeds = [1, 5, 11, 19, 28, 38, 49, 61, 74, 88, 102, 117, 1000]; - for (var beaufort in speeds) { - var speed = speeds[beaufort]; - if (speed > kmh) { - return beaufort; + beaufortWindSpeed() { + const windInKmh = this.units === "imperial" ? this.windSpeed * 1.609344 : this.windSpeed * 60 * 60 / 1000; + const speeds = [1, 5, 11, 19, 28, 38, 49, 61, 74, 88, 102, 117, 1000]; + for (const [index, speed] of speeds.entries()) { + if (speed > windInKmh) { + return index; } } return 12; } - nextSunAction () { - var now = new Date(); - return (this.sunrise < now && this.sunset > now) ? "sunset" : "sunrise"; + nextSunAction() { + return moment().isBetween(this.sunrise, this.sunset) ? "sunset" : "sunrise"; } } From 8dd7621f2937611bc9c344db3909dd7d186723c2 Mon Sep 17 00:00:00 2001 From: fewieden Date: Sun, 30 Dec 2018 14:17:13 +0100 Subject: [PATCH 72/79] add original feels like temperature and fixed it for imperial units --- modules/default/weather/README.md | 2 +- modules/default/weather/current.njk | 7 +++++ .../weather/providers/openweathermap.js | 30 +++++++++---------- modules/default/weather/weather.js | 3 +- modules/default/weather/weatherobject.js | 19 ++++++++++++ 5 files changed, 44 insertions(+), 17 deletions(-) diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md index d87668240e..ee9ec7b8bf 100644 --- a/modules/default/weather/README.md +++ b/modules/default/weather/README.md @@ -48,7 +48,6 @@ The following properties can be configured: | `lang` | The language of the days.

**Possible values:** `en`, `nl`, `ru`, etc ...
**Default value:** uses value of _config.language_ | `decimalSymbol` | The decimal symbol to use.

**Possible values:** `.`, `,` or any other symbol.
**Default value:** `.` | `initialLoadDelay` | The initial delay before loading. If you have multiple modules that use the same API key, you might want to delay one of the requests. (Milliseconds)

**Possible values:** `1000` - `5000`
**Default value:** `0` -| `retryDelay` | The delay before retrying after a request failure. (Milliseconds)

**Possible values:** `1000` - `60000`
**Default value:** `2500` | `appendLocationNameToHeader` | If set to `true`, the returned location name will be appended to the header of the module, if the header is enabled. This is mainly intresting when using calender based weather.

**Default value:** `true` | `calendarClass` | The class for the calender module to base the event based weather information on.

**Default value:** `'calendar'` @@ -63,6 +62,7 @@ The following properties can be configured: | `showHumidity` | Show the current humidity

**Possible values:** `true` or `false`
**Default value:** `false` | `showIndoorTemperature` | If you have another module that emits the `INDOOR_TEMPERATURE` notification, the indoor temperature will be displayed
**Default value:** `false` | `showIndoorHumidity` | If you have another module that emits the `INDOOR_HUMIDITY` notification, the indoor humidity will be displayed
**Default value:** `false` +| `showFeelsLike` | Shows the Feels like temperature weather.

**Possible values:**`true` or `false`
**Default value:** `true` #### Weather forecast options diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index a788bcc261..aed51ac6bb 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -51,6 +51,13 @@ {% endif %}