diff --git a/.travis.yml b/.travis.yml
index 62cc10a3..d98a72cd 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,6 @@
language: node_js
node_js:
- - "7"
+ - "8"
before_script:
- yarn danger ci
- npm install grunt-cli -g
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cee21d56..7d97166d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,46 @@ This project adheres to [Semantic Versioning](http://semver.org/).
---
+## [2.7.0] - Unreleased
+
+*This release is scheduled to be released on 2019-04-01.*
+
+ℹ️ **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install`. If you are having issues running Electron, make sure your [Raspbian is up to date](https://www.raspberrypi.org/documentation/raspbian/updating.md).
+
+### Added
+- Italian translation for "Feels"
+- Disabled the screensaver on raspbian with installation script
+- Added option to truncate the number of vertical lines a calendar item can span if `wrapEvents` is enabled.
+- Added autoLocation options for weather forcast and current weather modules.
+- Added autoTimezone option for the default clock module.
+- Danish translation for "Feels" and "Weeks"
+
+### Updated
+- Bumped the Electron dependency to v3.0.13 to support the most recent Raspbian. [#1500](https://github.com/MichMich/MagicMirror/issues/1500)
+
+### Fixed
+- Fixed temperature displays in currentweather and weatherforecast modules [#1503](https://github.com/MichMich/MagicMirror/issues/1503), [#1511](https://github.com/MichMich/MagicMirror/issues/1511).
+- Fixed unhandled error on bad git data in updatenotiifcation module [#1285](https://github.com/MichMich/MagicMirror/issues/1285).
+- Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504).
+- Fixed analogue clock border display issue where non-black backgrounds used (previous fix for issue 611)
+- Fixed compatibility issues caused when modules request different versions of Font Awesome, see issue [#1522](https://github.com/MichMich/MagicMirror/issues/1522). MagicMirror now uses [Font Awesome 5 with v4 shims included for backwards compatibility](https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4#shims).
+- Installation script problems with raspbian
+- Calendar: only show repeating count if the event is actually repeating [#1534](https://github.com/MichMich/MagicMirror/pull/1534)
+- Calendar: Fix exdate handling when multiple values are specified (comma separated)
+- Fix null dereference in moduleNeedsUpdate when the module isn't visible
+
+### New weather module
+- Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499).
+- Dimmed loading indicator for weather forecast.
+- Implemented config option `decimalSymbol` [#1499](https://github.com/MichMich/MagicMirror/issues/1499).
+- Aligned indoor values in current weather vertical [#1499](https://github.com/MichMich/MagicMirror/issues/1499).
+- Added humidity support to nunjuck unit filter.
+- Do not display degree symbol for temperature in Kelvin [#1503](https://github.com/MichMich/MagicMirror/issues/1503).
+- Weather forecast now works with openweathermap for both, `/forecast` and `/forecast/daily`, in new weather module. If you use the `/forecast`-weatherEndpoint, the hourly data are converted to daily data, see issues [#1504](https://github.com/MichMich/MagicMirror/issues/1504), [#1513](https://github.com/MichMich/MagicMirror/issues/1513).
+- Added fade, fadePoint and maxNumberOfDays properties to the forecast mode [#1516](https://github.com/MichMich/MagicMirror/issues/1516)
+- Fixed Loading string and decimalSymbol string replace [#1538](https://github.com/MichMich/MagicMirror/issues/1538)
+- Show Snow amounts in new weather module [#1545](https://github.com/MichMich/MagicMirror/issues/1545)
+
## [2.6.0] - 2019-01-01
ℹ️ **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.
@@ -12,6 +52,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### ✨ 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).
+A huge, huge, huge thanks to user @fewieden for all his hard work on the new `weather` module!
+
### Added
- Possibility to add classes to the cell of symbol, title and time of the events of calendar.
- Font-awesome 5, still has 4 for backwards compatibility.
diff --git a/README.md b/README.md
index 3d39832c..1cadc57a 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,6 @@
-
**MagicMirror²** is an open source modular smart mirror platform. With a growing list of installable modules, the **MagicMirror²** allows you to convert your hallway or bathroom mirror into your personal assistant. **MagicMirror²** is built by the creator of [the original MagicMirror](http://michaelteeuw.nl/tagged/magicmirror) with the incredible help of a [growing community of contributors](https://github.com/MichMich/MagicMirror/graphs/contributors).
@@ -16,18 +15,22 @@ MagicMirror² focuses on a modular plugin system and uses [Electron](http://elec
## Table Of Contents
+- [Table Of Contents](#table-of-contents)
- [Installation](#installation)
- [Raspberry Pi](#raspberry-pi)
- - [General](#general)
+ - [Automatic Installation (Raspberry Pi only!)](#automatic-installation-raspberry-pi-only)
+ - [Manual Installation](#manual-installation)
- [Server Only](#server-only)
- [Client Only](#client-only)
- [Docker](#docker)
- [Configuration](#configuration)
+ - [Raspberry Specific](#raspberry-specific)
+ - [General](#general)
- [Modules](#modules)
- [Updating](#updating)
-- [Known Issues](#known-issues)
- [Community](#community)
- [Contributing Guidelines](#contributing-guidelines)
+- [Enjoying MagicMirror? Consider a donation!](#enjoying-magicmirror-consider-a-donation)
- [Manifesto](#manifesto)
## Installation
@@ -199,6 +202,16 @@ Please keep the following in mind:
Thanks for your help in making MagicMirror² better!
+
+## Enjoying MagicMirror? Consider a donation!
+
+MagicMirror² is opensource and free. That doesn't mean we don't need any money.
+
+Please consider a donation to help us cover the ongoing costs like webservers and email services.
+If we recieve enough donations we might even be able to free up some working hours and spend some extra time improving the MagicMirror² core.
+
+To donate, please follow [this](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G5D8E9MR5DTD2&source=url) link.
+
## Manifesto
A real Manifesto is still to be written. Till then, Michael's response on [one of the repository issues](https://github.com/MichMich/MagicMirror/issues/1174) gives a great summary:
diff --git a/installers/raspberry.sh b/installers/raspberry.sh
index 4e9c20d8..1551b5fb 100644
--- a/installers/raspberry.sh
+++ b/installers/raspberry.sh
@@ -47,7 +47,7 @@ sudo apt-get --assume-yes install curl wget git build-essential unzip || exit
# Check if we need to install or upgrade Node.js.
echo -e "\e[96mCheck current Node installation ...\e[0m"
NODE_INSTALL=false
-if command_exists node; then
+if command_exists node && command_exists npm; then
echo -e "\e[0mNode currently installed. Checking version number.";
NODE_CURRENT=$(node -v)
echo -e "\e[0mMinimum Node version: \e[1m$NODE_TESTED\e[0m"
@@ -152,9 +152,19 @@ fi
read -p "Do you want use pm2 for auto starting of your MagicMirror (y/N)?" choice
if [[ $choice =~ ^[Yy]$ ]]; then
sudo npm install -g pm2
- sudo su -c "env PATH=$PATH:/usr/bin pm2 startup linux -u pi --hp /home/pi"
- pm2 start ~/MagicMirror/installers/pm2_MagicMirror.json
- pm2 save
+ if [[ "$(ps --no-headers -o comm 1)" =~ systemd ]]; then #Checking for systemd
+ sudo pm2 startup systemd -u pi --hp /home/pi
+ else
+ sudo su -c "env PATH=$PATH:/usr/bin pm2 startup linux -u pi --hp /home/pi"
+ fi
+ pm2 start ~/MagicMirror/installers/pm2_MagicMirror.json
+ pm2 save
+fi
+# Disable Screensaver
+read -p "Do you want to disable the screen saver? (y/N)?" choice
+if [[ $choice =~ ^[Yy]$ ]]; then
+ sudo su -c "echo -e '@xset s noblank\n@xset s off\n@xset -dpms' >> /etc/xdg/lxsession/LXDE-pi/autostart"
+ export DISPLAY=:0; xset s noblank;xset s off;xset -dpms
fi
echo " "
diff --git a/js/main.js b/js/main.js
index 7ec9b5f3..21a882f8 100644
--- a/js/main.js
+++ b/js/main.js
@@ -173,6 +173,10 @@ var MM = (function() {
*/
var moduleNeedsUpdate = function(module, newHeader, newContent) {
var moduleWrapper = document.getElementById(module.identifier);
+ if (moduleWrapper === null) {
+ return false;
+ }
+
var contentWrapper = moduleWrapper.getElementsByClassName("module-content");
var headerWrapper = moduleWrapper.getElementsByClassName("module-header");
diff --git a/modules/README.md b/modules/README.md
index 8bc8f86e..5fb86df2 100644
--- a/modules/README.md
+++ b/modules/README.md
@@ -33,8 +33,8 @@ Therefore **we highly recommend you to include the following information in your
- A high quality screenshot of your working module
- A short, one sentence, clear description what it does (duh!)
-- What external API's it depend on, including web links to those
-- Wheteher the API/request require a key and the user limitations of those. (Is it free?)
+- What external API's it depends upon, including web links to those
+- Whether the API/request require a key and the user limitations of those. (Is it free?)
Surely this also help you get better recognition and feedback for your work.
@@ -46,8 +46,8 @@ A module can be placed in one single folder. Or multiple modules can be grouped
### Files
- **modulename/modulename.js** - This is your core module script.
-- **modulename/node_helper.js** - This is an optional helper that will be loaded by the node script. The node helper and module script can communicate with each other using an intergrated socket system.
-- **modulename/public** - Any files in this folder can be accesed via the browser on `/modulename/filename.ext`.
+- **modulename/node_helper.js** - This is an optional helper that will be loaded by the node script. The node helper and module script can communicate with each other using an integrated socket system.
+- **modulename/public** - Any files in this folder can be accessed via the browser on `/modulename/filename.ext`.
- **modulename/anyfileorfolder** Any other file or folder in the module folder can be used by the core module script. For example: *modulename/css/modulename.css* would be a good path for your additional module styles.
## The Core module file: modulename.js
@@ -89,7 +89,7 @@ After the module is initialized, the module instance has a few available module
| `this.data` | Object | The data object contain additional metadata about the module instance. (See below) |
-The `this.data` data object contain the follwoing metadata:
+The `this.data` data object contain the following metadata:
- `data.classes` - The classes which are added to the module dom wrapper.
- `data.file` - The filename of the core module file.
- `data.path` - The path of the module folder.
@@ -98,7 +98,7 @@ The `this.data` data object contain the follwoing metadata:
#### `defaults: {}`
-Any properties defined in the defaults object, will be merged with the module config as defined in the user's config.js file. This is the best place to set your modules's configuration defaults. Any of the module configuration properties can be accessed using `this.config.propertyName`, but more about that later.
+Any properties defined in the defaults object, will be merged with the module config as defined in the user's config.js file. This is the best place to set your modules' configuration defaults. Any of the module configuration properties can be accessed using `this.config.propertyName`, but more about that later.
#### `requiresVersion:`
@@ -134,7 +134,7 @@ loaded: function(callback) {
````
#### `start()`
-This method is called when all modules are loaded an the system is ready to boot up. Keep in mind that the dom object for the module is not yet created. The start method is a perfect place to define any additional module properties:
+This method is called when all modules are loaded and the system is ready to boot up. Keep in mind that the dom object for the module is not yet created. The start method is a perfect place to define any additional module properties:
**Example:**
````javascript
@@ -161,7 +161,7 @@ getScripts: function() {
}
````
-**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore it's advised not to use any external urls.
+**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore, it's advised not to use any external urls.
#### `getStyles()`
@@ -174,14 +174,14 @@ The getStyles method is called to request any additional stylesheets that need t
getStyles: function() {
return [
'script.css', // will try to load it from the vendor folder, otherwise it will load is from the module folder.
- 'font-awesome.css', // this file is available in the vendor folder, so it doesn't need to be avialable in the module folder.
+ 'font-awesome.css', // this file is available in the vendor folder, so it doesn't need to be available in the module folder.
this.file('anotherfile.css'), // this file will be loaded straight from the module folder.
'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css', // this file will be loaded from the bootstrapcdn servers.
]
}
````
-**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore it's advised not to use any external urls.
+**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore, it's advised not to use any external URLs.
#### `getTranslations()`
**Should return: Dictionary**
@@ -239,7 +239,7 @@ That MagicMirror core has the ability to send notifications to modules. Or even
- `notification` - String - The notification identifier.
- `payload` - AnyType - The payload of a notification.
-- `sender` - Module - The sender of the notification. If this argument is `undefined`, the sender of the notififiction is the core system.
+- `sender` - Module - The sender of the notification. If this argument is `undefined`, the sender of the notification is the core system.
**Example:**
````javascript
@@ -346,7 +346,7 @@ Possible configurable options:
- `lockString` - String - When setting lock string, the module can not be shown without passing the correct lockstring. This way (multiple) modules can prevent a module from showing. It's considered best practice to use your modules identifier as the locksString: `this.identifier`. See *visibility locking* below.
-**Note 1:** If the hide animation is canceled, for instance because the show method is called before the hide animation was finished, the callback will not be called.
+**Note 1:** If the hide animation is cancelled, for instance because the show method is called before the hide animation was finished, the callback will not be called.
**Note 2:** If the hide animation is hijacked (an other method calls hide on the same module), the callback will not be called.
**Note 3:** If the dom is not yet created, the hide method won't work. Wait for the `DOM_OBJECTS_CREATED` [notification](#notificationreceivednotification-payload-sender).
@@ -371,7 +371,7 @@ Possible configurable options:
(*Introduced in version: 2.1.0.*)
-Visiblity locking helps the module system to prevent unwanted hide/show actions. The following scenario explains the concept:
+Visibility locking helps the module system to prevent unwanted hide/show actions. The following scenario explains the concept:
**Module B asks module A to hide:**
````javascript
@@ -436,7 +436,7 @@ If no translation is found, a fallback will be used. The fallback sequence is as
- 4. Translation as defined in core translation file of the fallback language (the first defined core translation file).
- 5. The key (identifier) of the translation.
-When adding translations to your module, it's a good idea to see if an apropriate translation is already available in the [core translation files](https://github.com/MichMich/MagicMirror/tree/master/translations). This way, your module can benefit from the existing translations.
+When adding translations to your module, it's a good idea to see if an appropriate translation is already available in the [core translation files](https://github.com/MichMich/MagicMirror/tree/master/translations). This way, your module can benefit from the existing translations.
**Example:**
````javascript
@@ -490,7 +490,7 @@ this.translate("RUNNING", {
)}); // Will return a translated string for the identifier RUNNING, replacing `{timeUntilEnd}` with the contents of the variable `timeUntilEnd` in the order that translator intended. (has a fallback)
````
-**Example swedish .json file that does not have the variable in it:**
+**Example Swedish .json file that does not have the variable in it:**
````javascript
{
"RUNNING": "Slutar",
diff --git a/modules/default/calendar/README.md b/modules/default/calendar/README.md
index b272a2d2..e0d727c8 100755
--- a/modules/default/calendar/README.md
+++ b/modules/default/calendar/README.md
@@ -32,6 +32,7 @@ The following properties can be configured:
| `defaultSymbol` | The default symbol.
**Possible values:** See [Font Awsome](http://fontawesome.io/icons/) website.
**Default value:** `calendar`
| `maxTitleLength` | The maximum title length.
**Possible values:** `10` - `50`
**Default value:** `25`
| `wrapEvents` | Wrap event titles to multiple lines. Breaks lines at the length defined by `maxTitleLength`.
**Possible values:** `true` or `false`
**Default value:** `false`
+| `maxTitleLines` | The maximum number of lines a title will wrap vertically before being cut (Only enabled if `wrapEvents` is also enabled).
**Possible values:** `0` - `10`
**Default value:** `3`
| `fetchInterval` | How often does the content needs to be fetched? (Milliseconds)
**Possible values:** `1000` - `86400000`
**Default value:** `300000` (5 minutes)
| `animationSpeed` | Speed of the update animation. (Milliseconds)
**Possible values:** `0` - `5000`
**Default value:** `2000` (2 seconds)
| `fade` | Fade the future events to black. (Gradient)
**Possible values:** `true` or `false`
**Default value:** `true`
diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js
index 38b04269..2c2970ec 100755
--- a/modules/default/calendar/calendar.js
+++ b/modules/default/calendar/calendar.js
@@ -19,6 +19,7 @@ Module.register("calendar", {
defaultRepeatingCountTitle: "",
maxTitleLength: 25,
wrapEvents: false, // wrap events to multiple lines breaking at maxTitleLength
+ maxTitleLines: 3,
fetchInterval: 5 * 60 * 1000, // Update every 5 minutes.
animationSpeed: 2000,
fade: true,
@@ -51,7 +52,7 @@ Module.register("calendar", {
// Define required scripts.
getStyles: function () {
- return ["calendar.css", "font-awesome5.css", "font-awesome5.v4shims.css"];
+ return ["calendar.css", "font-awesome.css"];
},
// Define required scripts.
@@ -220,7 +221,7 @@ Module.register("calendar", {
var titleWrapper = document.createElement("td"),
repeatingCountTitle = "";
- if (this.config.displayRepeatingCountTitle) {
+ if (this.config.displayRepeatingCountTitle && event.firstYear !== undefined) {
repeatingCountTitle = this.countTitleForUrl(event.url);
@@ -584,9 +585,10 @@ Module.register("calendar", {
* @param {string} string Text string to shorten
* @param {number} maxLength The max length of the string
* @param {boolean} wrapEvents Wrap the text after the line has reached maxLength
+ * @param {number} maxTitleLines The max number of vertical lines before cutting event title
* @returns {string} The shortened string
*/
- shorten: function (string, maxLength, wrapEvents) {
+ shorten: function (string, maxLength, wrapEvents, maxTitleLines) {
if (typeof string !== "string") {
return "";
}
@@ -595,12 +597,21 @@ Module.register("calendar", {
var temp = "";
var currentLine = "";
var words = string.split(" ");
+ var line = 0;
for (var i = 0; i < words.length; i++) {
var word = words[i];
if (currentLine.length + word.length < (typeof maxLength === "number" ? maxLength : 25) - 1) { // max - 1 to account for a space
currentLine += (word + " ");
} else {
+ line++;
+ if (line > maxTitleLines - 1) {
+ if (i < words.length) {
+ currentLine += "…";
+ }
+ break;
+ }
+
if (currentLine.length > 0) {
temp += (currentLine + "
" + word + " ");
} else {
@@ -651,7 +662,7 @@ Module.register("calendar", {
title = title.replace(needle, replacement);
}
- title = this.shorten(title, this.config.maxTitleLength, this.config.wrapEvents);
+ title = this.shorten(title, this.config.maxTitleLength, this.config.wrapEvents, this.config.maxTitleLines);
return title;
},
diff --git a/modules/default/calendar/vendor/ical.js/ical.js b/modules/default/calendar/vendor/ical.js/ical.js
index f60c5357..8f0c532b 100644
--- a/modules/default/calendar/vendor/ical.js/ical.js
+++ b/modules/default/calendar/vendor/ical.js/ical.js
@@ -80,16 +80,45 @@
}
}
- var addTZ = function(dt, name, params){
+ var addTZ = function(dt, params){
var p = parseParams(params);
- if (params && p){
- dt[name].tz = p.TZID
+ if (params && p && dt){
+ dt.tz = p.TZID
}
return dt
}
+ var parseTimestamp = function(val){
+ //typical RFC date-time format
+ var comps = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z)?$/.exec(val);
+ if (comps !== null) {
+ if (comps[7] == 'Z'){ // GMT
+ return new Date(Date.UTC(
+ parseInt(comps[1], 10),
+ parseInt(comps[2], 10)-1,
+ parseInt(comps[3], 10),
+ parseInt(comps[4], 10),
+ parseInt(comps[5], 10),
+ parseInt(comps[6], 10 )
+ ));
+ // TODO add tz
+ } else {
+ return new Date(
+ parseInt(comps[1], 10),
+ parseInt(comps[2], 10)-1,
+ parseInt(comps[3], 10),
+ parseInt(comps[4], 10),
+ parseInt(comps[5], 10),
+ parseInt(comps[6], 10)
+ );
+ }
+ }
+
+ return undefined;
+ }
+
var dateParam = function(name){
return function(val, params, curr){
@@ -108,37 +137,24 @@
comps[3]
);
- return addTZ(curr, name, params);
+ curr[name] = addTZ(curr[name], params);
+ return curr;
}
}
+ curr[name] = []
+ val.split(',').forEach(function(val){
+ var newDate = parseTimestamp(val);
+ curr[name].push(addTZ(newDate, params));
+ });
- //typical RFC date-time format
- var comps = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z)?$/.exec(val);
- if (comps !== null) {
- if (comps[7] == 'Z'){ // GMT
- curr[name] = new Date(Date.UTC(
- parseInt(comps[1], 10),
- parseInt(comps[2], 10)-1,
- parseInt(comps[3], 10),
- parseInt(comps[4], 10),
- parseInt(comps[5], 10),
- parseInt(comps[6], 10 )
- ));
- // TODO add tz
- } else {
- curr[name] = new Date(
- parseInt(comps[1], 10),
- parseInt(comps[2], 10)-1,
- parseInt(comps[3], 10),
- parseInt(comps[4], 10),
- parseInt(comps[5], 10),
- parseInt(comps[6], 10)
- );
- }
+ if (curr[name].length === 0){
+ delete curr[name];
+ } else if (curr[name].length === 1){
+ curr[name] = curr[name][0];
}
- return addTZ(curr, name, params)
+ return curr;
}
}
@@ -148,7 +164,11 @@
if (date.exdates === undefined) {
date.exdates = [];
}
- date.exdates.push(date.exdate);
+ if (Array.isArray(date.exdate)){
+ date.exdates = date.exdates.concat(date.exdate);
+ } else {
+ date.exdates.push(date.exdate);
+ }
return date;
}
}
diff --git a/modules/default/clock/clock.js b/modules/default/clock/clock.js
index 705b4303..03528bce 100644
--- a/modules/default/clock/clock.js
+++ b/modules/default/clock/clock.js
@@ -26,6 +26,7 @@ Module.register("clock",{
analogShowDate: "top", // options: false, 'top', or 'bottom'
secondsColor: "#888888",
timezone: null,
+ autoTimezone: false
},
// Define required scripts.
getScripts: function() {
@@ -39,16 +40,31 @@ Module.register("clock",{
start: function() {
Log.info("Starting module: " + this.name);
- // Schedule update interval.
- var self = this;
- setInterval(function() {
- self.updateDom();
- }, 1000);
+ if (this.config.autoTimezone) {
+ this.sendSocketNotification("AUTO_TIMEZONE");
+ } else {
+ // Schedule update interval.
+ var self = this;
+ setInterval(function() {
+ self.updateDom();
+ }, 1000);
+ }
// Set locale.
moment.locale(config.language);
},
+
+ socketNotificationReceived: function (notification, payload) {
+ if (notification === "UPDATE_TIMEZONE") {
+ var self = this;
+ self.config.timezone = payload.timezone;
+ setInterval(function() {
+ self.updateDom();
+ }, 1000);
+ }
+ },
+
// Override dom generator.
getDom: function() {
@@ -137,7 +153,8 @@ Module.register("clock",{
clockCircle.style.backgroundSize = "100%";
// The following line solves issue: https://github.com/MichMich/MagicMirror/issues/611
- clockCircle.style.border = "1px solid black";
+ // clockCircle.style.border = "1px solid black";
+ clockCircle.style.border = "rgba(0, 0, 0, 0.1)"; //Updated fix for Issue 611 where non-black backgrounds are used
} else if (this.config.analogFace != "none") {
clockCircle.style.border = "2px solid white";
diff --git a/modules/default/clock/node_helper.js b/modules/default/clock/node_helper.js
new file mode 100644
index 00000000..68258b0a
--- /dev/null
+++ b/modules/default/clock/node_helper.js
@@ -0,0 +1,29 @@
+var http = require("http");
+var NodeHelper = require("node_helper");
+
+module.exports = NodeHelper.create({
+ start: function () {
+ },
+
+ socketNotificationReceived: function (notification, payload) {
+ var self = this;
+
+ if (notification === "AUTO_TIMEZONE") {
+ console.log("Loading timezone...");
+ http.get("http://ip-api.com/json", function (req) {
+ var data = "";
+ req.on("data", function (d) {
+ data += d;
+ });
+ req.on("end", function () {
+ var body = JSON.parse(data);
+ payload.timezone = body.timezone;
+ self.sendSocketNotification("UPDATE_TIMEZONE", payload);
+ });
+ }).on("error", function () {
+ payload.error = "Could not figure out the timezone.";
+ self.sendSocketNotification("UPDATE_TIMEZONE", payload);
+ });
+ }
+ }
+});
diff --git a/modules/default/currentweather/currentweather.js b/modules/default/currentweather/currentweather.js
index 18ae3c71..0472b7a1 100644
--- a/modules/default/currentweather/currentweather.js
+++ b/modules/default/currentweather/currentweather.js
@@ -11,6 +11,7 @@ Module.register("currentweather",{
// Default module config.
defaults: {
+ autoLocation: false,
location: false,
locationID: false,
appid: "",
@@ -109,8 +110,19 @@ Module.register("currentweather",{
this.weatherType = null;
this.feelsLike = null;
this.loaded = false;
- this.scheduleUpdate(this.config.initialLoadDelay);
+ if (this.config.autoLocation) {
+ this.sendSocketNotification("AUTO_LOCATION");
+ } else {
+ this.scheduleUpdate(this.config.initialLoadDelay);
+ }
+ },
+
+ socketNotificationReceived: function (notification, payload) {
+ if (notification === "UPDATE_LOCATION") {
+ this.config.location = payload.location;
+ this.scheduleUpdate(this.config.initialLoadDelay);
+ }
},
// add extra information of current weather
@@ -198,16 +210,19 @@ Module.register("currentweather",{
large.appendChild(weatherIcon);
var degreeLabel = "";
- if (this.config.degreeLabel) {
- switch (this.config.units ) {
+ if (this.config.units === "metric" || this.config.units === "imperial") {
+ degreeLabel += "°";
+ }
+ if(this.config.degreeLabel) {
+ switch(this.config.units) {
case "metric":
- degreeLabel = "C";
+ degreeLabel += "C";
break;
case "imperial":
- degreeLabel = "F";
+ degreeLabel += "F";
break;
case "default":
- degreeLabel = "K";
+ degreeLabel += "K";
break;
}
}
@@ -218,7 +233,7 @@ Module.register("currentweather",{
var temperature = document.createElement("span");
temperature.className = "bright";
- temperature.innerHTML = " " + this.temperature.replace(".", this.config.decimalSymbol) + "°" + degreeLabel;
+ temperature.innerHTML = " " + this.temperature.replace(".", this.config.decimalSymbol) + degreeLabel;
large.appendChild(temperature);
if (this.config.showIndoorTemperature && this.indoorTemperature) {
@@ -228,7 +243,7 @@ Module.register("currentweather",{
var indoorTemperatureElem = document.createElement("span");
indoorTemperatureElem.className = "bright";
- indoorTemperatureElem.innerHTML = " " + this.indoorTemperature.replace(".", this.config.decimalSymbol) + "°" + degreeLabel;
+ indoorTemperatureElem.innerHTML = " " + this.indoorTemperature.replace(".", this.config.decimalSymbol) + degreeLabel;
large.appendChild(indoorTemperatureElem);
}
@@ -251,7 +266,7 @@ Module.register("currentweather",{
var feelsLike = document.createElement("span");
feelsLike.className = "dimmed";
- feelsLike.innerHTML = this.translate("FEELS") + " " + this.feelsLike + "°" + degreeLabel;
+ feelsLike.innerHTML = this.translate("FEELS") + " " + this.feelsLike + degreeLabel;
small.appendChild(feelsLike);
wrapper.appendChild(small);
diff --git a/modules/default/currentweather/node_helper.js b/modules/default/currentweather/node_helper.js
new file mode 100644
index 00000000..53956f62
--- /dev/null
+++ b/modules/default/currentweather/node_helper.js
@@ -0,0 +1,29 @@
+var http = require("http");
+var NodeHelper = require("node_helper");
+
+module.exports = NodeHelper.create({
+ start: function () {
+ },
+
+ socketNotificationReceived: function (notification, payload) {
+ var self = this;
+
+ if (notification === "AUTO_LOCATION") {
+ console.log("Loading timezone...");
+ http.get("http://ip-api.com/json", function (req) {
+ var data = "";
+ req.on("data", function (d) {
+ data += d;
+ });
+ req.on("end", function () {
+ var body = JSON.parse(data);
+ payload.location = body.city + ", " + body.regionName;
+ self.sendSocketNotification("UPDATE_LOCATION", payload);
+ });
+ }).on("error", function () {
+ payload.error = "Could not figure out the timezone.";
+ self.sendSocketNotification("UPDATE_LOCATION", payload);
+ });
+ }
+ }
+});
diff --git a/modules/default/updatenotification/node_helper.js b/modules/default/updatenotification/node_helper.js
index df989faa..f4014519 100644
--- a/modules/default/updatenotification/node_helper.js
+++ b/modules/default/updatenotification/node_helper.js
@@ -65,8 +65,10 @@ module.exports = NodeHelper.create({
data.module = sg.module;
if (!err) {
sg.git.log({"-1": null}, function(err, data2) {
- data.hash = data2.latest.hash;
- self.sendSocketNotification("STATUS", data);
+ if (!err && data2.latest && "hash" in data2.latest) {
+ data.hash = data2.latest.hash;
+ self.sendSocketNotification("STATUS", data);
+ }
});
}
});
diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md
index 89e65de1..d15a208f 100644
--- a/modules/default/weather/README.md
+++ b/modules/default/weather/README.md
@@ -2,7 +2,7 @@
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.
+The biggest change 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.
@@ -70,7 +70,10 @@ The following properties can be configured:
| ---------------------------- | -----------
| `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`
+| `showPrecipitationAmount` | Show the amount of rain/snow in the forecast
**Possible values:** `true` or `false`
**Default value:** `false`
+| `fade` | Fade the future events to black. (Gradient)
**Possible values:** `true` or `false`
**Default value:** `true`
+| `fadePoint` | Where to start fade?
**Possible values:** `0` (top of the list) - `1` (bottom of list)
**Default value:** `0.25`
+| `maxNumberOfDays` | How many days of forecast to return. Specified by config.js
**Possible values:** `1` - `16`
**Default value:** `5` (5 days)
This value is optional. By default the weatherforecast module will return 5 days.
### Openweathermap options
@@ -78,17 +81,17 @@ The following properties can be configured:
| ---------------------------- | -----------
| `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'`
+| `weatherEndpoint` | The OpenWeatherMap API endPoint.
**Possible values:** `/weather`, `/forecast` (free users) or `/forecast/daily` (paying users or old apiKey only)
**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**
+| `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**
+| `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.njk b/modules/default/weather/current.njk
index aed51ac6..64d22e7b 100644
--- a/modules/default/weather/current.njk
+++ b/modules/default/weather/current.njk
@@ -4,31 +4,30 @@
{% if config.useBeaufort %}
- {{current.beaufortWindSpeed() | round}}
+ {{ current.beaufortWindSpeed() | round }}
{% else %}
- {{current.windSpeed | round}}
+ {{ current.windSpeed | round }}
{% endif %}
-
{% if config.showWindDirection %}
{% if config.showWindDirectionAsArrow %}
-
+
{% else %}
- {{current.cardinalWindDirection() | translate}}
+ {{ current.cardinalWindDirection() | translate }}
{% endif %}
{% endif %}
{% if config.showHumidity and current.humidity %}
- {{ current.humidity }}
+ {{ current.humidity | decimalSymbol }}
{% endif %}
-
+
{% if current.nextSunAction() == "sunset" %}
- {{current.sunset | formatTime}}
+ {{ current.sunset | formatTime }}
{% else %}
- {{current.sunrise | formatTime}}
+ {{ current.sunrise | formatTime }}
{% endif %}
@@ -36,33 +35,39 @@
- {{current.temperature | roundValue | unit("temperature")}}
+ {{ current.temperature | roundValue | unit("temperature") | decimalSymbol }}
+
+
{% if config.showIndoorTemperature and indoor.temperature %}
-
-
- {{indoor.temperature | roundValue | unit("temperature")}}
-
+
+
+
+ {{ indoor.temperature | roundValue | unit("temperature") | decimalSymbol }}
+
+
{% endif %}
{% if config.showIndoorHumidity and indoor.humidity %}
-
-
- {{indoor.humidity | roundValue}}%
-
+
+
+
+ {{ indoor.humidity | roundValue | unit("humidity") | decimalSymbol }}
+
+
{% endif %}
{% if config.showFeelsLike and not config.onlyTemp %}
- {{ "FEELS" | translate }} {{ current.feelsLike() | roundValue | unit("temperature") }}
+ {{ "FEELS" | translate }} {{ current.feelsLike() | roundValue | unit("temperature") | decimalSymbol }}
{% endif %}
{% else %}
- {{"LOADING" | translate}}
+ {{ "LOADING" | translate | safe }}
{% endif %}
-
+
diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk
index 1f247867..8e997c85 100644
--- a/modules/default/weather/forecast.njk
+++ b/modules/default/weather/forecast.njk
@@ -1,26 +1,32 @@
{% if forecast %}
-
+ {% set numSteps = forecast | calcNumSteps %}
+ {% set currentStep = 0 %}
+
+ {% set forecast = forecast.slice(0, numSteps) %}
{% for f in forecast %}
-
- {{f.date.format('ddd')}} |
- |
+
+ {{ f.date.format('ddd') }} |
+ |
- {{f.maxTemperature | roundValue | unit("temperature")}}
+ {{ f.maxTemperature | roundValue | unit("temperature") }}
|
- {{f.minTemperature | roundValue | unit("temperature")}}
+ {{ f.minTemperature | roundValue | unit("temperature") }}
|
- {% if config.showRainAmount %}
-
- {{f.rain | unit("rain")}}
+ {% if config.showPrecipitationAmount %}
+ |
+ {{ f.precipitation | unit("precip") }}
|
{% endif %}
+ {% set currentStep = currentStep + 1 %}
{% endfor %}
{% else %}
- {{"LOADING" | translate}}
+
+ {{ "LOADING" | translate | safe }}
+
{% endif %}
-
+
diff --git a/modules/default/weather/providers/README.md b/modules/default/weather/providers/README.md
index f204a88a..85d9c3c5 100644
--- a/modules/default/weather/providers/README.md
+++ b/modules/default/weather/providers/README.md
@@ -103,6 +103,8 @@ A convinience function to make requests. It returns a promise.
| 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` |
+| snow | `number` | Metric: `millimeters`
Imperial: `inches` |
+| precipitation | `number` | Metric: `millimeters`
Imperial: `inches` |
#### Current weather
diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js
index 4b1bc4ee..7bfc4c0f 100644
--- a/modules/default/weather/providers/darksky.js
+++ b/modules/default/weather/providers/darksky.js
@@ -8,6 +8,7 @@
* MIT Licensed
*
* This class is a provider for Dark Sky.
+ * Note that the Dark Sky API does not provide rainfall. Instead it provides snowfall and precipitation probability
*/
WeatherProvider.register("darksky", {
// Set the name of the provider.
@@ -81,12 +82,20 @@ WeatherProvider.register("darksky", {
weather.minTemperature = forecast.temperatureMin;
weather.maxTemperature = forecast.temperatureMax;
weather.weatherType = this.convertWeatherType(forecast.icon);
- if (this.config.units === "metric" && !isNaN(forecast.precipAccumulation)) {
- weather.rain = forecast.precipAccumulation * 10;
- } else {
- weather.rain = forecast.precipAccumulation;
+ weather.snow = 0;
+
+ // The API will return centimeters if units is 'si' and will return inches for 'us'
+ // Note that the Dark Sky API does not provide rainfall. Instead it provides snowfall and precipitation probability
+ if (forecast.hasOwnProperty("precipAccumulation")) {
+ if (this.config.units === "imperial" && !isNaN(forecast.precipAccumulation)) {
+ weather.snow = forecast.precipAccumulation;
+ } else if (!isNaN(forecast.precipAccumulation)) {
+ weather.snow = forecast.precipAccumulation * 10;
+ }
}
+ weather.precipitation = weather.snow;
+
days.push(weather);
}
diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js
index 89ccfcf5..e388e278 100644
--- a/modules/default/weather/providers/openweathermap.js
+++ b/modules/default/weather/providers/openweathermap.js
@@ -5,7 +5,7 @@
*
* By Michael Teeuw http://michaelteeuw.nl
* MIT Licensed.
- *
+ *
* This class is the blueprint for a weather provider.
*/
@@ -56,8 +56,6 @@ WeatherProvider.register("openweathermap", {
})
},
-
-
/** OpenWeatherMap Specific Methods - These are not part of the default provider methods */
/*
* Gets the complete url for the request
@@ -66,7 +64,7 @@ WeatherProvider.register("openweathermap", {
return this.config.apiBase + this.config.apiVersion + this.config.weatherEndpoint + this.getParams();
},
- /*
+ /*
* Generate a WeatherObject based on currentWeatherInformation
*/
generateWeatherObjectFromCurrentWeather(currentWeatherData) {
@@ -87,6 +85,105 @@ WeatherProvider.register("openweathermap", {
* Generate WeatherObjects based on forecast information
*/
generateWeatherObjectsFromForecast(forecasts) {
+
+ if (this.config.weatherEndpoint == "/forecast") {
+ return this.fetchForecastHourly(forecasts);
+ } else if (this.config.weatherEndpoint == "/forecast/daily") {
+ return this.fetchForecastDaily(forecasts);
+ }
+ // if weatherEndpoint does not match forecast or forecast/daily, what should be returned?
+ const days = [new WeatherObject(this.config.units)];
+ return days;
+ },
+
+ /*
+ * fetch forecast information for 3-hourly forecast (available for free subscription).
+ */
+ fetchForecastHourly(forecasts) {
+ // initial variable declaration
+ const days = [];
+ // variables for temperature range and rain
+ var minTemp = [];
+ var maxTemp = [];
+ var rain = 0;
+ var snow = 0;
+ // variable for date
+ let date = "";
+ var weather = new WeatherObject(this.config.units);
+
+ for (const forecast of forecasts) {
+
+ if (date !== moment(forecast.dt, "X").format("YYYY-MM-DD")) {
+ // calculate minimum/maximum temperature, specify rain amount
+ weather.minTemperature = Math.min.apply(null, minTemp);
+ weather.maxTemperature = Math.max.apply(null, maxTemp);
+ weather.rain = rain;
+ weather.snow = snow;
+ weather.precipitation = weather.rain + weather.snow;
+ // push weather information to days array
+ days.push(weather);
+ // create new weather-object
+ weather = new WeatherObject(this.config.units);
+
+ minTemp = [];
+ maxTemp = [];
+ rain = 0;
+ snow = 0;
+
+ // set new date
+ date = moment(forecast.dt, "X").format("YYYY-MM-DD");
+
+ // specify date
+ weather.date = moment(forecast.dt, "X");
+
+ // If the first value of today is later than 17:00, we have an icon at least!
+ weather.weatherType = this.convertWeatherType(forecast.weather[0].icon);
+
+ }
+
+ if (moment(forecast.dt, "X").format("H") >= 8 && moment(forecast.dt, "X").format("H") <= 17) {
+ weather.weatherType = this.convertWeatherType(forecast.weather[0].icon);
+ }
+
+ // the same day as before
+ // add values from forecast to corresponding variables
+ minTemp.push(forecast.main.temp_min);
+ maxTemp.push(forecast.main.temp_max);
+
+ if (forecast.hasOwnProperty("rain")) {
+ if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) {
+ rain += forecast.rain["3h"] / 25.4;
+ } else if (!isNaN(forecast.rain["3h"])) {
+ rain += forecast.rain["3h"];
+ }
+ }
+
+ if (forecast.hasOwnProperty("snow")) {
+ if (this.config.units === "imperial" && !isNaN(forecast.snow["3h"])) {
+ snow += forecast.snow["3h"] / 25.4;
+ } else if (!isNaN(forecast.snow["3h"])) {
+ snow += forecast.snow["3h"];
+ }
+ }
+ }
+
+ // last day
+ // calculate minimum/maximum temperature, specify rain amount
+ weather.minTemperature = Math.min.apply(null, minTemp);
+ weather.maxTemperature = Math.max.apply(null, maxTemp);
+ weather.rain = rain;
+ weather.snow = snow;
+ weather.precipitation = weather.rain + weather.snow;
+ // push weather information to days array
+ days.push(weather);
+ return days.slice(1);
+ },
+
+ /*
+ * fetch forecast information for daily forecast (available for paid subscription or old apiKey).
+ */
+ fetchForecastDaily(forecasts) {
+ // initial variable declaration
const days = [];
for (const forecast of forecasts) {
@@ -96,16 +193,35 @@ WeatherProvider.register("openweathermap", {
weather.minTemperature = forecast.temp.min;
weather.maxTemperature = forecast.temp.max;
weather.weatherType = this.convertWeatherType(forecast.weather[0].icon);
- if (this.config.units === "imperial" && !isNaN(forecast.rain)) {
- weather.rain = forecast.rain / 25.4
- } else {
- weather.rain = forecast.rain;
+ weather.rain = 0;
+ weather.snow = 0;
+
+ // forecast.rain not available if amount is zero
+ // The API always returns in millimeters
+ if (forecast.hasOwnProperty("rain")) {
+ if (this.config.units === "imperial" && !isNaN(forecast.rain)) {
+ weather.rain = forecast.rain / 25.4;
+ } else if (!isNaN(forecast.rain)) {
+ weather.rain = forecast.rain;
+ }
}
+ // forecast.snow not available if amount is zero
+ // The API always returns in millimeters
+ if (forecast.hasOwnProperty("snow")) {
+ if (this.config.units === "imperial" && !isNaN(forecast.snow)) {
+ weather.snow = forecast.snow / 25.4;
+ } else if (!isNaN(forecast.snow)) {
+ weather.snow = forecast.snow;
+ }
+ }
+
+ weather.precipitation = weather.rain + weather.snow;
+
days.push(weather);
}
- return days;
+ return days;
},
/*
diff --git a/modules/default/weather/weather.css b/modules/default/weather/weather.css
index dfa2b12a..639ce7a9 100644
--- a/modules/default/weather/weather.css
+++ b/modules/default/weather/weather.css
@@ -31,11 +31,15 @@
padding-right: 0;
}
-.weather .rain {
+.weather .precipitation {
padding-left: 20px;
padding-right: 0;
}
+.weather tr .weathericon {
+ line-height: 25px;
+}
+
.weather tr.colored .min-temp {
color: #bcddff;
}
diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js
index eff3f90e..097b1437 100644
--- a/modules/default/weather/weather.js
+++ b/modules/default/weather/weather.js
@@ -30,8 +30,12 @@ Module.register("weather",{
lang: config.language,
showHumidity: false,
degreeLabel: false,
+ decimalSymbol: ".",
showIndoorTemperature: false,
showIndoorHumidity: false,
+ maxNumberOfDays: 5,
+ fade: true,
+ fadePoint: 0.25, // Start on 1/4th of the list.
initialLoadDelay: 0, // 0 seconds delay
retryDelay: 2500,
@@ -45,7 +49,7 @@ Module.register("weather",{
tableClass: "small",
onlyTemp: false,
- showRainAmount: true,
+ showPrecipitationAmount: false,
colored: false,
showFeelsLike: true
},
@@ -58,7 +62,7 @@ Module.register("weather",{
return ["font-awesome.css", "weather-icons.css", "weather.css"];
},
- // Return the scripts that are nessecery for the weather module.
+ // Return the scripts that are necessary for the weather module.
getScripts: function () {
return [
"moment.js",
@@ -184,7 +188,9 @@ Module.register("weather",{
this.nunjucksEnvironment().addFilter("unit", function (value, type) {
if (type === "temperature") {
- value += "°";
+ if (this.config.units === "metric" || this.config.units === "imperial") {
+ value += "°";
+ }
if (this.config.degreeLabel) {
if (this.config.units === "metric") {
value += "C";
@@ -194,12 +200,14 @@ Module.register("weather",{
value += "K";
}
}
- } else if (type === "rain") {
- if (isNaN(value)) {
+ } else if (type === "precip") {
+ if (isNaN(value) || value === 0 || value.toFixed(2) === "0.00") {
value = "";
} else {
value = `${value.toFixed(2)} ${this.config.units === "imperial" ? "in" : "mm"}`;
}
+ } else if (type === "humidity") {
+ value += "%"
}
return value;
@@ -208,5 +216,30 @@ Module.register("weather",{
this.nunjucksEnvironment().addFilter("roundValue", function(value) {
return this.roundValue(value);
}.bind(this));
+
+ this.nunjucksEnvironment().addFilter("decimalSymbol", function(value) {
+ return value.toString().replace(/\./g, this.config.decimalSymbol);
+ }.bind(this));
+
+ this.nunjucksEnvironment().addFilter("calcNumSteps", function(forecast) {
+ return Math.min(forecast.length, this.config.maxNumberOfDays);
+ }.bind(this));
+
+ this.nunjucksEnvironment().addFilter("opacity", function(currentStep, numSteps) {
+ if (this.config.fade && this.config.fadePoint < 1) {
+ if (this.config.fadePoint < 0) {
+ this.config.fadePoint = 0;
+ }
+ var startingPoint = numSteps * this.config.fadePoint;
+ var numFadesteps = numSteps - startingPoint;
+ if (currentStep >= startingPoint) {
+ return 1 - (currentStep - startingPoint) / numFadesteps;
+ } else {
+ return 1;
+ }
+ } else {
+ return 1;
+ }
+ }.bind(this));
}
});
diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js
index 8768d49d..f3b34bf2 100644
--- a/modules/default/weather/weatherobject.js
+++ b/modules/default/weather/weatherobject.js
@@ -26,6 +26,8 @@ class WeatherObject {
this.weatherType = null;
this.humidity = null;
this.rain = null;
+ this.snow = null;
+ this.precipitation = null;
}
cardinalWindDirection() {
diff --git a/modules/default/weatherforecast/node_helper.js b/modules/default/weatherforecast/node_helper.js
new file mode 100644
index 00000000..53956f62
--- /dev/null
+++ b/modules/default/weatherforecast/node_helper.js
@@ -0,0 +1,29 @@
+var http = require("http");
+var NodeHelper = require("node_helper");
+
+module.exports = NodeHelper.create({
+ start: function () {
+ },
+
+ socketNotificationReceived: function (notification, payload) {
+ var self = this;
+
+ if (notification === "AUTO_LOCATION") {
+ console.log("Loading timezone...");
+ http.get("http://ip-api.com/json", function (req) {
+ var data = "";
+ req.on("data", function (d) {
+ data += d;
+ });
+ req.on("end", function () {
+ var body = JSON.parse(data);
+ payload.location = body.city + ", " + body.regionName;
+ self.sendSocketNotification("UPDATE_LOCATION", payload);
+ });
+ }).on("error", function () {
+ payload.error = "Could not figure out the timezone.";
+ self.sendSocketNotification("UPDATE_LOCATION", payload);
+ });
+ }
+ }
+});
diff --git a/modules/default/weatherforecast/weatherforecast.js b/modules/default/weatherforecast/weatherforecast.js
index a29abc16..c32821db 100644
--- a/modules/default/weatherforecast/weatherforecast.js
+++ b/modules/default/weatherforecast/weatherforecast.js
@@ -11,6 +11,7 @@ Module.register("weatherforecast",{
// Default module config.
defaults: {
+ autoLocation: false,
location: false,
locationID: false,
appid: "",
@@ -95,10 +96,20 @@ Module.register("weatherforecast",{
this.forecast = [];
this.loaded = false;
- this.scheduleUpdate(this.config.initialLoadDelay);
-
this.updateTimer = null;
+ if (this.config.autoLocation) {
+ this.sendSocketNotification("AUTO_LOCATION");
+ } else {
+ this.scheduleUpdate(this.config.initialLoadDelay);
+ }
+ },
+
+ socketNotificationReceived: function (notification, payload) {
+ if (notification === "UPDATE_LOCATION") {
+ this.config.location = payload.location;
+ this.scheduleUpdate(this.config.initialLoadDelay);
+ }
},
// Override dom generator.
@@ -142,14 +153,17 @@ Module.register("weatherforecast",{
icon.className = "wi weathericon " + forecast.icon;
iconCell.appendChild(icon);
- var degreeLabel = "°";
+ var degreeLabel = "";
+ if (this.config.units === "metric" || this.config.units === "imperial") {
+ 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";
diff --git a/package-lock.json b/package-lock.json
index 281f5ada..124aa864 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,9 +1,66 @@
{
"name": "magicmirror",
- "version": "2.6.0",
+ "version": "2.7.0-develop",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ },
+ "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
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
"@octokit/rest": {
"version": "14.0.5",
"resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-14.0.5.tgz",
@@ -85,13 +142,10 @@
}
},
"acorn-jsx": {
- "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": "^5.0.3"
- }
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
+ "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
+ "dev": true
},
"after": {
"version": "0.8.2",
@@ -395,6 +449,12 @@
"integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
"dev": true
},
+ "astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "dev": true
+ },
"async": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
@@ -441,17 +501,6 @@
"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",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
- }
- },
"babel-polyfill": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
@@ -1225,9 +1274,9 @@
},
"dependencies": {
"semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
"dev": true
}
}
@@ -1470,24 +1519,6 @@
"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",
@@ -1663,12 +1694,12 @@
"dev": true
},
"electron": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.16.tgz",
- "integrity": "sha512-mlC91VDuBU8x9tdGGISznrBCsnPKO1tBskXtBQhceBt0zWUZtV6eURVF5RaY5QK5Q+eBzVJbFT4+LUVupNwhSg==",
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-3.0.13.tgz",
+ "integrity": "sha512-tfx5jFgXhCmpe6oPjcesaRj7geHqQxrJdbpseanRzL9BbyYUtsj0HoxwPAUvCx4+52P6XryBwWTvne/1eBVf9Q==",
"requires": {
"@types/node": "^8.0.24",
- "electron-download": "^3.0.1",
+ "electron-download": "^4.1.0",
"extract-zip": "^1.0.3"
}
},
@@ -1727,19 +1758,39 @@
}
},
"electron-download": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz",
- "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz",
+ "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==",
"requires": {
- "debug": "^2.2.0",
- "fs-extra": "^0.30.0",
- "home-path": "^1.0.1",
+ "debug": "^3.0.0",
+ "env-paths": "^1.0.0",
+ "fs-extra": "^4.0.1",
"minimist": "^1.2.0",
- "nugget": "^2.0.0",
- "path-exists": "^2.1.0",
- "rc": "^1.1.2",
- "semver": "^5.3.0",
- "sumchecker": "^1.2.0"
+ "nugget": "^2.0.1",
+ "path-exists": "^3.0.0",
+ "rc": "^1.2.1",
+ "semver": "^5.4.1",
+ "sumchecker": "^2.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ }
}
},
"electron-to-chromium": {
@@ -1843,8 +1894,7 @@
"env-paths": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
- "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=",
- "dev": true
+ "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA="
},
"error-ex": {
"version": "1.3.1",
@@ -1854,34 +1904,11 @@
"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",
- "integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ=="
+ "integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ==",
+ "dev": true
},
"es6-promisify": {
"version": "5.0.0",
@@ -1931,32 +1958,31 @@
}
},
"eslint": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.1.0.tgz",
- "integrity": "sha512-DyH6JsoA1KzA5+OSWFjg56DFJT+sDLO0yokaPZ9qY0UEmYrPA1gEX/G1MnVkmRDsksG4H1foIVz2ZXXM3hHYvw==",
+ "version": "5.11.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.11.1.tgz",
+ "integrity": "sha512-gOKhM8JwlFOc2acbOrkYR05NW8M6DCMSvfcJiBB5NDxRE1gv8kbvxKaC9u69e6ZGEMWXcswA/7eKR229cEIpvg==",
"dev": true,
"requires": {
- "ajv": "^6.5.0",
- "babel-code-frame": "^6.26.0",
+ "@babel/code-frame": "^7.0.0",
+ "ajv": "^6.5.3",
"chalk": "^2.1.0",
"cross-spawn": "^6.0.5",
- "debug": "^3.1.0",
+ "debug": "^4.0.1",
"doctrine": "^2.1.0",
"eslint-scope": "^4.0.0",
"eslint-utils": "^1.3.1",
"eslint-visitor-keys": "^1.0.0",
- "espree": "^4.0.0",
+ "espree": "^5.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.7.0",
- "ignore": "^3.3.3",
+ "ignore": "^4.0.6",
"imurmurhash": "^0.1.4",
- "inquirer": "^5.2.0",
- "is-resolvable": "^1.1.0",
- "js-yaml": "^3.11.0",
+ "inquirer": "^6.1.0",
+ "js-yaml": "^3.12.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.3.0",
"lodash": "^4.17.5",
@@ -1967,34 +1993,15 @@
"path-is-inside": "^1.0.2",
"pluralize": "^7.0.0",
"progress": "^2.0.0",
- "regexpp": "^1.1.0",
+ "regexpp": "^2.0.1",
"require-uncached": "^1.0.3",
- "semver": "^5.5.0",
- "string.prototype.matchall": "^2.0.0",
+ "semver": "^5.5.1",
"strip-ansi": "^4.0.0",
"strip-json-comments": "^2.0.1",
- "table": "^4.0.3",
+ "table": "^5.0.2",
"text-table": "^0.2.0"
},
"dependencies": {
- "ajv": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz",
- "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^2.0.1",
- "fast-json-stable-stringify": "^2.0.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",
@@ -2022,18 +2029,18 @@
}
},
"debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
}
},
"esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"fast-deep-equal": {
@@ -2048,6 +2055,12 @@
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "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",
@@ -2071,38 +2084,31 @@
"dev": true
},
"lodash": {
- "version": "4.17.10",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
"dev": true
},
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"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"
- }
- },
"semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
"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==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz",
+ "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==",
"dev": true,
"requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
"is-fullwidth-code-point": "^2.0.0"
}
},
@@ -2126,26 +2132,38 @@
}
},
"supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"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==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz",
+ "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==",
"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",
+ "ajv": "^6.6.1",
+ "lodash": "^4.17.11",
+ "slice-ansi": "2.0.0",
"string-width": "^2.1.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
+ "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+ "dev": true,
+ "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"
+ }
+ }
}
}
}
@@ -2173,19 +2191,20 @@
"dev": true
},
"espree": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz",
- "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz",
+ "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==",
"dev": true,
"requires": {
- "acorn": "^5.6.0",
- "acorn-jsx": "^4.1.1"
+ "acorn": "^6.0.2",
+ "acorn-jsx": "^5.0.0",
+ "eslint-visitor-keys": "^1.0.0"
},
"dependencies": {
"acorn": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz",
- "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==",
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz",
+ "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==",
"dev": true
}
}
@@ -2228,7 +2247,7 @@
},
"eventemitter2": {
"version": "0.4.14",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
+ "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
"integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
"dev": true
},
@@ -2574,7 +2593,7 @@
},
"findup-sync": {
"version": "0.3.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
+ "resolved": "http://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
"integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
"dev": true,
"requires": {
@@ -2623,12 +2642,6 @@
"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",
@@ -2667,15 +2680,23 @@
"dev": true
},
"fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
"requires": {
"graceful-fs": "^4.1.2",
- "jsonfile": "^2.1.0",
- "klaw": "^1.0.0",
- "path-is-absolute": "^1.0.0",
- "rimraf": "^2.2.8"
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "dependencies": {
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ }
}
},
"fs.realpath": {
@@ -2683,12 +2704,6 @@
"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",
@@ -2779,9 +2794,9 @@
}
},
"globals": {
- "version": "11.7.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
- "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==",
+ "version": "11.9.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+ "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
"dev": true
},
"globby": {
@@ -2891,7 +2906,7 @@
},
"grunt-cli": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
+ "resolved": "http://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
"integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
"dev": true,
"requires": {
@@ -2901,28 +2916,29 @@
"resolve": "~1.1.0"
}
},
- "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==",
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
"dev": true,
"requires": {
- "glob": "^7.0.5"
+ "glob": "^7.1.3"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": 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"
+ }
+ }
}
}
}
@@ -2964,9 +2980,9 @@
"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==",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
@@ -2985,9 +3001,9 @@
}
},
"grunt-known-options": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz",
- "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
+ "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
"dev": true
},
"grunt-legacy-log": {
@@ -3003,9 +3019,9 @@
},
"dependencies": {
"lodash": {
- "version": "4.17.10",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
"dev": true
}
}
@@ -3047,15 +3063,15 @@
"dev": true
},
"lodash": {
- "version": "4.17.10",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
"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==",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
@@ -3079,9 +3095,9 @@
},
"dependencies": {
"lodash": {
- "version": "4.17.10",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
"dev": true
}
}
@@ -3120,9 +3136,9 @@
}
},
"grunt-stylelint": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.10.0.tgz",
- "integrity": "sha512-1HC3H1CZlK3niJGORr+1nmcdtogoSiZex7ej9MtJPXVmxrvWvXTVhZppKoPVVQgHRvNozmtGCZTZr7c9kMPO5g==",
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.10.1.tgz",
+ "integrity": "sha512-7MAHUqySn2x0yCS4SEkrv5pVoTrP44j8IZGEF6UTQD9Nm7K96cGEhB6FFMWk+uXbRHiiU+c4s3B0h4rpT8nOyQ==",
"dev": true,
"requires": {
"chalk": "1.1.3"
@@ -3199,15 +3215,6 @@
}
}
},
- "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": {
- "function-bind": "^1.1.1"
- }
- },
"has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
@@ -3249,12 +3256,6 @@
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
},
- "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",
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
@@ -3493,23 +3494,23 @@
"integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4="
},
"inquirer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz",
- "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz",
+ "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==",
"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.1.0",
+ "external-editor": "^3.0.0",
"figures": "^2.0.0",
- "lodash": "^4.3.0",
+ "lodash": "^4.17.10",
"mute-stream": "0.0.7",
"run-async": "^2.2.0",
- "rxjs": "^5.5.2",
+ "rxjs": "^6.1.0",
"string-width": "^2.1.0",
- "strip-ansi": "^4.0.0",
+ "strip-ansi": "^5.0.0",
"through": "^2.3.6"
},
"dependencies": {
@@ -3539,14 +3540,20 @@
"supports-color": "^5.3.0"
}
},
+ "chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
"external-editor": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
- "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
+ "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
"dev": true,
"requires": {
- "chardet": "^0.4.0",
- "iconv-lite": "^0.4.17",
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
"tmp": "^0.0.33"
}
},
@@ -3556,6 +3563,15 @@
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
"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",
@@ -3563,9 +3579,9 @@
"dev": true
},
"lodash": {
- "version": "4.17.10",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
"dev": true
},
"string-width": {
@@ -3576,34 +3592,44 @@
"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=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz",
+ "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==",
"dev": true,
"requires": {
- "ansi-regex": "^3.0.0"
+ "ansi-regex": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
+ "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==",
+ "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==",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"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"
- }
}
}
},
@@ -3664,18 +3690,6 @@
"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",
@@ -3809,27 +3823,12 @@
"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",
"integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
"dev": true
},
- "is-resolvable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
- "dev": true
- },
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -3842,12 +3841,6 @@
"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",
@@ -3910,9 +3903,9 @@
"dev": true
},
"js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"js-yaml": {
@@ -4137,6 +4130,7 @@
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
"integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+ "dev": true,
"requires": {
"graceful-fs": "^4.1.6"
}
@@ -4183,14 +4177,6 @@
"is-buffer": "^1.1.5"
}
},
- "klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
- "requires": {
- "graceful-fs": "^4.1.9"
- }
- },
"lazystream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
@@ -4681,9 +4667,9 @@
}
},
"moment": {
- "version": "2.22.2",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz",
- "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y="
+ "version": "2.23.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.23.0.tgz",
+ "integrity": "sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA=="
},
"ms": {
"version": "2.0.0",
@@ -4708,9 +4694,9 @@
"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==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
"nocache": {
@@ -5456,9 +5442,9 @@
"dev": true
},
"progress": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
- "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
"progress-stream": {
@@ -5642,19 +5628,10 @@
"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==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
"dev": true
},
"remark": {
@@ -5836,7 +5813,7 @@
},
"require-uncached": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
"integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
"dev": true,
"requires": {
@@ -5846,7 +5823,7 @@
},
"resolve": {
"version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
"integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
"dev": true
},
@@ -5888,6 +5865,7 @@
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
"integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
+ "dev": true,
"requires": {
"glob": "^7.0.5"
}
@@ -5922,12 +5900,12 @@
}
},
"rxjs": {
- "version": "5.5.11",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz",
- "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==",
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+ "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
"dev": true,
"requires": {
- "symbol-observable": "1.0.1"
+ "tslib": "^1.9.0"
}
},
"safe-buffer": {
@@ -6237,19 +6215,6 @@
"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",
@@ -6680,12 +6645,11 @@
}
},
"sumchecker": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz",
- "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz",
+ "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=",
"requires": {
- "debug": "^2.2.0",
- "es6-promise": "^4.0.5"
+ "debug": "^2.2.0"
}
},
"supports-color": {
@@ -6721,12 +6685,6 @@
"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",
@@ -6982,6 +6940,12 @@
"integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=",
"dev": true
},
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
+ },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -7037,9 +7001,9 @@
"dev": true
},
"underscore.string": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
- "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
+ "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
"dev": true,
"requires": {
"sprintf-js": "^1.0.3",
@@ -7133,6 +7097,11 @@
"unist-util-is": "^2.1.1"
}
},
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ },
"unix-crypt-td-js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz",
diff --git a/package.json b/package.json
index 4c8f24dd..3180f70d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "magicmirror",
- "version": "2.6.0",
+ "version": "2.7.0-develop",
"description": "The open source modular smart mirror platform.",
"main": "js/electron.js",
"scripts": {
@@ -58,7 +58,7 @@
"ajv": "6.5.5",
"body-parser": "^1.18.2",
"colors": "^1.1.2",
- "electron": "^2.0.16",
+ "electron": "^3.0.13",
"express": "^4.16.2",
"express-ipfilter": "0.3.1",
"feedme": "latest",
diff --git a/serveronly/index.js b/serveronly/index.js
index ccd4c294..3b8013ef 100644
--- a/serveronly/index.js
+++ b/serveronly/index.js
@@ -1,6 +1,5 @@
var app = require("../js/app.js");
app.start(function(config) {
- console.log("");
var bindAddress = config.address ? config.address : "localhost";
- console.log("Ready to go! Please point your browser to: http://" + bindAddress + ":" + config.port);
+ console.log("\nReady to go! Please point your browser to: http://" + bindAddress + ":" + config.port);
});
diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js
index 9454b92e..4bcfc4e8 100644
--- a/tests/e2e/env_spec.js
+++ b/tests/e2e/env_spec.js
@@ -36,7 +36,7 @@ describe("Electron app environment", function() {
it("should open a browserwindow", function() {
return app.client
.waitUntilWindowLoaded()
- .browserWindow.focus()
+ // .browserWindow.focus()
.getWindowCount()
.should.eventually.equal(1)
.browserWindow.isMinimized()
diff --git a/translations/da.json b/translations/da.json
index 4f4f50e7..11722d64 100644
--- a/translations/da.json
+++ b/translations/da.json
@@ -6,6 +6,8 @@
"DAYAFTERTOMORROW": "I overmorgen",
"RUNNING": "Slutter om",
"EMPTY": "Ingen kommende begivenheder.",
+ "FEELS": "Føles som",
+ "WEEK": "Uge {weekNumber}",
"N": "N",
"NNE": "NNØ",
diff --git a/translations/it.json b/translations/it.json
index a5eaf2f2..e1a5b806 100644
--- a/translations/it.json
+++ b/translations/it.json
@@ -29,5 +29,7 @@
"UPDATE_NOTIFICATION": "E' disponibile un aggiornamento di MagicMirror².",
"UPDATE_NOTIFICATION_MODULE": "E' disponibile un aggiornamento del modulo {MODULE_NAME}.",
"UPDATE_INFO_SINGLE": "L'installazione è {COMMIT_COUNT} commit indietro rispetto all'attuale branch {BRANCH_NAME}.",
- "UPDATE_INFO_MULTIPLE": "L'installazione è {COMMIT_COUNT} commits indietro rispetto all'attuale branch {BRANCH_NAME}."
+ "UPDATE_INFO_MULTIPLE": "L'installazione è {COMMIT_COUNT} commits indietro rispetto all'attuale branch {BRANCH_NAME}.",
+
+ "FEELS": "Percepiti"
}
diff --git a/vendor/css/font-awesome.css b/vendor/css/font-awesome.css
new file mode 100644
index 00000000..2ba4a708
--- /dev/null
+++ b/vendor/css/font-awesome.css
@@ -0,0 +1,2 @@
+@import url("../node_modules/@fortawesome/fontawesome-free/css/all.min.css");
+@import url("../node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css");
\ No newline at end of file
diff --git a/vendor/package.json b/vendor/package.json
index d14f8bcb..241374cb 100644
--- a/vendor/package.json
+++ b/vendor/package.json
@@ -11,7 +11,6 @@
},
"dependencies": {
"@fortawesome/fontawesome-free": "^5.3.1",
- "font-awesome": "^4.7.0",
"moment": "^2.17.1",
"moment-timezone": "^0.5.11",
"nunjucks": "^3.0.1",
diff --git a/vendor/vendor.js b/vendor/vendor.js
index abbf1423..6acf8427 100644
--- a/vendor/vendor.js
+++ b/vendor/vendor.js
@@ -12,9 +12,7 @@ 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": "css/font-awesome.css",
"nunjucks.js": "node_modules/nunjucks/browser/nunjucks.min.js"
};