diff --git a/.github/workflows/enforce-changelog.yml b/.github/workflows/enforce-changelog.yml
new file mode 100644
index 00000000..eefa1645
--- /dev/null
+++ b/.github/workflows/enforce-changelog.yml
@@ -0,0 +1,15 @@
+name: "Enforce Changelog"
+on:
+ pull_request:
+ types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled]
+
+jobs:
+ # Enforces the update of a changelog file on every pull request
+ check:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: dangoslen/changelog-enforcer@v1.6.1
+ with:
+ changeLogPath: 'CHANGELOG.md'
+ skipLabels: 'Skip Changelog'
diff --git a/.github/workflows/node-ci.js.yml b/.github/workflows/node-ci.js.yml
new file mode 100644
index 00000000..f794c941
--- /dev/null
+++ b/.github/workflows/node-ci.js.yml
@@ -0,0 +1,35 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: Automated Tests
+
+on:
+ push:
+ branches: [ master, develop ]
+ pull_request:
+ branches: [ master, develop ]
+
+jobs:
+ test:
+
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [10.x, 12.x, 14.x]
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - run: |
+ Xvfb :99 -screen 0 1024x768x16 &
+ export DISPLAY=:99
+ npm install
+ npm run test:prettier
+ npm run test:js
+ npm run test:css
+ npm run test:e2e
+ npm run test:unit
diff --git a/.prettierignore b/.prettierignore
index 3b87fcd2..b829fa7c 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -2,3 +2,4 @@ package-lock.json
/config/**/*
/vendor/**/*
!/vendor/vendor.js
+.github/**/*
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index b2c4ae0f..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-dist: trusty
-language: node_js
-node_js:
- - 10
- - lts/*
- - node
-before_install:
- - npm i -g npm
-before_script:
- - yarn danger ci
- - "export DISPLAY=:99.0"
- - "export ELECTRON_DISABLE_SANDBOX=1"
- - "sh -e /etc/init.d/xvfb start"
- - sleep 5
-script:
- - npm run test:prettier
- - npm run test:js
- - npm run test:css
- - npm run test:e2e
- - npm run test:unit
-after_script:
- - npm list
-cache:
- directories:
- - node_modules
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 41e39aec..7228c8b6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,27 +12,46 @@ _This release is scheduled to be released on 2021-01-01._
### Added
- Added new log level "debug" to the logger.
-
+- Added new parameter "useKmh" to weather module for displaying wind speed as kmh.
+- Chuvash translation.
+- Added Weatherbit as a provider to Weather module.
+- Added SMHI as a provider to Weather module.
- Added Hindi & Gujarati translation.
- Chuvash translation.
+- Calendar: new options "limitDays" and "coloredEvents".
+- Added new option "limitDays" - limit the number of discreet days displayed.
+- Added new option "customEvents" - use custom symbol/color based on keyword in event title.
+- Added GitHub workflows for automated testing and changelog enforcement.
### Updated
- Weather module - forecast now show TODAY and TOMORROW instead of weekday, to make it easier to understand.
- Update dependencies to latest versions.
+- Update dependencies eslint, feedme, simple-git and socket.io to latest versions.
+- Update lithuanian translation.
### Deleted
+- Removed Travis CI intergration.
+
### Fixed
- JSON Parse translation files with comments crashing UI. (#2149)
- Calendar parsing where RRULE bug returns wrong date, add Windows timezone name support. (#2145, #2151)
- Wrong node-ical version installed (package.json) requested version. (#2153)
-- Fix calendar fetcher subsequent timing (#2160)
+- Fix calendar fetcher subsequent timing. (#2160)
- Rename Greek translation to correct ISO 639-1 alpha-2 code (gr > el). (#2155)
-- Add a space after icons of sunrise and sunset (#2169)
-- Fix calendar when no DTEND record found in event, startDate overlay when endDate set (#2177)
-- Fix calendar full day event east of UTC start time (#2200)
+- Add a space after icons of sunrise and sunset. (#2169)
+- Fix calendar when no DTEND record found in event, startDate overlay when endDate set. (#2177)
+- Fix windspeed convertion error in ukmetoffice weather provider. (#2189)
+- Fix console.debug not having timestamps. (#2199)
+- Fix calendar full day event east of UTC start time. (#2200)
+- Fix non-fullday recurring rule processing. (#2216)
+- Catch errors when parsing calendar data with ical. (#2022)
+- Corrected logic for timeFormat "relative" and "absolute".
+- Fix Default Alert Module does not hide black overlay when alert is dismissed manually. (#2228)
+- Weather module - Always displays night icons when local is other then English. (#2221)
+- update Node-ical 0.12.4 , fix invalid RRULE format in cal entries
## [2.13.0] - 2020-10-01
@@ -237,7 +256,7 @@ Special thanks to @sdetweil for all his great contributions!
- Option to show event location in calendar
- Finnish translation for "Feels" and "Weeks"
-- Russian translation for "Feels"
+- Russian translation for “Feels”
- Calendar module: added `nextDaysRelative` config option
- Add `broadcastPastEvents` config option for calendars to include events from the past `maximumNumberOfDays` in event broadcasts
- Added feature to broadcast news feed items `NEWS_FEED` and updated news items `NEWS_FEED_UPDATED` in default [newsfeed](https://github.com/MichMich/MagicMirror/tree/develop/modules/default/newsfeed) module (when news is updated) with documented default and `config.js` options in [README.md](https://github.com/MichMich/MagicMirror/blob/develop/modules/default/newsfeed/README.md)
diff --git a/README.md b/README.md
index e09e2e34..d4ca67ab 100644
--- a/README.md
+++ b/README.md
@@ -5,8 +5,7 @@
-
-
+
**MagicMirror²** is an open source modular smart mirror platform. With a growing list of installable modules, the **MagicMirror²** allows you to convert your hallway or bathroom mirror into your personal assistant. **MagicMirror²** is built by the creator of [the original MagicMirror](https://michaelteeuw.nl/tagged/magicmirror) with the incredible help of a [growing community of contributors](https://github.com/MichMich/MagicMirror/graphs/contributors).
@@ -40,6 +39,6 @@ If we receive enough donations we might even be able to free up some working hou
To donate, please follow [this](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G5D8E9MR5DTD2&source=url) link.
-
+
diff --git a/js/logger.js b/js/logger.js
index e9e17c52..93a5bb53 100644
--- a/js/logger.js
+++ b/js/logger.js
@@ -10,7 +10,10 @@
(function (root, factory) {
if (typeof exports === "object") {
// add timestamps in front of log messages
- require("console-stamp")(console, "yyyy-mm-dd HH:MM:ss.l");
+ require("console-stamp")(console, {
+ pattern: "yyyy-mm-dd HH:MM:ss.l",
+ include: ["debug", "log", "info", "warn", "error"]
+ });
// Node, CommonJS-like
module.exports = factory(root.config);
@@ -21,8 +24,8 @@
})(this, function (config) {
const logLevel = {
debug: Function.prototype.bind.call(console.debug, console),
- info: Function.prototype.bind.call(console.info, console),
log: Function.prototype.bind.call(console.log, console),
+ info: Function.prototype.bind.call(console.info, console),
warn: Function.prototype.bind.call(console.warn, console),
error: Function.prototype.bind.call(console.error, console),
group: Function.prototype.bind.call(console.group, console),
diff --git a/modules/default/alert/alert.js b/modules/default/alert/alert.js
index b2eb2eb2..8d175b39 100644
--- a/modules/default/alert/alert.js
+++ b/modules/default/alert/alert.js
@@ -100,10 +100,13 @@ Module.register("alert", {
message: image + message,
effect: this.config.alert_effect,
ttl: params.timer,
+ onClose: () => this.hide_alert(sender),
al_no: "ns-alert"
});
+
//Show alert
this.alerts[sender.name].show();
+
//Add timer to dismiss alert and overlay
if (params.timer) {
setTimeout(() => {
diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js
index b2737586..73af9ecd 100755
--- a/modules/default/calendar/calendar.js
+++ b/modules/default/calendar/calendar.js
@@ -11,6 +11,7 @@ Module.register("calendar", {
defaults: {
maximumEntries: 10, // Total Maximum Entries
maximumNumberOfDays: 365,
+ limitDays: 0, // Limit the number of days shown, 0 = no limit
displaySymbol: true,
defaultSymbol: "calendar", // Fontawesome Symbol see https://fontawesome.com/cheatsheet?from=io
showLocation: false,
@@ -37,6 +38,7 @@ Module.register("calendar", {
hideOngoing: false,
colored: false,
coloredSymbolOnly: false,
+ customEvents: [], // Array of {keyword: "", symbol: "", color: ""} where Keyword is a regexp and symbol/color are to be applied for matched
tableClass: "small",
calendars: [
{
@@ -153,6 +155,12 @@ Module.register("calendar", {
// Override dom generator.
getDom: function () {
+ // Define second, minute, hour, and day constants
+ const oneSecond = 1000; // 1,000 milliseconds
+ const oneMinute = oneSecond * 60;
+ const oneHour = oneMinute * 60;
+ const oneDay = oneHour * 24;
+
var events = this.createEventList();
var wrapper = document.createElement("table");
wrapper.className = this.config.tableClass;
@@ -173,6 +181,8 @@ Module.register("calendar", {
var currentFadeStep = 0;
var lastSeenDate = "";
+ var ev;
+ var needle;
for (var e in events) {
var event = events[e];
@@ -218,6 +228,19 @@ Module.register("calendar", {
symbolWrapper.className = "symbol align-right " + symbolClass;
var symbols = this.symbolsForEvent(event);
+ // If symbols are displayed and custom symbol is set, replace event symbol
+ if (this.config.displaySymbol && this.config.customEvents.length > 0) {
+ for (ev in this.config.customEvents) {
+ if (typeof this.config.customEvents[ev].symbol !== "undefined" && this.config.customEvents[ev].symbol !== "") {
+ needle = new RegExp(this.config.customEvents[ev].keyword, "gi");
+ if (needle.test(event.title)) {
+ symbols[0] = this.config.customEvents[ev].symbol;
+ break;
+ }
+ }
+ }
+ }
+
for (var i = 0; i < symbols.length; i++) {
var symbol = document.createElement("span");
symbol.className = "fa fa-fw fa-" + symbols[i];
@@ -248,6 +271,23 @@ Module.register("calendar", {
}
}
+ // Color events if custom color is specified
+ if (this.config.customEvents.length > 0) {
+ for (ev in this.config.customEvents) {
+ if (typeof this.config.customEvents[ev].color !== "undefined" && this.config.customEvents[ev].color !== "") {
+ needle = new RegExp(this.config.customEvents[ev].keyword, "gi");
+ if (needle.test(event.title)) {
+ eventWrapper.style.cssText = "color:" + this.config.customEvents[ev].color;
+ titleWrapper.style.cssText = "color:" + this.config.customEvents[ev].color;
+ if (this.config.displaySymbol) {
+ symbolWrapper.style.cssText = "color:" + this.config.customEvents[ev].color;
+ }
+ break;
+ }
+ }
+ }
+ }
+
titleWrapper.innerHTML = this.titleTransform(event.title, this.config.titleReplace, this.config.wrapEvents, this.config.maxTitleLength, this.config.maxTitleLines) + repeatingCountTitle;
var titleClass = this.titleClassForUrl(event.url);
@@ -280,82 +320,56 @@ Module.register("calendar", {
eventWrapper.appendChild(titleWrapper);
var now = new Date();
- // Define second, minute, hour, and day variables
- var oneSecond = 1000; // 1,000 milliseconds
- var oneMinute = oneSecond * 60;
- var oneHour = oneMinute * 60;
- var oneDay = oneHour * 24;
- if (event.fullDayEvent) {
- //subtract one second so that fullDayEvents end at 23:59:59, and not at 0:00:00 one the next day
- event.endDate -= oneSecond;
- if (event.today) {
- timeWrapper.innerHTML = this.capFirst(this.translate("TODAY"));
- } else if (event.startDate - now < oneDay && event.startDate - now > 0) {
- timeWrapper.innerHTML = this.capFirst(this.translate("TOMORROW"));
- } else if (event.startDate - now < 2 * oneDay && event.startDate - now > 0) {
- if (this.translate("DAYAFTERTOMORROW") !== "DAYAFTERTOMORROW") {
- timeWrapper.innerHTML = this.capFirst(this.translate("DAYAFTERTOMORROW"));
- } else {
+
+ if (this.config.timeFormat === "absolute") {
+ // Use dateFormat
+ timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat));
+ // Add end time if showEnd
+ if (this.config.showEnd) {
+ timeWrapper.innerHTML += "-";
+ timeWrapper.innerHTML += this.capFirst(moment(event.endDate, "x").format(this.config.dateEndFormat));
+ }
+ // For full day events we use the fullDayEventDateFormat
+ if (event.fullDayEvent) {
+ //subtract one second so that fullDayEvents end at 23:59:59, and not at 0:00:00 one the next day
+ event.endDate -= oneSecond;
+ timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.fullDayEventDateFormat));
+ }
+ if (this.config.getRelative > 0 && event.startDate < now) {
+ // Ongoing and getRelative is set
+ timeWrapper.innerHTML = this.capFirst(
+ this.translate("RUNNING", {
+ fallback: this.translate("RUNNING") + " {timeUntilEnd}",
+ timeUntilEnd: moment(event.endDate, "x").fromNow(true)
+ })
+ );
+ } else if (this.config.urgency > 0 && event.startDate - now < this.config.urgency * oneDay) {
+ // Within urgency days
+ timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
+ }
+ if (event.fullDayEvent && this.config.nextDaysRelative) {
+ // Full days events within the next two days
+ if (event.today) {
+ timeWrapper.innerHTML = this.capFirst(this.translate("TODAY"));
+ } else if (event.startDate - now < oneDay && event.startDate - now > 0) {
+ timeWrapper.innerHTML = this.capFirst(this.translate("TOMORROW"));
+ } else if (event.startDate - now < 2 * oneDay && event.startDate - now > 0) {
+ if (this.translate("DAYAFTERTOMORROW") !== "DAYAFTERTOMORROW") {
+ timeWrapper.innerHTML = this.capFirst(this.translate("DAYAFTERTOMORROW"));
+ }
+ }
+ }
+ } else {
+ // Show relative times
+ if (event.startDate >= now) {
+ // Use relative time
+ timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").calendar());
+ if (event.startDate - now < this.config.getRelative * oneHour) {
+ // If event is within getRelative hours, display 'in xxx' time format or moment.fromNow()
timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
}
} else {
- /* Check to see if the user displays absolute or relative dates with their events
- * Also check to see if an event is happening within an 'urgency' time frameElement
- * For example, if the user set an .urgency of 7 days, those events that fall within that
- * time frame will be displayed with 'in xxx' time format or moment.fromNow()
- *
- * Note: this needs to be put in its own function, as the whole thing repeats again verbatim
- */
- if (this.config.timeFormat === "absolute") {
- if (this.config.urgency > 1 && event.startDate - now < this.config.urgency * oneDay) {
- // This event falls within the config.urgency period that the user has set
- timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").from(moment().format("YYYYMMDD")));
- } else {
- timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.fullDayEventDateFormat));
- }
- } else {
- timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").from(moment().format("YYYYMMDD")));
- }
- }
- if (this.config.showEnd) {
- timeWrapper.innerHTML += "-";
- timeWrapper.innerHTML += this.capFirst(moment(event.endDate, "x").format(this.config.fullDayEventDateFormat));
- }
- } else {
- if (event.startDate >= new Date()) {
- if (event.startDate - now < 2 * oneDay) {
- // This event is within the next 48 hours (2 days)
- if (event.startDate - now < this.config.getRelative * oneHour) {
- // If event is within 6 hour, display 'in xxx' time format or moment.fromNow()
- timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
- } else {
- if (this.config.timeFormat === "absolute" && !this.config.nextDaysRelative) {
- timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat));
- } else {
- // Otherwise just say 'Today/Tomorrow at such-n-such time'
- timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").calendar());
- }
- }
- } else {
- /* Check to see if the user displays absolute or relative dates with their events
- * Also check to see if an event is happening within an 'urgency' time frameElement
- * For example, if the user set an .urgency of 7 days, those events that fall within that
- * time frame will be displayed with 'in xxx' time format or moment.fromNow()
- *
- * Note: this needs to be put in its own function, as the whole thing repeats again verbatim
- */
- if (this.config.timeFormat === "absolute") {
- if (this.config.urgency > 1 && event.startDate - now < this.config.urgency * oneDay) {
- // This event falls within the config.urgency period that the user has set
- timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
- } else {
- timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").format(this.config.dateFormat));
- }
- } else {
- timeWrapper.innerHTML = this.capFirst(moment(event.startDate, "x").fromNow());
- }
- }
- } else {
+ // Ongoing event
timeWrapper.innerHTML = this.capFirst(
this.translate("RUNNING", {
fallback: this.translate("RUNNING") + " {timeUntilEnd}",
@@ -363,12 +377,7 @@ Module.register("calendar", {
})
);
}
- if (this.config.showEnd) {
- timeWrapper.innerHTML += "-";
- timeWrapper.innerHTML += this.capFirst(moment(event.endDate, "x").format(this.config.dateEndFormat));
- }
}
- //timeWrapper.innerHTML += ' - '+ moment(event.startDate,'x').format('lll');
timeWrapper.className = "time light " + this.timeClassForUrl(event.url);
eventWrapper.appendChild(timeWrapper);
}
@@ -521,6 +530,35 @@ Module.register("calendar", {
events.sort(function (a, b) {
return a.startDate - b.startDate;
});
+
+ // Limit the number of days displayed
+ // If limitDays is set > 0, limit display to that number of days
+ if (this.config.limitDays > 0) {
+ var newEvents = [];
+ var lastDate = today.clone().subtract(1, "days").format("YYYYMMDD");
+ var days = 0;
+ var eventDate;
+ for (var ev of events) {
+ eventDate = moment(ev.startDate, "x").format("YYYYMMDD");
+ // if date of event is later than lastdate
+ // check if we already are showing max unique days
+ if (eventDate > lastDate) {
+ // if the only entry in the first day is a full day event that day is not counted as unique
+ if (newEvents.length === 1 && days === 1 && newEvents[0].fullDayEvent) {
+ days--;
+ }
+ days++;
+ if (days > this.config.limitDays) {
+ continue;
+ } else {
+ lastDate = eventDate;
+ }
+ }
+ newEvents.push(ev);
+ }
+ events = newEvents;
+ }
+
return events.slice(0, this.config.maximumEntries);
},
diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js
index 7cb4434c..6c268c46 100644
--- a/modules/default/calendar/calendarfetcher.js
+++ b/modules/default/calendar/calendarfetcher.js
@@ -76,7 +76,18 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn
return;
}
- const data = ical.parseICS(requestData);
+ let data = [];
+
+ try {
+ data = ical.parseICS(requestData);
+ } catch (error) {
+ fetchFailedCallback(self, error.message);
+ scheduleTimer();
+ return;
+ }
+
+ Log.debug(" parsed data=" + JSON.stringify(data));
+
const newEvents = [];
// limitFunction doesn't do much limiting, see comment re: the dates array in rrule section below as to why we need to do the filtering ourselves
@@ -87,13 +98,13 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn
const eventDate = function (event, time) {
return isFullDayEvent(event) ? moment(event[time], "YYYYMMDD") : moment(new Date(event[time]));
};
-
+ Log.debug("there are " + Object.entries(data).length + " calendar entries");
Object.entries(data).forEach(([key, event]) => {
const now = new Date();
const today = moment().startOf("day").toDate();
const future = moment().startOf("day").add(maximumNumberOfDays, "days").subtract(1, "seconds").toDate(); // Subtract 1 second so that events that start on the middle of the night will not repeat.
let past = today;
-
+ Log.debug("have entries ");
if (includePastEvents) {
past = moment().startOf("day").subtract(maximumNumberOfDays, "days").toDate();
}
@@ -110,7 +121,8 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn
if (event.type === "VEVENT") {
let startDate = eventDate(event, "start");
let endDate;
- // Log.debug("\nevent="+JSON.stringify(event))
+
+ Log.debug("\nevent=" + JSON.stringify(event));
if (typeof event.end !== "undefined") {
endDate = eventDate(event, "end");
} else if (typeof event.duration !== "undefined") {
@@ -212,8 +224,15 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn
pastLocal = pastMoment.toDate();
futureLocal = futureMoment.toDate();
} else {
- pastLocal = pastMoment.subtract(past.getTimezoneOffset(), "minutes").toDate();
- futureLocal = futureMoment.subtract(future.getTimezoneOffset(), "minutes").toDate();
+ // if we want past events
+ if (includePastEvents) {
+ // use the calculated past time for the between from
+ pastLocal = pastMoment.toDate();
+ } else {
+ // otherwise use NOW.. cause we shouldnt use any before now
+ pastLocal = moment().toDate(); //now
+ }
+ futureLocal = futureMoment.toDate(); // future
}
Log.debug(" between=" + pastLocal + " to " + futureLocal);
const dates = rule.between(pastLocal, futureLocal, true, limitFunction);
@@ -299,6 +318,7 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn
}
if (showRecurrence === true) {
+ Log.debug("saving event =" + description);
addedEvents++;
newEvents.push({
title: recurrenceTitle,
@@ -352,7 +372,6 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn
}
// if the start and end are the same, then make end the 'end of day' value (start is at 00:00:00)
if (fullDayEvent && startDate.format("x") === endDate.format("x")) {
- //Log.debug("end same as start")
endDate = endDate.endOf("day");
}
// get correction for date saving and dst change between now and then
@@ -376,7 +395,21 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn
return a.startDate - b.startDate;
});
- events = newEvents.slice(0, maximumEntries);
+ // include up to maximumEntries current or upcoming events
+ // If past events should be included, include all past events
+ const now = moment();
+ var entries = 0;
+ events = [];
+ for (let ne of newEvents) {
+ if (moment(ne.endDate, "x").isBefore(now)) {
+ if (includePastEvents) events.push(ne);
+ continue;
+ }
+ entries++;
+ // If max events has been saved, skip the rest
+ if (entries > maximumEntries) break;
+ events.push(ne);
+ }
self.broadcastEvents();
scheduleTimer();
diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk
index c838c1e9..240dcdc5 100755
--- a/modules/default/weather/current.njk
+++ b/modules/default/weather/current.njk
@@ -9,7 +9,11 @@
{% if config.useBeaufort %}
{{ current.beaufortWindSpeed() | round }}
{% else %}
- {{ current.windSpeed | round }}
+ {% if config.useKmh %}
+ {{ current.kmhWindSpeed() | round }}
+ {% else %}
+ {{ current.windSpeed | round }}
+ {% endif %}
{% endif %}
{% if config.showWindDirection %}
diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js
index 4ba90105..b2bf4e78 100755
--- a/modules/default/weather/providers/darksky.js
+++ b/modules/default/weather/providers/darksky.js
@@ -62,7 +62,7 @@ WeatherProvider.register("darksky", {
// Implement WeatherDay generator.
generateWeatherDayFromCurrentWeather(currentWeatherData) {
- const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
currentWeather.date = moment();
currentWeather.humidity = parseFloat(currentWeatherData.currently.humidity);
@@ -80,7 +80,7 @@ WeatherProvider.register("darksky", {
const days = [];
for (const forecast of forecasts) {
- const weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
weather.date = moment(forecast.time, "X");
weather.minTemperature = forecast.temperatureMin;
diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js
index 12635f1b..2fde7139 100755
--- a/modules/default/weather/providers/openweathermap.js
+++ b/modules/default/weather/providers/openweathermap.js
@@ -89,11 +89,15 @@ WeatherProvider.register("openweathermap", {
* Generate a WeatherObject based on currentWeatherInformation
*/
generateWeatherObjectFromCurrentWeather(currentWeatherData) {
- const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
currentWeather.humidity = currentWeatherData.main.humidity;
currentWeather.temperature = currentWeatherData.main.temp;
- currentWeather.windSpeed = currentWeatherData.wind.speed;
+ if (this.config.windUnits === "metric") {
+ currentWeather.windSpeed = this.config.useKmh ? currentWeatherData.wind.speed * 3.6 : currentWeatherData.wind.speed;
+ } else {
+ currentWeather.windSpeed = currentWeatherData.wind.speed;
+ }
currentWeather.windDirection = currentWeatherData.wind.deg;
currentWeather.weatherType = this.convertWeatherType(currentWeatherData.weather[0].icon);
currentWeather.sunrise = moment(currentWeatherData.sys.sunrise, "X");
@@ -112,7 +116,7 @@ WeatherProvider.register("openweathermap", {
return this.fetchForecastDaily(forecasts);
}
// if weatherEndpoint does not match forecast or forecast/daily, what should be returned?
- const days = [new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits)];
+ const days = [new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh)];
return days;
},
@@ -124,7 +128,7 @@ WeatherProvider.register("openweathermap", {
return this.fetchOnecall(data);
}
// if weatherEndpoint does not match onecall, what should be returned?
- const weatherData = { current: new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits), hours: [], days: [] };
+ const weatherData = { current: new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh), hours: [], days: [] };
return weatherData;
},
@@ -141,7 +145,7 @@ WeatherProvider.register("openweathermap", {
let snow = 0;
// variable for date
let date = "";
- let weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ let weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
for (const forecast of forecasts) {
if (date !== moment(forecast.dt, "X").format("YYYY-MM-DD")) {
@@ -154,7 +158,7 @@ WeatherProvider.register("openweathermap", {
// push weather information to days array
days.push(weather);
// create new weather-object
- weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
minTemp = [];
maxTemp = [];
@@ -217,7 +221,7 @@ WeatherProvider.register("openweathermap", {
const days = [];
for (const forecast of forecasts) {
- const weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
weather.date = moment(forecast.dt, "X");
weather.minTemperature = forecast.temp.min;
@@ -263,7 +267,7 @@ WeatherProvider.register("openweathermap", {
let precip = false;
// get current weather, if requested
- const current = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const current = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
if (data.hasOwnProperty("current")) {
current.date = moment(data.current.dt, "X").utcOffset(data.timezone_offset / 60);
current.windSpeed = data.current.wind_speed;
@@ -295,7 +299,7 @@ WeatherProvider.register("openweathermap", {
current.feelsLikeTemp = data.current.feels_like;
}
- let weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ let weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
// get hourly weather, if requested
const hours = [];
@@ -331,7 +335,7 @@ WeatherProvider.register("openweathermap", {
}
hours.push(weather);
- weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
}
}
@@ -370,7 +374,7 @@ WeatherProvider.register("openweathermap", {
}
days.push(weather);
- weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
}
}
diff --git a/modules/default/weather/providers/smhi.js b/modules/default/weather/providers/smhi.js
new file mode 100644
index 00000000..cdbaf013
--- /dev/null
+++ b/modules/default/weather/providers/smhi.js
@@ -0,0 +1,309 @@
+/* global WeatherProvider, WeatherObject, SunCalc */
+
+/* Magic Mirror
+ * Module: Weather
+ * Provider: SMHI
+ *
+ * By BuXXi https://github.com/buxxi
+ * MIT Licensed
+ *
+ * This class is a provider for SMHI (Sweden only).
+ * Note that SMHI doesn't provide sunrise and sundown, use SunCalc to calculate it.
+ * Metric system is the only supported unit.
+ */
+WeatherProvider.register("smhi", {
+ providerName: "SMHI",
+
+ /**
+ * Implements method in interface for fetching current weather
+ */
+ fetchCurrentWeather() {
+ this.fetchData(this.getURL())
+ .then((data) => {
+ let closest = this.getClosestToCurrentTime(data.timeSeries);
+ let coordinates = this.resolveCoordinates(data);
+ let weatherObject = this.convertWeatherDataToObject(closest, coordinates);
+ this.setFetchedLocation(`(${coordinates.lat},${coordinates.lon})`);
+ this.setCurrentWeather(weatherObject);
+ })
+ .catch((error) => Log.error("Could not load data: " + error.message))
+ .finally(() => this.updateAvailable());
+ },
+
+ /**
+ * Implements method in interface for fetching a forecast.
+ * Handling hourly forecast would be easy as not grouping by day but it seems really specific for one weather provider for now.
+ */
+ fetchWeatherForecast() {
+ this.fetchData(this.getURL())
+ .then((data) => {
+ let coordinates = this.resolveCoordinates(data);
+ let weatherObjects = this.convertWeatherDataGroupedByDay(data.timeSeries, coordinates);
+ this.setFetchedLocation(`(${coordinates.lat},${coordinates.lon})`);
+ this.setWeatherForecast(weatherObjects);
+ })
+ .catch((error) => Log.error("Could not load data: " + error.message))
+ .finally(() => this.updateAvailable());
+ },
+
+ /**
+ * Overrides method for setting config with checks for the precipitationValue being unset or invalid
+ *
+ * @param config
+ */
+ setConfig(config) {
+ this.config = config;
+ if (!config.precipitationValue || ["pmin", "pmean", "pmedian", "pmax"].indexOf(config.precipitationValue) == -1) {
+ console.log("invalid or not set: " + config.precipitationValue);
+ config.precipitationValue = "pmedian";
+ }
+ },
+
+ /**
+ * Of all the times returned find out which one is closest to the current time, should be the first if the data isn't old.
+ *
+ * @param times
+ */
+ getClosestToCurrentTime(times) {
+ let now = moment();
+ let minDiff = undefined;
+ for (time of times) {
+ let diff = Math.abs(moment(time.validTime).diff(now));
+ if (!minDiff || diff < Math.abs(moment(minDiff.validTime).diff(now))) {
+ minDiff = time;
+ }
+ }
+ return minDiff;
+ },
+
+ /**
+ * Get the forecast url for the configured coordinates
+ */
+ getURL() {
+ let lon = this.config.lon;
+ let lat = this.config.lat;
+ return `https://opendata-download-metfcst.smhi.se/api/category/pmp3g/version/2/geotype/point/lon/${lon}/lat/${lat}/data.json`;
+ },
+
+ /**
+ * Converts the returned data into a WeatherObject with required properties set for both current weather and forecast.
+ * The returned units is always in metric system.
+ * Requires coordinates to determine if its daytime or nighttime to know which icon to use and also to set sunrise and sunset.
+ *
+ * @param weatherData
+ * @param coordinates
+ * @param weatherData
+ * @param coordinates
+ */
+ convertWeatherDataToObject(weatherData, coordinates) {
+ let currentWeather = new WeatherObject("metric", "metric", "metric"); //Weather data is only for Sweden and nobody in Sweden would use imperial
+
+ currentWeather.date = moment(weatherData.validTime);
+ let times = SunCalc.getTimes(currentWeather.date.toDate(), coordinates.lat, coordinates.lon);
+ currentWeather.sunrise = moment(times.sunrise, "X");
+ currentWeather.sunset = moment(times.sunset, "X");
+ currentWeather.humidity = this.paramValue(weatherData, "r");
+ currentWeather.temperature = this.paramValue(weatherData, "t");
+ currentWeather.windSpeed = this.paramValue(weatherData, "ws");
+ currentWeather.windDirection = this.paramValue(weatherData, "wd");
+ currentWeather.weatherType = this.convertWeatherType(this.paramValue(weatherData, "Wsymb2"), this.isDayTime(currentWeather));
+
+ //Determine the precipitation amount and category and update the weatherObject with it, the valuetype to use can be configured or uses median as default.
+ let precipitationValue = this.paramValue(weatherData, this.config.precipitationValue);
+ switch (this.paramValue(weatherData, "pcat")) {
+ // 0 = No precipitation
+ case 1: // Snow
+ currentWeather.snow += precipitationValue;
+ currentWeather.precipitation += precipitationValue;
+ break;
+ case 2: // Snow and rain, treat it as 50/50 snow and rain
+ currentWeather.snow += precipitationValue / 2;
+ currentWeather.rain += precipitationValue / 2;
+ currentWeather.precipitation += precipitationValue;
+ break;
+ case 3: // Rain
+ case 4: // Drizzle
+ case 5: // Freezing rain
+ case 6: // Freezing drizzle
+ currentWeather.rain += precipitationValue;
+ currentWeather.precipitation += precipitationValue;
+ break;
+ }
+
+ return currentWeather;
+ },
+
+ /**
+ * Takes all of the data points and converts it to one WeatherObject per day.
+ *
+ * @param allWeatherData
+ * @param coordinates
+ * @param allWeatherData
+ * @param coordinates
+ */
+ convertWeatherDataGroupedByDay(allWeatherData, coordinates) {
+ var currentWeather;
+ let result = [];
+
+ let allWeatherObjects = this.fillInGaps(allWeatherData).map((weatherData) => this.convertWeatherDataToObject(weatherData, coordinates));
+ var dayWeatherTypes = [];
+
+ for (weatherObject of allWeatherObjects) {
+ //If its the first object or if a day change we need to reset the summary object
+ if (!currentWeather || !currentWeather.date.isSame(weatherObject.date, "day")) {
+ currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ dayWeatherTypes = [];
+ currentWeather.date = weatherObject.date;
+ currentWeather.minTemperature = Infinity;
+ currentWeather.maxTemperature = -Infinity;
+ currentWeather.snow = 0;
+ currentWeather.rain = 0;
+ currentWeather.precipitation = 0;
+ result.push(currentWeather);
+ }
+
+ //Keep track of what icons has been used for each hour of daytime and use the middle one for the forecast
+ if (this.isDayTime(weatherObject)) {
+ dayWeatherTypes.push(weatherObject.weatherType);
+ }
+ if (dayWeatherTypes.length > 0) {
+ currentWeather.weatherType = dayWeatherTypes[Math.floor(dayWeatherTypes.length / 2)];
+ } else {
+ currentWeather.weatherType = weatherObject.weatherType;
+ }
+
+ //All other properties is either a sum, min or max of each hour
+ currentWeather.minTemperature = Math.min(currentWeather.minTemperature, weatherObject.temperature);
+ currentWeather.maxTemperature = Math.max(currentWeather.maxTemperature, weatherObject.temperature);
+ currentWeather.snow += weatherObject.snow;
+ currentWeather.rain += weatherObject.rain;
+ currentWeather.precipitation += weatherObject.precipitation;
+ }
+
+ return result;
+ },
+
+ /**
+ * Resolve coordinates from the response data (probably preferably to use this if it's not matching the config values exactly)
+ *
+ * @param data
+ */
+ resolveCoordinates(data) {
+ return { lat: data.geometry.coordinates[0][1], lon: data.geometry.coordinates[0][0] };
+ },
+
+ /**
+ * Checks if the weatherObject is at dayTime.
+ *
+ * @param weatherObject
+ */
+ isDayTime(weatherObject) {
+ return weatherObject.date.isBetween(weatherObject.sunrise, weatherObject.sunset, undefined, "[]");
+ },
+
+ /**
+ * The distance between the data points is increasing in the data the more distant the prediction is.
+ * Find these gaps and fill them with the previous hours data to make the data returned a complete set.
+ *
+ * @param data
+ */
+ fillInGaps(data) {
+ let result = [];
+ for (var i = 1; i < data.length; i++) {
+ let to = moment(data[i].validTime);
+ let from = moment(data[i - 1].validTime);
+ let hours = moment.duration(to.diff(from)).asHours();
+ // For each hour add a datapoint but change the validTime
+ for (var j = 0; j < hours; j++) {
+ let current = Object.assign({}, data[i]);
+ current.validTime = from.clone().add(j, "hours").toISOString();
+ result.push(current);
+ }
+ }
+ return result;
+ },
+
+ /**
+ * Helper method to fetch a property from the returned data set.
+ * The returned values is an array with always one value in it.
+ *
+ * @param currentWeatherData
+ * @param name
+ * @param currentWeatherData
+ * @param name
+ */
+ paramValue(currentWeatherData, name) {
+ return currentWeatherData.parameters.filter((p) => p.name == name).flatMap((p) => p.values)[0];
+ },
+
+ /**
+ * Map the icon value from SHMI to an icon that MagicMirror understands.
+ * Uses different icons depending if its daytime or nighttime.
+ * SHMI's description of what the numeric value means is the comment after the case.
+ *
+ * @param input
+ * @param isDayTime
+ * @param input
+ * @param isDayTime
+ */
+ convertWeatherType(input, isDayTime) {
+ switch (input) {
+ case 1:
+ return isDayTime ? "day-sunny" : "night-clear"; // Clear sky
+ case 2:
+ return isDayTime ? "day-sunny-overcast" : "night-partly-cloudy"; //Nearly clear sky
+ case 3:
+ return isDayTime ? "day-cloudy" : "night-cloudy"; //Variable cloudiness
+ case 4:
+ return isDayTime ? "day-cloudy" : "night-cloudy"; //Halfclear sky
+ case 5:
+ return "cloudy"; //Cloudy sky
+ case 6:
+ return "cloudy"; //Overcast
+ case 7:
+ return "fog"; //Fog
+ case 8:
+ return "showers"; //Light rain showers
+ case 9:
+ return "showers"; //Moderate rain showers
+ case 10:
+ return "showers"; //Heavy rain showers
+ case 11:
+ return "thunderstorm"; //Thunderstorm
+ case 12:
+ return "sleet"; //Light sleet showers
+ case 13:
+ return "sleet"; //Moderate sleet showers
+ case 14:
+ return "sleet"; //Heavy sleet showers
+ case 15:
+ return "snow"; //Light snow showers
+ case 16:
+ return "snow"; //Moderate snow showers
+ case 17:
+ return "snow"; //Heavy snow showers
+ case 18:
+ return "rain"; //Light rain
+ case 19:
+ return "rain"; //Moderate rain
+ case 20:
+ return "rain"; //Heavy rain
+ case 21:
+ return "thunderstorm"; //Thunder
+ case 22:
+ return "sleet"; // Light sleet
+ case 23:
+ return "sleet"; //Moderate sleet
+ case 24:
+ return "sleet"; // Heavy sleet
+ case 25:
+ return "snow"; // Light snowfall
+ case 26:
+ return "snow"; //Moderate snowfall
+ case 27:
+ return "snow"; //Heavy snowfall
+ default:
+ return "";
+ }
+ }
+});
diff --git a/modules/default/weather/providers/ukmetoffice.js b/modules/default/weather/providers/ukmetoffice.js
index f1a50074..b71ced88 100755
--- a/modules/default/weather/providers/ukmetoffice.js
+++ b/modules/default/weather/providers/ukmetoffice.js
@@ -73,7 +73,7 @@ WeatherProvider.register("ukmetoffice", {
* Generate a WeatherObject based on currentWeatherInformation
*/
generateWeatherObjectFromCurrentWeather(currentWeatherData) {
- const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
// data times are always UTC
let nowUtc = moment.utc();
@@ -124,7 +124,7 @@ WeatherProvider.register("ukmetoffice", {
// loop round the (5) periods getting the data
// for each period array, Day is [0], Night is [1]
for (var j in forecasts.SiteRep.DV.Location.Period) {
- const weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
// data times are always UTC
const dateStr = forecasts.SiteRep.DV.Location.Period[j].value;
@@ -208,10 +208,10 @@ WeatherProvider.register("ukmetoffice", {
},
/*
- * Convert wind speed (from mph) if required
+ * Convert wind speed (from mph to m/s or km/h) if required
*/
convertWindSpeed(windInMph) {
- return this.windUnits === "metric" ? windInMph * 2.23694 : windInMph;
+ return this.windUnits === "metric" ? (this.useKmh ? windInMph * 1.60934 : windInMph / 2.23694) : windInMph;
},
/*
diff --git a/modules/default/weather/providers/ukmetofficedatahub.js b/modules/default/weather/providers/ukmetofficedatahub.js
index 505732d3..af2e09c6 100644
--- a/modules/default/weather/providers/ukmetofficedatahub.js
+++ b/modules/default/weather/providers/ukmetofficedatahub.js
@@ -108,7 +108,7 @@ WeatherProvider.register("ukmetofficedatahub", {
// Create a WeatherObject using current weather data (data for the current hour)
generateWeatherObjectFromCurrentWeather(currentWeatherData) {
- const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
// Extract the actual forecasts
let forecastDataHours = currentWeatherData.features[0].properties.timeSeries;
@@ -189,7 +189,7 @@ WeatherProvider.register("ukmetofficedatahub", {
// Go through each day in the forecasts
for (day in forecastDataDays) {
- const forecastWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const forecastWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
// Get date of forecast
let forecastDate = moment.utc(forecastDataDays[day].time);
@@ -254,7 +254,7 @@ WeatherProvider.register("ukmetofficedatahub", {
return windInMpS;
}
- if (this.config.windUnits == "kph" || this.config.windUnits == "metric") {
+ if (this.config.windUnits == "kph" || this.config.windUnits == "metric" || this.config.useKmh) {
return windInMpS * 3.6;
}
diff --git a/modules/default/weather/providers/weatherbit.js b/modules/default/weather/providers/weatherbit.js
new file mode 100644
index 00000000..6bd3508e
--- /dev/null
+++ b/modules/default/weather/providers/weatherbit.js
@@ -0,0 +1,181 @@
+/* global WeatherProvider, WeatherObject */
+
+/* Magic Mirror
+ * Module: Weather
+ * Provider: Weatherbit
+ *
+ * By Andrew Pometti
+ * MIT Licensed
+ *
+ * This class is a provider for Weatherbit, based on Nicholas Hubbard's class for Dark Sky & Vince Peri's class for Weather.gov.
+ */
+WeatherProvider.register("weatherbit", {
+ // Set the name of the provider.
+ // Not strictly required, but helps for debugging.
+ providerName: "Weatherbit",
+
+ units: {
+ imperial: "I",
+ metric: "M"
+ },
+
+ fetchedLocation: function () {
+ return this.fetchedLocationName || "";
+ },
+
+ fetchCurrentWeather() {
+ this.fetchData(this.getUrl())
+ .then((data) => {
+ if (!data || !data.data[0] || typeof data.data[0].temp === "undefined") {
+ // No usable data?
+ return;
+ }
+
+ const currentWeather = this.generateWeatherDayFromCurrentWeather(data);
+ this.setCurrentWeather(currentWeather);
+ })
+ .catch(function (request) {
+ Log.error("Could not load data ... ", request);
+ })
+ .finally(() => this.updateAvailable());
+ },
+
+ fetchWeatherForecast() {
+ this.fetchData(this.getUrl())
+ .then((data) => {
+ if (!data || !data.data) {
+ // No usable data?
+ return;
+ }
+
+ const forecast = this.generateWeatherObjectsFromForecast(data.data);
+ this.setWeatherForecast(forecast);
+
+ this.fetchedLocationName = data.city_name + ", " + data.state_code;
+ })
+ .catch(function (request) {
+ Log.error("Could not load data ... ", request);
+ })
+ .finally(() => this.updateAvailable());
+ },
+
+ // Create a URL from the config and base URL.
+ getUrl() {
+ const units = this.units[this.config.units] || "auto";
+ return `${this.config.apiBase}${this.config.weatherEndpoint}?lat=${this.config.lat}&lon=${this.config.lon}&units=${units}&key=${this.config.apiKey}`;
+ },
+
+ // Implement WeatherDay generator.
+ generateWeatherDayFromCurrentWeather(currentWeatherData) {
+ //Calculate TZ Offset and invert to convert Sunrise/Sunset times to Local
+ const d = new Date();
+ let tzOffset = d.getTimezoneOffset();
+ tzOffset = tzOffset * -1;
+
+ const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+
+ currentWeather.date = moment(currentWeatherData.data[0].ts, "X");
+ currentWeather.humidity = parseFloat(currentWeatherData.data[0].rh);
+ currentWeather.temperature = parseFloat(currentWeatherData.data[0].temp);
+ currentWeather.windSpeed = parseFloat(currentWeatherData.data[0].wind_spd);
+ currentWeather.windDirection = currentWeatherData.data[0].wind_dir;
+ currentWeather.weatherType = this.convertWeatherType(currentWeatherData.data[0].weather.icon);
+ Log.log("Wx Icon: " + currentWeatherData.data[0].weather.icon);
+ currentWeather.sunrise = moment(currentWeatherData.data[0].sunrise, "HH:mm").add(tzOffset, "m");
+ currentWeather.sunset = moment(currentWeatherData.data[0].sunset, "HH:mm").add(tzOffset, "m");
+
+ this.fetchedLocationName = currentWeatherData.data[0].city_name + ", " + currentWeatherData.data[0].state_code;
+
+ return currentWeather;
+ },
+
+ generateWeatherObjectsFromForecast(forecasts) {
+ const days = [];
+
+ for (const forecast of forecasts) {
+ const weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+
+ weather.date = moment(forecast.datetime, "YYYY-MM-DD");
+ weather.minTemperature = forecast.min_temp;
+ weather.maxTemperature = forecast.max_temp;
+ weather.precipitation = forecast.precip;
+ weather.weatherType = this.convertWeatherType(forecast.weather.icon);
+
+ days.push(weather);
+ }
+
+ return days;
+ },
+
+ // Map icons from Dark Sky to our icons.
+ convertWeatherType(weatherType) {
+ const weatherTypes = {
+ t01d: "day-thunderstorm",
+ t01n: "night-alt-thunderstorm",
+ t02d: "day-thunderstorm",
+ t02n: "night-alt-thunderstorm",
+ t03d: "thunderstorm",
+ t03n: "thunderstorm",
+ t04d: "day-thunderstorm",
+ t04n: "night-alt-thunderstorm",
+ t05d: "day-sleet-storm",
+ t05n: "night-alt-sleet-storm",
+ d01d: "day-sprinkle",
+ d01n: "night-alt-sprinkle",
+ d02d: "day-sprinkle",
+ d02n: "night-alt-sprinkle",
+ d03d: "day-shower",
+ d03n: "night-alt-shower",
+ r01d: "day-shower",
+ r01n: "night-alt-shower",
+ r02d: "day-rain",
+ r02n: "night-alt-rain",
+ r03d: "day-rain",
+ r03n: "night-alt-rain",
+ r04d: "day-sprinkle",
+ r04n: "night-alt-sprinkle",
+ r05d: "day-shower",
+ r05n: "night-alt-shower",
+ r06d: "day-shower",
+ r06n: "night-alt-shower",
+ f01d: "day-sleet",
+ f01n: "night-alt-sleet",
+ s01d: "day-snow",
+ s01n: "night-alt-snow",
+ s02d: "day-snow-wind",
+ s02n: "night-alt-snow-wind",
+ s03d: "snowflake-cold",
+ s03n: "snowflake-cold",
+ s04d: "day-rain-mix",
+ s04n: "night-alt-rain-mix",
+ s05d: "day-sleet",
+ s05n: "night-alt-sleet",
+ s06d: "day-snow",
+ s06n: "night-alt-snow",
+ a01d: "day-haze",
+ a01n: "dust",
+ a02d: "smoke",
+ a02n: "smoke",
+ a03d: "day-haze",
+ a03n: "dust",
+ a04d: "dust",
+ a04n: "dust",
+ a05d: "day-fog",
+ a05n: "night-fog",
+ a06d: "fog",
+ a06n: "fog",
+ c01d: "day-sunny",
+ c01n: "night-clear",
+ c02d: "day-sunny-overcast",
+ c02n: "night-alt-partly-cloudy",
+ c03d: "day-cloudy",
+ c03n: "night-alt-cloudy",
+ c04d: "cloudy",
+ c04n: "cloudy",
+ u00d: "rain-mix",
+ u00n: "rain-mix"
+ };
+
+ return weatherTypes.hasOwnProperty(weatherType) ? weatherTypes[weatherType] : null;
+ }
+});
diff --git a/modules/default/weather/providers/weathergov.js b/modules/default/weather/providers/weathergov.js
index 1b28bba1..86837763 100755
--- a/modules/default/weather/providers/weathergov.js
+++ b/modules/default/weather/providers/weathergov.js
@@ -131,11 +131,11 @@ WeatherProvider.register("weathergov", {
* ... object needs data in units based on config!
*/
generateWeatherObjectFromCurrentWeather(currentWeatherData) {
- const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ const currentWeather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
currentWeather.date = moment(currentWeatherData.timestamp);
currentWeather.temperature = this.convertTemp(currentWeatherData.temperature.value);
- currentWeather.windSpeed = this.covertSpeed(currentWeatherData.windSpeed.value);
+ currentWeather.windSpeed = this.convertSpeed(currentWeatherData.windSpeed.value);
currentWeather.windDirection = currentWeatherData.windDirection.value;
currentWeather.minTemperature = this.convertTemp(currentWeatherData.minTemperatureLast24Hours.value);
currentWeather.maxTemperature = this.convertTemp(currentWeatherData.maxTemperatureLast24Hours.value);
@@ -179,7 +179,7 @@ WeatherProvider.register("weathergov", {
let maxTemp = [];
// variable for date
let date = "";
- let weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ let weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
weather.precipitation = 0;
for (const forecast of forecasts) {
@@ -191,7 +191,7 @@ WeatherProvider.register("weathergov", {
// push weather information to days array
days.push(weather);
// create new weather-object
- weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits);
+ weather = new WeatherObject(this.config.units, this.config.tempUnits, this.config.windUnits, this.config.useKmh);
minTemp = [];
maxTemp = [];
@@ -238,12 +238,16 @@ WeatherProvider.register("weathergov", {
return temp;
}
},
- // conversion to mph
- covertSpeed(metSec) {
+ // conversion to mph or kmh
+ convertSpeed(metSec) {
if (this.config.windUnits === "imperial") {
return metSec * 2.23694;
} else {
- return metSec;
+ if (this.config.useKmh) {
+ return metSec * 3.6;
+ } else {
+ return metSec;
+ }
}
},
// conversion to inches
diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js
index b5a68a52..73ee0e16 100644
--- a/modules/default/weather/weather.js
+++ b/modules/default/weather/weather.js
@@ -12,16 +12,14 @@ Module.register("weather", {
weatherProvider: "openweathermap",
roundTemp: false,
type: "current", // current, forecast, daily (equivalent to forecast), hourly (only with OpenWeatherMap /onecall endpoint)
-
lat: 0,
lon: 0,
location: false,
locationID: false,
units: config.units,
-
+ useKmh: false,
tempUnits: config.units,
windUnits: config.units,
-
updateInterval: 10 * 60 * 1000, // every 10 minutes
animationSpeed: 1000,
timeFormat: config.timeFormat,
@@ -41,20 +39,16 @@ Module.register("weather", {
maxEntries: 5,
fade: true,
fadePoint: 0.25, // Start on 1/4th of the list.
-
initialLoadDelay: 0, // 0 seconds delay
retryDelay: 2500,
-
apiKey: "",
apiSecret: "",
apiVersion: "2.5",
apiBase: "https://api.openweathermap.org/data/", // TODO: this should not be part of the weather.js file, but should be contained in the openweatherprovider
weatherEndpoint: "/weather",
-
appendLocationNameToHeader: true,
calendarClass: "calendar",
tableClass: "small",
-
onlyTemp: false,
showPrecipitationAmount: false,
colored: false,
diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js
index 0ee42123..3fbbb42a 100755
--- a/modules/default/weather/weatherobject.js
+++ b/modules/default/weather/weatherobject.js
@@ -10,10 +10,11 @@
* As soon as we start implementing the forecast, mode properties will be added.
*/
class WeatherObject {
- constructor(units, tempUnits, windUnits) {
+ constructor(units, tempUnits, windUnits, useKmh) {
this.units = units;
this.tempUnits = tempUnits;
this.windUnits = windUnits;
+ this.useKmh = useKmh;
this.date = null;
this.windSpeed = null;
this.windDirection = null;
@@ -67,7 +68,7 @@ class WeatherObject {
}
beaufortWindSpeed() {
- const windInKmh = this.windUnits === "imperial" ? this.windSpeed * 1.609344 : (this.windSpeed * 60 * 60) / 1000;
+ const windInKmh = this.windUnits === "imperial" ? this.windSpeed * 1.609344 : this.useKmh ? this.windSpeed : (this.windSpeed * 60 * 60) / 1000;
const speeds = [1, 5, 11, 19, 28, 38, 49, 61, 74, 88, 102, 117, 1000];
for (const [index, speed] of speeds.entries()) {
if (speed > windInKmh) {
@@ -77,6 +78,11 @@ class WeatherObject {
return 12;
}
+ kmhWindSpeed() {
+ const windInKmh = this.windUnits === "imperial" ? this.windSpeed * 1.609344 : (this.windSpeed * 60 * 60) / 1000;
+ return windInKmh;
+ }
+
nextSunAction() {
return moment().isBetween(this.sunrise, this.sunset) ? "sunset" : "sunrise";
}
diff --git a/modules/default/weatherforecast/weatherforecast.js b/modules/default/weatherforecast/weatherforecast.js
index 4ecc18aa..53eee5dd 100644
--- a/modules/default/weatherforecast/weatherforecast.js
+++ b/modules/default/weatherforecast/weatherforecast.js
@@ -371,10 +371,10 @@ Module.register("weatherforecast", {
var hour;
if (forecast.dt_txt) {
day = moment(forecast.dt_txt, "YYYY-MM-DD hh:mm:ss").format("ddd");
- hour = moment(forecast.dt_txt, "YYYY-MM-DD hh:mm:ss").format("H");
+ hour = moment(forecast.dt_txt, "YYYY-MM-DD hh:mm:ss").toDate().getHours();
} else {
day = moment(forecast.dt, "X").format("ddd");
- hour = moment(forecast.dt, "X").format("H");
+ hour = moment(forecast.dt, "X").toDate().getHours();
}
if (day !== lastDay) {
@@ -385,7 +385,6 @@ Module.register("weatherforecast", {
minTemp: this.roundValue(forecast.temp.min),
rain: this.processRain(forecast, forecastList)
};
-
this.forecast.push(forecastData);
lastDay = day;
diff --git a/package-lock.json b/package-lock.json
index e2f3dfcd..87dcc438 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -212,9 +212,9 @@
},
"dependencies": {
"core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
"dev": true
}
}
@@ -284,9 +284,9 @@
}
},
"@eslint/eslintrc": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz",
- "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==",
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
+ "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==",
"requires": {
"ajv": "^6.12.4",
"debug": "^4.1.1",
@@ -389,21 +389,21 @@
}
},
"@octokit/auth-token": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.3.tgz",
- "integrity": "sha512-fdGoOQ3kQJh+hrilc0Plg50xSfaCKOeYN9t6dpJKXN9BxhhfquL0OzoQXg3spLYymL5rm29uPeI3KEXRaZQ9zg==",
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.4.tgz",
+ "integrity": "sha512-LNfGu3Ro9uFAYh10MUZVaT7X2CnNm2C8IDQmabx+3DygYIQjs9FwzFAHN/0t6mu5HEPhxcb1XOuxdpY82vCg2Q==",
"dev": true,
"requires": {
- "@octokit/types": "^5.0.0"
+ "@octokit/types": "^6.0.0"
}
},
"@octokit/endpoint": {
- "version": "6.0.9",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.9.tgz",
- "integrity": "sha512-3VPLbcCuqji4IFTclNUtGdp9v7g+nspWdiCUbK3+iPMjJCZ6LEhn1ts626bWLOn0GiDb6j+uqGvPpqLnY7pBgw==",
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.10.tgz",
+ "integrity": "sha512-9+Xef8nT7OKZglfkOMm7IL6VwxXUQyR7DUSU0LH/F7VNqs8vyd7es5pTfz9E7DwUIx7R3pGscxu1EBhYljyu7Q==",
"dev": true,
"requires": {
- "@octokit/types": "^5.0.0",
+ "@octokit/types": "^6.0.0",
"is-plain-object": "^5.0.0",
"universal-user-agent": "^6.0.0"
},
@@ -416,6 +416,12 @@
}
}
},
+ "@octokit/openapi-types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-2.0.0.tgz",
+ "integrity": "sha512-J4bfM7lf8oZvEAdpS71oTvC1ofKxfEZgU5vKVwzZKi4QPiL82udjpseJwxPid9Pu2FNmyRQOX4iEj6W1iOSnPw==",
+ "dev": true
+ },
"@octokit/plugin-paginate-rest": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz",
@@ -464,14 +470,14 @@
}
},
"@octokit/request": {
- "version": "5.4.10",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.10.tgz",
- "integrity": "sha512-egA49HkqEORVGDZGav1mh+VD+7uLgOxtn5oODj6guJk0HCy+YBSYapFkSLFgeYj3Fr18ZULKGURkjyhkAChylw==",
+ "version": "5.4.12",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.12.tgz",
+ "integrity": "sha512-MvWYdxengUWTGFpfpefBBpVmmEYfkwMoxonIB3sUGp5rhdgwjXL1ejo6JbgzG/QD9B/NYt/9cJX1pxXeSIUCkg==",
"dev": true,
"requires": {
"@octokit/endpoint": "^6.0.1",
"@octokit/request-error": "^2.0.0",
- "@octokit/types": "^5.0.0",
+ "@octokit/types": "^6.0.3",
"deprecation": "^2.0.0",
"is-plain-object": "^5.0.0",
"node-fetch": "^2.6.1",
@@ -480,12 +486,12 @@
},
"dependencies": {
"@octokit/request-error": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.3.tgz",
- "integrity": "sha512-GgD5z8Btm301i2zfvJLk/mkhvGCdjQ7wT8xF9ov5noQY8WbKZDH9cOBqXzoeKd1mLr1xH2FwbtGso135zGBgTA==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.4.tgz",
+ "integrity": "sha512-LjkSiTbsxIErBiRh5wSZvpZqT4t0/c9+4dOe0PII+6jXR+oj/h66s7E4a/MghV7iT8W9ffoQ5Skoxzs96+gBPA==",
"dev": true,
"requires": {
- "@octokit/types": "^5.0.1",
+ "@octokit/types": "^6.0.0",
"deprecation": "^2.0.0",
"once": "^1.4.0"
}
@@ -545,11 +551,12 @@
}
},
"@octokit/types": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz",
- "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.1.1.tgz",
+ "integrity": "sha512-btm3D6S7VkRrgyYF31etUtVY/eQ1KzrNRqhFt25KSe2mKlXuLXJilglRC6eDA2P6ou94BUnk/Kz5MPEolXgoiw==",
"dev": true,
"requires": {
+ "@octokit/openapi-types": "^2.0.0",
"@types/node": ">= 8"
}
},
@@ -569,13 +576,13 @@
}
},
"@stylelint/postcss-markdown": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz",
- "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==",
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz",
+ "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==",
"dev": true,
"requires": {
- "remark": "^12.0.0",
- "unist-util-find-all-after": "^3.0.1"
+ "remark": "^13.0.0",
+ "unist-util-find-all-after": "^3.0.2"
}
},
"@szmarczak/http-timer": {
@@ -587,6 +594,30 @@
"defer-to-connect": "^1.0.1"
}
},
+ "@types/component-emitter": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
+ "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg=="
+ },
+ "@types/cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg=="
+ },
+ "@types/cors": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz",
+ "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg=="
+ },
+ "@types/mdast": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
+ "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
"@types/minimatch": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -687,11 +718,6 @@
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
"dev": true
},
- "after": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
- "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
- },
"agent-base": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
@@ -744,12 +770,16 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
},
"ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
},
"anymatch": {
"version": "3.1.1",
@@ -859,7 +889,8 @@
"array-find-index": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
- "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
},
"array-flatten": {
"version": "1.1.1",
@@ -878,11 +909,6 @@
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
"dev": true
},
- "arraybuffer.slice": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
- "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
- },
"arrify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
@@ -928,11 +954,6 @@
"lodash": "^4.17.14"
}
},
- "async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
- },
"async-retry": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz",
@@ -1008,11 +1029,6 @@
}
}
},
- "backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
- },
"bail": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
@@ -1118,14 +1134,6 @@
"integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==",
"dev": true
},
- "better-assert": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
- "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
- "requires": {
- "callsite": "1.0.0"
- }
- },
"binary-extensions": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
@@ -1142,11 +1150,6 @@
"safe-buffer": "^5.1.1"
}
},
- "blob": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
- "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
- },
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
@@ -1376,11 +1379,6 @@
"write-file-atomic": "^3.0.0"
}
},
- "callsite": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
- "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
- },
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -1389,21 +1387,23 @@
"camelcase": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
},
"camelcase-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
"integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
"requires": {
"camelcase": "^2.0.0",
"map-obj": "^1.0.0"
}
},
"caniuse-lite": {
- "version": "1.0.30001157",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001157.tgz",
- "integrity": "sha512-gOerH9Wz2IRZ2ZPdMfBvyOi3cjaz4O4dgNwPGzx8EhqAs4+2IL/O+fJsbt+znSigujoZG8bVcIAUM/I/E5K3MA==",
+ "version": "1.0.30001161",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001161.tgz",
+ "integrity": "sha512-JharrCDxOqPLBULF9/SPa6yMcBRTjZARJ6sc3cuKrPfyIk64JN6kuMINWqA99Xc8uElMFcROliwtz0n9pYej+g==",
"dev": true
},
"caseless": {
@@ -1411,12 +1411,6 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
- "ccount": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
- "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==",
- "dev": true
- },
"chai": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
@@ -1441,15 +1435,13 @@
}
},
"chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
}
},
"character-entities": {
@@ -1458,12 +1450,6 @@
"integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
"dev": true
},
- "character-entities-html4": {
- "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.4",
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
@@ -1646,12 +1632,6 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
- "collapse-white-space": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
- "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
- "dev": true
- },
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -1718,20 +1698,10 @@
"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",
- "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
- },
"component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
- },
- "component-inherit": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
- "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
},
"compress-commons": {
"version": "1.2.2",
@@ -1783,13 +1753,12 @@
}
},
"console-stamp": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-0.2.9.tgz",
- "integrity": "sha512-jtgd1Fx3Im+pWN54mF269ptunkzF5Lpct2LBTbtyNoK2A4XjcxLM+TQW+e+XE/bLwLQNGRqPqlxm9JMixFntRA==",
+ "version": "3.0.0-rc4.2",
+ "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-3.0.0-rc4.2.tgz",
+ "integrity": "sha512-ncGYdZsfDbBYYiaPXr9NHfZbSSkoVzYyh8nHji9/3ovw35Jn4ozo0btcirtfIznXT4xNgBQW+IyTVLISnNumdQ==",
"requires": {
- "chalk": "^1.1.1",
- "dateformat": "^1.0.11",
- "merge": "^1.2.0"
+ "chalk": "^2.4.2",
+ "dateformat": "^3.0.3"
}
},
"content-disposition": {
@@ -1841,6 +1810,15 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
"cosmiconfig": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
@@ -1971,14 +1949,15 @@
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
"integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
"requires": {
"array-find-index": "^1.0.1"
}
},
"danger": {
- "version": "10.5.1",
- "resolved": "https://registry.npmjs.org/danger/-/danger-10.5.1.tgz",
- "integrity": "sha512-M+SnvfD4VKSXwXMRGYR0KPtdl8jYmWqHIlqw1vwB/oTikjCi0nwXFJ7Nw/H3lCPY5NgXDFfJ7UHf8cR7kLNBlQ==",
+ "version": "10.5.4",
+ "resolved": "https://registry.npmjs.org/danger/-/danger-10.5.4.tgz",
+ "integrity": "sha512-+1OQymly06JlYwkY0CLJzjzRaSV5qx0/FBhM8uRQz+aNh0Zl6SeUzVYLoeyA+h1UZeXhjYwzlzVDATM+p0691w==",
"dev": true,
"requires": {
"@babel/polyfill": "^7.2.5",
@@ -2019,40 +1998,11 @@
"supports-hyperlinks": "^1.0.1"
},
"dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
"get-stdin": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
"integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
"dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
}
}
},
@@ -2104,13 +2054,9 @@
}
},
"dateformat": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
- "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
- "requires": {
- "get-stdin": "^4.0.1",
- "meow": "^3.3.0"
- }
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q=="
},
"debug": {
"version": "4.2.0",
@@ -2123,7 +2069,8 @@
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
},
"decamelize-keys": {
"version": "1.1.0",
@@ -2519,9 +2466,9 @@
}
},
"electron-to-chromium": {
- "version": "1.3.592",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.592.tgz",
- "integrity": "sha512-kGNowksvqQiPb1pUSQKpd8JFoGPLxYOwduNRCqCxGh/2Q1qE2JdmwouCW41lUzDxOb/2RIV4lR0tVIfboWlO9A==",
+ "version": "1.3.606",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.606.tgz",
+ "integrity": "sha512-+/2yPHwtNf6NWKpaYt0KoqdSZ6Qddt6nDfH/pnhcrHq9hSb23e5LFy06Mlf0vF2ykXvj7avJ597psqcbKnG5YQ==",
"dev": true
},
"emoji-regex": {
@@ -2543,22 +2490,23 @@
}
},
"engine.io": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz",
- "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.0.5.tgz",
+ "integrity": "sha512-Ri+whTNr2PKklxQkfbGjwEo+kCBUM4Qxk4wtLqLrhH+b1up2NFL9g9pjYWiCV/oazwB0rArnvF/ZmZN2ab5Hpg==",
"requires": {
"accepts": "~1.3.4",
"base64id": "2.0.0",
- "cookie": "0.3.1",
+ "cookie": "~0.4.1",
+ "cors": "~2.8.5",
"debug": "~4.1.0",
- "engine.io-parser": "~2.2.0",
+ "engine.io-parser": "~4.0.0",
"ws": "^7.1.2"
},
"dependencies": {
"cookie": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
- "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
},
"debug": {
"version": "4.1.1",
@@ -2570,72 +2518,12 @@
}
}
},
- "engine.io-client": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.4.tgz",
- "integrity": "sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ==",
- "requires": {
- "component-emitter": "~1.3.0",
- "component-inherit": "0.0.3",
- "debug": "~3.1.0",
- "engine.io-parser": "~2.2.0",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "parseqs": "0.0.6",
- "parseuri": "0.0.6",
- "ws": "~6.1.0",
- "xmlhttprequest-ssl": "~1.5.4",
- "yeast": "0.1.2"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "parseqs": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
- "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
- },
- "parseuri": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
- "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
- },
- "ws": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
- "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
- "requires": {
- "async-limiter": "~1.0.0"
- }
- }
- }
- },
"engine.io-parser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz",
- "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz",
+ "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==",
"requires": {
- "after": "0.8.2",
- "arraybuffer.slice": "~0.0.7",
- "base64-arraybuffer": "0.1.4",
- "blob": "0.0.5",
- "has-binary2": "~1.0.2"
+ "base64-arraybuffer": "0.1.4"
}
},
"enquirer": {
@@ -2662,6 +2550,7 @@
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
"requires": {
"is-arrayish": "^0.2.1"
}
@@ -2764,12 +2653,12 @@
}
},
"eslint": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.13.0.tgz",
- "integrity": "sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz",
+ "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==",
"requires": {
"@babel/code-frame": "^7.0.0",
- "@eslint/eslintrc": "^0.2.1",
+ "@eslint/eslintrc": "^0.2.2",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
@@ -2779,10 +2668,10 @@
"eslint-scope": "^5.1.1",
"eslint-utils": "^2.1.0",
"eslint-visitor-keys": "^2.0.0",
- "espree": "^7.3.0",
+ "espree": "^7.3.1",
"esquery": "^1.2.0",
"esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
+ "file-entry-cache": "^6.0.0",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
"globals": "^12.1.0",
@@ -2848,9 +2737,12 @@
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"semver": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
- "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
},
"strip-ansi": {
"version": "6.0.0",
@@ -2871,26 +2763,15 @@
}
},
"eslint-config-prettier": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz",
- "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==",
- "dev": true,
- "requires": {
- "get-stdin": "^6.0.0"
- },
- "dependencies": {
- "get-stdin": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
- "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
- "dev": true
- }
- }
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz",
+ "integrity": "sha512-8Y8lGLVPPZdaNA7JXqnvETVC7IiVRgAP6afQu9gOQRn90YY3otMNh+x7Vr2vMePQntF+5erdSUBqSzCmU/AxaQ==",
+ "dev": true
},
"eslint-plugin-jsdoc": {
- "version": "30.7.7",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.7.tgz",
- "integrity": "sha512-DmVMJC2AbpYX7X1KhnVT1a9ex1AUvG+q9G8i6hzjp3cpjW8vmKQTUmZnRS0//W+7HvMqeb+eXPANdCOzGVVZBQ==",
+ "version": "30.7.8",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.8.tgz",
+ "integrity": "sha512-OWm2AYvXjCl7nRbpcw5xisfSVkpVAyp4lGqL9T+DeK4kaPm6ecnmTc/G5s1PtcRrwbaI8bIWGzwScqv5CdGyxA==",
"dev": true,
"requires": {
"comment-parser": "^0.7.6",
@@ -2911,9 +2792,9 @@
}
},
"eslint-plugin-prettier": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz",
- "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.2.0.tgz",
+ "integrity": "sha512-kOUSJnFjAUFKwVxuzy6sA5yyMx6+o9ino4gCdShzBNx4eyFRudWRYKCFolKjoM40PEiuU6Cn7wBLfq3WsGg7qg==",
"dev": true,
"requires": {
"prettier-linter-helpers": "^1.0.0"
@@ -2949,12 +2830,12 @@
"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ=="
},
"espree": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
- "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"requires": {
"acorn": "^7.4.0",
- "acorn-jsx": "^5.2.0",
+ "acorn-jsx": "^5.3.1",
"eslint-visitor-keys": "^1.3.0"
},
"dependencies": {
@@ -3021,11 +2902,6 @@
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
"dev": true
},
- "eventyoshi": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/eventyoshi/-/eventyoshi-0.2.1.tgz",
- "integrity": "sha512-74HGaBn3Okqlv+mLFBRgqAgG5X8FvmHzrAZcJ7SG8nZZiLgRR2or0kJrkJ3GT5NncQDwHYh/sO7Cpzne+Ep2LA=="
- },
"execa": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
@@ -3489,13 +3365,12 @@
}
},
"feedme": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/feedme/-/feedme-1.2.0.tgz",
- "integrity": "sha512-GNaewCsb6eWTgWqvxnGCYm6MkYrRSlXyqNhJRbdX7ku2Ubks3Vlg0cveea+gnK3mYh4pjfMQpzWpYyFl2RvILw==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/feedme/-/feedme-2.0.2.tgz",
+ "integrity": "sha512-0RNn0uLaSey8EThxgABR0T1Q47kSRatYnAXy1cfUc8/eypqXiAu38XGthuwwzb7mESCD9465k6Nym8D9AtB8HA==",
"requires": {
- "clarinet": "^0.12.0",
- "eventyoshi": "^0.2.0",
- "sax": "^1.0.0"
+ "clarinet": "^0.12.4",
+ "sax": "^1.2.4"
}
},
"figures": {
@@ -3508,11 +3383,11 @@
}
},
"file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
+ "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
"requires": {
- "flat-cache": "^2.0.1"
+ "flat-cache": "^3.0.4"
}
},
"fill-range": {
@@ -3582,6 +3457,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
"requires": {
"path-exists": "^2.0.0",
"pinkie-promise": "^2.0.0"
@@ -3603,19 +3479,18 @@
"dev": true
},
"flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
}
},
"flatted": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
- "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+ "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA=="
},
"for-in": {
"version": "1.0.2",
@@ -3711,7 +3586,8 @@
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
},
"functional-red-black-tree": {
"version": "1.0.1",
@@ -3754,7 +3630,8 @@
"get-stdin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
},
"get-stream": {
"version": "4.1.0",
@@ -4047,38 +3924,11 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
"requires": {
"function-bind": "^1.1.1"
}
},
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "has-binary2": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
- "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
- "requires": {
- "isarray": "2.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
- }
- }
- },
- "has-cors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
- "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
- },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -4169,7 +4019,8 @@
"hosted-git-info": {
"version": "2.8.8",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
- "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
},
"html-encoding-sniffer": {
"version": "2.0.1",
@@ -4292,9 +4143,9 @@
},
"dependencies": {
"debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
@@ -4315,9 +4166,9 @@
"dev": true
},
"husky": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz",
- "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==",
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.5.tgz",
+ "integrity": "sha512-E5S/1HMoDDaqsH8kDF5zeKEQbYqe3wL9zJDyqyYqc8I4vHBtAoxkDBGXox0lZ9RI+k5GyB728vZdmnM4bYap+g==",
"dev": true,
"requires": {
"chalk": "^4.0.0",
@@ -4450,6 +4301,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
"integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
"requires": {
"repeating": "^2.0.0"
}
@@ -4460,11 +4312,6 @@
"integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
"dev": true
},
- "indexof": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
- "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
- },
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -4480,9 +4327,9 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+ "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="
},
"inquirer": {
"version": "3.3.0",
@@ -4609,12 +4456,6 @@
"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
"dev": true
},
- "is-alphanumeric": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
- "dev": true
- },
"is-alphanumerical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
@@ -4628,7 +4469,8 @@
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
},
"is-binary-path": {
"version": "2.1.0",
@@ -4649,6 +4491,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
"integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
+ "dev": true,
"requires": {
"has": "^1.0.3"
}
@@ -4712,7 +4555,8 @@
"is-finite": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
- "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="
+ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+ "dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
@@ -4791,12 +4635,7 @@
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
- },
- "is-whitespace-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
- "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true
},
"is-windows": {
@@ -4805,12 +4644,6 @@
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true
},
- "is-word-character": {
- "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": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -5181,9 +5014,9 @@
"dev": true
},
"known-css-properties": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz",
- "integrity": "sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==",
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.20.0.tgz",
+ "integrity": "sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==",
"dev": true
},
"ky": {
@@ -5236,6 +5069,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"parse-json": "^2.2.0",
@@ -5430,6 +5264,7 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
"integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
"requires": {
"currently-unhandled": "^0.4.1",
"signal-exit": "^3.0.0"
@@ -5441,6 +5276,14 @@
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
"optional": true
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"luxon": {
"version": "1.25.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.25.0.tgz",
@@ -5479,7 +5322,8 @@
"map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
},
"map-visit": {
"version": "1.0.0",
@@ -5490,21 +5334,6 @@
"object-visit": "^1.0.0"
}
},
- "markdown-escapes": {
- "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-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
- "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
- "dev": true,
- "requires": {
- "repeat-string": "^1.0.0"
- }
- },
"matcher": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
@@ -5528,15 +5357,46 @@
"integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
"dev": true
},
- "mdast-util-compact": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz",
- "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==",
+ "mdast-util-from-markdown": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.1.tgz",
+ "integrity": "sha512-qJXNcFcuCSPqUF0Tb0uYcFDIq67qwB3sxo9RPdf9vG8T90ViKnksFqdB/Coq2a7sTnxL/Ify2y7aIQXDkQFH0w==",
"dev": true,
"requires": {
- "unist-util-visit": "^2.0.0"
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "micromark": "~2.10.0",
+ "parse-entities": "^2.0.0"
}
},
+ "mdast-util-to-markdown": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.5.4.tgz",
+ "integrity": "sha512-0jQTkbWYx0HdEA/h++7faebJWr5JyBoBeiRf0u3F4F3QtnyyGaWIsOwo749kRb1ttKrLLr+wRtOkfou9yB0p6A==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "longest-streak": "^2.0.0",
+ "mdast-util-to-string": "^2.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.0.0",
+ "zwitch": "^1.0.0"
+ },
+ "dependencies": {
+ "mdast-util-to-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+ "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
+ "dev": true
+ }
+ }
+ },
+ "mdast-util-to-string": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz",
+ "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==",
+ "dev": true
+ },
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -5555,6 +5415,7 @@
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
"integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
"requires": {
"camelcase-keys": "^2.0.0",
"decamelize": "^1.1.2",
@@ -5568,11 +5429,6 @@
"trim-newlines": "^1.0.0"
}
},
- "merge": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
- "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ=="
- },
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -5595,6 +5451,16 @@
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
+ "micromark": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.10.1.tgz",
+ "integrity": "sha512-fUuVF8sC1X7wsCS29SYQ2ZfIZYbTymp0EYr6sab3idFjigFFjGa5UwoniPlV9tAgntjuapW1t9U+S0yDYeGKHQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
"micromatch": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
@@ -5967,15 +5833,16 @@
}
},
"node-releases": {
- "version": "1.1.66",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.66.tgz",
- "integrity": "sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg==",
+ "version": "1.1.67",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz",
+ "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==",
"dev": true
},
"normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
"requires": {
"hosted-git-info": "^2.1.4",
"resolve": "^1.10.0",
@@ -6295,11 +6162,6 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
- "object-component": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
- "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
- },
"object-copy": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
@@ -6551,6 +6413,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
"requires": {
"error-ex": "^1.2.0"
}
@@ -6576,22 +6439,6 @@
"integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
"dev": true
},
- "parseqs": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
- "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
- "requires": {
- "better-assert": "~1.0.0"
- }
- },
- "parseuri": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
- "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
- "requires": {
- "better-assert": "~1.0.0"
- }
- },
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -6607,6 +6454,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
"requires": {
"pinkie-promise": "^2.0.0"
}
@@ -6624,7 +6472,8 @@
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
},
"path-to-regexp": {
"version": "0.1.7",
@@ -6635,6 +6484,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"pify": "^2.0.0",
@@ -6666,17 +6516,20 @@
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
},
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
"requires": {
"pinkie": "^2.0.0"
}
@@ -6882,9 +6735,9 @@
"optional": true
},
"prettier": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
- "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
+ "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==",
"dev": true
},
"prettier-linter-helpers": {
@@ -7216,6 +7069,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
"requires": {
"load-json-file": "^1.0.0",
"normalize-package-data": "^2.3.2",
@@ -7226,6 +7080,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
"requires": {
"find-up": "^1.0.0",
"read-pkg": "^1.0.0"
@@ -7264,6 +7119,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
"integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
"requires": {
"indent-string": "^2.1.0",
"strip-indent": "^1.0.1"
@@ -7306,60 +7162,32 @@
}
},
"remark": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz",
- "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==",
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+ "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
"dev": true,
"requires": {
- "remark-parse": "^8.0.0",
- "remark-stringify": "^8.0.0",
- "unified": "^9.0.0"
+ "remark-parse": "^9.0.0",
+ "remark-stringify": "^9.0.0",
+ "unified": "^9.1.0"
}
},
"remark-parse": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz",
- "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
"dev": true,
"requires": {
- "ccount": "^1.0.0",
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^2.0.0",
- "vfile-location": "^3.0.0",
- "xtend": "^4.0.1"
+ "mdast-util-from-markdown": "^0.8.0"
}
},
"remark-stringify": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz",
- "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.0.tgz",
+ "integrity": "sha512-8x29DpTbVzEc6Dwb90qhxCtbZ6hmj3BxWWDpMhA+1WM4dOEGH5U5/GFe3Be5Hns5MvPSFAr1e2KSVtKZkK5nUw==",
"dev": true,
"requires": {
- "ccount": "^1.0.0",
- "is-alphanumeric": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "longest-streak": "^2.0.1",
- "markdown-escapes": "^1.0.0",
- "markdown-table": "^2.0.0",
- "mdast-util-compact": "^2.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "stringify-entities": "^3.0.0",
- "unherit": "^1.0.4",
- "xtend": "^4.0.1"
+ "mdast-util-to-markdown": "^0.5.0"
}
},
"remove-trailing-separator": {
@@ -7384,6 +7212,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
"requires": {
"is-finite": "^1.0.0"
}
@@ -7475,6 +7304,7 @@
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
"integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
+ "dev": true,
"requires": {
"is-core-module": "^2.0.0",
"path-parse": "^1.0.6"
@@ -7552,9 +7382,9 @@
"dev": true
},
"rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"requires": {
"glob": "^7.1.3"
}
@@ -7659,7 +7489,8 @@
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
},
"semver-compare": {
"version": "1.0.0",
@@ -7802,16 +7633,27 @@
"signal-exit": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
},
"simple-git": {
- "version": "2.21.0",
- "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.21.0.tgz",
- "integrity": "sha512-rohCHmEjD/ESXFLxF4bVeqgdb4Awc65ZyyuCKl3f7BvgMbZOBa/Ye3HN/GFnvruiUOAWWNupxhz3Rz5/3vJLTg==",
+ "version": "2.26.0",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.26.0.tgz",
+ "integrity": "sha512-I9QIjBNA773X23SZ/S1HFMCA+S//san83Twyd5ffWFjo/sv8VRk7tuck23y1uFWuzTu4KTwDh5LEXyCfEfOWMw==",
"requires": {
"@kwsites/file-exists": "^1.1.1",
"@kwsites/promise-deferred": "^1.1.1",
- "debug": "^4.1.1"
+ "debug": "^4.3.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ }
}
},
"single-line-log": {
@@ -7859,16 +7701,6 @@
"ansi-styles": "^3.2.0",
"astral-regex": "^1.0.0",
"is-fullwidth-code-point": "^2.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "^1.9.0"
- }
- }
}
},
"snapdragon": {
@@ -7994,18 +7826,26 @@
}
},
"socket.io": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz",
- "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.0.4.tgz",
+ "integrity": "sha512-Vj1jUoO75WGc9txWd311ZJJqS9Dr8QtNJJ7gk2r7dcM/yGe9sit7qOijQl3GAwhpBOz/W8CwkD7R6yob07nLbA==",
"requires": {
+ "@types/cookie": "^0.4.0",
+ "@types/cors": "^2.8.8",
+ "@types/node": "^14.14.7",
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
"debug": "~4.1.0",
- "engine.io": "~3.4.0",
- "has-binary2": "~1.0.2",
- "socket.io-adapter": "~1.1.0",
- "socket.io-client": "2.3.0",
- "socket.io-parser": "~3.4.0"
+ "engine.io": "~4.0.0",
+ "socket.io-adapter": "~2.0.3",
+ "socket.io-parser": "~4.0.1"
},
"dependencies": {
+ "@types/node": {
+ "version": "14.14.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.12.tgz",
+ "integrity": "sha512-ASH8OPHMNlkdjrEdmoILmzFfsJICvhBsFfAum4aKZ/9U4B6M6tTmTPh+f3ttWdD74CEGV5XvXWkbyfSdXaTd7g=="
+ },
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -8017,89 +7857,18 @@
}
},
"socket.io-adapter": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
- "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
- },
- "socket.io-client": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
- "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
- "requires": {
- "backo2": "1.0.2",
- "base64-arraybuffer": "0.1.5",
- "component-bind": "1.0.0",
- "component-emitter": "1.2.1",
- "debug": "~4.1.0",
- "engine.io-client": "~3.4.0",
- "has-binary2": "~1.0.2",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "object-component": "0.0.3",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "socket.io-parser": "~3.3.0",
- "to-array": "0.1.4"
- },
- "dependencies": {
- "base64-arraybuffer": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
- "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
- },
- "socket.io-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz",
- "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==",
- "requires": {
- "component-emitter": "~1.3.0",
- "debug": "~3.1.0",
- "isarray": "2.0.1"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- }
- }
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.3.tgz",
+ "integrity": "sha512-2wo4EXgxOGSFueqvHAdnmi5JLZzWqMArjuP4nqC26AtLh5PoCPsaRbRdah2xhcwTAMooZfjYiNVNkkmmSMaxOQ=="
},
"socket.io-parser": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz",
- "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.2.tgz",
+ "integrity": "sha512-Bs3IYHDivwf+bAAuW/8xwJgIiBNtlvnjYRc4PbXgniLmcP1BrakBoq/QhO24rgtgW7VZ7uAaswRGxutUnlAK7g==",
"requires": {
- "component-emitter": "1.2.1",
- "debug": "~4.1.0",
- "isarray": "2.0.1"
+ "@types/component-emitter": "^1.2.10",
+ "component-emitter": "~1.3.0",
+ "debug": "~4.1.0"
},
"dependencies": {
"debug": {
@@ -8109,11 +7878,6 @@
"requires": {
"ms": "^2.1.1"
}
- },
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
}
}
},
@@ -8171,6 +7935,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
"integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
@@ -8179,12 +7944,14 @@
"spdx-exceptions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
},
"spdx-expression-parse": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
@@ -8193,7 +7960,8 @@
"spdx-license-ids": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
- "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw=="
+ "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
+ "dev": true
},
"specificity": {
"version": "0.4.1",
@@ -8266,12 +8034,6 @@
"tweetnacl": "~0.14.0"
}
},
- "state-toggle": {
- "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
- },
"static-extend": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@@ -8343,21 +8105,11 @@
"safe-buffer": "~5.1.0"
}
},
- "stringify-entities": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz",
- "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==",
- "dev": true,
- "requires": {
- "character-entities-html4": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "xtend": "^4.0.0"
- }
- },
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -8366,6 +8118,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
"requires": {
"is-utf8": "^0.2.0"
}
@@ -8386,6 +8139,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
"integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
"requires": {
"get-stdin": "^4.0.1"
}
@@ -8402,22 +8156,22 @@
"dev": true
},
"stylelint": {
- "version": "13.7.2",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.7.2.tgz",
- "integrity": "sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==",
+ "version": "13.8.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz",
+ "integrity": "sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==",
"dev": true,
"requires": {
"@stylelint/postcss-css-in-js": "^0.37.2",
- "@stylelint/postcss-markdown": "^0.36.1",
+ "@stylelint/postcss-markdown": "^0.36.2",
"autoprefixer": "^9.8.6",
"balanced-match": "^1.0.0",
"chalk": "^4.1.0",
"cosmiconfig": "^7.0.0",
- "debug": "^4.1.1",
+ "debug": "^4.2.0",
"execall": "^2.0.0",
"fast-glob": "^3.2.4",
"fastest-levenshtein": "^1.0.12",
- "file-entry-cache": "^5.0.1",
+ "file-entry-cache": "^6.0.0",
"get-stdin": "^8.0.0",
"global-modules": "^2.0.0",
"globby": "^11.0.1",
@@ -8426,14 +8180,14 @@
"ignore": "^5.1.8",
"import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4",
- "known-css-properties": "^0.19.0",
+ "known-css-properties": "^0.20.0",
"lodash": "^4.17.20",
"log-symbols": "^4.0.0",
"mathml-tag-names": "^2.1.3",
- "meow": "^7.1.1",
+ "meow": "^8.0.0",
"micromatch": "^4.0.2",
"normalize-selector": "^0.2.0",
- "postcss": "^7.0.32",
+ "postcss": "^7.0.35",
"postcss-html": "^0.36.0",
"postcss-less": "^3.1.4",
"postcss-media-query-parser": "^0.2.3",
@@ -8441,7 +8195,7 @@
"postcss-safe-parser": "^4.0.2",
"postcss-sass": "^0.4.4",
"postcss-scss": "^2.1.1",
- "postcss-selector-parser": "^6.0.2",
+ "postcss-selector-parser": "^6.0.4",
"postcss-syntax": "^0.36.2",
"postcss-value-parser": "^4.1.0",
"resolve-from": "^5.0.0",
@@ -8452,8 +8206,8 @@
"style-search": "^0.1.0",
"sugarss": "^2.0.0",
"svg-tags": "^1.0.0",
- "table": "^6.0.1",
- "v8-compile-cache": "^2.1.1",
+ "table": "^6.0.3",
+ "v8-compile-cache": "^2.2.0",
"write-file-atomic": "^3.0.3"
},
"dependencies": {
@@ -8535,6 +8289,15 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
+ "file-entry-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
+ "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -8554,6 +8317,22 @@
"path-exists": "^4.0.0"
}
},
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+ "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
+ "dev": true
+ },
"get-stdin": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
@@ -8566,6 +8345,15 @@
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
+ "hosted-git-info": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
+ "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
"ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
@@ -8597,9 +8385,9 @@
"dev": true
},
"meow": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz",
- "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz",
+ "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==",
"dev": true,
"requires": {
"@types/minimist": "^1.2.0",
@@ -8607,12 +8395,12 @@
"decamelize-keys": "^1.1.0",
"hard-rejection": "^2.1.0",
"minimist-options": "4.1.0",
- "normalize-package-data": "^2.5.0",
+ "normalize-package-data": "^3.0.0",
"read-pkg-up": "^7.0.1",
"redent": "^3.0.0",
"trim-newlines": "^3.0.0",
- "type-fest": "^0.13.1",
- "yargs-parser": "^18.1.3"
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
}
},
"micromatch": {
@@ -8625,6 +8413,18 @@
"picomatch": "^2.0.5"
}
},
+ "normalize-package-data": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz",
+ "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^3.0.6",
+ "resolve": "^1.17.0",
+ "semver": "^7.3.2",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
"parse-json": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
@@ -8655,6 +8455,30 @@
"type-fest": "^0.6.0"
},
"dependencies": {
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
"type-fest": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
@@ -8698,6 +8522,21 @@
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ },
"slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
@@ -8748,9 +8587,9 @@
}
},
"table": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/table/-/table-6.0.3.tgz",
- "integrity": "sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==",
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.4.tgz",
+ "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
@@ -8774,15 +8613,17 @@
"integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
"dev": true
},
+ "type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true
+ },
"yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
}
}
},
@@ -8835,9 +8676,12 @@
}
},
"supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
},
"supports-hyperlinks": {
"version": "1.0.1",
@@ -8854,23 +8698,6 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- },
- "dependencies": {
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- }
- }
}
}
},
@@ -9000,11 +8827,6 @@
"os-tmpdir": "~1.0.2"
}
},
- "to-array": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
- "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
- },
"to-buffer": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
@@ -9088,21 +8910,10 @@
"punycode": "^2.1.0"
}
},
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
- "dev": true
- },
"trim-newlines": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
- },
- "trim-trailing-lines": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz",
- "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
"dev": true
},
"trough": {
@@ -9161,7 +8972,8 @@
"type-fest": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
- "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "optional": true
},
"type-is": {
"version": "1.6.18",
@@ -9186,16 +8998,6 @@
"is-typedarray": "^1.0.0"
}
},
- "unherit": {
- "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.0",
- "xtend": "^4.0.0"
- }
- },
"unified": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz",
@@ -9251,15 +9053,6 @@
"integrity": "sha512-bTofCFVx0iQM8Jqb1TBDVRIQW03YkD3p66JOd/aCWuqzlLyUtx1ZAGw/u+Zw+SttKvSVcvTiKYbfrtLoLefykw==",
"dev": true
},
- "unist-util-remove-position": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
- "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
- "dev": true,
- "requires": {
- "unist-util-visit": "^2.0.0"
- }
- },
"unist-util-stringify-position": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
@@ -9269,27 +9062,6 @@
"@types/unist": "^2.0.2"
}
},
- "unist-util-visit": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
- "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
- "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- }
- },
"universal-url": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universal-url/-/universal-url-2.0.0.tgz",
@@ -9441,6 +9213,7 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
"requires": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
@@ -9482,12 +9255,6 @@
}
}
},
- "vfile-location": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz",
- "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==",
- "dev": true
- },
"vfile-message": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
@@ -9742,14 +9509,6 @@
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
"write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
@@ -9779,11 +9538,6 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
},
- "xmlhttprequest-ssl": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
- "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
- },
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -9796,6 +9550,11 @@
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
"dev": true
},
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
"yaml": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
@@ -9909,11 +9668,6 @@
"fd-slicer": "~1.1.0"
}
},
- "yeast": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
- "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
- },
"zip-stream": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
@@ -9925,6 +9679,12 @@
"lodash": "^4.8.0",
"readable-stream": "^2.0.0"
}
+ },
+ "zwitch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+ "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index edd6542c..6da3538c 100644
--- a/package.json
+++ b/package.json
@@ -44,22 +44,22 @@
"devDependencies": {
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",
- "danger": "^10.5.1",
- "eslint-config-prettier": "^6.15.0",
- "eslint-plugin-jsdoc": "^30.7.7",
- "eslint-plugin-prettier": "^3.1.4",
+ "danger": "^10.5.4",
+ "eslint-config-prettier": "^7.0.0",
+ "eslint-plugin-jsdoc": "^30.7.8",
+ "eslint-plugin-prettier": "^3.2.0",
"express-basic-auth": "^1.2.0",
- "husky": "^4.3.0",
+ "husky": "^4.3.5",
"jsdom": "^16.4.0",
"lodash": "^4.17.20",
"mocha": "^8.2.1",
"mocha-each": "^2.0.1",
"mocha-logger": "^1.0.7",
"nyc": "^15.1.0",
- "prettier": "^2.1.2",
+ "prettier": "^2.2.1",
"pretty-quick": "^3.1.0",
"spectron": "^10.0.1",
- "stylelint": "^13.7.2",
+ "stylelint": "^13.8.0",
"stylelint-config-prettier": "^8.0.2",
"stylelint-config-standard": "^20.0.0",
"stylelint-prettier": "^1.1.2"
@@ -69,23 +69,23 @@
},
"dependencies": {
"colors": "^1.4.0",
- "console-stamp": "^0.2.9",
+ "console-stamp": "^3.0.0-rc4.2",
"electron": "^8.5.3",
- "eslint": "^7.13.0",
+ "eslint": "^7.15.0",
"express": "^4.17.1",
"express-ipfilter": "^1.1.2",
- "feedme": "^1.2.0",
+ "feedme": "^2.0.2",
"helmet": "^4.2.0",
"ical": "^0.8.0",
"iconv-lite": "^0.6.2",
"module-alias": "^2.2.2",
"moment": "^2.29.1",
- "node-ical": "^0.12.3",
+ "node-ical": "^0.12.4",
"request": "^2.88.2",
"rrule": "^2.6.6",
"rrule-alt": "^2.2.8",
- "simple-git": "^2.21.0",
- "socket.io": "^2.3.0",
+ "simple-git": "^2.26.0",
+ "socket.io": "^3.0.4",
"valid-url": "^1.0.9"
},
"_moduleAliases": {
diff --git a/tests/configs/modules/calendar/custom.js b/tests/configs/modules/calendar/custom.js
index 2084419d..7bbeb602 100644
--- a/tests/configs/modules/calendar/custom.js
+++ b/tests/configs/modules/calendar/custom.js
@@ -22,11 +22,11 @@ let config = {
config: {
calendars: [
{
+ maximumEntries: 4,
+ maximumNumberOfDays: 10000,
symbol: "birthday-cake",
fullDaySymbol: "calendar-day",
recurringSymbol: "undo",
- maximumEntries: 4,
- maximumNumberOfDays: 10000,
url: "http://localhost:8080/tests/configs/data/calendar_test_icons.ics"
}
]
diff --git a/translations/lt.json b/translations/lt.json
index 87fbd791..0ab64c3c 100644
--- a/translations/lt.json
+++ b/translations/lt.json
@@ -9,28 +9,28 @@
"WEEK": "{weekNumber} savaitė",
- "N": "N",
- "NNE": "NNE",
- "NE": "NE",
- "ENE": "ENE",
- "E": "E",
- "ESE": "ESE",
- "SE": "SE",
- "SSE": "SSE",
- "S": "S",
- "SSW": "SSW",
- "SW": "SW",
- "WSW": "WSW",
- "W": "W",
- "WNW": "WNW",
- "NW": "NW",
- "NNW": "NNW",
+ "N": "Š",
+ "NNE": "ŠŠR",
+ "NE": "ŠR",
+ "ENE": "RŠR",
+ "E": "R",
+ "ESE": "RPR",
+ "SE": "PR",
+ "SSE": "PPR",
+ "S": "P",
+ "SSW": "PPV",
+ "SW": "PV",
+ "WSW": "VPV",
+ "W": "V",
+ "WNW": "VŠV",
+ "NW": "ŠV",
+ "NNW": "ŠŠV",
"UPDATE_NOTIFICATION": "Galimas MagicMirror² naujinimas.",
"UPDATE_NOTIFICATION_MODULE": "Galimas {MODULE_NAME} naujinimas.",
"UPDATE_INFO_SINGLE": "Šis įdiegimas atsilieka {COMMIT_COUNT} įsipareigojimu {BRANCH_NAME} šakoje.",
"UPDATE_INFO_MULTIPLE": "Šis įdiegimas atsilieka {COMMIT_COUNT} įsipareigojimais {BRANCH_NAME} šakoje.",
- "FEELS": "Jaučiasi kaip",
+ "FEELS": "Jutiminė temp.",
"PRECIP": "Krituliai"
}
diff --git a/translations/ps.json b/translations/ps.json
new file mode 100644
index 00000000..f3f8a638
--- /dev/null
+++ b/translations/ps.json
@@ -0,0 +1,37 @@
+{
+ "LOADING": "پیلېدل",
+
+ "TODAY": "نن",
+ "TOMORROW": "سبا",
+ "DAYAFTERTOMORROW": "بل سبا",
+ "RUNNING": "روان",
+ "EMPTY": "تش",
+
+ "WEEK": "{weekNumber}. اونۍ",
+
+ "N": "N",
+ "NNE": "NNO",
+ "NE": "NO",
+ "ENE": "ONO",
+ "E": "O",
+ "ESE": "OSO",
+ "SE": "SO",
+ "SSE": "SSO",
+ "S": "S",
+ "SSW": "SSW",
+ "SW": "SW",
+ "WSW": "WSW",
+ "W": "W",
+ "WNW": "WNW",
+ "NW": "NW",
+ "NNW": "NNW",
+
+ "MODULE_CONFIG_CHANGED": "د {MODULE_NAME} بڼی تغیر کړی دی. \n هیله دی چی اسناد و ګوری!",
+
+ "UPDATE_NOTIFICATION": "د MagicMirror² نوې نسخه سته ",
+ "UPDATE_NOTIFICATION_MODULE": "د {MODULE_NAME} نوی نسخه سته",
+ "UPDATE_INFO_SINGLE": "اوسنی برخه {COMMIT_COUNT} د {BRANCH_NAME} څخه وروسته پاته ده",
+ "UPDATE_INFO_MULTIPLE": "اوسنی برخه {COMMIT_COUNT} د {BRANCH_NAME} څخه وروسته پاته ده",
+
+ "FEELS": "حس کېږی"
+}
diff --git a/vendor/package-lock.json b/vendor/package-lock.json
index adc372bc..3159313f 100644
--- a/vendor/package-lock.json
+++ b/vendor/package-lock.json
@@ -4,9 +4,9 @@
"lockfileVersion": 1,
"dependencies": {
"@fortawesome/fontawesome-free": {
- "version": "5.14.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.14.0.tgz",
- "integrity": "sha512-OfdMsF+ZQgdKHP9jUbmDcRrP0eX90XXrsXIdyjLbkmSBzmMXPABB8eobUJtivaupucYaByz6WNe1PI1JuYm3qA=="
+ "version": "5.15.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.1.tgz",
+ "integrity": "sha512-OEdH7SyC1suTdhBGW91/zBfR6qaIhThbcN8PUXtXilY4GYnSBbVqOntdHbC1vXwsDnX0Qix2m2+DSU1J51ybOQ=="
},
"a-sync-waterfall": {
"version": "1.0.1",
@@ -119,14 +119,14 @@
"optional": true
},
"moment": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.28.0.tgz",
- "integrity": "sha512-Z5KOjYmnHyd/ukynmFd/WwyXHd7L4J9vTI/nn5Ap9AVUgaAE15VvQ9MOGmJJygEUklupqIrFnor/tjTwRU+tQw=="
+ "version": "2.29.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+ "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"moment-timezone": {
- "version": "0.5.31",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
- "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
+ "version": "0.5.32",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz",
+ "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==",
"requires": {
"moment": ">= 2.9.0"
}
diff --git a/vendor/package.json b/vendor/package.json
index 2de60b52..5f7c18c7 100755
--- a/vendor/package.json
+++ b/vendor/package.json
@@ -10,9 +10,9 @@
"url": "https://github.com/MichMich/MagicMirror/issues"
},
"dependencies": {
- "@fortawesome/fontawesome-free": "^5.14.0",
- "moment": "^2.28.0",
- "moment-timezone": "^0.5.31",
+ "@fortawesome/fontawesome-free": "^5.15.1",
+ "moment": "^2.29.1",
+ "moment-timezone": "^0.5.32",
"nunjucks": "^3.2.2",
"suncalc": "^1.8.0",
"weathericons": "^2.1.0"