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 5f8f6024..2f9f3690 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,24 @@ dist: trusty language: node_js node_js: - - "10" + - 10 + - lts/* + - node before_install: - npm i -g npm before_script: - - yarn danger ci - - npm install grunt-cli -g - - "export DISPLAY=:99.0" - - "export ELECTRON_DISABLE_SANDBOX=1" - - "sh -e /etc/init.d/xvfb start" - - sleep 5 + - yarn danger ci + - npm install grunt-cli -g + - "export DISPLAY=:99.0" + - "export ELECTRON_DISABLE_SANDBOX=1" + - "sh -e /etc/init.d/xvfb start" + - sleep 5 script: -- npm run test:e2e -- npm run test:unit -- grunt + - npm run test:lint + - npm run test:e2e + - npm run test:unit after_script: - - npm list + - npm list cache: - directories: - - node_modules + directories: + - node_modules diff --git a/CHANGELOG.md b/CHANGELOG.md index 603ac1b8..f701f165 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,19 +12,29 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Deleted - Remove installers. - Remove externalized scripts. +- Remove jshint dependency, instead eslint checks your config file now ### Added +- Brazilian translation for "FEELS". - Ukrainian translation. - Finnish translation for "PRECIP", "UPDATE_INFO_MULTIPLE" and "UPDATE_INFO_SINGLE". - Added the ability to hide the temp label and weather icon in the `currentweather` module to allow showing only information such as wind and sunset/rise. - The `clock` module now optionally displays sun and moon data, including rise/set times, remaining daylight, and percent of moon illumination. - Added Hebrew translation. +- 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 +- Fix FEELS translation for Croatian +- Fixed weather tests [#1840](https://github.com/MichMich/MagicMirror/issues/1840) +- Fixed Socket.io can't be used with Reverse Proxy in serveronly mode [#1934](https://github.com/MichMich/MagicMirror/issues/1934) +- Fix update checking skipping 3rd party modules the first time ### Changed - Remove documentation from core repository and link to new dedicated docs site: [docs.magicmirror.builders](https://docs.magicmirror.builders). @@ -33,6 +43,9 @@ This project adheres to [Semantic Versioning](http://semver.org/). - To start using electron, use `npm run start`. - To start in server only mode, use `npm run server`. - Remove redundant logging from modules. +- Timestamp in log output now also contains the date +- Turkish translation. +- Option to configure the size of the currentweather module. ## [2.10.1] - 2020-01-10 @@ -572,7 +585,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/clientonly/index.js b/clientonly/index.js index 895dacae..6430b270 100644 --- a/clientonly/index.js +++ b/clientonly/index.js @@ -1,5 +1,3 @@ -/* jshint esversion: 6 */ - "use strict"; // Use separate scope to prevent global scope pollution diff --git a/config/config.js.sample b/config/config.js.sample index c22960e5..414054da 100644 --- a/config/config.js.sample +++ b/config/config.js.sample @@ -21,6 +21,10 @@ var config = { // or IPv4 range of 192.168.3.0 --> 192.168.3.15 use CIDR format : // ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.3.0/28"], + 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", @@ -63,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" } }, @@ -73,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/index.html b/index.html index d8604256..5a46bb72 100644 --- a/index.html +++ b/index.html @@ -37,7 +37,7 @@
- + diff --git a/js/app.js b/js/app.js index 08612dd8..b7c55ffa 100644 --- a/js/app.js +++ b/js/app.js @@ -14,7 +14,7 @@ var path = require("path"); require("module-alias/register"); // add timestamps in front of log messages -require("console-stamp")(console, "HH:MM:ss.l"); +require("console-stamp")(console, "yyyy-mm-dd HH:MM:ss.l"); // Get version number. global.version = JSON.parse(fs.readFileSync("package.json", "utf8")).version; @@ -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/electron.js b/js/electron.js index c5e9c4cb..f7615b1c 100644 --- a/js/electron.js +++ b/js/electron.js @@ -1,5 +1,3 @@ -/* jshint esversion: 6 */ - "use strict"; const electron = require("electron"); 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 de44ccce..465f1d45 100644 --- a/js/main.js +++ b/js/main.js @@ -1,5 +1,4 @@ /* global Log, Loader, Module, config, defaults */ -/* jshint -W020, esversion: 6 */ /* Magic Mirror * Main System @@ -306,7 +305,9 @@ var MM = (function() { module.showHideTimer = setTimeout(function() { if (typeof callback === "function") { callback(); } }, speed); - + } else { + // invoke callback + if (typeof callback === "function") { callback(); } } }; @@ -377,7 +378,7 @@ var MM = (function() { * * return array - Filtered collection of modules. */ - var exceptWithClass = function(className) { + var exceptWithClass = function(className) { return modulesByClass(className, false); }; @@ -439,10 +440,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/module.js b/js/module.js index a245db52..e456e6a8 100644 --- a/js/module.js +++ b/js/module.js @@ -417,8 +417,11 @@ var Module = Class.extend({ callback = callback || function () { }; options = options || {}; - this.resume(); - MM.showModule(this, speed, callback, options); + var self = this; + MM.showModule(this, speed, function () { + self.resume(); + callback; + }, options); } }); 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 b9c9b0d8..185790af 100644 --- a/js/server.js +++ b/js/server.js @@ -7,8 +7,6 @@ var express = require("express"); var app = require("express")(); -var server = require("http").Server(app); -var io = require("socket.io")(server); var path = require("path"); var ipfilter = require("express-ipfilter").IpFilter; var fs = require("fs"); @@ -22,6 +20,18 @@ var Server = function(config, callback) { port = process.env.MM_PORT; } + var server = null; + if(config.useHttps){ + 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 baead68e..ee30f267 100644 --- a/js/socketclient.js +++ b/js/socketclient.js @@ -8,15 +8,17 @@ var MMSocket = function(moduleName) { self.moduleName = moduleName; // Private Methods - self.socket = io("/" + self.moduleName); + self.socket = io("/" + self.moduleName, { + path: window.location.pathname + "socket.io" + }); var notificationCallback = function() {}; 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 2678edae..d93f570c 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -318,7 +318,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 96c31143..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,23 +167,31 @@ 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()); const moonTimes = SunCalc.getMoonTimes(now, this.config.lat, this.config.lon); - const isVisible = now.isBetween(moonTimes.rise, moonTimes.set); - const illuminatedFractionString = moonIllumination.fraction.toLocaleString(undefined, {style: 'percent'}); - moonWrapper.innerHTML = ' ' + illuminatedFractionString + '' + - ' ' + formatTime(this.config, moonTimes.rise) + ''+ - ' ' + formatTime(this.config, moonTimes.set) + ''; + const moonRise = moonTimes.rise; + var moonSet; + 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); + 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) : "...") + ""; } /**************************************************************** diff --git a/modules/default/currentweather/currentweather.js b/modules/default/currentweather/currentweather.js index 2f58de5b..7f7c805d 100644 --- a/modules/default/currentweather/currentweather.js +++ b/modules/default/currentweather/currentweather.js @@ -42,6 +42,7 @@ Module.register("currentweather",{ appendLocationNameToHeader: true, calendarClass: "calendar", + tableClass: "large", onlyTemp: false, hideTemp: false, @@ -175,6 +176,7 @@ Module.register("currentweather",{ // Override dom generator. getDom: function() { var wrapper = document.createElement("div"); + wrapper.className = this.config.tableClass; if (this.config.appid === "") { wrapper.innerHTML = "Please set the correct openweather appid in the config for module: " + this.name + "."; @@ -193,7 +195,7 @@ Module.register("currentweather",{ } var large = document.createElement("div"); - large.className = "large light"; + large.className = "light"; var degreeLabel = ""; if (this.config.units === "metric" || this.config.units === "imperial") { @@ -217,7 +219,7 @@ Module.register("currentweather",{ this.config.decimalSymbol = "."; } - if (this.config.hideTemp === true) { + if (this.config.hideTemp === false) { var weatherIcon = document.createElement("span"); weatherIcon.className = "wi weathericon " + this.weatherType; large.appendChild(weatherIcon); diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 9738ccc4..cb0e8ece 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 03ecd745..2d41626c 100644 --- a/modules/default/updatenotification/node_helper.js +++ b/modules/default/updatenotification/node_helper.js @@ -18,37 +18,30 @@ module.exports = NodeHelper.create({ configureModules: function(modules) { // Push MagicMirror itself , biggest chance it'll show up last in UI and isn't overwritten - // others will be added in front, asynchronously + // others will be added in front + // this method returns promises so we can't wait for every one to resolve before continuing simpleGits.push({"module": "default", "git": SimpleGit(path.normalize(__dirname + "/../../../"))}); - for (moduleName in modules) { - if (defaultModules.indexOf(moduleName) < 0) { - // Default modules are included in the main MagicMirror repo - var moduleFolder = path.normalize(__dirname + "/../../" + moduleName); + var promises = []; + + for (moduleName in modules) { + if (!this.ignoreUpdateChecking(moduleName)) { + // Default modules are included in the main MagicMirror repo + var moduleFolder = path.normalize(__dirname + "/../../" + moduleName); - var stat; try { //console.log("checking git for module="+moduleName) - stat = fs.statSync(path.join(moduleFolder, ".git")); + let stat = fs.statSync(path.join(moduleFolder, ".git")); + promises.push(this.resolveRemote(moduleName, moduleFolder)); } catch(err) { // Error when directory .git doesn't exist // This module is not managed with git, skip continue; } - - var res = function(mn, mf) { - var git = SimpleGit(mf); - git.getRemotes(true, function(err, remotes) { - if (remotes.length < 1 || remotes[0].name.length < 1) { - // No valid remote for folder, skip - return; - } - // Folder has .git and has at least one git remote, watch this folder - simpleGits.unshift({"module": mn, "git": git}); - }); - }(moduleName, moduleFolder); } } + + return Promise.all(promises); }, socketNotificationReceived: function (notification, payload) { @@ -56,21 +49,35 @@ module.exports = NodeHelper.create({ this.config = payload; } else if(notification === "MODULES") { // if this is the 1st time thru the update check process - if(this.updateProcessStarted==false ){ - this.updateProcessStarted=true; - this.configureModules(payload); - this.preformFetch(); + if (!this.updateProcessStarted) { + this.updateProcessStarted = true; + this.configureModules(payload).then(() => this.performFetch()); } } }, - preformFetch() { + resolveRemote: function(moduleName, moduleFolder) { + return new Promise((resolve, reject) => { + var git = SimpleGit(moduleFolder); + git.getRemotes(true, (err, remotes) => { + if (remotes.length < 1 || remotes[0].name.length < 1) { + // No valid remote for folder, skip + return resolve(); + } + // Folder has .git and has at least one git remote, watch this folder + simpleGits.unshift({"module": moduleName, "git": git}); + resolve(); + }); + }); + }, + + performFetch: function() { var self = this; - simpleGits.forEach(function(sg) { - sg.git.fetch().status(function(err, data) { + simpleGits.forEach((sg) => { + sg.git.fetch().status((err, data) => { data.module = sg.module; if (!err) { - sg.git.log({"-1": null}, function(err, data2) { + sg.git.log({"-1": null}, (err, data2) => { if (!err && data2.latest && "hash" in data2.latest) { data.hash = data2.latest.hash; self.sendSocketNotification("STATUS", data); @@ -91,8 +98,23 @@ module.exports = NodeHelper.create({ var self = this; clearTimeout(this.updateTimer); this.updateTimer = setTimeout(function() { - self.preformFetch(); + self.performFetch(); }, delay); + }, + + ignoreUpdateChecking: function(moduleName) { + // Should not check for updates for default modules + if (defaultModules.indexOf(moduleName) >= 0) { + return true; + } + + // Should not check for updates for ignored modules + if (this.config.ignoreModules.indexOf(moduleName) >= 0) { + return true; + } + + // The rest of the modules that passes should check for updates + return false; } }); diff --git a/modules/default/updatenotification/updatenotification.js b/modules/default/updatenotification/updatenotification.js index d4bdc568..35a018bf 100644 --- a/modules/default/updatenotification/updatenotification.js +++ b/modules/default/updatenotification/updatenotification.js @@ -3,6 +3,7 @@ Module.register("updatenotification", { defaults: { updateInterval: 10 * 60 * 1000, // every 10 minutes refreshInterval: 24 * 60 * 60 * 1000, // one day + ignoreModules: [] }, suspended: false, diff --git a/package-lock.json b/package-lock.json index 2509883d..b7c363b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,18 +14,18 @@ } }, "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.7.tgz", + "integrity": "sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/generator": "^7.8.7", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.7", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -63,12 +63,12 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz", + "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.8.7", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -112,13 +112,13 @@ } }, "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", + "@babel/traverse": "^7.8.4", "@babel/types": "^7.8.3" } }, @@ -165,51 +165,51 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz", + "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==", "dev": true }, "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz", + "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true } } }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", + "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.6", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -233,9 +233,9 @@ } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", + "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -317,9 +317,9 @@ "dev": true }, "@types/node": { - "version": "13.1.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.8.tgz", - "integrity": "sha512-6XzyyNM9EKQW4HKuzbo/CkOIjn/evtCmsU+MUM1xDfJ+3/rNjBttM1NgN7AOQvN6tP1Sl1D1PIKMreTArnxM9A==", + "version": "13.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.1.tgz", + "integrity": "sha512-E6M6N0blf/jiZx8Q3nb0vNaswQeEyn0XlupO+xN6DtJ6r6IT4nXrTry7zhIfYvFCl3/8Cu6WIysmUBKiqV0bqQ==", "dev": true }, "@types/normalize-package-data": { @@ -688,9 +688,9 @@ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, "bail": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", - "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", "dev": true }, "balanced-match": { @@ -836,14 +836,14 @@ "dev": true }, "browserslist": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", - "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz", + "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001017", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.44" + "caniuse-lite": "^1.0.30001030", + "electron-to-chromium": "^1.3.363", + "node-releases": "^1.1.50" } }, "btoa-lite": { @@ -937,9 +937,9 @@ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, "caniuse-lite": { - "version": "1.0.30001021", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz", - "integrity": "sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g==", + "version": "1.0.30001035", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", + "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", "dev": true }, "caseless": { @@ -948,9 +948,9 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "ccount": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", - "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", + "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==", "dev": true }, "chai": { @@ -989,27 +989,27 @@ } }, "character-entities": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", - "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "dev": true }, "character-entities-html4": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.3.tgz", - "integrity": "sha512-SwnyZ7jQBCRHELk9zf2CN5AnGEc2nA+uKMZLHvcqhpPprjkYhiLn0DywMHgN5ttFZuITMATbh68M6VIVKwJbcg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", "dev": true }, "character-entities-legacy": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", - "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", "dev": true }, "character-reference-invalid": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", - "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", "dev": true }, "chardet": { @@ -1048,37 +1048,17 @@ } } }, + "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", "integrity": "sha512-Rx9Zw8KQkoPO3/O2yPRchCZm3cGubCQiRLmmFAlbkDKobUIPP3JYul+bKILR9DIv1gSVwPQSgF8JGGkXzX8Q0w==" }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -1159,9 +1139,9 @@ "dev": true }, "collapse-white-space": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", - "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", "dev": true }, "color-convert": { @@ -1198,6 +1178,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", @@ -1264,15 +1250,6 @@ } } }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, "console-stamp": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-0.2.9.tgz", @@ -1428,6 +1405,12 @@ "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", "dev": true }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", @@ -1569,12 +1552,6 @@ } } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, "date-time": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz", @@ -1774,15 +1751,6 @@ "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1865,9 +1833,9 @@ } }, "electron-to-chromium": { - "version": "1.3.338", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.338.tgz", - "integrity": "sha512-wlmfixuHEc9CkfOKgcqdtzBmRW4NStM9ptl5oPILY2UDyHuSXb3Yit+yLVyLObTgGuMMU36hhnfs2GDJId7ctA==", + "version": "1.3.376", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz", + "integrity": "sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw==", "dev": true }, "emoji-regex": { @@ -2459,16 +2427,17 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-glob": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz", - "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.0", "merge2": "^1.3.0", - "micromatch": "^4.0.2" + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" } }, "fast-json-stable-stringify": { @@ -2483,12 +2452,12 @@ "dev": true }, "fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", + "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", "dev": true, "requires": { - "reusify": "^1.0.0" + "reusify": "^1.0.4" } }, "fd-slicer": { @@ -2579,6 +2548,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,18 +3078,18 @@ } }, "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": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.13.0.tgz", - "integrity": "sha512-Ju9N03UBvPwcdoJYL77pDk0k0E8VD4oYtTfoRwvvPM1ON2MjOXWwPyaeIoYPnhUwcfN9D7TaXnTtuhNoWNsyrQ==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.14.0.tgz", + "integrity": "sha512-4gi/Yw9djHEdRlikKvFjy2wkHlD1YVzlJOePUPlYm1PIpGi3PMVJoc7Eon6RVSjdRcj3NcYHbeNA0EzplXzp7w==", "dev": true, "requires": { "chalk": "^2.4.2" @@ -3350,27 +3328,6 @@ "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", "dev": true }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - }, - "dependencies": { - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - } - } - }, "http-auth": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.2.4.tgz", @@ -3449,6 +3406,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", @@ -3666,9 +3693,9 @@ "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, "is-alphabetical": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", - "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", "dev": true }, "is-alphanumeric": { @@ -3678,9 +3705,9 @@ "dev": true }, "is-alphanumerical": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", - "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", "dev": true, "requires": { "is-alphabetical": "^1.0.0", @@ -3720,9 +3747,9 @@ "dev": true }, "is-decimal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", - "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", "dev": true }, "is-extendable": { @@ -3763,9 +3790,9 @@ } }, "is-hexadecimal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", - "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "dev": true }, "is-number": { @@ -3774,12 +3801,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -3833,15 +3854,15 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-whitespace-character": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", - "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", "dev": true }, "is-word-character": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz", - "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", "dev": true }, "isarray": { @@ -3938,30 +3959,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "jshint": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.3.tgz", - "integrity": "sha512-d8AoXcNNYzmm7cdmulQ3dQApbrPYArtVBO6n4xOICe4QsXGNHCAKDcFORzqP52LhK61KX0VhY39yYzCsNq+bxQ==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.11", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - } - } - }, "jsome": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/jsome/-/jsome-2.5.0.tgz", @@ -4111,9 +4108,9 @@ "dev": true }, "known-css-properties": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.17.0.tgz", - "integrity": "sha512-Vi3nxDGMm/z+lAaCjvAR1u+7fiv+sG6gU/iYDj5QOF8h76ytK9EW/EKfF0NeTyiGBi8Jy6Hklty/vxISrLox3w==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.18.0.tgz", + "integrity": "sha512-69AgJ1rQa7VvUsd2kpvVq+VeObDuo3zrj0CzM5Slmf6yduQFAI2kXPDQJR2IE/u6MSAUOJrwSzjg5vlz8qcMiw==", "dev": true }, "lazystream": { @@ -4351,9 +4348,9 @@ } }, "longest-streak": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.3.tgz", - "integrity": "sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", "dev": true }, "loud-rejection": { @@ -4392,9 +4389,9 @@ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "markdown-escapes": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz", - "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", "dev": true }, "markdown-it": { @@ -4417,18 +4414,18 @@ "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" } }, "mathml-tag-names": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz", - "integrity": "sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, "mdast-util-compact": { @@ -5016,9 +5013,9 @@ "dev": true }, "node-releases": { - "version": "1.1.46", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.46.tgz", - "integrity": "sha512-YOjdx+Uoh9FbRO7yVYbnbt1puRWPQMemR3SutLeyv2XfxKs1ihpe0OLAUwBPEP2ImNH/PZC7SEiC6j32dwRZ7g==", + "version": "1.1.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", + "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", "dev": true, "requires": { "semver": "^6.3.0" @@ -5207,6 +5204,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 +5507,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", @@ -5517,9 +5589,9 @@ "dev": true }, "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -5599,9 +5671,9 @@ } }, "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -5713,12 +5785,12 @@ "dev": true }, "postcss-safe-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", - "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "^7.0.26" } }, "postcss-sass": { @@ -5741,12 +5813,12 @@ } }, "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "dev": true, "requires": { - "dot-prop": "^4.1.1", + "cssesc": "^3.0.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } @@ -5758,9 +5830,9 @@ "dev": true }, "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", "dev": true }, "prelude-ls": { @@ -6294,6 +6366,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", @@ -6373,12 +6457,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -7050,9 +7128,9 @@ } }, "state-toggle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz", - "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", "dev": true }, "statuses": { @@ -7155,12 +7233,12 @@ "dev": true }, "stylelint": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.0.0.tgz", - "integrity": "sha512-6sjgOJbM3iLhnUtmRO0J1vvxie9VnhIZX/2fCehjylv9Gl9u0ytehGCTm9Lhw2p1F8yaNZn5UprvhCB8C3g/Tg==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.2.1.tgz", + "integrity": "sha512-461ZV4KpUe7pEHHgMOsH4kkjF7qsjkCIMJYOf7QQC4cvgPUJ0z4Nj+ah5fvKl1rzqBqc5EZa6P0nna4CGoJX+A==", "dev": true, "requires": { - "autoprefixer": "^9.7.3", + "autoprefixer": "^9.7.4", "balanced-match": "^1.0.0", "chalk": "^3.0.0", "cosmiconfig": "^6.0.0", @@ -7175,17 +7253,17 @@ "ignore": "^5.1.4", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", - "known-css-properties": "^0.17.0", + "known-css-properties": "^0.18.0", "leven": "^3.1.0", "lodash": "^4.17.15", "log-symbols": "^3.0.0", - "mathml-tag-names": "^2.1.1", - "meow": "^6.0.0", + "mathml-tag-names": "^2.1.3", + "meow": "^6.0.1", "micromatch": "^4.0.2", "normalize-selector": "^0.2.0", - "postcss": "^7.0.26", + "postcss": "^7.0.27", "postcss-html": "^0.36.0", - "postcss-jsx": "^0.36.3", + "postcss-jsx": "^0.36.4", "postcss-less": "^3.1.4", "postcss-markdown": "^0.36.0", "postcss-media-query-parser": "^0.2.3", @@ -7194,9 +7272,9 @@ "postcss-safe-parser": "^4.0.1", "postcss-sass": "^0.4.2", "postcss-scss": "^2.0.0", - "postcss-selector-parser": "^3.1.0", + "postcss-selector-parser": "^6.0.2", "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^4.0.2", + "postcss-value-parser": "^4.0.3", "resolve-from": "^5.0.0", "slash": "^3.0.0", "specificity": "^0.4.1", @@ -7207,7 +7285,7 @@ "svg-tags": "^1.0.0", "table": "^5.4.6", "v8-compile-cache": "^2.1.0", - "write-file-atomic": "^3.0.1" + "write-file-atomic": "^3.0.3" }, "dependencies": { "ansi-regex": { @@ -7233,9 +7311,9 @@ "dev": true }, "camelcase-keys": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.1.1.tgz", - "integrity": "sha512-kEPCddRFChEzO0d6w61yh0WbBiSv9gBnfZWGfXRYPlGqIdIGef6HMR6pgqVSEWCYkrp8B0AtEpEXNY+Jx0xk1A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.1.tgz", + "integrity": "sha512-BPCNVH56RVIxQQIXskp5tLQXUNGQ6sXr7iCv1FHDt81xBOQ/1r6H8SPxf19InVP6DexWar4s87q9thfuk8X9HA==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -7333,9 +7411,9 @@ "dev": true }, "meow": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-6.0.0.tgz", - "integrity": "sha512-x4rYsjigPBDAxY+BGuK83YLhUIqui5wYyZoqb6QJCUOs+0fiYq+i/NV4Jt8OgIfObZFxG9iTyvLDu4UTohGTFw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.0.1.tgz", + "integrity": "sha512-kxGTFgT/b7/oSRSQsJ0qsT5IMU+bgZ1eAdSA3kIV7onkW0QWo/hL5RbGlMfvBjHJKPE1LaPX0kdecYFiqYWjUw==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -7503,9 +7581,9 @@ "dev": true }, "stylelint-config-standard": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-19.0.0.tgz", - "integrity": "sha512-VvcODsL1PryzpYteWZo2YaA5vU/pWfjqBpOvmeA8iB2MteZ/ZhI1O4hnrWMidsS4vmEJpKtjdhLdfGJmmZm6Cg==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz", + "integrity": "sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==", "dev": true, "requires": { "stylelint-config-recommended": "^3.0.0" @@ -7783,15 +7861,15 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "trim-trailing-lines": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz", - "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", + "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==", "dev": true }, "trough": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", - "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", "dev": true }, "tslib": { @@ -7873,13 +7951,13 @@ } }, "unherit": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz", - "integrity": "sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", "dev": true, "requires": { - "inherits": "^2.0.1", - "xtend": "^4.0.1" + "inherits": "^2.0.0", + "xtend": "^4.0.0" }, "dependencies": { "xtend": { @@ -7937,9 +8015,9 @@ } }, "unist-util-stringify-position": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.2.tgz", - "integrity": "sha512-nK5n8OGhZ7ZgUwoUbL8uiVRwAbZyzBsB/Ddrlbu6jwwubFza4oe15KlyEaLNMXQW1svOQq4xesUeqA85YrIUQA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "dev": true, "requires": { "@types/unist": "^2.0.2" @@ -8112,9 +8190,9 @@ "dev": true }, "vfile-message": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.2.tgz", - "integrity": "sha512-gNV2Y2fDvDOOqq8bEe7cF3DXU6QgV4uA9zMR2P8tix11l1r7zju3zry3wZ8sx+BEfuO6WQ7z2QzfWTvqHQiwsA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.3.tgz", + "integrity": "sha512-qQg/2z8qnnBHL0psXyF72kCjb9YioIynvyltuNKFaUhRtqTIcIMP3xnBaPzirVZNuBrUe1qwFciSx2yApa4byw==", "dev": true, "requires": { "@types/unist": "^2.0.0", @@ -8212,6 +8290,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", @@ -8268,9 +8352,9 @@ } }, "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -8321,12 +8405,12 @@ "dev": true }, "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.2.tgz", + "integrity": "sha512-omakb0d7FjMo3R1D2EbTKVIk6dAVLRxFXdLZMEUToeAvuqgG/YuHMuQOZ5fgk+vQ8cx+cnGKwyg+8g8PNT0xQg==", "dev": true, "requires": { - "@babel/runtime": "^7.6.3" + "@babel/runtime": "^7.8.7" } }, "yargs": { diff --git a/package.json b/package.json index 1b150ed4..823624e5 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", @@ -47,7 +48,6 @@ "grunt-yamllint": "latest", "http-auth": "^3.2.3", "jsdom": "^11.6.2", - "jshint": "^2.10.2", "mocha": "^7.0.0", "mocha-each": "^1.1.0", "mocha-logger": "^1.0.6", diff --git a/serveronly/index.js b/serveronly/index.js index 3b8013ef..f7da58f5 100644 --- a/serveronly/index.js +++ b/serveronly/index.js @@ -1,5 +1,6 @@ var app = require("../js/app.js"); app.start(function(config) { var bindAddress = config.address ? config.address : "localhost"; - console.log("\nReady to go! Please point your browser to: http://" + bindAddress + ":" + config.port); + var httpType = config.useHttps ? "https" : "http"; + console.log("\nReady to go! Please point your browser to: " + httpType + "://" + bindAddress + ":" + config.port); }); diff --git a/tests/configs/check_config.js b/tests/configs/check_config.js index 03a275bf..917b6d32 100644 --- a/tests/configs/check_config.js +++ b/tests/configs/check_config.js @@ -9,7 +9,10 @@ * */ -var v = require("jshint"); +const Linter = require("eslint").Linter; +const linter = new Linter(); +const config = require(__dirname + "/../../.eslintrc.json"); + var path = require("path"); var fs = require("fs"); var Utils = require(__dirname + "/../../js/utils.js"); @@ -50,16 +53,15 @@ function checkConfigFile() { // I'm not sure if all ever is utf-8 fs.readFile(configFileName, "utf-8", function (err, data) { if (err) { throw err; } - v.JSHINT(data); // Parser by jshint - - if (v.JSHINT.errors.length === 0) { + const messages = linter.verify(data, config); + if (messages.length === 0) { console.log("Your configuration file doesn't contain syntax errors :)"); return true; } else { - errors = v.JSHINT.data().errors; + errors = messages; for (var idx in errors) { error = errors[idx]; - console.log("Line", error.line, "col", error.character, error.reason); + console.log("Line", error.line, "col", error.column, error.message); } } }); diff --git a/tests/e2e/modules/weather_spec.js b/tests/e2e/modules/weather_spec.js index dad11f50..ea916e5e 100644 --- a/tests/e2e/modules/weather_spec.js +++ b/tests/e2e/modules/weather_spec.js @@ -8,14 +8,7 @@ const helpers = require("../global-setup"); const {generateWeather, generateWeatherForecast} = require("./mocks"); -const wait = () => new Promise(res => setTimeout(res, 3000)); - -// See issue: https://github.com/MichMich/MagicMirror/issues/1840 -// Skipping the weather tests for now since these seem to give issues. -// Please send a PR if you know how to fix these. Thanks! - - -describe.skip("Weather module", function() { +describe("Weather module", function() { let app; @@ -49,7 +42,7 @@ describe.skip("Weather module", function() { it("should render wind speed and wind direction", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); return app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(2)", "6 WSW", 10000); }); @@ -59,7 +52,7 @@ describe.skip("Weather module", function() { const sunset = moment().startOf("day").unix(); const weather = generateWeather({sys: {sunrise, sunset}}); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather .normal.medium span.wi.dimmed.wi-sunrise", 10000); @@ -71,7 +64,7 @@ describe.skip("Weather module", function() { const sunset = moment().endOf("day").unix(); const weather = generateWeather({sys: {sunrise, sunset}}); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather .normal.medium span.wi.dimmed.wi-sunset", 10000); @@ -80,7 +73,7 @@ describe.skip("Weather module", function() { it("should render temperature with icon", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather .large.light span.wi.weathericon.wi-snow", 10000); @@ -89,7 +82,7 @@ describe.skip("Weather module", function() { it("should render feels like temperature", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); return app.client.waitUntilTextExists(".weather .normal.medium span.dimmed", "Feels like -5.6°", 10000); }); @@ -102,14 +95,14 @@ describe.skip("Weather module", function() { it("should render useBeaufort = false", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); return app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(2)", "12", 10000); }); it("should render showWindDirectionAsArrow = true", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather .normal.medium sup i.fa-long-arrow-up", 10000); const element = await app.client.getHTML(".weather .normal.medium sup i.fa-long-arrow-up"); @@ -119,7 +112,7 @@ describe.skip("Weather module", function() { it("should render showHumidity = true", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(3)", "93", 10000); return app.client.waitForExist(".weather .normal.medium sup i.wi-humidity", 10000); @@ -127,7 +120,7 @@ describe.skip("Weather module", function() { it("should render degreeLabel = true", async function() { const weather = generateWeather(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitUntilTextExists(".weather .large.light span.bright", "1°C", 10000); @@ -151,7 +144,7 @@ describe.skip("Weather module", function() { speed: 11.8 * 2.23694 }, }); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(2)", "6 WSW", 10000); await app.client.waitUntilTextExists(".weather .large.light span.bright", "34,7°", 10000); @@ -169,7 +162,7 @@ describe.skip("Weather module", function() { speed: 11.8 * 2.23694 }, }); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitUntilTextExists(".weather .normal.medium span:nth-child(3)", "93,7", 10000); await app.client.waitUntilTextExists(".weather .large.light span.bright", "34,7°", 10000); @@ -192,7 +185,7 @@ describe.skip("Weather module", function() { it("should render days", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const days = ["Fri", "Sat", "Sun", "Mon", "Tue"]; @@ -203,7 +196,7 @@ describe.skip("Weather module", function() { it("should render icons", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const icons = ["day-cloudy", "rain", "day-sunny", "day-sunny", "day-sunny"]; @@ -214,7 +207,7 @@ describe.skip("Weather module", function() { it("should render max temperatures", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const temperatures = ["24.4°", "21.0°", "22.9°", "23.4°", "20.6°"]; @@ -225,7 +218,7 @@ describe.skip("Weather module", function() { it("should render min temperatures", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const temperatures = ["15.3°", "13.6°", "13.8°", "13.9°", "10.9°"]; @@ -236,7 +229,7 @@ describe.skip("Weather module", function() { it("should render fading of rows", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); const opacities = [1, 1, 0.8, 0.5333333333333333, 0.2666666666666667]; @@ -256,14 +249,14 @@ describe.skip("Weather module", function() { it("should render custom table class", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather table.myTableClass", 10000); }); it("should render colored rows", async function() { const weather = generateWeatherForecast(); - await setup([weather, template]); + await setup({template, data: weather}); await app.client.waitForExist(".weather table.myTableClass", 10000); diff --git a/tests/node_modules/webdriverajaxstub/index.js b/tests/node_modules/webdriverajaxstub/index.js index ed524ddb..186033b6 100644 --- a/tests/node_modules/webdriverajaxstub/index.js +++ b/tests/node_modules/webdriverajaxstub/index.js @@ -3,7 +3,7 @@ function plugin (wdInstance, requests) { throw new Error("You can't use WebdriverAjaxStub with this version of WebdriverIO"); } - function stub(requests, done) { + function stub({template, data}, done) { window.XMLHttpRequest = function () { this.open = function (method, url) { this.method = method; @@ -13,7 +13,7 @@ function plugin (wdInstance, requests) { this.send = function () { this.status = 200; this.readyState = 4; - const response = requests.shift() || []; + 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/translations/hr.json b/translations/hr.json index d714cc7b..6ed6d314 100644 --- a/translations/hr.json +++ b/translations/hr.json @@ -31,5 +31,5 @@ "UPDATE_INFO_SINGLE": "Instalirana verzija {COMMIT_COUNT} commit kasni za branch-om {BRANCH_NAME}.", "UPDATE_INFO_MULTIPLE": "Instalirana verzija {COMMIT_COUNT} commit-ova kasni za branch-om {BRANCH_NAME}.", - "FEELS": "Osjeća" + "FEELS": "Osjećaj" } diff --git a/translations/pt-br.json b/translations/pt-br.json index 898e4f1f..e5726cc0 100644 --- a/translations/pt-br.json +++ b/translations/pt-br.json @@ -26,5 +26,8 @@ "UPDATE_NOTIFICATION": "Nova atualização para MagicMirror disponível.", "UPDATE_NOTIFICATION_MODULE": "Atualização para o módulo {MODULE_NAME} disponível.", "UPDATE_INFO_SINGLE": "Sua versão atual é a {COMMIT_COUNT} commit dentro do seguinte branch {BRANCH_NAME}.", - "UPDATE_INFO_MULTIPLE": "Sua versão atual é a {COMMIT_COUNT} commits dentro do seguinte branch {BRANCH_NAME}." + "UPDATE_INFO_MULTIPLE": "Sua versão atual é a {COMMIT_COUNT} commits dentro do seguinte branch {BRANCH_NAME}.", + + "FEELS": "Percebida", + "PRECIP": "PoP" } diff --git a/translations/tr.json b/translations/tr.json index c79956b8..61726f6d 100644 --- a/translations/tr.json +++ b/translations/tr.json @@ -3,8 +3,11 @@ "TODAY": "Bugün", "TOMORROW": "Yarın", + "DAYAFTERTOMORROW": "İki gün içinde", "RUNNING": "Biten", "EMPTY": "Yakında etkinlik yok.", + + "WEEK": "Hafta {weekNumber}", "N": "K", "NNE": "KKD", @@ -21,5 +24,14 @@ "W": "B", "WNW": "BKB", "NW": "KB", - "NNW": "KKB" + "NNW": "KKB", + + "UPDATE_NOTIFICATION": "MagicMirror² güncellemesi mevcut.", + "UPDATE_NOTIFICATION_MODULE": "{MODULE_NAME} modulü için güncelleme mevcut.", + "UPDATE_INFO_SINGLE": "Sahip olduğunuz kurulum {BRANCH_NAME} branchinden {COMMIT_COUNT} commit geridedir.", + "UPDATE_INFO_MULTIPLE": "Sahip olduğunuz kurulum {BRANCH_NAME} branchinden {COMMIT_COUNT} commit geridedir.", + + "FEELS": "Hissedilen", + "PRECIP": "Yağış" + } 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",