Merge pull request #1338 from MichMich/develop

Release 2.4.0
This commit is contained in:
Michael Teeuw 2018-07-01 20:50:46 +02:00 committed by GitHub
commit 3545f80920
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 1813 additions and 5983 deletions

3
.gitignore vendored
View File

@ -19,6 +19,9 @@ jspm_modules
# Visual Studio Code ignoramuses. # Visual Studio Code ignoramuses.
.vscode/ .vscode/
# IDE Code ignoramuses.
.idea/
# Various Windows ignoramuses. # Various Windows ignoramuses.
Thumbs.db Thumbs.db
ehthumbs.db ehthumbs.db

View File

@ -1,11 +1,55 @@
# MagicMirror² Change Log # MagicMirror² Change Log
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/). This project adheres to [Semantic Versioning](http://semver.org/).
---
## [2.4.0] - 2018-07-01
⚠️ **Warning:** This release includes an updated version of Electron. This requires a Raspberry Pi configuration change to allow the best performance and prevent the CPU from overheating. Please read the information on the [MagicMirror Wiki](https://github.com/michmich/magicmirror/wiki/configuring-the-raspberry-pi#enable-the-open-gl-driver-to-decrease-electrons-cpu-usage).
**Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install`
### Added
- Enabled translation of feelsLike for module currentweather
- Added support for on-going calendar events
- Added scroll up in fullscreen newsfeed article view
- Changed fullscreen newsfeed width from 100% to 100vw (better results)
- Added option to calendar module that colors only the symbol instead of the whole line
- Added option for new display format in the calendar module with date headers with times/events below.
- Ability to fetch compliments from a remote server
- Add regex filtering to calendar module
- Customize classes for table
- Added option to newsfeed module to only log error parsing a news article if enabled
- Add update translations for Português Brasileiro
### Changed
- Upgrade to Electron 2.0.0.
- Remove yarn-or-npm which breaks production builds.
- Invoke module suspend even if no dom content. [#1308](https://github.com/MichMich/MagicMirror/issues/1308)
### Fixed
- Fixed issue where wind chill could not be displayed in Fahrenheit. [#1247](https://github.com/MichMich/MagicMirror/issues/1247)
- Fixed issues where a module crashes when it tries to dismiss a non existing alert. [#1240](https://github.com/MichMich/MagicMirror/issues/1240)
- In default module currentWeather/currentWeather.js line 296, 300, self.config.animationSpeed can not be found because the notificationReceived function does not have "self" variable.
- Fixed browser-side code to work on the Midori browser.
- Fixed issue where heat index was reporting incorrect values in Celsius and Fahrenheit. [#1263](https://github.com/MichMich/MagicMirror/issues/1263)
- Fixed weatherforecast to use dt_txt field instead of dt to handle timezones better
- Newsfeed now remembers to show the description when `"ARTICLE_LESS_DETAILS"` is called if the user wants to always show the description. [#1282](https://github.com/MichMich/MagicMirror/issues/1282)
- `clientonly/*.js` is now linted, and one linting error is fixed
- Fix issue #1196 by changing underscore to hyphen in locale id, in align with momentjs.
- Fixed issue where heat index and wind chill were reporting incorrect values in Kelvin. [#1263](https://github.com/MichMich/MagicMirror/issues/1263)
### Updated
- Updated Italian translation
- Updated German translation
- Updated Dutch translation
## [2.3.1] - 2018-04-01 ## [2.3.1] - 2018-04-01
### Fixed ### Fixed
- Downgrade electron to 1.4.15 to solve the black screen issue.[#1243](https://github.com/MichMich/MagicMirror/issues/1243) - Downgrade electron to 1.4.15 to solve the black screen issue.[#1243](https://github.com/MichMich/MagicMirror/issues/1243)
## [2.3.0] - 2018-04-01 ## [2.3.0] - 2018-04-01

View File

@ -11,6 +11,7 @@ module.exports = function(grunt) {
"modules/default/*.js", "modules/default/*.js",
"modules/default/*/*.js", "modules/default/*/*.js",
"serveronly/*.js", "serveronly/*.js",
"clientonly/*.js",
"*.js", "*.js",
"tests/**/*.js", "tests/**/*.js",
"!modules/default/alert/notificationFx.js", "!modules/default/alert/notificationFx.js",

View File

@ -17,7 +17,7 @@ MagicMirror² focuses on a modular plugin system and uses [Electron](http://elec
## Table Of Contents ## Table Of Contents
- [Installation](#installation) - [Installation](#installation)
- [Raspberry Pi](#raspberrypi) - [Raspberry Pi](#raspberry-pi)
- [General](#general) - [General](#general)
- [Server Only](#server-only) - [Server Only](#server-only)
- [Client Only](#client-only) - [Client Only](#client-only)
@ -119,11 +119,11 @@ The following wiki links are helpful for the initial configuration of your Magic
### General ### General
1. Copy `config/config.js.sample` to `config/config.js`. \ 1. Copy `/home/pi/MagicMirror/config/config.js.sample` to `/home/pi/MagicMirror/config/config.js`. \
**Note:** If you used the installer script. This step is already done for you. **Note:** If you used the installer script. This step is already done for you.
2. Modify your required settings. \ 2. Modify your required settings. \
Note: You'll can check your configuration running `npm run config:check`. Note: You'll can check your configuration running `npm run config:check` in `/home/pi/MagicMirror`.
The following properties can be configured: The following properties can be configured:
@ -146,7 +146,7 @@ Module configuration:
| **Option** | **Description** | | **Option** | **Description** |
| --- | --- | | --- | --- |
| `module` | The name of the module. This can also contain the subfolder. Valid examples include `clock`, `default/calendar` and `custommodules/mymodule`. | | `module` | The name of the module. This can also contain the subfolder. Valid examples include `clock`, `default/calendar` and `custommodules/mymodule`. |
| `position` | The location of the module in which the module will be loaded. Possible values are `top_ bar`, `top_left`, `top_center`, `top_right`, `upper_third`, `middle_center`, `lower_third`, `bottom_left`, `bottom_center`, `bottom_right`, `bottom_bar`, `fullscreen_above`, and `fullscreen_below`. This field is optional but most modules require this field to set. Check the documentation of the module for more information. Multiple modules with the same position will be ordered based on the order in the configuration file. | | `position` | The location of the module in which the module will be loaded. Possible values are `top_bar`, `top_left`, `top_center`, `top_right`, `upper_third`, `middle_center`, `lower_third`, `bottom_left`, `bottom_center`, `bottom_right`, `bottom_bar`, `fullscreen_above`, and `fullscreen_below`. This field is optional but most modules require this field to set. Check the documentation of the module for more information. Multiple modules with the same position will be ordered based on the order in the configuration file. |
| `classes` | Additional classes which are passed to the module. The field is optional. | | `classes` | Additional classes which are passed to the module. The field is optional. |
| `header` | To display a header text above the module, add the header property. This field is optional. | | `header` | To display a header text above the module, add the header property. This field is optional. |
| `disabled` | Set disabled to `true` to skip creating the module. This field is optional. | | `disabled` | Set disabled to `true` to skip creating the module. This field is optional. |

View File

@ -88,7 +88,7 @@
process.stdout.write(`Client: ${err}`); process.stdout.write(`Client: ${err}`);
}); });
child.on('close', (code) => { child.on("close", (code) => {
if (code != 0) { if (code != 0) {
console.log(`There something wrong. The clientonly is not running code ${code}`); console.log(`There something wrong. The clientonly is not running code ${code}`);
} }

View File

@ -21,7 +21,7 @@ var MM = (function() {
var createDomObjects = function() { var createDomObjects = function() {
var domCreationPromises = []; var domCreationPromises = [];
modules.forEach(module => { modules.forEach(function(module) {
if (typeof module.data.position !== "string") { if (typeof module.data.position !== "string") {
return; return;
} }
@ -52,14 +52,14 @@ var MM = (function() {
var domCreationPromise = updateDom(module, 0); var domCreationPromise = updateDom(module, 0);
domCreationPromises.push(domCreationPromise); domCreationPromises.push(domCreationPromise);
domCreationPromise.then(() => { domCreationPromise.then(function() {
sendNotification("MODULE_DOM_CREATED", null, null, module); sendNotification("MODULE_DOM_CREATED", null, null, module);
}).catch(Log.error); }).catch(Log.error);
}); });
updateWrapperStates(); updateWrapperStates();
Promise.all(domCreationPromises).then(() => { Promise.all(domCreationPromises).then(function() {
sendNotification("DOM_OBJECTS_CREATED"); sendNotification("DOM_OBJECTS_CREATED");
}); });
}; };
@ -106,7 +106,7 @@ var MM = (function() {
* return Promise - Resolved when the dom is fully updated. * return Promise - Resolved when the dom is fully updated.
*/ */
var updateDom = function(module, speed) { var updateDom = function(module, speed) {
return new Promise((resolve) => { return new Promise(function(resolve) {
var newContentPromise = module.getDom(); var newContentPromise = module.getDom();
var newHeader = module.getHeader(); var newHeader = module.getHeader();
@ -115,7 +115,7 @@ var MM = (function() {
newContentPromise = Promise.resolve(newContentPromise); newContentPromise = Promise.resolve(newContentPromise);
} }
newContentPromise.then((newContent) => { newContentPromise.then(function(newContent) {
var updatePromise = updateDomWithContent(module, speed, newHeader, newContent); var updatePromise = updateDomWithContent(module, speed, newHeader, newContent);
updatePromise.then(resolve).catch(Log.error); updatePromise.then(resolve).catch(Log.error);
@ -134,7 +134,7 @@ var MM = (function() {
* return Promise - Resolved when the module dom has been updated. * return Promise - Resolved when the module dom has been updated.
*/ */
var updateDomWithContent = function(module, speed, newHeader, newContent) { var updateDomWithContent = function(module, speed, newHeader, newContent) {
return new Promise((resolve) => { return new Promise(function(resolve) {
if (module.hidden || !speed) { if (module.hidden || !speed) {
updateModuleContent(module, newHeader, newContent); updateModuleContent(module, newHeader, newContent);
resolve(); resolve();
@ -245,6 +245,9 @@ var MM = (function() {
if (typeof callback === "function") { callback(); } if (typeof callback === "function") { callback(); }
}, speed); }, speed);
} else {
// invoke callback even if no content, issue 1308
if (typeof callback === "function") { callback(); }
} }
}; };

View File

@ -81,15 +81,16 @@ var Module = Class.extend({
* return DomObject | Promise - The dom or a promise with the dom to display. * return DomObject | Promise - The dom or a promise with the dom to display.
*/ */
getDom: function () { getDom: function () {
return new Promise((resolve) => { var self = this;
return new Promise(function(resolve) {
var div = document.createElement("div"); var div = document.createElement("div");
var template = this.getTemplate(); var template = self.getTemplate();
var templateData = this.getTemplateData(); var templateData = self.getTemplateData();
// Check to see if we need to render a template string or a file. // Check to see if we need to render a template string or a file.
if (/^.*((\.html)|(\.njk))$/.test(template)) { if (/^.*((\.html)|(\.njk))$/.test(template)) {
// the template is a filename // the template is a filename
this.nunjucksEnvironment().render(template, templateData, function (err, res) { self.nunjucksEnvironment().render(template, templateData, function (err, res) {
if (err) { if (err) {
Log.error(err) Log.error(err)
} }
@ -100,7 +101,7 @@ var Module = Class.extend({
}); });
} else { } else {
// the template is a template string. // the template is a template string.
div.innerHTML = this.nunjucksEnvironment().renderString(template, templateData); div.innerHTML = self.nunjucksEnvironment().renderString(template, templateData);
resolve(div); resolve(div);
} }

View File

@ -110,11 +110,13 @@ Module.register("alert",{
}, },
hide_alert: function(sender) { hide_alert: function(sender) {
//Dismiss alert and remove from this.alerts //Dismiss alert and remove from this.alerts
this.alerts[sender.name].dismiss(); if (this.alerts[sender.name]) {
this.alerts[sender.name] = null; this.alerts[sender.name].dismiss();
//Remove overlay this.alerts[sender.name] = null;
var overlay = document.getElementById("overlay"); //Remove overlay
overlay.parentNode.removeChild(overlay); var overlay = document.getElementById("overlay");
overlay.parentNode.removeChild(overlay);
}
}, },
setPosition: function(pos) { setPosition: function(pos) {
//Add css to body depending on the set position for notifications //Add css to body depending on the set position for notifications

11
modules/default/calendar/README.md Normal file → Executable file
View File

@ -1,6 +1,7 @@
# Module: Calendar # Module: Calendar
The `calendar` module is one of the default modules of the MagicMirror. The `calendar` module is one of the default modules of the MagicMirror.
This module displays events from a public .ical calendar. It can combine multiple calendars. This module displays events from a public .ical calendar. It can combine multiple calendars.
Note that calendars may not contain any entry before 1st January 1970, otherwise the calendar won't be displayed and the module will crash.
## Using the module ## Using the module
@ -33,30 +34,34 @@ The following properties can be configured:
| `maxTitleLength` | The maximum title length. <br><br> **Possible values:** `10` - `50` <br> **Default value:** `25` | `maxTitleLength` | The maximum title length. <br><br> **Possible values:** `10` - `50` <br> **Default value:** `25`
| `wrapEvents` | Wrap event titles to multiple lines. Breaks lines at the length defined by `maxTitleLength`. <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false` | `wrapEvents` | Wrap event titles to multiple lines. Breaks lines at the length defined by `maxTitleLength`. <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false`
| `fetchInterval` | How often does the content needs to be fetched? (Milliseconds) <br><br> **Possible values:** `1000` - `86400000` <br> **Default value:** `300000` (5 minutes) | `fetchInterval` | How often does the content needs to be fetched? (Milliseconds) <br><br> **Possible values:** `1000` - `86400000` <br> **Default value:** `300000` (5 minutes)
| `animationSpeed` | Speed of the update animation. (Milliseconds) <br><br> **Possible values:**`0` - `5000` <br> **Default value:** `2000` (2 seconds) | `animationSpeed` | Speed of the update animation. (Milliseconds) <br><br> **Possible values:** `0` - `5000` <br> **Default value:** `2000` (2 seconds)
| `fade` | Fade the future events to black. (Gradient) <br><br> **Possible values:** `true` or `false` <br> **Default value:** `true` | `fade` | Fade the future events to black. (Gradient) <br><br> **Possible values:** `true` or `false` <br> **Default value:** `true`
| `fadePoint` | Where to start fade? <br><br> **Possible values:** `0` (top of the list) - `1` (bottom of list) <br> **Default value:** `0.25` | `fadePoint` | Where to start fade? <br><br> **Possible values:** `0` (top of the list) - `1` (bottom of list) <br> **Default value:** `0.25`
| `tableClass` | Name of the classes issued from `main.css`. <br><br> **Possible values:** xsmall, small, medium, large, xlarge. <br> **Default value:** _small._
| `calendars` | The list of calendars. <br><br> **Possible values:** An array, see _calendar configuration_ below. <br> **Default value:** _An example calendar._ | `calendars` | The list of calendars. <br><br> **Possible values:** An array, see _calendar configuration_ below. <br> **Default value:** _An example calendar._
| `titleReplace` | An object of textual replacements applied to the tile of the event. This allow to remove or replace certains words in the title. <br><br> **Example:** `{'Birthday of ' : '', 'foo':'bar'}` <br> **Default value:** `{ "De verjaardag van ": "", "'s birthday": "" }` | `titleReplace` | An object of textual replacements applied to the tile of the event. This allow to remove or replace certains words in the title. <br><br> **Example:** `{'Birthday of ' : '', 'foo':'bar'}` <br> **Default value:** `{ "De verjaardag van ": "", "'s birthday": "" }`
| `displayRepeatingCountTitle` | Show count title for yearly repeating events (e.g. "X. Birthday", "X. Anniversary") <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false` | `displayRepeatingCountTitle` | Show count title for yearly repeating events (e.g. "X. Birthday", "X. Anniversary") <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false`
| `dateFormat` | Format to use for the date of events (when using absolute dates) <br><br> **Possible values:** See [Moment.js formats](http://momentjs.com/docs/#/parsing/string-format/) <br> **Default value:** `MMM Do` (e.g. Jan 18th) | `dateFormat` | Format to use for the date of events (when using absolute dates) <br><br> **Possible values:** See [Moment.js formats](http://momentjs.com/docs/#/parsing/string-format/) <br> **Default value:** `MMM Do` (e.g. Jan 18th)
| `fullDayEventDateFormat` | Format to use for the date of full day events (when using absolute dates) <br><br> **Possible values:** See [Moment.js formats](http://momentjs.com/docs/#/parsing/string-format/) <br> **Default value:** `MMM Do` (e.g. Jan 18th) | `fullDayEventDateFormat` | Format to use for the date of full day events (when using absolute dates) <br><br> **Possible values:** See [Moment.js formats](http://momentjs.com/docs/#/parsing/string-format/) <br> **Default value:** `MMM Do` (e.g. Jan 18th)
| `timeFormat` | Display event times as absolute dates, or relative time <br><br> **Possible values:** `absolute` or `relative` <br> **Default value:** `relative` | `timeFormat` | Display event times as absolute dates, or relative time, or using absolute date headers with times for each event next to it <br><br> **Possible values:** `absolute` or `relative` or `dateheaders` <br> **Default value:** `relative`
| `getRelative` | How much time (in hours) should be left until calendar events start getting relative? <br><br> **Possible values:** `0` (events stay absolute) - `48` (48 hours before the event starts) <br> **Default value:** `6` | `getRelative` | How much time (in hours) should be left until calendar events start getting relative? <br><br> **Possible values:** `0` (events stay absolute) - `48` (48 hours before the event starts) <br> **Default value:** `6`
| `urgency` | When using a timeFormat of `absolute`, the `urgency` setting allows you to display events within a specific time frame as `relative`. This allows events within a certain time frame to be displayed as relative (in xx days) while others are displayed as absolute dates <br><br> **Possible values:** a positive integer representing the number of days for which you want a relative date, for example `7` (for 7 days) <br><br> **Default value:** `7` | `urgency` | When using a timeFormat of `absolute`, the `urgency` setting allows you to display events within a specific time frame as `relative`. This allows events within a certain time frame to be displayed as relative (in xx days) while others are displayed as absolute dates <br><br> **Possible values:** a positive integer representing the number of days for which you want a relative date, for example `7` (for 7 days) <br><br> **Default value:** `7`
| `broadcastEvents` | If this property is set to true, the calendar will broadcast all the events to all other modules with the notification message: `CALENDAR_EVENTS`. The event objects are stored in an array and contain the following fields: `title`, `startDate`, `endDate`, `fullDayEvent`, `location` and `geo`. <br><br> **Possible values:** `true`, `false` <br><br> **Default value:** `true` | `broadcastEvents` | If this property is set to true, the calendar will broadcast all the events to all other modules with the notification message: `CALENDAR_EVENTS`. The event objects are stored in an array and contain the following fields: `title`, `startDate`, `endDate`, `fullDayEvent`, `location` and `geo`. <br><br> **Possible values:** `true`, `false` <br><br> **Default value:** `true`
| `hidePrivate` | Hides private calendar events. <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false` | `hidePrivate` | Hides private calendar events. <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false`
| `excludedEvents` | An array of words / phrases from event titles that will be excluded from being shown. <br><br>Additionally advanced filter objects can be passed in. Below is the configuration for the advance filtering object.<br>**Required**<br>`filterBy` - string used to determine if filter is applied.<br>**Optional**<br>`until` - Time before an event to display it Ex: [`'3 days'`, `'2 months'`, `'1 week'`]<br>`caseSensitive` - By default, excludedEvents are case insensitive, set this to true to enforce case sensitivity<br><br> **Example:** `['Birthday', 'Hide This Event', {filterBy: 'Payment', until: '6 days', caseSensitive: true}]` <br> **Default value:** `[]` | `hideOngoing` | Hides calendar events that have already started. <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false`
| `excludedEvents` | An array of words / phrases from event titles that will be excluded from being shown. <br><br>Additionally advanced filter objects can be passed in. Below is the configuration for the advance filtering object.<br>**Required**<br>`filterBy` - string used to determine if filter is applied.<br>**Optional**<br>`until` - Time before an event to display it Ex: [`'3 days'`, `'2 months'`, `'1 week'`]<br>`caseSensitive` - By default, excludedEvents are case insensitive, set this to true to enforce case sensitivity<br>`regex` - set to `true` if filterBy is a regex. For those not familiar with regex it is used for pattern matching, please see [here](https://regexr.com/) for more info.<br><br> **Example:** `['Birthday', 'Hide This Event', {filterBy: 'Payment', until: '6 days', caseSensitive: true}, {filterBy: '^[0-9]{1,}.*', regex: true}]` <br> **Default value:** `[]`
### Calendar configuration ### Calendar configuration
The `calendars` property contains an array of the configured calendars. The `calendars` property contains an array of the configured calendars.
The `colored` property gives the option for an individual color for each calendar. The `colored` property gives the option for an individual color for each calendar.
The `coloredSymbolOnly` property will apply color to the symbol only, not the whole line. This is only applicable when `colored` is also enabled.
#### Default value: #### Default value:
````javascript ````javascript
config: { config: {
colored: false, colored: false,
coloredSymbolOnly: false,
calendars: [ calendars: [
{ {
url: 'http://www.calendarlabs.com/templates/ical/US-Holidays.ics', url: 'http://www.calendarlabs.com/templates/ical/US-Holidays.ics',

216
modules/default/calendar/calendar.js Normal file → Executable file
View File

@ -29,7 +29,10 @@ Module.register("calendar", {
getRelative: 6, getRelative: 6,
fadePoint: 0.25, // Start on 1/4th of the list. fadePoint: 0.25, // Start on 1/4th of the list.
hidePrivate: false, hidePrivate: false,
hideOngoing: false,
colored: false, colored: false,
coloredSymbolOnly: false,
tableClass: "small",
calendars: [ calendars: [
{ {
symbol: "calendar", symbol: "calendar",
@ -122,19 +125,39 @@ Module.register("calendar", {
var events = this.createEventList(); var events = this.createEventList();
var wrapper = document.createElement("table"); var wrapper = document.createElement("table");
wrapper.className = "small"; wrapper.className = this.config.tableClass;
if (events.length === 0) { if (events.length === 0) {
wrapper.innerHTML = (this.loaded) ? this.translate("EMPTY") : this.translate("LOADING"); wrapper.innerHTML = (this.loaded) ? this.translate("EMPTY") : this.translate("LOADING");
wrapper.className = "small dimmed"; wrapper.className = this.config.tableClass + " dimmed";
return wrapper; return wrapper;
} }
var lastSeenDate = "";
for (var e in events) { for (var e in events) {
var event = events[e]; var event = events[e];
var dateAsString = moment(event.startDate, "x").format(this.config.dateFormat);
if(this.config.timeFormat === "dateheaders"){
if(lastSeenDate !== dateAsString){
var dateRow = document.createElement("tr");
dateRow.className = "normal"
var dateCell = document.createElement("td");
dateCell.colSpan = "3";
dateCell.innerHTML = dateAsString;
dateRow.appendChild(dateCell);
wrapper.appendChild(dateRow);
lastSeenDate = dateAsString;
}
}
var eventWrapper = document.createElement("tr"); var eventWrapper = document.createElement("tr");
if (this.config.colored) { if (this.config.colored && !this.config.coloredSymbolOnly) {
eventWrapper.style.cssText = "color:" + this.colorForUrl(event.url); eventWrapper.style.cssText = "color:" + this.colorForUrl(event.url);
} }
@ -142,6 +165,11 @@ Module.register("calendar", {
if (this.config.displaySymbol) { if (this.config.displaySymbol) {
var symbolWrapper = document.createElement("td"); var symbolWrapper = document.createElement("td");
if (this.config.colored && this.config.coloredSymbolOnly) {
symbolWrapper.style.cssText = "color:" + this.colorForUrl(event.url);
}
symbolWrapper.className = "symbol align-right"; symbolWrapper.className = "symbol align-right";
var symbols = this.symbolsForUrl(event.url); var symbols = this.symbolsForUrl(event.url);
if(typeof symbols === "string") { if(typeof symbols === "string") {
@ -157,6 +185,10 @@ Module.register("calendar", {
symbolWrapper.appendChild(symbol); symbolWrapper.appendChild(symbol);
} }
eventWrapper.appendChild(symbolWrapper); eventWrapper.appendChild(symbolWrapper);
}else if(this.config.timeFormat === "dateheaders"){
var blankCell = document.createElement("td");
blankCell.innerHTML = "&nbsp;&nbsp;&nbsp;"
eventWrapper.appendChild(blankCell);
} }
var titleWrapper = document.createElement("td"), var titleWrapper = document.createElement("td"),
@ -182,89 +214,123 @@ Module.register("calendar", {
titleWrapper.className = "title"; titleWrapper.className = "title";
} }
eventWrapper.appendChild(titleWrapper); if(this.config.timeFormat === "dateheaders"){
var timeWrapper = document.createElement("td"); if (event.fullDayEvent) {
//console.log(event.today); titleWrapper.colSpan = "2";
var now = new Date(); titleWrapper.align = "left";
// Define second, minute, hour, and day variables
var oneSecond = 1000; // 1,000 milliseconds }else{
var oneMinute = oneSecond * 60; var timeWrapper = document.createElement("td");
var oneHour = oneMinute * 60; timeWrapper.className = "time light";
var oneDay = oneHour * 24; timeWrapper.align = "left";
if (event.fullDayEvent) { timeWrapper.style.paddingLeft = "2px";
if (event.today) { var timeFormatString = "";
timeWrapper.innerHTML = this.capFirst(this.translate("TODAY")); switch (config.timeFormat) {
} else if (event.startDate - now < oneDay && event.startDate - now > 0) { case 12: {
timeWrapper.innerHTML = this.capFirst(this.translate("TOMORROW")); timeFormatString = "h:mm A";
} else if (event.startDate - now < 2 * oneDay && event.startDate - now > 0) { break;
if (this.translate("DAYAFTERTOMORROW") !== "DAYAFTERTOMORROW") {
timeWrapper.innerHTML = this.capFirst(this.translate("DAYAFTERTOMORROW"));
} else {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} }
} else { case 24: {
/* Check to see if the user displays absolute or relative dates with their events timeFormatString = "HH:mm";
* Also check to see if an event is happening within an 'urgency' time frameElement break;
* For example, if the user set an .urgency of 7 days, those events that fall within that
* time frame will be displayed with 'in xxx' time format or moment.fromNow()
*
* Note: this needs to be put in its own function, as the whole thing repeats again verbatim
*/
if (this.config.timeFormat === "absolute") {
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) {
// This event falls within the config.urgency period that the user has set
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} else {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.fullDayEventDateFormat));
}
} else {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} }
default: {
timeFormatString = "HH:mm";
break;
}
}
timeWrapper.innerHTML = moment(event.startDate, "x").format(timeFormatString);
eventWrapper.appendChild(timeWrapper);
titleWrapper.align = "right";
} }
} else {
if (event.startDate >= new Date()) { eventWrapper.appendChild(titleWrapper);
if (event.startDate - now < 2 * oneDay) { }else{
// This event is within the next 48 hours (2 days) var timeWrapper = document.createElement("td");
if (event.startDate - now < this.config.getRelative * oneHour) {
// If event is within 6 hour, display 'in xxx' time format or moment.fromNow() eventWrapper.appendChild(titleWrapper);
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow()); //console.log(event.today);
var now = new Date();
// Define second, minute, hour, and day variables
var oneSecond = 1000; // 1,000 milliseconds
var oneMinute = oneSecond * 60;
var oneHour = oneMinute * 60;
var oneDay = oneHour * 24;
if (event.fullDayEvent) {
if (event.today) {
timeWrapper.innerHTML = this.capFirst(this.translate("TODAY"));
} else if (event.startDate - now < oneDay && event.startDate - now > 0) {
timeWrapper.innerHTML = this.capFirst(this.translate("TOMORROW"));
} else if (event.startDate - now < 2 * oneDay && event.startDate - now > 0) {
if (this.translate("DAYAFTERTOMORROW") !== "DAYAFTERTOMORROW") {
timeWrapper.innerHTML = this.capFirst(this.translate("DAYAFTERTOMORROW"));
} else { } else {
// Otherwise just say 'Today/Tomorrow at such-n-such time' timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").calendar());
} }
} else { } else {
/* Check to see if the user displays absolute or relative dates with their events /* Check to see if the user displays absolute or relative dates with their events
* Also check to see if an event is happening within an 'urgency' time frameElement * Also check to see if an event is happening within an 'urgency' time frameElement
* For example, if the user set an .urgency of 7 days, those events that fall within that * For example, if the user set an .urgency of 7 days, those events that fall within that
* time frame will be displayed with 'in xxx' time format or moment.fromNow() * time frame will be displayed with 'in xxx' time format or moment.fromNow()
* *
* Note: this needs to be put in its own function, as the whole thing repeats again verbatim * Note: this needs to be put in its own function, as the whole thing repeats again verbatim
*/ */
if (this.config.timeFormat === "absolute") { if (this.config.timeFormat === "absolute") {
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) { if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) {
// This event falls within the config.urgency period that the user has set // This event falls within the config.urgency period that the user has set
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow()); timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} else { } else {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat)); timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.fullDayEventDateFormat));
} }
} else { } else {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow()); timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} }
} }
} else { } else {
timeWrapper.innerHTML = this.capFirst( if (event.startDate >= new Date()) {
this.translate("RUNNING", { if (event.startDate - now < 2 * oneDay) {
fallback: this.translate("RUNNING") + " {timeUntilEnd}", // This event is within the next 48 hours (2 days)
timeUntilEnd: moment(event.endDate, "x").fromNow(true) if (event.startDate - now < this.config.getRelative * oneHour) {
}) // If event is within 6 hour, display 'in xxx' time format or moment.fromNow()
); timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} else {
// Otherwise just say 'Today/Tomorrow at such-n-such time'
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").calendar());
}
} else {
/* Check to see if the user displays absolute or relative dates with their events
* Also check to see if an event is happening within an 'urgency' time frameElement
* For example, if the user set an .urgency of 7 days, those events that fall within that
* time frame will be displayed with 'in xxx' time format or moment.fromNow()
*
* Note: this needs to be put in its own function, as the whole thing repeats again verbatim
*/
if (this.config.timeFormat === "absolute") {
if ((this.config.urgency > 1) && (event.startDate - now < (this.config.urgency * oneDay))) {
// This event falls within the config.urgency period that the user has set
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
} else {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat));
}
} else {
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
}
}
} else {
timeWrapper.innerHTML = this.capFirst(
this.translate("RUNNING", {
fallback: this.translate("RUNNING") + " {timeUntilEnd}",
timeUntilEnd: moment(event.endDate, "x").fromNow(true)
})
);
}
} }
//timeWrapper.innerHTML += ' - '+ moment(event.startDate,'x').format('lll');
//console.log(event);
timeWrapper.className = "time light";
eventWrapper.appendChild(timeWrapper);
} }
//timeWrapper.innerHTML += ' - '+ moment(event.startDate,'x').format('lll');
//console.log(event);
timeWrapper.className = "time light";
eventWrapper.appendChild(timeWrapper);
wrapper.appendChild(eventWrapper); wrapper.appendChild(eventWrapper);
@ -336,6 +402,7 @@ Module.register("calendar", {
createEventList: function () { createEventList: function () {
var events = []; var events = [];
var today = moment().startOf("day"); var today = moment().startOf("day");
var now = new Date();
for (var c in this.calendarData) { for (var c in this.calendarData) {
var calendar = this.calendarData[c]; var calendar = this.calendarData[c];
for (var e in calendar) { for (var e in calendar) {
@ -346,6 +413,14 @@ Module.register("calendar", {
continue; continue;
} }
} }
if(this.config.hideOngoing) {
if(event.startDate < now) {
continue;
}
}
if(this.listContainsEvent(events,event)){
continue;
}
event.url = c; event.url = c;
event.today = event.startDate >= today && event.startDate < (today + 24 * 60 * 60 * 1000); event.today = event.startDate >= today && event.startDate < (today + 24 * 60 * 60 * 1000);
events.push(event); events.push(event);
@ -359,6 +434,17 @@ Module.register("calendar", {
return events.slice(0, this.config.maximumEntries); return events.slice(0, this.config.maximumEntries);
}, },
listContainsEvent: function(eventList, event){
for(let evt of eventList){
if(evt.title === event.title && parseInt(evt.startDate) === parseInt(event.startDate)){
return true;
}
}
return false;
},
/* createEventList(url) /* createEventList(url)
* Requests node helper to add calendar url. * Requests node helper to add calendar url.
* *

View File

@ -119,19 +119,29 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri
for (var f in excludedEvents) { for (var f in excludedEvents) {
var filter = excludedEvents[f], var filter = excludedEvents[f],
testTitle = title.toLowerCase(), testTitle = title.toLowerCase(),
until = null; until = null,
useRegex = false,
regexFlags = "g";
if (filter instanceof Object) { if (filter instanceof Object) {
if (typeof filter.until !== "undefined") { if (typeof filter.until !== "undefined") {
until = filter.until; until = filter.until;
} }
if (typeof filter.regex !== "undefined") {
useRegex = filter.regex;
}
// If additional advanced filtering is added in, this section // If additional advanced filtering is added in, this section
// must remain last as we overwrite the filter object with the // must remain last as we overwrite the filter object with the
// filterBy string // filterBy string
if (filter.caseSensitive) { if (filter.caseSensitive) {
filter = filter.filterBy; filter = filter.filterBy;
testTitle = title; testTitle = title;
} else if (useRegex) {
filter = filter.filterBy;
testTitle = title;
regexFlags += "i";
} else { } else {
filter = filter.filterBy.toLowerCase(); filter = filter.filterBy.toLowerCase();
} }
@ -139,7 +149,7 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri
filter = filter.toLowerCase(); filter = filter.toLowerCase();
} }
if (testTitle.includes(filter)) { if (testTitleByFilter(testTitle, filter, useRegex, regexFlags)) {
if (until) { if (until) {
dateFilter = until; dateFilter = until;
} else { } else {
@ -294,6 +304,22 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri
return false; return false;
}; };
var testTitleByFilter = function (title, filter, useRegex, regexFlags) {
if (useRegex) {
// Assume if leading slash, there is also trailing slash
if (filter[0] === "/") {
// Strip leading and trailing slashes
filter = filter.substr(1).slice(0, -1);
}
filter = new RegExp(filter, regexFlags);
return filter.test(title);
} else {
return title.includes(filter);
}
}
/* public methods */ /* public methods */
/* startFetch() /* startFetch()

View File

@ -30,7 +30,7 @@ The following properties can be configured:
| `updateInterval` | How often does the compliment have to change? (Milliseconds) <br><br> **Possible values:** `1000` - `86400000` <br> **Default value:** `30000` (30 seconds) | `updateInterval` | How often does the compliment have to change? (Milliseconds) <br><br> **Possible values:** `1000` - `86400000` <br> **Default value:** `30000` (30 seconds)
| `fadeSpeed` | Speed of the update animation. (Milliseconds) <br><br> **Possible values:**`0` - `5000` <br> **Default value:** `4000` (4 seconds) | `fadeSpeed` | Speed of the update animation. (Milliseconds) <br><br> **Possible values:**`0` - `5000` <br> **Default value:** `4000` (4 seconds)
| `compliments` | The list of compliments. <br><br> **Possible values:** An object with four arrays: `morning`, `afternoon`, `evening` and `anytime`. See _compliment configuration_ below. <br> **Default value:** See _compliment configuration_ below. | `compliments` | The list of compliments. <br><br> **Possible values:** An object with four arrays: `morning`, `afternoon`, `evening` and `anytime`. See _compliment configuration_ below. <br> **Default value:** See _compliment configuration_ below.
| `remoteFile` | External file from which to load the compliments <br><br> **Possible values:** Path to a JSON file containing compliments, configured as per the value of the _compliments configuration_ (see below). An object with four arrays: `morning`, `afternoon`, `evening` and `anytime`. - `compliments.json` <br> **Default value:** `null` (Do not load from file) | `remoteFile` | External file from which to load the compliments <br><br> **Possible values:** Path or URL (starting with `http://` or `https://`) to a JSON file containing compliments, configured as per the value of the _compliments configuration_ (see below). An object with four arrays: `morning`, `afternoon`, `evening` and `anytime`. - `compliments.json` <br> **Default value:** `null` (Do not load from file)
| `classes` | Override the CSS classes of the div showing the compliments <br><br> **Default value:** `thin xlarge bright` | `classes` | Override the CSS classes of the div showing the compliments <br><br> **Default value:** `thin xlarge bright`
| `morningStartTime` | Time in hours (in 24 format), after which the mode of "morning" will begin <br> **Possible values:** `0` - `24` <br><br> **Default value:** `3` | `morningStartTime` | Time in hours (in 24 format), after which the mode of "morning" will begin <br> **Possible values:** `0` - `24` <br><br> **Default value:** `3`
| `morningEndTime` | Time in hours (in 24 format), after which the mode of "morning" will end <br> **Possible values:** `0` - `24` <br><br> **Default value:** `12` | `morningEndTime` | Time in hours (in 24 format), after which the mode of "morning" will end <br> **Possible values:** `0` - `24` <br><br> **Default value:** `12`

View File

@ -55,8 +55,8 @@ Module.register("compliments", {
var self = this; var self = this;
if (this.config.remoteFile != null) { if (this.config.remoteFile != null) {
this.complimentFile((response) => { this.complimentFile(function(response) {
this.config.compliments = JSON.parse(response); self.config.compliments = JSON.parse(response);
self.updateDom(); self.updateDom();
}); });
} }
@ -128,9 +128,11 @@ Module.register("compliments", {
* Retrieve a file from the local filesystem * Retrieve a file from the local filesystem
*/ */
complimentFile: function(callback) { complimentFile: function(callback) {
var xobj = new XMLHttpRequest(); var xobj = new XMLHttpRequest(),
isRemote = this.config.remoteFile.indexOf("http://") === 0 || this.config.remoteFile.indexOf("https://") === 0,
path = isRemote ? this.config.remoteFile : this.file(this.config.remoteFile);
xobj.overrideMimeType("application/json"); xobj.overrideMimeType("application/json");
xobj.open("GET", this.file(this.config.remoteFile), true); xobj.open("GET", path, true);
xobj.onreadystatechange = function() { xobj.onreadystatechange = function() {
if (xobj.readyState == 4 && xobj.status == "200") { if (xobj.readyState == 4 && xobj.status == "200") {
callback(xobj.responseText); callback(xobj.responseText);
@ -197,4 +199,4 @@ Module.register("compliments", {
} }
}, },
}); });

View File

@ -67,7 +67,7 @@ Module.register("currentweather",{
}, },
}, },
// create a variable for the first upcoming calendaar event. Used if no location is specified. // create a variable for the first upcoming calendar event. Used if no location is specified.
firstEvent: false, firstEvent: false,
// create a variable to hold the location name based on the API result. // create a variable to hold the location name based on the API result.
@ -87,7 +87,7 @@ Module.register("currentweather",{
getTranslations: function() { getTranslations: function() {
// The translations for the default modules are defined in the core translation files. // The translations for the default modules are defined in the core translation files.
// Therefor we can just return false. Otherwise we should have returned a dictionary. // Therefor we can just return false. Otherwise we should have returned a dictionary.
// If you're trying to build yiur own module including translations, check out the documentation. // If you're trying to build your own module including translations, check out the documentation.
return false; return false;
}, },
@ -251,7 +251,7 @@ Module.register("currentweather",{
var feelsLike = document.createElement("span"); var feelsLike = document.createElement("span");
feelsLike.className = "dimmed"; feelsLike.className = "dimmed";
feelsLike.innerHTML = "Feels " + this.feelsLike + "&deg;" + degreeLabel; feelsLike.innerHTML = this.translate("FEELS") + " " + this.feelsLike + "&deg;" + degreeLabel;
small.appendChild(feelsLike); small.appendChild(feelsLike);
wrapper.appendChild(small); wrapper.appendChild(small);
@ -293,11 +293,11 @@ Module.register("currentweather",{
} }
if (notification === "INDOOR_TEMPERATURE") { if (notification === "INDOOR_TEMPERATURE") {
this.indoorTemperature = this.roundValue(payload); this.indoorTemperature = this.roundValue(payload);
this.updateDom(self.config.animationSpeed); this.updateDom(this.config.animationSpeed);
} }
if (notification === "INDOOR_HUMIDITY") { if (notification === "INDOOR_HUMIDITY") {
this.indoorHumidity = this.roundValue(payload); this.indoorHumidity = this.roundValue(payload);
this.updateDom(self.config.animationSpeed); this.updateDom(this.config.animationSpeed);
} }
}, },
@ -407,8 +407,8 @@ Module.register("currentweather",{
if (windInMph > 3 && tempInF < 50){ if (windInMph > 3 && tempInF < 50){
// windchill // windchill
var windchillinF = Math.round(35.74+0.6215*tempInF-35.75*Math.pow(windInMph,0.16)+0.4275*tempInF*Math.pow(windInMph,0.16)); var windChillInF = Math.round(35.74+0.6215*tempInF-35.75*Math.pow(windInMph,0.16)+0.4275*tempInF*Math.pow(windInMph,0.16));
var windChillInC = (windchillinF - 32) * (5/9); var windChillInC = (windChillInF - 32) * (5/9);
// this.feelsLike = windChillInC.toFixed(0); // this.feelsLike = windChillInC.toFixed(0);
switch (this.config.units){ switch (this.config.units){
@ -417,7 +417,7 @@ Module.register("currentweather",{
case "imperial": this.feelsLike = windChillInF.toFixed(0); case "imperial": this.feelsLike = windChillInF.toFixed(0);
break; break;
case "default": case "default":
var tc = windChillInC - 273.15; var tc = windChillInC + 273.15;
this.feelsLike = tc.toFixed(0); this.feelsLike = tc.toFixed(0);
break; break;
} }
@ -432,12 +432,12 @@ Module.register("currentweather",{
- 1.99*Math.pow(10,-6)*tempInF*tempInF*this.humidity*this.humidity; - 1.99*Math.pow(10,-6)*tempInF*tempInF*this.humidity*this.humidity;
switch (this.config.units){ switch (this.config.units){
case "metric": this.feelsLike = Hindex.toFixed(0); case "metric": this.feelsLike = parseFloat((Hindex - 32) / 1.8).toFixed(0);
break; break;
case "imperial": this.feelsLike = parseFloat(Hindex * 1.8 + 32).toFixed(0); case "imperial": this.feelsLike = Hindex.toFixed(0);
break; break;
case "default": case "default":
var tc = Hindex - 273.15; var tc = parseFloat((Hindex - 32) / 1.8) + 273.15;
this.feelsLike = tc.toFixed(0); this.feelsLike = tc.toFixed(0);
break; break;
} }

View File

@ -80,6 +80,7 @@ The following properties can be configured:
| `endTags` | List the tags you would like to have removed at the end of the feed item <br><br> **Possible values:** `['TAG']` or `['TAG1','TAG2',...]` | `endTags` | List the tags you would like to have removed at the end of the feed item <br><br> **Possible values:** `['TAG']` or `['TAG1','TAG2',...]`
| `prohibitedWords` | Remove news feed item if one of these words is found anywhere in the title (case insensitive and greedy matching) <br><br> **Possible values:** `['word']` or `['word1','word2',...]` | `prohibitedWords` | Remove news feed item if one of these words is found anywhere in the title (case insensitive and greedy matching) <br><br> **Possible values:** `['word']` or `['word1','word2',...]`
| `scrollLength` | Scrolls the full news article page by a given number of pixels when a `ARTICLE_MORE_DETAILS` notification is received and the full news article is already displayed.<br><br> **Possible values:** `1` or `10000` <br> **Default value:** `500` | `scrollLength` | Scrolls the full news article page by a given number of pixels when a `ARTICLE_MORE_DETAILS` notification is received and the full news article is already displayed.<br><br> **Possible values:** `1` or `10000` <br> **Default value:** `500`
| `logFeedWarnings` | Log warnings when there is an error parsing a news article. <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false`
The `feeds` property contains an array with multiple objects. These objects have the following properties: The `feeds` property contains an array with multiple objects. These objects have the following properties:

View File

@ -14,9 +14,10 @@ var iconv = require("iconv-lite");
* *
* attribute url string - URL of the news feed. * attribute url string - URL of the news feed.
* attribute reloadInterval number - Reload interval in milliseconds. * attribute reloadInterval number - Reload interval in milliseconds.
* attribute logFeedWarnings boolean - Log warnings when there is an error parsing a news article.
*/ */
var Fetcher = function(url, reloadInterval, encoding) { var Fetcher = function(url, reloadInterval, encoding, logFeedWarnings) {
var self = this; var self = this;
if (reloadInterval < 1000) { if (reloadInterval < 1000) {
reloadInterval = 1000; reloadInterval = 1000;
@ -60,7 +61,7 @@ var Fetcher = function(url, reloadInterval, encoding) {
url: url, url: url,
}); });
} else { } else if (logFeedWarnings) {
console.log("Can't parse feed item:"); console.log("Can't parse feed item:");
console.log(item); console.log(item);
console.log("Title: " + title); console.log("Title: " + title);

View File

@ -37,7 +37,8 @@ Module.register("newsfeed",{
startTags: [], startTags: [],
endTags: [], endTags: [],
prohibitedWords: [], prohibitedWords: [],
scrollLength: 500 scrollLength: 500,
logFeedWarnings: false
}, },
// Define required scripts. // Define required scripts.
@ -67,6 +68,7 @@ Module.register("newsfeed",{
this.registerFeeds(); this.registerFeeds();
this.isShowingDescription = this.config.showDescription;
}, },
// Override socket notification handler. // Override socket notification handler.
@ -133,7 +135,7 @@ Module.register("newsfeed",{
if (this.config.removeStartTags == "description" || this.config.removeStartTags == "both") { if (this.config.removeStartTags == "description" || this.config.removeStartTags == "both") {
if (this.config.showDescription) { if (this.isShowingDescription) {
for (f=0; f<this.config.startTags.length;f++) { for (f=0; f<this.config.startTags.length;f++) {
if (this.newsItems[this.activeItem].description.slice(0,this.config.startTags[f].length) == this.config.startTags[f]) { if (this.newsItems[this.activeItem].description.slice(0,this.config.startTags[f].length) == this.config.startTags[f]) {
this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].description.slice(this.config.startTags[f].length,this.newsItems[this.activeItem].description.length); this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].description.slice(this.config.startTags[f].length,this.newsItems[this.activeItem].description.length);
@ -152,7 +154,7 @@ Module.register("newsfeed",{
} }
} }
if (this.config.showDescription) { if (this.isShowingDescription) {
for (f=0; f<this.config.endTags.length;f++) { for (f=0; f<this.config.endTags.length;f++) {
if (this.newsItems[this.activeItem].description.slice(-this.config.endTags[f].length)==this.config.endTags[f]) { if (this.newsItems[this.activeItem].description.slice(-this.config.endTags[f].length)==this.config.endTags[f]) {
this.newsItems[this.activeItem].description = this.newsItems[this.activeItem].description.slice(0,-this.config.endTags[f].length); this.newsItems[this.activeItem].description = this.newsItems[this.activeItem].description.slice(0,-this.config.endTags[f].length);
@ -169,7 +171,7 @@ Module.register("newsfeed",{
wrapper.appendChild(title); wrapper.appendChild(title);
} }
if (this.config.showDescription) { if (this.isShowingDescription) {
var description = document.createElement("div"); var description = document.createElement("div");
description.className = "small light" + (!this.config.wrapDescription ? " no-wrap" : ""); description.className = "small light" + (!this.config.wrapDescription ? " no-wrap" : "");
var txtDesc = this.newsItems[this.activeItem].description; var txtDesc = this.newsItems[this.activeItem].description;
@ -180,10 +182,10 @@ Module.register("newsfeed",{
if (this.config.showFullArticle) { if (this.config.showFullArticle) {
var fullArticle = document.createElement("iframe"); var fullArticle = document.createElement("iframe");
fullArticle.className = ""; fullArticle.className = "";
fullArticle.style.width = "100%"; fullArticle.style.width = "100vw";
// very large height value to allow scrolling // very large height value to allow scrolling
fullArticle.height = "10000"; fullArticle.height = "3000";
fullArticle.style.height = "10000"; fullArticle.style.height = "3000";
fullArticle.style.top = "0"; fullArticle.style.top = "0";
fullArticle.style.left = "0"; fullArticle.style.left = "0";
fullArticle.style.border = "none"; fullArticle.style.border = "none";
@ -323,7 +325,7 @@ Module.register("newsfeed",{
}, },
resetDescrOrFullArticleAndTimer: function() { resetDescrOrFullArticleAndTimer: function() {
this.config.showDescription = false; this.isShowingDescription = this.config.showDescription;
this.config.showFullArticle = false; this.config.showFullArticle = false;
this.scrollPosition = 0; this.scrollPosition = 0;
// reset bottom bar alignment // reset bottom bar alignment
@ -366,8 +368,8 @@ Module.register("newsfeed",{
} }
// display full article // display full article
else { else {
this.config.showDescription = !this.config.showDescription; this.isShowingDescription = !this.isShowingDescription;
this.config.showFullArticle = !this.config.showDescription; this.config.showFullArticle = !this.isShowingDescription;
// make bottom bar align to top to allow scrolling // make bottom bar align to top to allow scrolling
if(this.config.showFullArticle == true){ if(this.config.showFullArticle == true){
document.getElementsByClassName("region bottom bar")[0].style.bottom = "inherit"; document.getElementsByClassName("region bottom bar")[0].style.bottom = "inherit";
@ -375,9 +377,16 @@ Module.register("newsfeed",{
} }
clearInterval(timer); clearInterval(timer);
timer = null; timer = null;
Log.info(this.name + " - showing " + this.config.showDescription ? "article description" : "full article"); Log.info(this.name + " - showing " + this.isShowingDescription ? "article description" : "full article");
this.updateDom(100); this.updateDom(100);
} }
} else if(notification == "ARTICLE_SCROLL_UP"){
if(this.config.showFullArticle == true){
this.scrollPosition -= this.config.scrollLength;
window.scrollTo(0, this.scrollPosition);
Log.info(this.name + " - scrolling up");
Log.info(this.name + " - ARTICLE_SCROLL_UP, scroll position: " + this.config.scrollLength);
}
} else if(notification == "ARTICLE_LESS_DETAILS"){ } else if(notification == "ARTICLE_LESS_DETAILS"){
this.resetDescrOrFullArticleAndTimer(); this.resetDescrOrFullArticleAndTimer();
Log.info(this.name + " - showing only article titles again"); Log.info(this.name + " - showing only article titles again");

View File

@ -46,7 +46,7 @@ module.exports = NodeHelper.create({
var fetcher; var fetcher;
if (typeof self.fetchers[url] === "undefined") { if (typeof self.fetchers[url] === "undefined") {
console.log("Create new news fetcher for url: " + url + " - Interval: " + reloadInterval); console.log("Create new news fetcher for url: " + url + " - Interval: " + reloadInterval);
fetcher = new Fetcher(url, reloadInterval, encoding); fetcher = new Fetcher(url, reloadInterval, encoding, config.logFeedWarnings);
fetcher.onReceive(function(fetcher) { fetcher.onReceive(function(fetcher) {
self.broadcastFeeds(); self.broadcastFeeds();

View File

@ -35,7 +35,7 @@ The following properties can be configured:
| `maxNumberOfDays` | How many days of forecast to return. Specified by config.js <br><br> **Possible values:** `1` - `16` <br> **Default value:** `7` (7 days) <br> This value is optional. By default the weatherforecast module will return 7 days. | `maxNumberOfDays` | How many days of forecast to return. Specified by config.js <br><br> **Possible values:** `1` - `16` <br> **Default value:** `7` (7 days) <br> This value is optional. By default the weatherforecast module will return 7 days.
| `showRainAmount` | Should the predicted rain amount be displayed? <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false` <br> This value is optional. By default the weatherforecast module will not display the predicted amount of rain. | `showRainAmount` | Should the predicted rain amount be displayed? <br><br> **Possible values:** `true` or `false` <br> **Default value:** `false` <br> This value is optional. By default the weatherforecast module will not display the predicted amount of rain.
| `updateInterval` | How often does the content needs to be fetched? (Milliseconds) <br><br> **Possible values:** `1000` - `86400000` <br> **Default value:** `600000` (10 minutes) | `updateInterval` | How often does the content needs to be fetched? (Milliseconds) <br><br> **Possible values:** `1000` - `86400000` <br> **Default value:** `600000` (10 minutes)
| `animationSpeed` | Speed of the update animation. (Milliseconds) <br><br> **Possible values:**`0` - `5000` <br> **Default value:** `1000` (1 second) | `animationSpeed` | Speed of the update animation. (Milliseconds) <br><br> **Possible values:** `0` - `5000` <br> **Default value:** `1000` (1 second)
| `lang` | The language of the days. <br><br> **Possible values:** `en`, `nl`, `ru`, etc ... <br> **Default value:** uses value of _config.language_ | `lang` | The language of the days. <br><br> **Possible values:** `en`, `nl`, `ru`, etc ... <br> **Default value:** uses value of _config.language_
| `decimalSymbol` | The decimal symbol to use.<br><br> **Possible values:** `.`, `,` or any other symbol.<br> **Default value:** `.` | `decimalSymbol` | The decimal symbol to use.<br><br> **Possible values:** `.`, `,` or any other symbol.<br> **Default value:** `.`
| `fade` | Fade the future events to black. (Gradient) <br><br> **Possible values:** `true` or `false` <br> **Default value:** `true` | `fade` | Fade the future events to black. (Gradient) <br><br> **Possible values:** `true` or `false` <br> **Default value:** `true`
@ -47,6 +47,7 @@ The following properties can be configured:
| `forecastEndpoint` | The OpenWeatherMap API endPoint. <br><br> **Default value:** `'forecast/daily'` | `forecastEndpoint` | The OpenWeatherMap API endPoint. <br><br> **Default value:** `'forecast/daily'`
| `appendLocationNameToHeader` | If set to `true`, the returned location name will be appended to the header of the module, if the header is enabled. This is mainly intresting when using calender based weather. <br><br> **Default value:** `true` | `appendLocationNameToHeader` | If set to `true`, the returned location name will be appended to the header of the module, if the header is enabled. This is mainly intresting when using calender based weather. <br><br> **Default value:** `true`
| `calendarClass` | The class for the calender module to base the event based weather information on. <br><br> **Default value:** `'calendar'` | `calendarClass` | The class for the calender module to base the event based weather information on. <br><br> **Default value:** `'calendar'`
| `tableClass` | Name of the classes issued from `main.css`. <br><br> **Possible values:** xsmall, small, medium, large, xlarge. <br> **Default value:** _small._
| `iconTable` | The conversion table to convert the weather conditions to weather-icons. <br><br> **Default value:** view table below | `iconTable` | The conversion table to convert the weather conditions to weather-icons. <br><br> **Default value:** view table below
`colored` | If set 'colored' to true the min-temp get a blue tone and the max-temp get a red tone. <br><br> **Default value:** `'false'` `colored` | If set 'colored' to true the min-temp get a blue tone and the max-temp get a red tone. <br><br> **Default value:** `'false'`

View File

@ -36,6 +36,7 @@ Module.register("weatherforecast",{
appendLocationNameToHeader: true, appendLocationNameToHeader: true,
calendarClass: "calendar", calendarClass: "calendar",
tableClass: "small",
roundTemp: false, roundTemp: false,
@ -117,7 +118,7 @@ Module.register("weatherforecast",{
} }
var table = document.createElement("table"); var table = document.createElement("table");
table.className = "small"; table.className = this.config.tableClass;
for (var f in this.forecast) { for (var f in this.forecast) {
var forecast = this.forecast[f]; var forecast = this.forecast[f];
@ -333,8 +334,8 @@ Module.register("weatherforecast",{
var forecast = data.list[i]; var forecast = data.list[i];
this.parserDataWeather(forecast); // hack issue #1017 this.parserDataWeather(forecast); // hack issue #1017
var day = moment(forecast.dt, "X").format("ddd"); var day = moment(forecast.dt_txt, "YYYY-MM-DD hh:mm:ss").format("ddd");
var hour = moment(forecast.dt, "X").format("H"); var hour = moment(forecast.dt_txt, "YYYY-MM-DD hh:mm:ss").format("H");
if (day !== lastDay) { if (day !== lastDay) {
var forecastData = { var forecastData = {

2441
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,13 @@
{ {
"name": "magicmirror", "name": "magicmirror",
"version": "2.3.1", "version": "2.4.0",
"description": "The open source modular smart mirror platform.", "description": "The open source modular smart mirror platform.",
"main": "js/electron.js", "main": "js/electron.js",
"scripts": { "scripts": {
"start": "sh run-start.sh", "start": "sh run-start.sh",
"install": "cd vendor && yon install", "install": "cd vendor && npm install",
"install-fonts": "cd fonts && yon install", "install-fonts": "cd fonts && npm install",
"postinstall": "sh installers/postinstall/postinstall.sh && yon run install-fonts", "postinstall": "sh installers/postinstall/postinstall.sh && npm run install-fonts",
"test": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests --recursive", "test": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests --recursive",
"test:unit": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/unit --recursive", "test:unit": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/unit --recursive",
"test:e2e": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/e2e --recursive", "test:e2e": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/e2e --recursive",
@ -52,13 +52,12 @@
"spectron": "3.7.x", "spectron": "3.7.x",
"stylelint": "^8.4.0", "stylelint": "^8.4.0",
"stylelint-config-standard": "latest", "stylelint-config-standard": "latest",
"time-grunt": "latest", "time-grunt": "latest"
"yarn-or-npm": "^2.0.4"
}, },
"dependencies": { "dependencies": {
"body-parser": "^1.18.2", "body-parser": "^1.18.2",
"colors": "^1.1.2", "colors": "^1.1.2",
"electron": "^1.4.15", "electron": "^2.0.0",
"express": "^4.16.2", "express": "^4.16.2",
"express-ipfilter": "0.3.1", "express-ipfilter": "0.3.1",
"feedme": "latest", "feedme": "latest",

View File

@ -28,5 +28,7 @@
"UPDATE_NOTIFICATION": "Aktualisierung für MagicMirror² verfügbar.", "UPDATE_NOTIFICATION": "Aktualisierung für MagicMirror² verfügbar.",
"UPDATE_NOTIFICATION_MODULE": "Aktualisierung für das {MODULE_NAME} Modul verfügbar.", "UPDATE_NOTIFICATION_MODULE": "Aktualisierung für das {MODULE_NAME} Modul verfügbar.",
"UPDATE_INFO": "Die aktuelle Installation ist {COMMIT_COUNT} hinter dem {BRANCH_NAME} branch." "UPDATE_INFO": "Die aktuelle Installation ist {COMMIT_COUNT} hinter dem {BRANCH_NAME} Branch.",
"FEELS": "Gefühlt"
} }

View File

@ -28,5 +28,7 @@
"UPDATE_NOTIFICATION": "MagicMirror² update available.", "UPDATE_NOTIFICATION": "MagicMirror² update available.",
"UPDATE_NOTIFICATION_MODULE": "Update available for {MODULE_NAME} module.", "UPDATE_NOTIFICATION_MODULE": "Update available for {MODULE_NAME} module.",
"UPDATE_INFO": "The current installation is {COMMIT_COUNT} behind on the {BRANCH_NAME} branch." "UPDATE_INFO": "The current installation is {COMMIT_COUNT} behind on the {BRANCH_NAME} branch.",
"FEELS": "Feels"
} }

View File

@ -3,8 +3,11 @@
"TODAY": "Oggi", "TODAY": "Oggi",
"TOMORROW": "Domani", "TOMORROW": "Domani",
"DAYAFTERTOMORROW": "Dopodomani",
"RUNNING": "Termina entro", "RUNNING": "Termina entro",
"EMPTY": "Nessun evento in arrivo.", "EMPTY": "Nessun evento imminente.",
"WEEK": "Settimana {weekNumber}",
"N": "N", "N": "N",
"NNE": "NNE", "NNE": "NNE",
@ -15,11 +18,15 @@
"SE": "SE", "SE": "SE",
"SSE": "SSE", "SSE": "SSE",
"S": "S", "S": "S",
"SSW": "SSW", "SSW": "SSO",
"SW": "SW", "SW": "SO",
"WSW": "WSW", "WSW": "OSO",
"W": "W", "W": "O",
"WNW": "WNW", "WNW": "ONO",
"NW": "NW", "NW": "NO",
"NNW": "NNW" "NNW": "NNO",
"UPDATE_NOTIFICATION": "E' disponibile un aggiornamento di MagicMirror².",
"UPDATE_NOTIFICATION_MODULE": "E' disponibile un aggiornamento del modulo {MODULE_NAME}.",
"UPDATE_INFO": "L'installazione è {COMMIT_COUNT} indietro rispetto all'attuale branch {BRANCH_NAME}."
} }

View File

@ -26,5 +26,7 @@
"UPDATE_NOTIFICATION": "MagicMirror² update beschikbaar.", "UPDATE_NOTIFICATION": "MagicMirror² update beschikbaar.",
"UPDATE_NOTIFICATION_MODULE": "Update beschikbaar voor {MODULE_NAME} module.", "UPDATE_NOTIFICATION_MODULE": "Update beschikbaar voor {MODULE_NAME} module.",
"UPDATE_INFO": "De huidige installatie loopt {COMMIT_COUNT} achter op de {BRANCH_NAME} branch." "UPDATE_INFO": "De huidige installatie loopt {COMMIT_COUNT} achter op de {BRANCH_NAME} branch.",
"FEELS": "Gevoelstemperatuur"
} }

View File

@ -21,5 +21,9 @@
"W": "O", "W": "O",
"WNW": "ONO", "WNW": "ONO",
"NW": "NO", "NW": "NO",
"NNW": "NNO" "NNW": "NNO",
"UPDATE_NOTIFICATION": "Nova atualização para MagicMirror disponível.",
"UPDATE_NOTIFICATION_MODULE": "Atualização para o módulo {MODULE_NAME} disponível.",
"UPDATE_INFO": "Sua versão atual é a {COMMIT_COUNT} dentro do seguinte branch {BRANCH_NAME}."
} }

View File

@ -17,12 +17,12 @@ var translations = {
"nb" : "translations/nb.json", // Norsk bokmål "nb" : "translations/nb.json", // Norsk bokmål
"nn" : "translations/nn.json", // Norsk nynorsk "nn" : "translations/nn.json", // Norsk nynorsk
"pt" : "translations/pt.json", // Português "pt" : "translations/pt.json", // Português
"pt_br" : "translations/pt_br.json", // Português Brasileiro "pt-br" : "translations/pt-br.json", // Português Brasileiro
"sv" : "translations/sv.json", // Svenska "sv" : "translations/sv.json", // Svenska
"id" : "translations/id.json", // Indonesian "id" : "translations/id.json", // Indonesian
"it" : "translations/it.json", // Italian "it" : "translations/it.json", // Italian
"zh_cn" : "translations/zh_cn.json", // Simplified Chinese "zh-cn" : "translations/zh-cn.json", // Simplified Chinese
"zh_tw" : "translations/zh_tw.json", // Traditional Chinese "zh-tw" : "translations/zh-tw.json", // Traditional Chinese
"ja" : "translations/ja.json", // Japanese "ja" : "translations/ja.json", // Japanese
"pl" : "translations/pl.json", // Polish "pl" : "translations/pl.json", // Polish
"gr" : "translations/gr.json", // Greek "gr" : "translations/gr.json", // Greek

464
vendor/package-lock.json generated vendored
View File

@ -19,8 +19,8 @@
"integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
"optional": true, "optional": true,
"requires": { "requires": {
"micromatch": "2.3.11", "micromatch": "^2.1.5",
"normalize-path": "2.1.1" "normalize-path": "^2.0.0"
} }
}, },
"arr-diff": { "arr-diff": {
@ -29,7 +29,7 @@
"integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
"optional": true, "optional": true,
"requires": { "requires": {
"arr-flatten": "1.1.0" "arr-flatten": "^1.0.1"
} }
}, },
"arr-flatten": { "arr-flatten": {
@ -73,7 +73,7 @@
"integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
"optional": true, "optional": true,
"requires": { "requires": {
"balanced-match": "1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
} }
}, },
@ -83,9 +83,9 @@
"integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
"optional": true, "optional": true,
"requires": { "requires": {
"expand-range": "1.8.2", "expand-range": "^1.8.1",
"preserve": "0.2.0", "preserve": "^0.2.0",
"repeat-element": "1.1.2" "repeat-element": "^1.1.2"
} }
}, },
"camelcase": { "camelcase": {
@ -99,15 +99,15 @@
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"optional": true, "optional": true,
"requires": { "requires": {
"anymatch": "1.3.2", "anymatch": "^1.3.0",
"async-each": "1.0.1", "async-each": "^1.0.0",
"fsevents": "1.1.2", "fsevents": "^1.0.0",
"glob-parent": "2.0.0", "glob-parent": "^2.0.0",
"inherits": "2.0.3", "inherits": "^2.0.1",
"is-binary-path": "1.0.1", "is-binary-path": "^1.0.0",
"is-glob": "2.0.1", "is-glob": "^2.0.0",
"path-is-absolute": "1.0.1", "path-is-absolute": "^1.0.0",
"readdirp": "2.1.0" "readdirp": "^2.0.0"
} }
}, },
"cliui": { "cliui": {
@ -115,9 +115,9 @@
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"requires": { "requires": {
"string-width": "1.0.2", "string-width": "^1.0.1",
"strip-ansi": "3.0.1", "strip-ansi": "^3.0.1",
"wrap-ansi": "2.1.0" "wrap-ansi": "^2.0.0"
} }
}, },
"code-point-at": { "code-point-at": {
@ -148,7 +148,7 @@
"integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
"optional": true, "optional": true,
"requires": { "requires": {
"is-posix-bracket": "0.1.1" "is-posix-bracket": "^0.1.0"
} }
}, },
"expand-range": { "expand-range": {
@ -157,7 +157,7 @@
"integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
"optional": true, "optional": true,
"requires": { "requires": {
"fill-range": "2.2.3" "fill-range": "^2.1.0"
} }
}, },
"extglob": { "extglob": {
@ -166,7 +166,7 @@
"integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
"optional": true, "optional": true,
"requires": { "requires": {
"is-extglob": "1.0.0" "is-extglob": "^1.0.0"
} }
}, },
"filename-regex": { "filename-regex": {
@ -181,11 +181,11 @@
"integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
"optional": true, "optional": true,
"requires": { "requires": {
"is-number": "2.1.0", "is-number": "^2.1.0",
"isobject": "2.1.0", "isobject": "^2.0.0",
"randomatic": "1.1.7", "randomatic": "^1.1.3",
"repeat-element": "1.1.2", "repeat-element": "^1.1.2",
"repeat-string": "1.6.1" "repeat-string": "^1.5.2"
} }
}, },
"font-awesome": { "font-awesome": {
@ -205,7 +205,7 @@
"integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
"optional": true, "optional": true,
"requires": { "requires": {
"for-in": "1.0.2" "for-in": "^1.0.1"
} }
}, },
"fsevents": { "fsevents": {
@ -214,8 +214,8 @@
"integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==",
"optional": true, "optional": true,
"requires": { "requires": {
"nan": "2.7.0", "nan": "^2.3.0",
"node-pre-gyp": "0.6.36" "node-pre-gyp": "^0.6.36"
}, },
"dependencies": { "dependencies": {
"abbrev": { "abbrev": {
@ -228,8 +228,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"co": "4.6.0", "co": "^4.6.0",
"json-stable-stringify": "1.0.1" "json-stable-stringify": "^1.0.1"
} }
}, },
"ansi-regex": { "ansi-regex": {
@ -246,8 +246,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"delegates": "1.0.0", "delegates": "^1.0.0",
"readable-stream": "2.2.9" "readable-stream": "^2.0.6"
} }
}, },
"asn1": { "asn1": {
@ -284,28 +284,28 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"tweetnacl": "0.14.5" "tweetnacl": "^0.14.3"
} }
}, },
"block-stream": { "block-stream": {
"version": "0.0.9", "version": "0.0.9",
"bundled": true, "bundled": true,
"requires": { "requires": {
"inherits": "2.0.3" "inherits": "~2.0.0"
} }
}, },
"boom": { "boom": {
"version": "2.10.1", "version": "2.10.1",
"bundled": true, "bundled": true,
"requires": { "requires": {
"hoek": "2.16.3" "hoek": "2.x.x"
} }
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.7", "version": "1.1.7",
"bundled": true, "bundled": true,
"requires": { "requires": {
"balanced-match": "0.4.2", "balanced-match": "^0.4.1",
"concat-map": "0.0.1" "concat-map": "0.0.1"
} }
}, },
@ -331,7 +331,7 @@
"version": "1.0.5", "version": "1.0.5",
"bundled": true, "bundled": true,
"requires": { "requires": {
"delayed-stream": "1.0.0" "delayed-stream": "~1.0.0"
} }
}, },
"concat-map": { "concat-map": {
@ -351,7 +351,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"boom": "2.10.1" "boom": "2.x.x"
} }
}, },
"dashdash": { "dashdash": {
@ -359,7 +359,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"assert-plus": "1.0.0" "assert-plus": "^1.0.0"
}, },
"dependencies": { "dependencies": {
"assert-plus": { "assert-plus": {
@ -396,7 +396,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"jsbn": "0.1.1" "jsbn": "~0.1.0"
} }
}, },
"extend": { "extend": {
@ -418,9 +418,9 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"asynckit": "0.4.0", "asynckit": "^0.4.0",
"combined-stream": "1.0.5", "combined-stream": "^1.0.5",
"mime-types": "2.1.15" "mime-types": "^2.1.12"
} }
}, },
"fs.realpath": { "fs.realpath": {
@ -431,10 +431,10 @@
"version": "1.0.11", "version": "1.0.11",
"bundled": true, "bundled": true,
"requires": { "requires": {
"graceful-fs": "4.1.11", "graceful-fs": "^4.1.2",
"inherits": "2.0.3", "inherits": "~2.0.0",
"mkdirp": "0.5.1", "mkdirp": ">=0.5 0",
"rimraf": "2.6.1" "rimraf": "2"
} }
}, },
"fstream-ignore": { "fstream-ignore": {
@ -442,9 +442,9 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"fstream": "1.0.11", "fstream": "^1.0.0",
"inherits": "2.0.3", "inherits": "2",
"minimatch": "3.0.4" "minimatch": "^3.0.0"
} }
}, },
"gauge": { "gauge": {
@ -452,14 +452,14 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"aproba": "1.1.1", "aproba": "^1.0.3",
"console-control-strings": "1.1.0", "console-control-strings": "^1.0.0",
"has-unicode": "2.0.1", "has-unicode": "^2.0.0",
"object-assign": "4.1.1", "object-assign": "^4.1.0",
"signal-exit": "3.0.2", "signal-exit": "^3.0.0",
"string-width": "1.0.2", "string-width": "^1.0.1",
"strip-ansi": "3.0.1", "strip-ansi": "^3.0.1",
"wide-align": "1.1.2" "wide-align": "^1.1.0"
} }
}, },
"getpass": { "getpass": {
@ -467,7 +467,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"assert-plus": "1.0.0" "assert-plus": "^1.0.0"
}, },
"dependencies": { "dependencies": {
"assert-plus": { "assert-plus": {
@ -481,12 +481,12 @@
"version": "7.1.2", "version": "7.1.2",
"bundled": true, "bundled": true,
"requires": { "requires": {
"fs.realpath": "1.0.0", "fs.realpath": "^1.0.0",
"inflight": "1.0.6", "inflight": "^1.0.4",
"inherits": "2.0.3", "inherits": "2",
"minimatch": "3.0.4", "minimatch": "^3.0.4",
"once": "1.4.0", "once": "^1.3.0",
"path-is-absolute": "1.0.1" "path-is-absolute": "^1.0.0"
} }
}, },
"graceful-fs": { "graceful-fs": {
@ -503,8 +503,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"ajv": "4.11.8", "ajv": "^4.9.1",
"har-schema": "1.0.5" "har-schema": "^1.0.5"
} }
}, },
"has-unicode": { "has-unicode": {
@ -517,10 +517,10 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"boom": "2.10.1", "boom": "2.x.x",
"cryptiles": "2.0.5", "cryptiles": "2.x.x",
"hoek": "2.16.3", "hoek": "2.x.x",
"sntp": "1.0.9" "sntp": "1.x.x"
} }
}, },
"hoek": { "hoek": {
@ -532,17 +532,17 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"assert-plus": "0.2.0", "assert-plus": "^0.2.0",
"jsprim": "1.4.0", "jsprim": "^1.2.2",
"sshpk": "1.13.0" "sshpk": "^1.7.0"
} }
}, },
"inflight": { "inflight": {
"version": "1.0.6", "version": "1.0.6",
"bundled": true, "bundled": true,
"requires": { "requires": {
"once": "1.4.0", "once": "^1.3.0",
"wrappy": "1.0.2" "wrappy": "1"
} }
}, },
"inherits": { "inherits": {
@ -558,7 +558,7 @@
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"requires": { "requires": {
"number-is-nan": "1.0.1" "number-is-nan": "^1.0.0"
} }
}, },
"is-typedarray": { "is-typedarray": {
@ -580,7 +580,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"jsbn": "0.1.1" "jsbn": "~0.1.0"
} }
}, },
"jsbn": { "jsbn": {
@ -598,7 +598,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"jsonify": "0.0.0" "jsonify": "~0.0.0"
} }
}, },
"json-stringify-safe": { "json-stringify-safe": {
@ -637,14 +637,14 @@
"version": "2.1.15", "version": "2.1.15",
"bundled": true, "bundled": true,
"requires": { "requires": {
"mime-db": "1.27.0" "mime-db": "~1.27.0"
} }
}, },
"minimatch": { "minimatch": {
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"requires": { "requires": {
"brace-expansion": "1.1.7" "brace-expansion": "^1.1.7"
} }
}, },
"minimist": { "minimist": {
@ -668,15 +668,15 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"mkdirp": "0.5.1", "mkdirp": "^0.5.1",
"nopt": "4.0.1", "nopt": "^4.0.1",
"npmlog": "4.1.0", "npmlog": "^4.0.2",
"rc": "1.2.1", "rc": "^1.1.7",
"request": "2.81.0", "request": "^2.81.0",
"rimraf": "2.6.1", "rimraf": "^2.6.1",
"semver": "5.3.0", "semver": "^5.3.0",
"tar": "2.2.1", "tar": "^2.2.1",
"tar-pack": "3.4.0" "tar-pack": "^3.4.0"
} }
}, },
"nopt": { "nopt": {
@ -684,8 +684,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"abbrev": "1.1.0", "abbrev": "1",
"osenv": "0.1.4" "osenv": "^0.1.4"
} }
}, },
"npmlog": { "npmlog": {
@ -693,10 +693,10 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"are-we-there-yet": "1.1.4", "are-we-there-yet": "~1.1.2",
"console-control-strings": "1.1.0", "console-control-strings": "~1.1.0",
"gauge": "2.7.4", "gauge": "~2.7.3",
"set-blocking": "2.0.0" "set-blocking": "~2.0.0"
} }
}, },
"number-is-nan": { "number-is-nan": {
@ -717,7 +717,7 @@
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"requires": { "requires": {
"wrappy": "1.0.2" "wrappy": "1"
} }
}, },
"os-homedir": { "os-homedir": {
@ -735,8 +735,8 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"os-homedir": "1.0.2", "os-homedir": "^1.0.0",
"os-tmpdir": "1.0.2" "os-tmpdir": "^1.0.0"
} }
}, },
"path-is-absolute": { "path-is-absolute": {
@ -767,10 +767,10 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"deep-extend": "0.4.2", "deep-extend": "~0.4.0",
"ini": "1.3.4", "ini": "~1.3.0",
"minimist": "1.2.0", "minimist": "^1.2.0",
"strip-json-comments": "2.0.1" "strip-json-comments": "~2.0.1"
}, },
"dependencies": { "dependencies": {
"minimist": { "minimist": {
@ -784,13 +784,13 @@
"version": "2.2.9", "version": "2.2.9",
"bundled": true, "bundled": true,
"requires": { "requires": {
"buffer-shims": "1.0.0", "buffer-shims": "~1.0.0",
"core-util-is": "1.0.2", "core-util-is": "~1.0.0",
"inherits": "2.0.3", "inherits": "~2.0.1",
"isarray": "1.0.0", "isarray": "~1.0.0",
"process-nextick-args": "1.0.7", "process-nextick-args": "~1.0.6",
"string_decoder": "1.0.1", "string_decoder": "~1.0.0",
"util-deprecate": "1.0.2" "util-deprecate": "~1.0.1"
} }
}, },
"request": { "request": {
@ -798,35 +798,35 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"aws-sign2": "0.6.0", "aws-sign2": "~0.6.0",
"aws4": "1.6.0", "aws4": "^1.2.1",
"caseless": "0.12.0", "caseless": "~0.12.0",
"combined-stream": "1.0.5", "combined-stream": "~1.0.5",
"extend": "3.0.1", "extend": "~3.0.0",
"forever-agent": "0.6.1", "forever-agent": "~0.6.1",
"form-data": "2.1.4", "form-data": "~2.1.1",
"har-validator": "4.2.1", "har-validator": "~4.2.1",
"hawk": "3.1.3", "hawk": "~3.1.3",
"http-signature": "1.1.1", "http-signature": "~1.1.0",
"is-typedarray": "1.0.0", "is-typedarray": "~1.0.0",
"isstream": "0.1.2", "isstream": "~0.1.2",
"json-stringify-safe": "5.0.1", "json-stringify-safe": "~5.0.1",
"mime-types": "2.1.15", "mime-types": "~2.1.7",
"oauth-sign": "0.8.2", "oauth-sign": "~0.8.1",
"performance-now": "0.2.0", "performance-now": "^0.2.0",
"qs": "6.4.0", "qs": "~6.4.0",
"safe-buffer": "5.0.1", "safe-buffer": "^5.0.1",
"stringstream": "0.0.5", "stringstream": "~0.0.4",
"tough-cookie": "2.3.2", "tough-cookie": "~2.3.0",
"tunnel-agent": "0.6.0", "tunnel-agent": "^0.6.0",
"uuid": "3.0.1" "uuid": "^3.0.0"
} }
}, },
"rimraf": { "rimraf": {
"version": "2.6.1", "version": "2.6.1",
"bundled": true, "bundled": true,
"requires": { "requires": {
"glob": "7.1.2" "glob": "^7.0.5"
} }
}, },
"safe-buffer": { "safe-buffer": {
@ -853,7 +853,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"hoek": "2.16.3" "hoek": "2.x.x"
} }
}, },
"sshpk": { "sshpk": {
@ -861,15 +861,15 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"asn1": "0.2.3", "asn1": "~0.2.3",
"assert-plus": "1.0.0", "assert-plus": "^1.0.0",
"bcrypt-pbkdf": "1.0.1", "bcrypt-pbkdf": "^1.0.0",
"dashdash": "1.14.1", "dashdash": "^1.12.0",
"ecc-jsbn": "0.1.1", "ecc-jsbn": "~0.1.1",
"getpass": "0.1.7", "getpass": "^0.1.1",
"jodid25519": "1.0.2", "jodid25519": "^1.0.0",
"jsbn": "0.1.1", "jsbn": "~0.1.0",
"tweetnacl": "0.14.5" "tweetnacl": "~0.14.0"
}, },
"dependencies": { "dependencies": {
"assert-plus": { "assert-plus": {
@ -883,16 +883,16 @@
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"requires": { "requires": {
"code-point-at": "1.1.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "1.0.0", "is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "3.0.1" "strip-ansi": "^3.0.0"
} }
}, },
"string_decoder": { "string_decoder": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true,
"requires": { "requires": {
"safe-buffer": "5.0.1" "safe-buffer": "^5.0.1"
} }
}, },
"stringstream": { "stringstream": {
@ -904,7 +904,7 @@
"version": "3.0.1", "version": "3.0.1",
"bundled": true, "bundled": true,
"requires": { "requires": {
"ansi-regex": "2.1.1" "ansi-regex": "^2.0.0"
} }
}, },
"strip-json-comments": { "strip-json-comments": {
@ -916,9 +916,9 @@
"version": "2.2.1", "version": "2.2.1",
"bundled": true, "bundled": true,
"requires": { "requires": {
"block-stream": "0.0.9", "block-stream": "*",
"fstream": "1.0.11", "fstream": "^1.0.2",
"inherits": "2.0.3" "inherits": "2"
} }
}, },
"tar-pack": { "tar-pack": {
@ -926,14 +926,14 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"debug": "2.6.8", "debug": "^2.2.0",
"fstream": "1.0.11", "fstream": "^1.0.10",
"fstream-ignore": "1.0.5", "fstream-ignore": "^1.0.5",
"once": "1.4.0", "once": "^1.3.3",
"readable-stream": "2.2.9", "readable-stream": "^2.1.4",
"rimraf": "2.6.1", "rimraf": "^2.5.1",
"tar": "2.2.1", "tar": "^2.2.1",
"uid-number": "0.0.6" "uid-number": "^0.0.6"
} }
}, },
"tough-cookie": { "tough-cookie": {
@ -941,7 +941,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"punycode": "1.4.1" "punycode": "^1.4.1"
} }
}, },
"tunnel-agent": { "tunnel-agent": {
@ -949,7 +949,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"safe-buffer": "5.0.1" "safe-buffer": "^5.0.1"
} }
}, },
"tweetnacl": { "tweetnacl": {
@ -984,7 +984,7 @@
"bundled": true, "bundled": true,
"optional": true, "optional": true,
"requires": { "requires": {
"string-width": "1.0.2" "string-width": "^1.0.2"
} }
}, },
"wrappy": { "wrappy": {
@ -999,8 +999,8 @@
"integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
"optional": true, "optional": true,
"requires": { "requires": {
"glob-parent": "2.0.0", "glob-parent": "^2.0.0",
"is-glob": "2.0.1" "is-glob": "^2.0.0"
} }
}, },
"glob-parent": { "glob-parent": {
@ -1008,7 +1008,7 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"requires": { "requires": {
"is-glob": "2.0.1" "is-glob": "^2.0.0"
} }
}, },
"graceful-fs": { "graceful-fs": {
@ -1033,7 +1033,7 @@
"integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
"optional": true, "optional": true,
"requires": { "requires": {
"binary-extensions": "1.10.0" "binary-extensions": "^1.0.0"
} }
}, },
"is-buffer": { "is-buffer": {
@ -1053,7 +1053,7 @@
"integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
"optional": true, "optional": true,
"requires": { "requires": {
"is-primitive": "2.0.0" "is-primitive": "^2.0.0"
} }
}, },
"is-extendable": { "is-extendable": {
@ -1072,7 +1072,7 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"requires": { "requires": {
"number-is-nan": "1.0.1" "number-is-nan": "^1.0.0"
} }
}, },
"is-glob": { "is-glob": {
@ -1080,7 +1080,7 @@
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"requires": { "requires": {
"is-extglob": "1.0.0" "is-extglob": "^1.0.0"
} }
}, },
"is-number": { "is-number": {
@ -1089,7 +1089,7 @@
"integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
"optional": true, "optional": true,
"requires": { "requires": {
"kind-of": "3.2.2" "kind-of": "^3.0.2"
} }
}, },
"is-posix-bracket": { "is-posix-bracket": {
@ -1123,7 +1123,7 @@
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"requires": { "requires": {
"is-buffer": "1.1.5" "is-buffer": "^1.1.5"
} }
}, },
"lcid": { "lcid": {
@ -1131,7 +1131,7 @@
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
"requires": { "requires": {
"invert-kv": "1.0.0" "invert-kv": "^1.0.0"
} }
}, },
"micromatch": { "micromatch": {
@ -1140,19 +1140,19 @@
"integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
"optional": true, "optional": true,
"requires": { "requires": {
"arr-diff": "2.0.0", "arr-diff": "^2.0.0",
"array-unique": "0.2.1", "array-unique": "^0.2.1",
"braces": "1.8.5", "braces": "^1.8.2",
"expand-brackets": "0.1.5", "expand-brackets": "^0.1.4",
"extglob": "0.3.2", "extglob": "^0.3.1",
"filename-regex": "2.0.1", "filename-regex": "^2.0.0",
"is-extglob": "1.0.0", "is-extglob": "^1.0.0",
"is-glob": "2.0.1", "is-glob": "^2.0.1",
"kind-of": "3.2.2", "kind-of": "^3.0.2",
"normalize-path": "2.1.1", "normalize-path": "^2.0.1",
"object.omit": "2.0.1", "object.omit": "^2.0.0",
"parse-glob": "3.0.4", "parse-glob": "^3.0.4",
"regex-cache": "0.4.4" "regex-cache": "^0.4.2"
} }
}, },
"minimatch": { "minimatch": {
@ -1161,7 +1161,7 @@
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"optional": true, "optional": true,
"requires": { "requires": {
"brace-expansion": "1.1.8" "brace-expansion": "^1.1.7"
} }
}, },
"moment": { "moment": {
@ -1174,7 +1174,7 @@
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.13.tgz", "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.13.tgz",
"integrity": "sha1-mc5cfYJyYusPH3AgRBd/YHRde5A=", "integrity": "sha1-mc5cfYJyYusPH3AgRBd/YHRde5A=",
"requires": { "requires": {
"moment": "2.18.1" "moment": ">= 2.9.0"
} }
}, },
"nan": { "nan": {
@ -1188,7 +1188,7 @@
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"requires": { "requires": {
"remove-trailing-separator": "1.1.0" "remove-trailing-separator": "^1.0.1"
} }
}, },
"number-is-nan": { "number-is-nan": {
@ -1201,10 +1201,10 @@
"resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.0.1.tgz", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.0.1.tgz",
"integrity": "sha1-TedKPlULr2+jNwMj89HHwqhr3E0=", "integrity": "sha1-TedKPlULr2+jNwMj89HHwqhr3E0=",
"requires": { "requires": {
"a-sync-waterfall": "1.0.0", "a-sync-waterfall": "^1.0.0",
"asap": "2.0.6", "asap": "^2.0.3",
"chokidar": "1.7.0", "chokidar": "^1.6.0",
"yargs": "3.32.0" "yargs": "^3.32.0"
} }
}, },
"object.omit": { "object.omit": {
@ -1213,8 +1213,8 @@
"integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
"optional": true, "optional": true,
"requires": { "requires": {
"for-own": "0.1.5", "for-own": "^0.1.4",
"is-extendable": "0.1.1" "is-extendable": "^0.1.1"
} }
}, },
"os-locale": { "os-locale": {
@ -1222,7 +1222,7 @@
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
"requires": { "requires": {
"lcid": "1.0.0" "lcid": "^1.0.0"
} }
}, },
"parse-glob": { "parse-glob": {
@ -1231,10 +1231,10 @@
"integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
"optional": true, "optional": true,
"requires": { "requires": {
"glob-base": "0.3.0", "glob-base": "^0.3.0",
"is-dotfile": "1.0.3", "is-dotfile": "^1.0.0",
"is-extglob": "1.0.0", "is-extglob": "^1.0.0",
"is-glob": "2.0.1" "is-glob": "^2.0.0"
} }
}, },
"path-is-absolute": { "path-is-absolute": {
@ -1261,8 +1261,8 @@
"integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
"optional": true, "optional": true,
"requires": { "requires": {
"is-number": "3.0.0", "is-number": "^3.0.0",
"kind-of": "4.0.0" "kind-of": "^4.0.0"
}, },
"dependencies": { "dependencies": {
"is-number": { "is-number": {
@ -1271,7 +1271,7 @@
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"optional": true, "optional": true,
"requires": { "requires": {
"kind-of": "3.2.2" "kind-of": "^3.0.2"
}, },
"dependencies": { "dependencies": {
"kind-of": { "kind-of": {
@ -1280,7 +1280,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"optional": true, "optional": true,
"requires": { "requires": {
"is-buffer": "1.1.5" "is-buffer": "^1.1.5"
} }
} }
} }
@ -1291,7 +1291,7 @@
"integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
"optional": true, "optional": true,
"requires": { "requires": {
"is-buffer": "1.1.5" "is-buffer": "^1.1.5"
} }
} }
} }
@ -1302,13 +1302,13 @@
"integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
"optional": true, "optional": true,
"requires": { "requires": {
"core-util-is": "1.0.2", "core-util-is": "~1.0.0",
"inherits": "2.0.3", "inherits": "~2.0.3",
"isarray": "1.0.0", "isarray": "~1.0.0",
"process-nextick-args": "1.0.7", "process-nextick-args": "~1.0.6",
"safe-buffer": "5.1.1", "safe-buffer": "~5.1.1",
"string_decoder": "1.0.3", "string_decoder": "~1.0.3",
"util-deprecate": "1.0.2" "util-deprecate": "~1.0.1"
} }
}, },
"readdirp": { "readdirp": {
@ -1317,10 +1317,10 @@
"integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
"optional": true, "optional": true,
"requires": { "requires": {
"graceful-fs": "4.1.11", "graceful-fs": "^4.1.2",
"minimatch": "3.0.4", "minimatch": "^3.0.2",
"readable-stream": "2.3.3", "readable-stream": "^2.0.2",
"set-immediate-shim": "1.0.1" "set-immediate-shim": "^1.0.1"
} }
}, },
"regex-cache": { "regex-cache": {
@ -1329,7 +1329,7 @@
"integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
"optional": true, "optional": true,
"requires": { "requires": {
"is-equal-shallow": "0.1.3" "is-equal-shallow": "^0.1.3"
} }
}, },
"remove-trailing-separator": { "remove-trailing-separator": {
@ -1364,9 +1364,9 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"requires": { "requires": {
"code-point-at": "1.1.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "1.0.0", "is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "3.0.1" "strip-ansi": "^3.0.0"
} }
}, },
"string_decoder": { "string_decoder": {
@ -1375,7 +1375,7 @@
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
"optional": true, "optional": true,
"requires": { "requires": {
"safe-buffer": "5.1.1" "safe-buffer": "~5.1.0"
} }
}, },
"strip-ansi": { "strip-ansi": {
@ -1383,7 +1383,7 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"requires": { "requires": {
"ansi-regex": "2.1.1" "ansi-regex": "^2.0.0"
} }
}, },
"util-deprecate": { "util-deprecate": {
@ -1407,8 +1407,8 @@
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"requires": { "requires": {
"string-width": "1.0.2", "string-width": "^1.0.1",
"strip-ansi": "3.0.1" "strip-ansi": "^3.0.1"
} }
}, },
"y18n": { "y18n": {
@ -1421,13 +1421,13 @@
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
"integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
"requires": { "requires": {
"camelcase": "2.1.1", "camelcase": "^2.0.1",
"cliui": "3.2.0", "cliui": "^3.0.3",
"decamelize": "1.2.0", "decamelize": "^1.1.1",
"os-locale": "1.4.0", "os-locale": "^1.4.0",
"string-width": "1.0.2", "string-width": "^1.0.1",
"window-size": "0.1.4", "window-size": "^0.1.4",
"y18n": "3.2.1" "y18n": "^3.2.0"
} }
} }
} }

4391
yarn.lock

File diff suppressed because it is too large Load Diff