diff --git a/.eslintrc.json b/.eslintrc.json
index eee62330..e5aca766 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -7,6 +7,7 @@
"curly": "error",
"camelcase": ["error", {"properties": "never"}],
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1 }],
+ "no-multi-spaces": "error",
"no-trailing-spaces": ["error", {"ignoreComments": false }],
"no-irregular-whitespace": ["error"]
},
diff --git a/.travis.yml b/.travis.yml
index b6f2e352..2f9f3690 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,9 +14,9 @@ before_script:
- "sh -e /etc/init.d/xvfb start"
- sleep 5
script:
+ - npm run test:lint
- npm run test:e2e
- npm run test:unit
- - grunt
after_script:
- npm list
cache:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7459f2c1..1b014c88 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,9 +22,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- Add HTTPS support and update config.js.sample
- Run tests on long term support and latest stable version of nodejs
- Added the ability to configure a list of modules that shouldn't be update checked.
+- Run linters on git commits
### Fixed
-- Force declaration of public ip adress in config file (ISSUE #1852)
+- Force declaration of public ip address in config file (ISSUE #1852)
- Fixes `run-start.sh`: If running in docker-container, don't check the environment, just start electron (ISSUE #1859)
- Fix calendar time offset for recurring events crossing Daylight Savings Time (ISSUE #1798)
- Fix regression in currentweather module causing 'undefined' to show up when config.hideTemp is false
@@ -585,7 +586,7 @@ A huge, huge, huge thanks to user @fewieden for all his hard work on the new `we
- Added option `remoteFile` to compliments module to load compliment array from filesystem.
- Added option `zoom` to scale the whole mirror display with a given factor.
- Added option `roundTemp` for currentweather and weatherforecast modules to display temperatures rounded to nearest integer.
-- Added abilty set the classes option to compliments module for style and text size of compliments.
+- Added ability set the classes option to compliments module for style and text size of compliments.
- Added ability to configure electronOptions
- Calendar module: option to hide private events
- Add root_path for global vars
diff --git a/Gruntfile.js b/Gruntfile.js
index a825a766..36a90c5e 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,10 +1,10 @@
module.exports = function(grunt) {
require("time-grunt")(grunt);
+ var fix = (grunt.option("env") || "lint") === "lint";
grunt.initConfig({
- pkg: grunt.file.readJSON("package.json"),
eslint: {
options: {
- fix: "true",
+ fix: fix,
configFile: ".eslintrc.json"
},
target: [
@@ -20,13 +20,13 @@ module.exports = function(grunt) {
"!modules/default/alert/classie.js",
"config/*",
"translations/translations.js",
- "vendor/vendor.js",
- "modules/node_modules/node_helper/index.js"
+ "vendor/vendor.js"
]
},
stylelint: {
simple: {
options: {
+ fix: fix,
configFile: ".stylelintrc.json"
},
src: [
@@ -44,7 +44,6 @@ module.exports = function(grunt) {
"package.json",
".eslintrc.json",
".stylelintrc.json",
- "installers/pm2_MagicMirror.json",
"translations/*.json",
"modules/default/*/translations/*.json",
"vendor/package.json"
@@ -102,5 +101,6 @@ module.exports = function(grunt) {
grunt.loadNpmTasks("grunt-jsonlint");
grunt.loadNpmTasks("grunt-yamllint");
grunt.loadNpmTasks("grunt-markdownlint");
+
grunt.registerTask("default", ["eslint", "stylelint", "jsonlint", "markdownlint", "yamllint"]);
};
diff --git a/config/config.js.sample b/config/config.js.sample
index 01a41caa..414054da 100644
--- a/config/config.js.sample
+++ b/config/config.js.sample
@@ -24,7 +24,7 @@ var config = {
useHttps: false, // Support HTTPS or not, default "false" will use HTTP
httpsPrivateKey: "", // HTTPS private key path, only require when useHttps is true
httpsCertificate: "", // HTTPS Certificate path, only require when useHttps is true
-
+
language: "en",
timeFormat: 24,
units: "metric",
@@ -67,7 +67,7 @@ var config = {
position: "top_right",
config: {
location: "New York",
- locationID: "", //ID from http://bulk.openweathermap.org/sample/city.list.json.gz; unzip the gz file and find your city
+ locationID: "", //ID from http://bulk.openweathermap.org/sample/city.list.json.gz; unzip the gz file and find your city
appid: "YOUR_OPENWEATHER_API_KEY"
}
},
@@ -77,7 +77,7 @@ var config = {
header: "Weather Forecast",
config: {
location: "New York",
- locationID: "5128581", //ID from http://bulk.openweathermap.org/sample/city.list.json.gz; unzip the gz file and find your city
+ locationID: "5128581", //ID from http://bulk.openweathermap.org/sample/city.list.json.gz; unzip the gz file and find your city
appid: "YOUR_OPENWEATHER_API_KEY"
}
},
diff --git a/js/app.js b/js/app.js
index ef66a44c..b7c55ffa 100644
--- a/js/app.js
+++ b/js/app.js
@@ -111,10 +111,10 @@ var App = function() {
var elements = module.split("/");
var moduleName = elements[elements.length - 1];
- var moduleFolder = __dirname + "/../modules/" + module;
+ var moduleFolder = __dirname + "/../modules/" + module;
if (defaultModules.indexOf(moduleName) !== -1) {
- moduleFolder = __dirname + "/../modules/default/" + module;
+ moduleFolder = __dirname + "/../modules/default/" + module;
}
var helperPath = moduleFolder + "/node_helper.js";
@@ -262,7 +262,7 @@ var App = function() {
*/
process.on("SIGINT", () => {
console.log("[SIGINT] Received. Shutting down server...");
- setTimeout(() => { process.exit(0); }, 3000); // Force quit after 3 seconds
+ setTimeout(() => { process.exit(0); }, 3000); // Force quit after 3 seconds
this.stop();
process.exit(0);
});
@@ -271,7 +271,7 @@ var App = function() {
*/
process.on("SIGTERM", () => {
console.log("[SIGTERM] Received. Shutting down server...");
- setTimeout(() => { process.exit(0); }, 3000); // Force quit after 3 seconds
+ setTimeout(() => { process.exit(0); }, 3000); // Force quit after 3 seconds
this.stop();
process.exit(0);
});
diff --git a/js/loader.js b/js/loader.js
index 3a4e05c3..6db46ad5 100644
--- a/js/loader.js
+++ b/js/loader.js
@@ -83,10 +83,10 @@ var Loader = (function() {
var elements = module.split("/");
var moduleName = elements[elements.length - 1];
- var moduleFolder = config.paths.modules + "/" + module;
+ var moduleFolder = config.paths.modules + "/" + module;
if (defaultModules.indexOf(moduleName) !== -1) {
- moduleFolder = config.paths.modules + "/default/" + module;
+ moduleFolder = config.paths.modules + "/default/" + module;
}
if (moduleData.disabled === true) {
@@ -172,7 +172,7 @@ var Loader = (function() {
*/
var loadFile = function(fileName, callback) {
- var extension = fileName.slice((Math.max(0, fileName.lastIndexOf(".")) || Infinity) + 1);
+ var extension = fileName.slice((Math.max(0, fileName.lastIndexOf(".")) || Infinity) + 1);
switch (extension.toLowerCase()) {
case "js":
diff --git a/js/main.js b/js/main.js
index 29d8f71e..a4c39494 100644
--- a/js/main.js
+++ b/js/main.js
@@ -379,7 +379,7 @@ var MM = (function() {
*
* return array - Filtered collection of modules.
*/
- var exceptWithClass = function(className) {
+ var exceptWithClass = function(className) {
return modulesByClass(className, false);
};
@@ -441,10 +441,10 @@ var MM = (function() {
});
};
- if (typeof modules.withClass === "undefined") { Object.defineProperty(modules, "withClass", {value: withClass, enumerable: false}); }
- if (typeof modules.exceptWithClass === "undefined") { Object.defineProperty(modules, "exceptWithClass", {value: exceptWithClass, enumerable: false}); }
- if (typeof modules.exceptModule === "undefined") { Object.defineProperty(modules, "exceptModule", {value: exceptModule, enumerable: false}); }
- if (typeof modules.enumerate === "undefined") { Object.defineProperty(modules, "enumerate", {value: enumerate, enumerable: false}); }
+ if (typeof modules.withClass === "undefined") { Object.defineProperty(modules, "withClass", {value: withClass, enumerable: false}); }
+ if (typeof modules.exceptWithClass === "undefined") { Object.defineProperty(modules, "exceptWithClass", {value: exceptWithClass, enumerable: false}); }
+ if (typeof modules.exceptModule === "undefined") { Object.defineProperty(modules, "exceptModule", {value: exceptModule, enumerable: false}); }
+ if (typeof modules.enumerate === "undefined") { Object.defineProperty(modules, "enumerate", {value: enumerate, enumerable: false}); }
};
return {
diff --git a/js/node_helper.js b/js/node_helper.js
index a083d332..326a8cce 100644
--- a/js/node_helper.js
+++ b/js/node_helper.js
@@ -101,9 +101,9 @@ NodeHelper = Class.extend({
var onevent = socket.onevent;
socket.onevent = function(packet) {
var args = packet.data || [];
- onevent.call(this, packet); // original call
+ onevent.call(this, packet); // original call
packet.data = ["*"].concat(args);
- onevent.call(this, packet); // additional call to catch-all
+ onevent.call(this, packet); // additional call to catch-all
};
// register catch all.
diff --git a/js/server.js b/js/server.js
index 19bdfb91..185790af 100644
--- a/js/server.js
+++ b/js/server.js
@@ -25,13 +25,13 @@ var Server = function(config, callback) {
var options = {
key: fs.readFileSync(config.httpsPrivateKey),
cert: fs.readFileSync(config.httpsCertificate)
- }
+ };
server = require("https").Server(options, app);
}else{
server = require("http").Server(app);
}
var io = require("socket.io")(server);
-
+
console.log("Starting server on port " + port + " ... ");
server.listen(port, config.address ? config.address : "localhost");
diff --git a/js/socketclient.js b/js/socketclient.js
index 5e138636..ee30f267 100644
--- a/js/socketclient.js
+++ b/js/socketclient.js
@@ -16,9 +16,9 @@ var MMSocket = function(moduleName) {
var onevent = self.socket.onevent;
self.socket.onevent = function(packet) {
var args = packet.data || [];
- onevent.call(this, packet); // original call
+ onevent.call(this, packet); // original call
packet.data = ["*"].concat(args);
- onevent.call(this, packet); // additional call to catch-all
+ onevent.call(this, packet); // additional call to catch-all
};
// register catch all.
diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js
index 9c91afe5..98ae5636 100755
--- a/modules/default/calendar/calendar.js
+++ b/modules/default/calendar/calendar.js
@@ -320,7 +320,7 @@ Module.register("calendar", {
}
if(this.config.showEnd){
timeWrapper.innerHTML += "-" ;
- timeWrapper.innerHTML += this.capFirst(moment(event.endDate , "x").format(this.config.fullDayEventDateFormat));
+ timeWrapper.innerHTML += this.capFirst(moment(event.endDate , "x").format(this.config.fullDayEventDateFormat));
}
} else {
if (event.startDate >= new Date()) {
diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js
index a9bf37ee..c393d5d6 100644
--- a/modules/default/calendar/calendarfetcher.js
+++ b/modules/default/calendar/calendarfetcher.js
@@ -28,7 +28,7 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri
nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
var opts = {
headers: {
- "User-Agent": "Mozilla/5.0 (Node.js "+ nodeVersion + ") MagicMirror/" + global.version + " (https://github.com/MichMich/MagicMirror/)"
+ "User-Agent": "Mozilla/5.0 (Node.js "+ nodeVersion + ") MagicMirror/" + global.version + " (https://github.com/MichMich/MagicMirror/)"
},
gzip: true
};
@@ -249,7 +249,7 @@ var CalendarFetcher = function(url, reloadInterval, excludedEvents, maximumEntri
showRecurrence = false;
}
- endDate = moment(parseInt(startDate.format("x")) + duration, "x");
+ endDate = moment(parseInt(startDate.format("x")) + duration, "x");
if (startDate.format("x") == endDate.format("x")) {
endDate = endDate.endOf("day");
}
diff --git a/modules/default/calendar/debug.js b/modules/default/calendar/debug.js
index bf65a279..84fc2f86 100644
--- a/modules/default/calendar/debug.js
+++ b/modules/default/calendar/debug.js
@@ -8,7 +8,7 @@
var CalendarFetcher = require("./calendarfetcher.js");
-var url = "https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics"; // Standard test URL
+var url = "https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics"; // Standard test URL
// var url = "https://www.googleapis.com/calendar/v3/calendars/primary/events/"; // URL for Bearer auth (must be configured in Google OAuth2 first)
var fetchInterval = 60 * 60 * 1000;
var maximumEntries = 10;
diff --git a/modules/default/clock/clock.js b/modules/default/clock/clock.js
index 2490a0ce..08dcced0 100644
--- a/modules/default/clock/clock.js
+++ b/modules/default/clock/clock.js
@@ -152,9 +152,9 @@ Module.register("clock",{
}
function formatTime(config, time) {
- var formatString = hourSymbol + ':mm';
+ var formatString = hourSymbol + ":mm";
if (config.showPeriod && config.timeFormat !== 24) {
- formatString += config.showPeriodUpper ? 'A' : 'a';
+ formatString += config.showPeriodUpper ? "A" : "a";
}
return moment(time).format(formatString);
}
@@ -167,14 +167,14 @@ Module.register("clock",{
} else if (now.isBefore(sunTimes.sunset)) {
nextEvent = sunTimes.sunset;
} else {
- const tomorrowSunTimes = SunCalc.getTimes(now.clone().add(1, 'day'), this.config.lat, this.config.lon);
+ const tomorrowSunTimes = SunCalc.getTimes(now.clone().add(1, "day"), this.config.lat, this.config.lon);
nextEvent = tomorrowSunTimes.sunrise;
}
const untilNextEvent = moment.duration(moment(nextEvent).diff(now));
- const untilNextEventString = untilNextEvent.hours() + 'h ' + untilNextEvent.minutes() + 'm';
- sunWrapper.innerHTML = ' ' + untilNextEventString + '' +
- '' + formatTime(this.config, sunTimes.sunrise) + '' +
- '' + formatTime(this.config, sunTimes.sunset) + '';
+ const untilNextEventString = untilNextEvent.hours() + "h " + untilNextEvent.minutes() + "m";
+ sunWrapper.innerHTML = " " + untilNextEventString + "" +
+ "" + formatTime(this.config, sunTimes.sunrise) + "" +
+ "" + formatTime(this.config, sunTimes.sunset) + "";
}
if (this.config.showMoonTimes) {
const moonIllumination = SunCalc.getMoonIllumination(now.toDate());
@@ -184,14 +184,14 @@ Module.register("clock",{
if (moment(moonTimes.set).isAfter(moonTimes.rise)) {
moonSet = moonTimes.set;
} else {
- const nextMoonTimes = SunCalc.getMoonTimes(now.clone().add(1, 'day'), this.config.lat, this.config.lon);
+ const nextMoonTimes = SunCalc.getMoonTimes(now.clone().add(1, "day"), this.config.lat, this.config.lon);
moonSet = nextMoonTimes.set;
}
const isVisible = now.isBetween(moonRise, moonSet) || moonTimes.alwaysUp === true;
- const illuminatedFractionString = Math.round(moonIllumination.fraction * 100) + '%';
- moonWrapper.innerHTML = ' ' + illuminatedFractionString + '' +
- ' ' + (moonRise ? formatTime(this.config, moonRise) : '...') + ''+
- ' ' + (moonSet ? formatTime(this.config, moonSet) : '...') + '';
+ const illuminatedFractionString = Math.round(moonIllumination.fraction * 100) + "%";
+ moonWrapper.innerHTML = " " + illuminatedFractionString + "" +
+ " " + (moonRise ? formatTime(this.config, moonRise) : "...") + ""+
+ " " + (moonSet ? formatTime(this.config, moonSet) : "...") + "";
}
/****************************************************************
diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js
index d358110c..53cb3065 100644
--- a/modules/default/newsfeed/newsfeed.js
+++ b/modules/default/newsfeed/newsfeed.js
@@ -213,7 +213,7 @@ Module.register("newsfeed",{
},
getActiveItemURL: function() {
- return typeof this.newsItems[this.activeItem].url === "string" ? this.newsItems[this.activeItem].url : this.newsItems[this.activeItem].url.href;
+ return typeof this.newsItems[this.activeItem].url === "string" ? this.newsItems[this.activeItem].url : this.newsItems[this.activeItem].url.href;
},
/* registerFeeds()
diff --git a/modules/default/updatenotification/node_helper.js b/modules/default/updatenotification/node_helper.js
index 4386b146..2d41626c 100644
--- a/modules/default/updatenotification/node_helper.js
+++ b/modules/default/updatenotification/node_helper.js
@@ -27,7 +27,7 @@ module.exports = NodeHelper.create({
for (moduleName in modules) {
if (!this.ignoreUpdateChecking(moduleName)) {
// Default modules are included in the main MagicMirror repo
- var moduleFolder = path.normalize(__dirname + "/../../" + moduleName);
+ var moduleFolder = path.normalize(__dirname + "/../../" + moduleName);
try {
//console.log("checking git for module="+moduleName)
diff --git a/package-lock.json b/package-lock.json
index 2509883d..077f1ff3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1048,6 +1048,12 @@
}
}
},
+ "ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "dev": true
+ },
"clarinet": {
"version": "0.12.4",
"resolved": "https://registry.npmjs.org/clarinet/-/clarinet-0.12.4.tgz",
@@ -1198,6 +1204,12 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
+ "compare-versions": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
+ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
+ "dev": true
+ },
"component-bind": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
@@ -2579,6 +2591,15 @@
"pinkie-promise": "^2.0.0"
}
},
+ "find-versions": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
+ "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+ "dev": true,
+ "requires": {
+ "semver-regex": "^2.0.0"
+ }
+ },
"findup-sync": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
@@ -3100,12 +3121,12 @@
}
},
"grunt-markdownlint": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/grunt-markdownlint/-/grunt-markdownlint-2.8.0.tgz",
- "integrity": "sha512-3HNNKB1C+qC+iB9ecDGymQMv2CVx+XHFxP3e1n/d1lE44GvJOaJFYCS6IgAc//Fhcz4v4X9XJCHDCTfAWuq5gg==",
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/grunt-markdownlint/-/grunt-markdownlint-2.9.0.tgz",
+ "integrity": "sha512-jLzTzNVZN/u2iblV2j+2xfJGG+Mv8NMl5CAOWNQftV7SOHnstwR/tiZPac8ZTmJFqwAqCwafIvu9wP2naAS8Og==",
"dev": true,
"requires": {
- "markdownlint": "^0.18.0"
+ "markdownlint": "^0.19.0"
}
},
"grunt-stylelint": {
@@ -3449,6 +3470,76 @@
"debug": "^3.1.0"
}
},
+ "husky": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz",
+ "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^3.0.0",
+ "ci-info": "^2.0.0",
+ "compare-versions": "^3.5.1",
+ "cosmiconfig": "^6.0.0",
+ "find-versions": "^3.2.0",
+ "opencollective-postinstall": "^2.0.2",
+ "pkg-dir": "^4.2.0",
+ "please-upgrade-node": "^3.2.0",
+ "slash": "^3.0.0",
+ "which-pm-runs": "^1.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
"hyperlinker": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz",
@@ -4417,9 +4508,9 @@
"dev": true
},
"markdownlint": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.18.0.tgz",
- "integrity": "sha512-nQAfK9Pbq0ZRoMC/abNGterEnV3kL8MZmi0WHhw8WJKoIbsm3cXGufGsxzCRvjW15cxe74KWcxRSKqwplS26Bw==",
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.19.0.tgz",
+ "integrity": "sha512-+MsWOnYVUH4klcKM7iRx5cno9FQMDAb6FC6mWlZkeXPwIaK6Z5Vd9VkXkykPidRqmLHU2wI+MNyfUMnUCBw3pQ==",
"dev": true,
"requires": {
"markdown-it": "10.0.0"
@@ -5207,6 +5298,12 @@
"mimic-fn": "^2.1.0"
}
},
+ "opencollective-postinstall": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz",
+ "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==",
+ "dev": true
+ },
"optimist": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
@@ -5504,6 +5601,75 @@
"integrity": "sha1-DPd1eml38b9/ajIge3CeN3OI6HQ=",
"dev": true
},
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+ "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ }
+ }
+ },
+ "please-upgrade-node": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
+ "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+ "dev": true,
+ "requires": {
+ "semver-compare": "^1.0.0"
+ }
+ },
"plur": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz",
@@ -6294,6 +6460,18 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
},
+ "semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+ "dev": true
+ },
+ "semver-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
+ "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
+ "dev": true
+ },
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -8212,6 +8390,12 @@
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
+ "which-pm-runs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
+ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
+ "dev": true
+ },
"wide-align": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
diff --git a/package.json b/package.json
index 1b150ed4..4640e627 100644
--- a/package.json
+++ b/package.json
@@ -12,8 +12,9 @@
"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:e2e": "NODE_ENV=test ./node_modules/mocha/bin/mocha tests/e2e --recursive",
+ "test:lint": "grunt --env=test",
"config:check": "node tests/configs/check_config.js",
- "lint": "grunt"
+ "lint": "grunt --env=lint"
},
"repository": {
"type": "git",
diff --git a/tests/node_modules/webdriverajaxstub/index.js b/tests/node_modules/webdriverajaxstub/index.js
index 031de5ac..186033b6 100644
--- a/tests/node_modules/webdriverajaxstub/index.js
+++ b/tests/node_modules/webdriverajaxstub/index.js
@@ -13,7 +13,7 @@ function plugin (wdInstance, requests) {
this.send = function () {
this.status = 200;
this.readyState = 4;
- const response = this.url.includes('.njk') ? template : data;
+ const response = this.url.includes(".njk") ? template : data;
this.response = response;
this.responseText = response;
this.onreadystatechange();
diff --git a/tests/unit/functions/currentweather_spec.js b/tests/unit/functions/currentweather_spec.js
index 0afbbd7b..d630cb9f 100644
--- a/tests/unit/functions/currentweather_spec.js
+++ b/tests/unit/functions/currentweather_spec.js
@@ -1,3 +1,4 @@
+/* eslint no-multi-spaces: 0 */
var expect = require("chai").expect;
describe("Functions module currentweather", function() {
diff --git a/tests/unit/functions/weatherforecast_spec.js b/tests/unit/functions/weatherforecast_spec.js
index 6c40531e..ea078bc7 100644
--- a/tests/unit/functions/weatherforecast_spec.js
+++ b/tests/unit/functions/weatherforecast_spec.js
@@ -1,3 +1,4 @@
+/* eslint no-multi-spaces: 0 */
var expect = require("chai").expect;
describe("Functions module weatherforecast", function() {
diff --git a/vendor/package-lock.json b/vendor/package-lock.json
index 61c1d19e..3253cc4e 100644
--- a/vendor/package-lock.json
+++ b/vendor/package-lock.json
@@ -703,6 +703,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "optional": true,
"requires": {
"is-glob": "^2.0.0"
}
@@ -716,7 +717,8 @@
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "optional": true
},
"invert-kv": {
"version": "1.0.0",
@@ -735,7 +737,8 @@
"is-buffer": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
- "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
+ "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
+ "optional": true
},
"is-dotfile": {
"version": "1.0.3",
@@ -761,7 +764,8 @@
"is-extglob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
@@ -775,6 +779,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "optional": true,
"requires": {
"is-extglob": "^1.0.0"
}
@@ -803,7 +808,8 @@
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "optional": true
},
"isobject": {
"version": "2.1.0",
@@ -818,6 +824,7 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "optional": true,
"requires": {
"is-buffer": "^1.1.5"
}
@@ -883,6 +890,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "optional": true,
"requires": {
"remove-trailing-separator": "^1.0.1"
}
@@ -1031,12 +1039,14 @@
"remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "optional": true
},
"repeat-element": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "optional": true
},
"repeat-string": {
"version": "1.6.1",
@@ -1047,7 +1057,8 @@
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "optional": true
},
"set-immediate-shim": {
"version": "1.0.1",