From 974de179e04b4a2c85e049a7c08a890d1038d836 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Mon, 13 Sep 2021 22:28:27 +0200 Subject: [PATCH 01/37] refactor tests in 3 categories unit, e2e and electron --- .github/workflows/node-ci.js.yml | 2 +- package.json | 20 ++++++++-- tests/e2e/env_spec.js | 37 +++-------------- tests/e2e/fonts.js | 16 ++------ tests/e2e/ipWhitelist_spec.js | 20 +++------- tests/e2e/port_config.js | 27 +++---------- tests/e2e/vendor_spec.js | 17 ++------ tests/{e2e => electron}/dev_console.js | 0 tests/electron/env_spec.js | 40 +++++++++++++++++++ tests/{e2e => electron}/global-setup.js | 0 tests/{e2e => electron}/modules/alert_spec.js | 0 .../modules}/basic-auth.js | 0 .../modules/calendar_spec.js | 2 +- .../modules/clock_es_spec.js | 0 tests/{e2e => electron}/modules/clock_spec.js | 0 .../modules/compliments_spec.js | 0 .../modules/helloworld_spec.js | 0 .../{e2e => electron}/modules/mocks/index.js | 0 .../modules/mocks/weather_current.js | 0 .../modules/mocks/weather_forecast.js | 0 .../modules/newsfeed_spec.js | 0 .../{e2e => electron}/modules/weather_spec.js | 0 .../{e2e => electron}/modules_display_spec.js | 0 .../modules_position_spec.js | 0 tests/{e2e => electron}/translations_spec.js | 0 tests/{e2e => electron}/without_modules.js | 0 26 files changed, 81 insertions(+), 100 deletions(-) rename tests/{e2e => electron}/dev_console.js (100%) create mode 100644 tests/electron/env_spec.js rename tests/{e2e => electron}/global-setup.js (100%) rename tests/{e2e => electron}/modules/alert_spec.js (100%) rename tests/{servers => electron/modules}/basic-auth.js (100%) rename tests/{e2e => electron}/modules/calendar_spec.js (98%) rename tests/{e2e => electron}/modules/clock_es_spec.js (100%) rename tests/{e2e => electron}/modules/clock_spec.js (100%) rename tests/{e2e => electron}/modules/compliments_spec.js (100%) rename tests/{e2e => electron}/modules/helloworld_spec.js (100%) rename tests/{e2e => electron}/modules/mocks/index.js (100%) rename tests/{e2e => electron}/modules/mocks/weather_current.js (100%) rename tests/{e2e => electron}/modules/mocks/weather_forecast.js (100%) rename tests/{e2e => electron}/modules/newsfeed_spec.js (100%) rename tests/{e2e => electron}/modules/weather_spec.js (100%) rename tests/{e2e => electron}/modules_display_spec.js (100%) rename tests/{e2e => electron}/modules_position_spec.js (100%) rename tests/{e2e => electron}/translations_spec.js (100%) rename tests/{e2e => electron}/without_modules.js (100%) diff --git a/.github/workflows/node-ci.js.yml b/.github/workflows/node-ci.js.yml index 3178607d..3a7391c2 100644 --- a/.github/workflows/node-ci.js.yml +++ b/.github/workflows/node-ci.js.yml @@ -23,7 +23,6 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: | - node -v Xvfb :99 -screen 0 1024x768x16 & export DISPLAY=:99 npm install @@ -32,3 +31,4 @@ jobs: npm run test:css npm run test:unit npm run test:e2e + npm run test:electron diff --git a/package.json b/package.json index 92350f0c..8bda06d8 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "postinstall": "npm run install-fonts && echo \"MagicMirror installation finished successfully! \n\"", "test": "NODE_ENV=test jest -i --forceExit", "test:coverage": "NODE_ENV=test nyc --reporter=lcov --reporter=text jest -i --forceExit", + "test:electron": "NODE_ENV=test jest --selectProjects electron -i --forceExit", "test:e2e": "NODE_ENV=test jest --selectProjects e2e -i --forceExit", "test:unit": "NODE_ENV=test jest --selectProjects unit -i --forceExit", "test:prettier": "prettier . --check", @@ -106,15 +107,26 @@ "/tests/unit/mocks" ] }, + { + "displayName": "electron", + "testMatch": [ + "**/tests/electron/**/*.[jt]s?(x)" + ], + "testPathIgnorePatterns": [ + "/tests/electron/modules/mocks", + "/tests/electron/global-setup.js", + "/tests/electron/modules/basic-auth.js" + ] + }, { "displayName": "e2e", "testMatch": [ "**/tests/e2e/**/*.[jt]s?(x)" ], - "testPathIgnorePatterns": [ - "/tests/e2e/modules/mocks", - "/tests/e2e/global-setup.js" - ] + "moduleNameMapper": { + "logger": "/js/logger.js", + "node_helper": "/js/node_helper.js" + } } ] } diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js index 706274a2..28a0294b 100644 --- a/tests/e2e/env_spec.js +++ b/tests/e2e/env_spec.js @@ -1,42 +1,15 @@ -const helpers = require("./global-setup"); const fetch = require("node-fetch"); +const app = require("../../js/app.js"); describe("Electron app environment", function () { - helpers.setupTimeout(this); - - let app = null; - beforeAll(function () { - // Set config sample for use in test process.env.MM_CONFIG_FILE = "tests/configs/env.js"; + + app.start(); }); - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - afterEach(function () { - return helpers.stopApplication(app); - }); - - it("should open a browserwindow", async function () { - await app.client.waitUntilWindowLoaded(); - app.browserWindow.focus(); - expect(await app.client.getWindowCount()).toBe(1); - expect(await app.browserWindow.isMinimized()).toBe(false); - expect(await app.browserWindow.isDevToolsOpened()).toBe(false); - expect(await app.browserWindow.isVisible()).toBe(true); - expect(await app.browserWindow.isFocused()).toBe(true); - const bounds = await app.browserWindow.getBounds(); - expect(bounds.width).toBeGreaterThan(0); - expect(bounds.height).toBeGreaterThan(0); - expect(await app.browserWindow.getTitle()).toBe("MagicMirror²"); + afterAll(function () { + app.stop(); }); it("get request from http://localhost:8080 should return 200", function (done) { diff --git a/tests/e2e/fonts.js b/tests/e2e/fonts.js index b1459294..d8b8e0a7 100644 --- a/tests/e2e/fonts.js +++ b/tests/e2e/fonts.js @@ -1,10 +1,7 @@ -const helpers = require("./global-setup"); const fetch = require("node-fetch"); +const app = require("../../js/app.js"); describe("All font files from roboto.css should be downloadable", function () { - helpers.setupTimeout(this); - - let app; const fontFiles = []; // Statements below filters out all 'url' lines in the CSS file const fileContent = require("fs").readFileSync(__dirname + "/../../fonts/roboto.css", "utf8"); @@ -18,20 +15,13 @@ describe("All font files from roboto.css should be downloadable", function () { } beforeAll(function () { - // Set config sample for use in test process.env.MM_CONFIG_FILE = "tests/configs/without_modules.js"; - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); + app.start(); }); afterAll(function () { - return helpers.stopApplication(app); + app.stop(); }); test.each(fontFiles)("should return 200 HTTP code for file '%s'", (fontFile, done) => { diff --git a/tests/e2e/ipWhitelist_spec.js b/tests/e2e/ipWhitelist_spec.js index 3406e0e7..99bad61a 100644 --- a/tests/e2e/ipWhitelist_spec.js +++ b/tests/e2e/ipWhitelist_spec.js @@ -1,23 +1,13 @@ -const helpers = require("./global-setup"); const fetch = require("node-fetch"); +const app = require("../../js/app.js"); describe("ipWhitelist directive configuration", function () { - helpers.setupTimeout(this); - - let app = null; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); + beforeAll(function () { + app.start(); }); - afterEach(function () { - return helpers.stopApplication(app); + afterAll(function () { + app.stop(); }); describe("Set ipWhitelist without access", function () { diff --git a/tests/e2e/port_config.js b/tests/e2e/port_config.js index da489414..7e960992 100644 --- a/tests/e2e/port_config.js +++ b/tests/e2e/port_config.js @@ -1,31 +1,18 @@ -const helpers = require("./global-setup"); const fetch = require("node-fetch"); +const app = require("../../js/app.js"); describe("port directive configuration", function () { - helpers.setupTimeout(this); + beforeAll(function () { + process.env.MM_CONFIG_FILE = "tests/configs/port_8090.js"; - let app = null; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); + app.start(); }); - afterEach(function () { - return helpers.stopApplication(app); + afterAll(function () { + app.stop(); }); describe("Set port 8090", function () { - beforeAll(function () { - // Set config sample for use in this test - process.env.MM_CONFIG_FILE = "tests/configs/port_8090.js"; - }); - it("should return 200", function (done) { fetch("http://localhost:8090").then((res) => { expect(res.status).toBe(200); @@ -37,8 +24,6 @@ describe("port directive configuration", function () { describe("Set port 8100 on environment variable MM_PORT", function () { beforeAll(function () { process.env.MM_PORT = 8100; - // Set config sample for use in this test - process.env.MM_CONFIG_FILE = "tests/configs/port_8090.js"; }); afterAll(function () { diff --git a/tests/e2e/vendor_spec.js b/tests/e2e/vendor_spec.js index 9fcb9aeb..2b619dd0 100644 --- a/tests/e2e/vendor_spec.js +++ b/tests/e2e/vendor_spec.js @@ -1,24 +1,15 @@ -const helpers = require("./global-setup"); const fetch = require("node-fetch"); +const app = require("../../js/app.js"); describe("Vendors", function () { - helpers.setupTimeout(this); - - let app = null; - beforeAll(function () { process.env.MM_CONFIG_FILE = "tests/configs/env.js"; - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); + + app.start(); }); afterAll(function () { - return helpers.stopApplication(app); + app.stop(); }); describe("Get list vendors", function () { diff --git a/tests/e2e/dev_console.js b/tests/electron/dev_console.js similarity index 100% rename from tests/e2e/dev_console.js rename to tests/electron/dev_console.js diff --git a/tests/electron/env_spec.js b/tests/electron/env_spec.js new file mode 100644 index 00000000..46efc719 --- /dev/null +++ b/tests/electron/env_spec.js @@ -0,0 +1,40 @@ +const helpers = require("./global-setup"); + +describe("Electron app environment", function () { + helpers.setupTimeout(this); + + let app = null; + + beforeAll(function () { + // Set config sample for use in test + process.env.MM_CONFIG_FILE = "tests/configs/env.js"; + }); + + beforeEach(function () { + return helpers + .startApplication({ + args: ["js/electron.js"] + }) + .then(function (startedApp) { + app = startedApp; + }); + }); + + afterEach(function () { + return helpers.stopApplication(app); + }); + + it("should open a browserwindow", async function () { + await app.client.waitUntilWindowLoaded(); + app.browserWindow.focus(); + expect(await app.client.getWindowCount()).toBe(1); + expect(await app.browserWindow.isMinimized()).toBe(false); + expect(await app.browserWindow.isDevToolsOpened()).toBe(false); + expect(await app.browserWindow.isVisible()).toBe(true); + expect(await app.browserWindow.isFocused()).toBe(true); + const bounds = await app.browserWindow.getBounds(); + expect(bounds.width).toBeGreaterThan(0); + expect(bounds.height).toBeGreaterThan(0); + expect(await app.browserWindow.getTitle()).toBe("MagicMirror²"); + }); +}); diff --git a/tests/e2e/global-setup.js b/tests/electron/global-setup.js similarity index 100% rename from tests/e2e/global-setup.js rename to tests/electron/global-setup.js diff --git a/tests/e2e/modules/alert_spec.js b/tests/electron/modules/alert_spec.js similarity index 100% rename from tests/e2e/modules/alert_spec.js rename to tests/electron/modules/alert_spec.js diff --git a/tests/servers/basic-auth.js b/tests/electron/modules/basic-auth.js similarity index 100% rename from tests/servers/basic-auth.js rename to tests/electron/modules/basic-auth.js diff --git a/tests/e2e/modules/calendar_spec.js b/tests/electron/modules/calendar_spec.js similarity index 98% rename from tests/e2e/modules/calendar_spec.js rename to tests/electron/modules/calendar_spec.js index 980eca58..b6420e83 100644 --- a/tests/e2e/modules/calendar_spec.js +++ b/tests/electron/modules/calendar_spec.js @@ -1,5 +1,5 @@ const helpers = require("../global-setup"); -const serverBasicAuth = require("../../servers/basic-auth.js"); +const serverBasicAuth = require("./basic-auth.js"); describe("Calendar module", function () { helpers.setupTimeout(this); diff --git a/tests/e2e/modules/clock_es_spec.js b/tests/electron/modules/clock_es_spec.js similarity index 100% rename from tests/e2e/modules/clock_es_spec.js rename to tests/electron/modules/clock_es_spec.js diff --git a/tests/e2e/modules/clock_spec.js b/tests/electron/modules/clock_spec.js similarity index 100% rename from tests/e2e/modules/clock_spec.js rename to tests/electron/modules/clock_spec.js diff --git a/tests/e2e/modules/compliments_spec.js b/tests/electron/modules/compliments_spec.js similarity index 100% rename from tests/e2e/modules/compliments_spec.js rename to tests/electron/modules/compliments_spec.js diff --git a/tests/e2e/modules/helloworld_spec.js b/tests/electron/modules/helloworld_spec.js similarity index 100% rename from tests/e2e/modules/helloworld_spec.js rename to tests/electron/modules/helloworld_spec.js diff --git a/tests/e2e/modules/mocks/index.js b/tests/electron/modules/mocks/index.js similarity index 100% rename from tests/e2e/modules/mocks/index.js rename to tests/electron/modules/mocks/index.js diff --git a/tests/e2e/modules/mocks/weather_current.js b/tests/electron/modules/mocks/weather_current.js similarity index 100% rename from tests/e2e/modules/mocks/weather_current.js rename to tests/electron/modules/mocks/weather_current.js diff --git a/tests/e2e/modules/mocks/weather_forecast.js b/tests/electron/modules/mocks/weather_forecast.js similarity index 100% rename from tests/e2e/modules/mocks/weather_forecast.js rename to tests/electron/modules/mocks/weather_forecast.js diff --git a/tests/e2e/modules/newsfeed_spec.js b/tests/electron/modules/newsfeed_spec.js similarity index 100% rename from tests/e2e/modules/newsfeed_spec.js rename to tests/electron/modules/newsfeed_spec.js diff --git a/tests/e2e/modules/weather_spec.js b/tests/electron/modules/weather_spec.js similarity index 100% rename from tests/e2e/modules/weather_spec.js rename to tests/electron/modules/weather_spec.js diff --git a/tests/e2e/modules_display_spec.js b/tests/electron/modules_display_spec.js similarity index 100% rename from tests/e2e/modules_display_spec.js rename to tests/electron/modules_display_spec.js diff --git a/tests/e2e/modules_position_spec.js b/tests/electron/modules_position_spec.js similarity index 100% rename from tests/e2e/modules_position_spec.js rename to tests/electron/modules_position_spec.js diff --git a/tests/e2e/translations_spec.js b/tests/electron/translations_spec.js similarity index 100% rename from tests/e2e/translations_spec.js rename to tests/electron/translations_spec.js diff --git a/tests/e2e/without_modules.js b/tests/electron/without_modules.js similarity index 100% rename from tests/e2e/without_modules.js rename to tests/electron/without_modules.js From 236bf6e0fc543cb7ce0691d420e54a69f4dd12e5 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Mon, 13 Sep 2021 23:55:41 +0200 Subject: [PATCH 02/37] silence logger for tests, use modulePaths for e2e --- js/logger.js | 61 ++++++++++++++++++++++------------- package.json | 7 ++-- tests/e2e/env_spec.js | 2 +- tests/e2e/fonts.js | 2 +- tests/e2e/ipWhitelist_spec.js | 2 +- tests/e2e/port_config.js | 2 +- tests/e2e/vendor_spec.js | 2 +- 7 files changed, 47 insertions(+), 31 deletions(-) diff --git a/js/logger.js b/js/logger.js index 38185153..7ea12a79 100644 --- a/js/logger.js +++ b/js/logger.js @@ -9,12 +9,13 @@ */ (function (root, factory) { if (typeof exports === "object") { - // add timestamps in front of log messages - require("console-stamp")(console, { - pattern: "yyyy-mm-dd HH:MM:ss.l", - include: ["debug", "log", "info", "warn", "error"] - }); - + if (process.env.JEST_WORKER_ID === undefined) { + // add timestamps in front of log messages + 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); } else { @@ -22,7 +23,9 @@ root.Log = factory(root.config); } })(this, function (config) { - let logLevel = { + let logLevel; + if ((typeof exports === "object" && process.env.JEST_WORKER_ID === undefined) || typeof exports !== "object") { + logLevel = { debug: Function.prototype.bind.call(console.debug, console), log: Function.prototype.bind.call(console.log, console), info: Function.prototype.bind.call(console.info, console), @@ -32,22 +35,36 @@ groupCollapsed: Function.prototype.bind.call(console.groupCollapsed, console), groupEnd: Function.prototype.bind.call(console.groupEnd, console), time: Function.prototype.bind.call(console.time, console), - timeEnd: Function.prototype.bind.call(console.timeEnd, console) - }; - - if ((typeof exports === "object" && process.env.JEST_WORKER_ID === undefined) || typeof exports !== "object") { - logLevel.timeStamp = Function.prototype.bind.call(console.timeStamp, console); - } - - logLevel.setLogLevel = function (newLevel) { - if (newLevel) { - Object.keys(logLevel).forEach(function (key, index) { - if (!newLevel.includes(key.toLocaleUpperCase())) { - logLevel[key] = function () {}; - } - }); + timeEnd: Function.prototype.bind.call(console.timeEnd, console), + timeStamp: Function.prototype.bind.call(console.timeStamp, console) } - }; + + logLevel.setLogLevel = function (newLevel) { + if (newLevel) { + Object.keys(logLevel).forEach(function (key, index) { + if (!newLevel.includes(key.toLocaleUpperCase())) { + logLevel[key] = function () {}; + } + }); + } + }; + } else { + logLevel = { + debug: function () {}, + log: function () {}, + info: function () {}, + warn: function () {}, + error: function () {}, + group: function () {}, + groupCollapsed: function () {}, + groupEnd: function () {}, + time: function () {}, + timeEnd: function () {}, + timeStamp: function () {} + }; + + logLevel.setLogLevel = function () {}; + } return logLevel; }); diff --git a/package.json b/package.json index 8bda06d8..e48f96f0 100644 --- a/package.json +++ b/package.json @@ -123,10 +123,9 @@ "testMatch": [ "**/tests/e2e/**/*.[jt]s?(x)" ], - "moduleNameMapper": { - "logger": "/js/logger.js", - "node_helper": "/js/node_helper.js" - } + "modulePaths": [ + "/js/" + ] } ] } diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js index 28a0294b..91e6564a 100644 --- a/tests/e2e/env_spec.js +++ b/tests/e2e/env_spec.js @@ -1,5 +1,5 @@ const fetch = require("node-fetch"); -const app = require("../../js/app.js"); +const app = require("app.js"); describe("Electron app environment", function () { beforeAll(function () { diff --git a/tests/e2e/fonts.js b/tests/e2e/fonts.js index d8b8e0a7..81327a87 100644 --- a/tests/e2e/fonts.js +++ b/tests/e2e/fonts.js @@ -1,5 +1,5 @@ const fetch = require("node-fetch"); -const app = require("../../js/app.js"); +const app = require("app.js"); describe("All font files from roboto.css should be downloadable", function () { const fontFiles = []; diff --git a/tests/e2e/ipWhitelist_spec.js b/tests/e2e/ipWhitelist_spec.js index 99bad61a..5f90274c 100644 --- a/tests/e2e/ipWhitelist_spec.js +++ b/tests/e2e/ipWhitelist_spec.js @@ -1,5 +1,5 @@ const fetch = require("node-fetch"); -const app = require("../../js/app.js"); +const app = require("app.js"); describe("ipWhitelist directive configuration", function () { beforeAll(function () { diff --git a/tests/e2e/port_config.js b/tests/e2e/port_config.js index 7e960992..3e50d347 100644 --- a/tests/e2e/port_config.js +++ b/tests/e2e/port_config.js @@ -1,5 +1,5 @@ const fetch = require("node-fetch"); -const app = require("../../js/app.js"); +const app = require("app.js"); describe("port directive configuration", function () { beforeAll(function () { diff --git a/tests/e2e/vendor_spec.js b/tests/e2e/vendor_spec.js index 2b619dd0..1aef4de7 100644 --- a/tests/e2e/vendor_spec.js +++ b/tests/e2e/vendor_spec.js @@ -1,5 +1,5 @@ const fetch = require("node-fetch"); -const app = require("../../js/app.js"); +const app = require("app.js"); describe("Vendors", function () { beforeAll(function () { From a3a6c33b32f14dc1192caa6a27ca2d729068a692 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Mon, 13 Sep 2021 23:57:18 +0200 Subject: [PATCH 03/37] move translations_spec to e2e --- tests/{electron => e2e}/translations_spec.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{electron => e2e}/translations_spec.js (100%) diff --git a/tests/electron/translations_spec.js b/tests/e2e/translations_spec.js similarity index 100% rename from tests/electron/translations_spec.js rename to tests/e2e/translations_spec.js From c15b31b374d172d99f729b174a84e7ed6f30fecc Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Wed, 15 Sep 2021 21:09:31 +0200 Subject: [PATCH 04/37] close server --- js/app.js | 4 +++- js/server.js | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/js/app.js b/js/app.js index 6315370b..9ead45b2 100644 --- a/js/app.js +++ b/js/app.js @@ -48,6 +48,7 @@ process.on("uncaughtException", function (err) { */ function App() { let nodeHelpers = []; + let httpServer; /** * Loads the config file. Combines it with the defaults, and runs the @@ -222,7 +223,7 @@ function App() { } loadModules(modules, function () { - const server = new Server(config, function (app, io) { + httpServer = new Server(config, function (app, io) { Log.log("Server started ..."); for (let nodeHelper of nodeHelpers) { @@ -253,6 +254,7 @@ function App() { nodeHelper.stop(); } } + httpServer.close(); }; /** diff --git a/js/server.js b/js/server.js index 5ce9435d..8db8b48c 100644 --- a/js/server.js +++ b/js/server.js @@ -92,6 +92,11 @@ function Server(config, callback) { if (typeof callback === "function") { callback(app, io); } + + this.close = function () { + server.close(); + } + } module.exports = Server; From 9969fede353c2a95956c02aba9a97af42a9dbb52 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Thu, 16 Sep 2021 22:36:18 +0200 Subject: [PATCH 05/37] refactor e2e --- js/logger.js | 24 ++++++++++++------------ js/server.js | 3 +-- package.json | 3 +++ tests/e2e/env_spec.js | 10 ++++------ tests/e2e/fonts.js | 10 ++++------ tests/e2e/global-setup.js | 16 ++++++++++++++++ tests/e2e/ipWhitelist_spec.js | 23 ++++++++++------------- tests/e2e/port_config.js | 25 +++++++++++-------------- tests/e2e/vendor_spec.js | 10 ++++------ 9 files changed, 65 insertions(+), 59 deletions(-) create mode 100644 tests/e2e/global-setup.js diff --git a/js/logger.js b/js/logger.js index 7ea12a79..d469e702 100644 --- a/js/logger.js +++ b/js/logger.js @@ -26,18 +26,18 @@ let logLevel; if ((typeof exports === "object" && process.env.JEST_WORKER_ID === undefined) || typeof exports !== "object") { logLevel = { - debug: Function.prototype.bind.call(console.debug, 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), - groupCollapsed: Function.prototype.bind.call(console.groupCollapsed, console), - groupEnd: Function.prototype.bind.call(console.groupEnd, console), - time: Function.prototype.bind.call(console.time, console), - timeEnd: Function.prototype.bind.call(console.timeEnd, console), - timeStamp: Function.prototype.bind.call(console.timeStamp, console) - } + debug: Function.prototype.bind.call(console.debug, 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), + groupCollapsed: Function.prototype.bind.call(console.groupCollapsed, console), + groupEnd: Function.prototype.bind.call(console.groupEnd, console), + time: Function.prototype.bind.call(console.time, console), + timeEnd: Function.prototype.bind.call(console.timeEnd, console), + timeStamp: Function.prototype.bind.call(console.timeStamp, console) + }; logLevel.setLogLevel = function (newLevel) { if (newLevel) { diff --git a/js/server.js b/js/server.js index 8db8b48c..35071091 100644 --- a/js/server.js +++ b/js/server.js @@ -95,8 +95,7 @@ function Server(config, callback) { this.close = function () { server.close(); - } - + }; } module.exports = Server; diff --git a/package.json b/package.json index e48f96f0..833010d1 100644 --- a/package.json +++ b/package.json @@ -125,6 +125,9 @@ ], "modulePaths": [ "/js/" + ], + "testPathIgnorePatterns": [ + "/tests/e2e/global-setup.js" ] } ] diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js index 91e6564a..825da0e6 100644 --- a/tests/e2e/env_spec.js +++ b/tests/e2e/env_spec.js @@ -1,15 +1,13 @@ const fetch = require("node-fetch"); -const app = require("app.js"); +const helpers = require("./global-setup"); +let app = null; describe("Electron app environment", function () { beforeAll(function () { - process.env.MM_CONFIG_FILE = "tests/configs/env.js"; - - app.start(); + app = helpers.startApplication("tests/configs/env.js"); }); - afterAll(function () { - app.stop(); + helpers.stopApplication(app); }); it("get request from http://localhost:8080 should return 200", function (done) { diff --git a/tests/e2e/fonts.js b/tests/e2e/fonts.js index 81327a87..105b9977 100644 --- a/tests/e2e/fonts.js +++ b/tests/e2e/fonts.js @@ -1,5 +1,6 @@ const fetch = require("node-fetch"); -const app = require("app.js"); +const helpers = require("./global-setup"); +let app = null; describe("All font files from roboto.css should be downloadable", function () { const fontFiles = []; @@ -15,13 +16,10 @@ describe("All font files from roboto.css should be downloadable", function () { } beforeAll(function () { - process.env.MM_CONFIG_FILE = "tests/configs/without_modules.js"; - - app.start(); + app = helpers.startApplication("tests/configs/without_modules.js"); }); - afterAll(function () { - app.stop(); + helpers.stopApplication(app); }); test.each(fontFiles)("should return 200 HTTP code for file '%s'", (fontFile, done) => { diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js new file mode 100644 index 00000000..1f9bce3b --- /dev/null +++ b/tests/e2e/global-setup.js @@ -0,0 +1,16 @@ +exports.startApplication = function (configFilename, exec) { + jest.resetModules(); + // Set config sample for use in test + process.env.MM_CONFIG_FILE = configFilename; + if (exec) exec; + const app = require("app.js"); + app.start(); + + return app; +}; + +exports.stopApplication = function (app) { + if (app) { + app.stop(); + } +}; diff --git a/tests/e2e/ipWhitelist_spec.js b/tests/e2e/ipWhitelist_spec.js index 5f90274c..eba92a3e 100644 --- a/tests/e2e/ipWhitelist_spec.js +++ b/tests/e2e/ipWhitelist_spec.js @@ -1,19 +1,14 @@ const fetch = require("node-fetch"); -const app = require("app.js"); +const helpers = require("./global-setup"); +let app = null; describe("ipWhitelist directive configuration", function () { - beforeAll(function () { - app.start(); - }); - - afterAll(function () { - app.stop(); - }); - describe("Set ipWhitelist without access", function () { beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/noIpWhiteList.js"; + app = helpers.startApplication("tests/configs/noIpWhiteList.js"); + }); + afterAll(function () { + helpers.stopApplication(app); }); it("should return 403", function (done) { @@ -26,8 +21,10 @@ describe("ipWhitelist directive configuration", function () { describe("Set ipWhitelist []", function () { beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/empty_ipWhiteList.js"; + app = helpers.startApplication("tests/configs/empty_ipWhiteList.js"); + }); + afterAll(function () { + helpers.stopApplication(app); }); it("should return 200", function (done) { diff --git a/tests/e2e/port_config.js b/tests/e2e/port_config.js index 3e50d347..6f6756a4 100644 --- a/tests/e2e/port_config.js +++ b/tests/e2e/port_config.js @@ -1,18 +1,16 @@ const fetch = require("node-fetch"); -const app = require("app.js"); +const helpers = require("./global-setup"); +let app = null; describe("port directive configuration", function () { - beforeAll(function () { - process.env.MM_CONFIG_FILE = "tests/configs/port_8090.js"; - - app.start(); - }); - - afterAll(function () { - app.stop(); - }); - describe("Set port 8090", function () { + beforeAll(function () { + app = helpers.startApplication("tests/configs/port_8090.js"); + }); + afterAll(function () { + helpers.stopApplication(app); + }); + it("should return 200", function (done) { fetch("http://localhost:8090").then((res) => { expect(res.status).toBe(200); @@ -23,11 +21,10 @@ describe("port directive configuration", function () { describe("Set port 8100 on environment variable MM_PORT", function () { beforeAll(function () { - process.env.MM_PORT = 8100; + app = helpers.startApplication("tests/configs/port_8090.js", (process.env.MM_PORT = 8100)); }); - afterAll(function () { - delete process.env.MM_PORT; + helpers.stopApplication(app); }); it("should return 200", function (done) { diff --git a/tests/e2e/vendor_spec.js b/tests/e2e/vendor_spec.js index 1aef4de7..e8dcde11 100644 --- a/tests/e2e/vendor_spec.js +++ b/tests/e2e/vendor_spec.js @@ -1,15 +1,13 @@ const fetch = require("node-fetch"); -const app = require("app.js"); +const helpers = require("./global-setup"); +let app = null; describe("Vendors", function () { beforeAll(function () { - process.env.MM_CONFIG_FILE = "tests/configs/env.js"; - - app.start(); + app = helpers.startApplication("tests/configs/env.js"); }); - afterAll(function () { - app.stop(); + helpers.stopApplication(app); }); describe("Get list vendors", function () { From 879d585f2e00a9e64b307d8f793268eff6b678c0 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Thu, 16 Sep 2021 23:16:38 +0200 Subject: [PATCH 06/37] update dependencies, add CHANGELOG --- CHANGELOG.md | 1 + package-lock.json | 1016 +++++++++++++++++++++++---------------------- package.json | 6 +- 3 files changed, 513 insertions(+), 510 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea963274..f8961cfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ _This release is scheduled to be released on 2021-10-01._ - Refactored methods from weatherproviders into weatherobject (isDaytime, updateSunTime). - Use of `logger.js` in jest tests. - Run prettier over all relevant files. +- Move test needing electron in new category `electron`, use `server only` mode in `e2e` tests. ### Fixed diff --git a/package-lock.json b/package-lock.json index 5a1c3fb9..a46bed61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,11 +32,11 @@ "eslint-plugin-prettier": "^4.0.0", "express-basic-auth": "^1.2.0", "husky": "^7.0.2", - "jest": "^27.1.1", + "jest": "^27.2.0", "jsdom": "^17.0.0", "lodash": "^4.17.21", "nyc": "^15.1.0", - "prettier": "^2.4.0", + "prettier": "^2.4.1", "pretty-quick": "^3.1.1", "sinon": "^11.1.2", "spectron": "^15.0.0", @@ -50,7 +50,7 @@ "node": ">=12" }, "optionalDependencies": { - "electron": "^13.3.0" + "electron": "^13.4.0" } }, "node_modules/@babel/code-frame": { @@ -788,16 +788,16 @@ } }, "node_modules/@jest/console": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.1.1.tgz", - "integrity": "sha512-VpQJRsWSeAem0zpBjeRtDbcD6DlbNoK11dNYt+PSQ+DDORh9q2/xyEpErfwgnLjWX0EKkSZmTGx/iH9Inzs6vQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.2.0.tgz", + "integrity": "sha512-35z+RqsK2CCgNxn+lWyK8X4KkaDtfL4BggT7oeZ0JffIiAiEYFYPo5B67V50ZubqDS1ehBrdCR2jduFnIrZOYw==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.1.1", - "jest-util": "^27.1.1", + "jest-message-util": "^27.2.0", + "jest-util": "^27.2.0", "slash": "^3.0.0" }, "engines": { @@ -805,15 +805,15 @@ } }, "node_modules/@jest/core": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.1.1.tgz", - "integrity": "sha512-oCkKeTgI0emznKcLoq5OCD0PhxCijA4l7ejDnWW3d5bgSi+zfVaLybVqa+EQOxpNejQWtTna7tmsAXjMN9N43Q==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.2.0.tgz", + "integrity": "sha512-E/2NHhq+VMo18DpKkoty8Sjey8Kps5Cqa88A8NP757s6JjYqPdioMuyUBhDiIOGCdQByEp0ou3jskkTszMS0nw==", "dev": true, "dependencies": { - "@jest/console": "^27.1.1", - "@jest/reporters": "^27.1.1", - "@jest/test-result": "^27.1.1", - "@jest/transform": "^27.1.1", + "@jest/console": "^27.2.0", + "@jest/reporters": "^27.2.0", + "@jest/test-result": "^27.2.0", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -822,18 +822,18 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.1.1", - "jest-config": "^27.1.1", - "jest-haste-map": "^27.1.1", - "jest-message-util": "^27.1.1", + "jest-config": "^27.2.0", + "jest-haste-map": "^27.2.0", + "jest-message-util": "^27.2.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.1.1", - "jest-resolve-dependencies": "^27.1.1", - "jest-runner": "^27.1.1", - "jest-runtime": "^27.1.1", - "jest-snapshot": "^27.1.1", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", - "jest-watcher": "^27.1.1", + "jest-resolve": "^27.2.0", + "jest-resolve-dependencies": "^27.2.0", + "jest-runner": "^27.2.0", + "jest-runtime": "^27.2.0", + "jest-snapshot": "^27.2.0", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", + "jest-watcher": "^27.2.0", "micromatch": "^4.0.4", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -853,12 +853,12 @@ } }, "node_modules/@jest/environment": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.1.1.tgz", - "integrity": "sha512-+y882/ZdxhyqF5RzxIrNIANjHj991WH7jifdcplzMDosDUOyCACFYUyVTBGbSTocbU+s1cesroRzkwi8hZ9SHg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.2.0.tgz", + "integrity": "sha512-iPWmQI0wRIYSZX3wKu4FXHK4eIqkfq6n1DCDJS+v3uby7SOXrHvX4eiTBuEdSvtDRMTIH2kjrSkjHf/F9JIYyQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^27.1.1", + "@jest/fake-timers": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1" @@ -868,46 +868,46 @@ } }, "node_modules/@jest/fake-timers": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.1.1.tgz", - "integrity": "sha512-u8TJ5VlsVYTsGFatoyIae2l25pku4Bu15QCPTx2Gs5z+R//Ee3tHN85462Vc9yGVcdDvgADbqNkhOLxbEwPjMQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.0.tgz", + "integrity": "sha512-gSu3YHvQOoVaTWYGgHFB7IYFtcF2HBzX4l7s47VcjvkUgL4/FBnE20x7TNLa3W6ABERtGd5gStSwsA8bcn+c4w==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "@sinonjs/fake-timers": "^7.0.2", "@types/node": "*", - "jest-message-util": "^27.1.1", + "jest-message-util": "^27.2.0", "jest-mock": "^27.1.1", - "jest-util": "^27.1.1" + "jest-util": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/globals": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.1.1.tgz", - "integrity": "sha512-Q3JcTPmY+DAEHnr4MpnBV3mwy50EGrTC6oSDTNnW7FNGGacTJAfpWNk02D7xv422T1OzK2A2BKx+26xJOvHkyw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.2.0.tgz", + "integrity": "sha512-raqk9Gf9WC3hlBa57rmRmJfRl9hom2b+qEE/ifheMtwn5USH5VZxzrHHOZg0Zsd/qC2WJ8UtyTwHKQAnNlDMdg==", "dev": true, "dependencies": { - "@jest/environment": "^27.1.1", + "@jest/environment": "^27.2.0", "@jest/types": "^27.1.1", - "expect": "^27.1.1" + "expect": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/reporters": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.1.1.tgz", - "integrity": "sha512-cEERs62n1P4Pqox9HWyNOEkP57G95aK2mBjB6D8Ruz1Yc98fKH53b58rlVEnsY5nLmkLNZk65fxNi9C0Yds/8w==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.0.tgz", + "integrity": "sha512-7wfkE3iRTLaT0F51h1mnxH3nQVwDCdbfgXiLuCcNkF1FnxXLH9utHqkSLIiwOTV1AtmiE0YagHbOvx4rnMP/GA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.1.1", - "@jest/test-result": "^27.1.1", - "@jest/transform": "^27.1.1", + "@jest/console": "^27.2.0", + "@jest/test-result": "^27.2.0", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -919,10 +919,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.1.1", - "jest-resolve": "^27.1.1", - "jest-util": "^27.1.1", - "jest-worker": "^27.1.1", + "jest-haste-map": "^27.2.0", + "jest-resolve": "^27.2.0", + "jest-util": "^27.2.0", + "jest-worker": "^27.2.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -956,12 +956,12 @@ } }, "node_modules/@jest/test-result": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.1.1.tgz", - "integrity": "sha512-8vy75A0Jtfz9DqXFUkjC5Co/wRla+D7qRFdShUY8SbPqBS3GBx3tpba7sGKFos8mQrdbe39n+c1zgVKtarfy6A==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.0.tgz", + "integrity": "sha512-JPPqn8h0RGr4HyeY1Km+FivDIjTFzDROU46iAvzVjD42ooGwYoqYO/MQTilhfajdz6jpVnnphFrKZI5OYrBONA==", "dev": true, "dependencies": { - "@jest/console": "^27.1.1", + "@jest/console": "^27.2.0", "@jest/types": "^27.1.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -971,24 +971,24 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.1.1.tgz", - "integrity": "sha512-l8zD3EdeixvwmLNlJoMX3hhj8iIze95okj4sqmBzOq/zW8gZLElUveH4bpKEMuR+Nweazjlwc7L6g4C26M/y6Q==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.0.tgz", + "integrity": "sha512-PrqarcpzOU1KSAK7aPwfL8nnpaqTMwPe7JBPnaOYRDSe/C6AoJiL5Kbnonqf1+DregxZIRAoDg69R9/DXMGqXA==", "dev": true, "dependencies": { - "@jest/test-result": "^27.1.1", + "@jest/test-result": "^27.2.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.1.1", - "jest-runtime": "^27.1.1" + "jest-haste-map": "^27.2.0", + "jest-runtime": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.1.1.tgz", - "integrity": "sha512-qM19Eu75U6Jc5zosXXVnq900Nl9JDpoGaZ4Mg6wZs7oqbu3heYSMOZS19DlwjlhWdfNRjF4UeAgkrCJCK3fEXg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.2.0.tgz", + "integrity": "sha512-Q8Q/8xXIZYllk1AF7Ou5sV3egOZsdY/Wlv09CSbcexBRcC1Qt6lVZ7jRFAZtbHsEEzvOCyFEC4PcrwKwyjXtCg==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", @@ -998,9 +998,9 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.1.1", + "jest-haste-map": "^27.2.0", "jest-regex-util": "^27.0.6", - "jest-util": "^27.1.1", + "jest-util": "^27.2.0", "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -1924,16 +1924,16 @@ } }, "node_modules/babel-jest": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.1.1.tgz", - "integrity": "sha512-JA+dzJl4n2RBvWQEnph6HJaTHrsIPiXGQYatt/D8nR4UpX9UG4GaDzykVVPQBbrdTebZREkRb6SOxyIXJRab6Q==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.0.tgz", + "integrity": "sha512-bS2p+KGGVVmWXBa8+i6SO/xzpiz2Q/2LnqLbQknPKefWXVZ67YIjA4iXup/jMOEZplga9PpWn+wrdb3UdDwRaA==", "dev": true, "dependencies": { - "@jest/transform": "^27.1.1", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.0.6", + "babel-preset-jest": "^27.2.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" @@ -1962,9 +1962,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", - "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz", + "integrity": "sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -2000,12 +2000,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", - "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz", + "integrity": "sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^27.0.6", + "babel-plugin-jest-hoist": "^27.2.0", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -3230,9 +3230,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.3.0.tgz", - "integrity": "sha512-d/BvOLDjI4i7yf9tqCuLL2fFGA2TrM/D9PyRpua+rJolG0qrwp/FohP02L0m+44kmPpofIo4l3NPwLmzyKKimA==", + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.4.0.tgz", + "integrity": "sha512-KJGWS2qa0xZXIMPMDUNkRVO8/JxRd4+M0ejYYOzu2LIQ5ijecPzNuNR9nvDkml9XyyRBzu975FkhJcwD17ietQ==", "devOptional": true, "hasInstallScript": true, "dependencies": { @@ -3908,16 +3908,16 @@ } }, "node_modules/expect": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.1.1.tgz", - "integrity": "sha512-JQAzp0CJoFFHF1RnOtrMUNMdsfx/Tl0+FhRzVl8q0fa23N+JyWdPXwb3T5rkHCvyo9uttnK7lVdKCBl1b/9EDw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.0.tgz", + "integrity": "sha512-oOTbawMQv7AK1FZURbPTgGSzmhxkjFzoARSvDjOMnOpeWuYQx1tP6rXu9MIX5mrACmyCAM7fSNP8IJO2f1p0CQ==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "ansi-styles": "^5.0.0", "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.1.1", - "jest-message-util": "^27.1.1", + "jest-matcher-utils": "^27.2.0", + "jest-message-util": "^27.2.0", "jest-regex-util": "^27.0.6" }, "engines": { @@ -5328,14 +5328,14 @@ } }, "node_modules/jest": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.1.1.tgz", - "integrity": "sha512-LFTEZOhoZNR/2DQM3OCaK5xC6c55c1OWhYh0njRsoHX0qd6x4nkcgenkSH0JKjsAGMTmmJAoL7/oqYHMfwhruA==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.0.tgz", + "integrity": "sha512-oUqVXyvh5YwEWl263KWdPUAqEzBFzGHdFLQ05hUnITr1tH+9SscEI9A/GH9eBClA+Nw1ct+KNuuOV6wlnmBPcg==", "dev": true, "dependencies": { - "@jest/core": "^27.1.1", + "@jest/core": "^27.2.0", "import-local": "^3.0.2", - "jest-cli": "^27.1.1" + "jest-cli": "^27.2.0" }, "bin": { "jest": "bin/jest.js" @@ -5367,27 +5367,27 @@ } }, "node_modules/jest-circus": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.1.1.tgz", - "integrity": "sha512-Xed1ApiMFu/yzqGMBToHr8sp2gkX/ARZf4nXoGrHJrXrTUdVIWiVYheayfcOaPdQvQEE/uyBLgW7I7YBLIrAXQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.0.tgz", + "integrity": "sha512-WwENhaZwOARB1nmcboYPSv/PwHBUGRpA4MEgszjr9DLCl97MYw0qZprBwLb7rNzvMwfIvNGG7pefQ5rxyBlzIA==", "dev": true, "dependencies": { - "@jest/environment": "^27.1.1", - "@jest/test-result": "^27.1.1", + "@jest/environment": "^27.2.0", + "@jest/test-result": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.1.1", + "expect": "^27.2.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.1.1", - "jest-matcher-utils": "^27.1.1", - "jest-message-util": "^27.1.1", - "jest-runtime": "^27.1.1", - "jest-snapshot": "^27.1.1", - "jest-util": "^27.1.1", - "pretty-format": "^27.1.1", + "jest-each": "^27.2.0", + "jest-matcher-utils": "^27.2.0", + "jest-message-util": "^27.2.0", + "jest-runtime": "^27.2.0", + "jest-snapshot": "^27.2.0", + "jest-util": "^27.2.0", + "pretty-format": "^27.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" @@ -5397,21 +5397,21 @@ } }, "node_modules/jest-cli": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.1.1.tgz", - "integrity": "sha512-LCjfEYp9D3bcOeVUUpEol9Y1ijZYMWVqflSmtw/wX+6Fb7zP4IlO14/6s9v1pxsoM4Pn46+M2zABgKuQjyDpTw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.0.tgz", + "integrity": "sha512-bq1X/B/b1kT9y1zIFMEW3GFRX1HEhFybiqKdbxM+j11XMMYSbU9WezfyWIhrSOmPT+iODLATVjfsCnbQs7cfIA==", "dev": true, "dependencies": { - "@jest/core": "^27.1.1", - "@jest/test-result": "^27.1.1", + "@jest/core": "^27.2.0", + "@jest/test-result": "^27.2.0", "@jest/types": "^27.1.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.1.1", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", + "jest-config": "^27.2.0", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", "prompts": "^2.0.1", "yargs": "^16.0.3" }, @@ -5431,32 +5431,32 @@ } }, "node_modules/jest-config": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.1.1.tgz", - "integrity": "sha512-2iSd5zoJV4MsWPcLCGwUVUY/j6pZXm4Qd3rnbCtrd9EHNTg458iHw8PZztPQXfxKBKJxLfBk7tbZqYF8MGtxJA==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.0.tgz", + "integrity": "sha512-Z1romHpxeNwLxQtouQ4xt07bY6HSFGKTo0xJcvOK3u6uJHveA4LB2P+ty9ArBLpTh3AqqPxsyw9l9GMnWBYS9A==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.1.1", + "@jest/test-sequencer": "^27.2.0", "@jest/types": "^27.1.1", - "babel-jest": "^27.1.1", + "babel-jest": "^27.2.0", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", "is-ci": "^3.0.0", - "jest-circus": "^27.1.1", - "jest-environment-jsdom": "^27.1.1", - "jest-environment-node": "^27.1.1", + "jest-circus": "^27.2.0", + "jest-environment-jsdom": "^27.2.0", + "jest-environment-node": "^27.2.0", "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.1.1", + "jest-jasmine2": "^27.2.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.1.1", - "jest-runner": "^27.1.1", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", + "jest-resolve": "^27.2.0", + "jest-runner": "^27.2.0", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", "micromatch": "^4.0.4", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -5471,15 +5471,15 @@ } }, "node_modules/jest-diff": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.1.1.tgz", - "integrity": "sha512-m/6n5158rqEriTazqHtBpOa2B/gGgXJijX6nsEgZfbJ/3pxQcdpVXBe+FP39b1dxWHyLVVmuVXddmAwtqFO4Lg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.0.tgz", + "integrity": "sha512-QSO9WC6btFYWtRJ3Hac0sRrkspf7B01mGrrQEiCW6TobtViJ9RWL0EmOs/WnBsZDsI/Y2IoSHZA2x6offu0sYw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", "jest-get-type": "^27.0.6", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -5498,33 +5498,33 @@ } }, "node_modules/jest-each": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.1.1.tgz", - "integrity": "sha512-r6hOsTLavUBb1xN0uDa89jdDeBmJ+K49fWpbyxeGRA2pLY46PlC4z551/cWNQzrj+IUa5/gSRsCIV/01HdNPug==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.2.0.tgz", + "integrity": "sha512-biDmmUQjg+HZOB7MfY2RHSFL3j418nMoC3TK3pGAj880fQQSxvQe1y2Wy23JJJNUlk6YXiGU0yWy86Le1HBPmA==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", - "jest-util": "^27.1.1", - "pretty-format": "^27.1.1" + "jest-util": "^27.2.0", + "pretty-format": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-environment-jsdom": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.1.1.tgz", - "integrity": "sha512-6vOnoZ6IaExuw7FvnuJhA1qFYv1DDSnN0sQowzolNwxQp7bG1YhLxj2YU1sVXAYA3IR3MbH2mbnJUsLUWfyfzw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.0.tgz", + "integrity": "sha512-wNQJi6Rd/AkUWqTc4gWhuTIFPo7tlMK0RPZXeM6AqRHZA3D3vwvTa9ktAktyVyWYmUoXdYstOfyYMG3w4jt7eA==", "dev": true, "dependencies": { - "@jest/environment": "^27.1.1", - "@jest/fake-timers": "^27.1.1", + "@jest/environment": "^27.2.0", + "@jest/fake-timers": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1", - "jest-util": "^27.1.1", + "jest-util": "^27.2.0", "jsdom": "^16.6.0" }, "engines": { @@ -5638,17 +5638,17 @@ } }, "node_modules/jest-environment-node": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.1.1.tgz", - "integrity": "sha512-OEGeZh0PwzngNIYWYgWrvTcLygopV8OJbC9HNb0j70VBKgEIsdZkYhwcFnaURX83OHACMqf1pa9Tv5Pw5jemrg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.0.tgz", + "integrity": "sha512-WbW+vdM4u88iy6Q3ftUEQOSgMPtSgjm3qixYYK2AKEuqmFO2zmACTw1vFUB0qI/QN88X6hA6ZkVKIdIWWzz+yg==", "dev": true, "dependencies": { - "@jest/environment": "^27.1.1", - "@jest/fake-timers": "^27.1.1", + "@jest/environment": "^27.2.0", + "@jest/fake-timers": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1", - "jest-util": "^27.1.1" + "jest-util": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -5664,9 +5664,9 @@ } }, "node_modules/jest-haste-map": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.1.1.tgz", - "integrity": "sha512-NGLYVAdh5C8Ezg5QBFzrNeYsfxptDBPlhvZNaicLiZX77F/rS27a9M6u9ripWAaaD54xnWdZNZpEkdjD5Eo5aQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.0.tgz", + "integrity": "sha512-laFet7QkNlWjwZtMGHCucLvF8o9PAh2cgePRck1+uadSM4E4XH9J4gnx4do+a6do8ZV5XHNEAXEkIoNg5XUH2Q==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", @@ -5677,8 +5677,8 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^27.0.6", "jest-serializer": "^27.0.6", - "jest-util": "^27.1.1", - "jest-worker": "^27.1.1", + "jest-util": "^27.2.0", + "jest-worker": "^27.2.0", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -5690,28 +5690,28 @@ } }, "node_modules/jest-jasmine2": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.1.1.tgz", - "integrity": "sha512-0LAzUmcmvQwjIdJt0cXUVX4G5qjVXE8ELt6nbMNDzv2yAs2hYCCUtQq+Eje70GwAysWCGcS64QeYj5VPHYVxPg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.0.tgz", + "integrity": "sha512-NcPzZBk6IkDW3Z2V8orGueheGJJYfT5P0zI/vTO/Jp+R9KluUdgFrgwfvZ0A34Kw6HKgiWFILZmh3oQ/eS+UxA==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.1.1", + "@jest/environment": "^27.2.0", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.1.1", + "@jest/test-result": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.1.1", + "expect": "^27.2.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.1.1", - "jest-matcher-utils": "^27.1.1", - "jest-message-util": "^27.1.1", - "jest-runtime": "^27.1.1", - "jest-snapshot": "^27.1.1", - "jest-util": "^27.1.1", - "pretty-format": "^27.1.1", + "jest-each": "^27.2.0", + "jest-matcher-utils": "^27.2.0", + "jest-message-util": "^27.2.0", + "jest-runtime": "^27.2.0", + "jest-snapshot": "^27.2.0", + "jest-util": "^27.2.0", + "pretty-format": "^27.2.0", "throat": "^6.0.1" }, "engines": { @@ -5719,37 +5719,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.1.1.tgz", - "integrity": "sha512-gwSgzmqShoeEsEVpgObymQPrM9P6557jt1EsFW5aCeJ46Cme0EdjYU7xr6llQZ5GpWDl56eOstUaPXiZOfiTKw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.0.tgz", + "integrity": "sha512-e91BIEmbZw5+MHkB4Hnrq7S86coTxUMCkz4n7DLmQYvl9pEKmRx9H/JFH87bBqbIU5B2Ju1soKxRWX6/eGFGpA==", "dev": true, "dependencies": { "jest-get-type": "^27.0.6", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.1.1.tgz", - "integrity": "sha512-Q1a10w9Y4sh0wegkdP6reQOa/Dtz7nAvDqBgrat1ItZAUvk4jzXAqyhXPu/ZuEtDaXaNKpdRPRQA8bvkOh2Eaw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.0.tgz", + "integrity": "sha512-F+LG3iTwJ0gPjxBX6HCyrARFXq6jjiqhwBQeskkJQgSLeF1j6ui1RTV08SR7O51XTUhtc8zqpDj8iCG4RGmdKw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^27.1.1", + "jest-diff": "^27.2.0", "jest-get-type": "^27.0.6", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-message-util": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.1.1.tgz", - "integrity": "sha512-b697BOJV93+AVGvzLRtVZ0cTVRbd59OaWnbB2D75GRaIMc4I+Z9W0wHxbfjW01JWO+TqqW4yevT0aN7Fd0XWng==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.0.tgz", + "integrity": "sha512-y+sfT/94CiP8rKXgwCOzO1mUazIEdEhrLjuiu+RKmCP+8O/TJTSne9dqQRbFIHBtlR2+q7cddJlWGir8UATu5w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -5758,7 +5758,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.1.1", + "pretty-format": "^27.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -5818,19 +5818,19 @@ } }, "node_modules/jest-resolve": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.1.1.tgz", - "integrity": "sha512-M41YFmWhvDVstwe7XuV21zynOiBLJB5Sk0GrIsYYgTkjfEWNLVXDjAyq1W7PHseaYNOxIc0nOGq/r5iwcZNC1A==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.0.tgz", + "integrity": "sha512-v09p9Ib/VtpHM6Cz+i9lEAv1Z/M5NVxsyghRHRMEUOqwPQs3zwTdwp1xS3O/k5LocjKiGS0OTaJoBSpjbM2Jlw==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "chalk": "^4.0.0", "escalade": "^3.1.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.1.1", + "jest-haste-map": "^27.2.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", "resolve": "^1.20.0", "slash": "^3.0.0" }, @@ -5839,29 +5839,29 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.1.1.tgz", - "integrity": "sha512-sYZR+uBjFDCo4VhYeazZf/T+ryYItvdLKu9vHatqkUqHGjDMrdEPOykiqC2iEpaCFTS+3iL/21CYiJuKdRbniw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.0.tgz", + "integrity": "sha512-EY5jc/Y0oxn+oVEEldTidmmdVoZaknKPyDORA012JUdqPyqPL+lNdRyI3pGti0RCydds6coaw6xt4JQY54dKsg==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-snapshot": "^27.1.1" + "jest-snapshot": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runner": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.1.1.tgz", - "integrity": "sha512-lP3MBNQhg75/sQtVkC8dsAQZumvy3lHK/YIwYPfEyqGIX1qEcnYIRxP89q0ZgC5ngvi1vN2P5UFHszQxguWdng==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.0.tgz", + "integrity": "sha512-Cl+BHpduIc0cIVTjwoyx0pQk4Br8gn+wkr35PmKCmzEdOUnQ2wN7QVXA8vXnMQXSlFkN/+KWnk20TAVBmhgrww==", "dev": true, "dependencies": { - "@jest/console": "^27.1.1", - "@jest/environment": "^27.1.1", - "@jest/test-result": "^27.1.1", - "@jest/transform": "^27.1.1", + "@jest/console": "^27.2.0", + "@jest/environment": "^27.2.0", + "@jest/test-result": "^27.2.0", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", @@ -5869,15 +5869,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.0.6", - "jest-environment-jsdom": "^27.1.1", - "jest-environment-node": "^27.1.1", - "jest-haste-map": "^27.1.1", - "jest-leak-detector": "^27.1.1", - "jest-message-util": "^27.1.1", - "jest-resolve": "^27.1.1", - "jest-runtime": "^27.1.1", - "jest-util": "^27.1.1", - "jest-worker": "^27.1.1", + "jest-environment-jsdom": "^27.2.0", + "jest-environment-node": "^27.2.0", + "jest-haste-map": "^27.2.0", + "jest-leak-detector": "^27.2.0", + "jest-message-util": "^27.2.0", + "jest-resolve": "^27.2.0", + "jest-runtime": "^27.2.0", + "jest-util": "^27.2.0", + "jest-worker": "^27.2.0", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -5886,18 +5886,18 @@ } }, "node_modules/jest-runtime": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.1.1.tgz", - "integrity": "sha512-FEwy+tSzmsvuKaQpyYsUyk31KG5vMmA2r2BSTHgv0yNfcooQdm2Ke91LM9Ud8D3xz8CLDHJWAI24haMFTwrsPg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.0.tgz", + "integrity": "sha512-6gRE9AVVX49hgBbWQ9PcNDeM4upMUXzTpBs0kmbrjyotyUyIJixLPsYjpeTFwAA07PVLDei1iAm2chmWycdGdQ==", "dev": true, "dependencies": { - "@jest/console": "^27.1.1", - "@jest/environment": "^27.1.1", - "@jest/fake-timers": "^27.1.1", - "@jest/globals": "^27.1.1", + "@jest/console": "^27.2.0", + "@jest/environment": "^27.2.0", + "@jest/fake-timers": "^27.2.0", + "@jest/globals": "^27.2.0", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.1.1", - "@jest/transform": "^27.1.1", + "@jest/test-result": "^27.2.0", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -5907,14 +5907,14 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.1.1", - "jest-message-util": "^27.1.1", + "jest-haste-map": "^27.2.0", + "jest-message-util": "^27.2.0", "jest-mock": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.1.1", - "jest-snapshot": "^27.1.1", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", + "jest-resolve": "^27.2.0", + "jest-snapshot": "^27.2.0", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^16.0.3" @@ -5937,9 +5937,9 @@ } }, "node_modules/jest-snapshot": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.1.1.tgz", - "integrity": "sha512-Wi3QGiuRFo3lU+EbQmZnBOks0CJyAMPHvYoG7iJk00Do10jeOyuOEO0Jfoaoun8+8TDv+Nzl7Aswir/IK9+1jg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.0.tgz", + "integrity": "sha512-MukJvy3KEqemCT2FoT3Gum37CQqso/62PKTfIzWmZVTsLsuyxQmJd2PI5KPcBYFqLlA8LgZLHM8ZlazkVt8LsQ==", "dev": true, "dependencies": { "@babel/core": "^7.7.2", @@ -5948,23 +5948,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.1.1", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.1.1", + "expect": "^27.2.0", "graceful-fs": "^4.2.4", - "jest-diff": "^27.1.1", + "jest-diff": "^27.2.0", "jest-get-type": "^27.0.6", - "jest-haste-map": "^27.1.1", - "jest-matcher-utils": "^27.1.1", - "jest-message-util": "^27.1.1", - "jest-resolve": "^27.1.1", - "jest-util": "^27.1.1", + "jest-haste-map": "^27.2.0", + "jest-matcher-utils": "^27.2.0", + "jest-message-util": "^27.2.0", + "jest-resolve": "^27.2.0", + "jest-util": "^27.2.0", "natural-compare": "^1.4.0", - "pretty-format": "^27.1.1", + "pretty-format": "^27.2.0", "semver": "^7.3.2" }, "engines": { @@ -5987,9 +5987,9 @@ } }, "node_modules/jest-util": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.1.1.tgz", - "integrity": "sha512-zf9nEbrASWn2mC/L91nNb0K+GkhFvi4MP6XJG2HqnHzHvLYcs7ou/In68xYU1i1dSkJlrWcYfWXQE8nVR+nbOA==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.2.0.tgz", + "integrity": "sha512-T5ZJCNeFpqcLBpx+Hl9r9KoxBCUqeWlJ1Htli+vryigZVJ1vuLB9j35grEBASp4R13KFkV7jM52bBGnArpJN6A==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", @@ -6004,9 +6004,9 @@ } }, "node_modules/jest-validate": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.1.1.tgz", - "integrity": "sha512-N5Er5FKav/8m2dJwn7BGnZwnoD1BSc8jx5T+diG2OvyeugvZDhPeAt5DrNaGkkaKCrSUvuE7A5E4uHyT7Vj0Mw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.0.tgz", + "integrity": "sha512-uIEZGkFKk3+4liA81Xu0maG5aGDyPLdp+4ed244c+Ql0k3aLWQYcMbaMLXOIFcb83LPHzYzqQ8hwNnIxTqfAGQ==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", @@ -6014,7 +6014,7 @@ "chalk": "^4.0.0", "jest-get-type": "^27.0.6", "leven": "^3.1.0", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -6033,17 +6033,17 @@ } }, "node_modules/jest-watcher": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.1.1.tgz", - "integrity": "sha512-XQzyHbxziDe+lZM6Dzs40fEt4q9akOGwitJnxQasJ9WG0bv3JGiRlsBgjw13znGapeMtFaEsyhL0Cl04IbaoWQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.0.tgz", + "integrity": "sha512-SjRWhnr+qO8aBsrcnYIyF+qRxNZk6MZH8TIDgvi+VlsyrvOyqg0d+Rm/v9KHiTtC9mGGeFi9BFqgavyWib6xLg==", "dev": true, "dependencies": { - "@jest/test-result": "^27.1.1", + "@jest/test-result": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.1.1", + "jest-util": "^27.2.0", "string-length": "^4.0.1" }, "engines": { @@ -6051,9 +6051,9 @@ } }, "node_modules/jest-worker": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", - "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", + "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", "dev": true, "dependencies": { "@types/node": "*", @@ -7741,9 +7741,9 @@ } }, "node_modules/prettier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", - "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -7765,9 +7765,9 @@ } }, "node_modules/pretty-format": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.1.tgz", - "integrity": "sha512-zdBi/xlstKJL42UH7goQti5Hip/B415w1Mfj+WWWYMBylAYtKESnXGUtVVcMVid9ReVjypCotUV6CEevYPHv2g==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.0.tgz", + "integrity": "sha512-KyJdmgBkMscLqo8A7K77omgLx5PWPiXJswtTtFV7XgVZv2+qPk6UivpXXO+5k6ZEbWIbLoKdx1pZ6ldINzbwTA==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", @@ -9064,12 +9064,13 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.4.tgz", + "integrity": "sha512-ERg+H//lSSYlZhBIUu+wJnqg30AbyBbpZlIhcshpn7BNzpoRODZgfyr9J+8ERf3ooC6af3u7Lcl01nleau7MrA==", "dev": true, "dependencies": { - "escape-string-regexp": "^2.0.0" + "escape-string-regexp": "^2.0.0", + "source-map-support": "^0.5.20" }, "engines": { "node": ">=10" @@ -11093,29 +11094,29 @@ "dev": true }, "@jest/console": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.1.1.tgz", - "integrity": "sha512-VpQJRsWSeAem0zpBjeRtDbcD6DlbNoK11dNYt+PSQ+DDORh9q2/xyEpErfwgnLjWX0EKkSZmTGx/iH9Inzs6vQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.2.0.tgz", + "integrity": "sha512-35z+RqsK2CCgNxn+lWyK8X4KkaDtfL4BggT7oeZ0JffIiAiEYFYPo5B67V50ZubqDS1ehBrdCR2jduFnIrZOYw==", "dev": true, "requires": { "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.1.1", - "jest-util": "^27.1.1", + "jest-message-util": "^27.2.0", + "jest-util": "^27.2.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.1.1.tgz", - "integrity": "sha512-oCkKeTgI0emznKcLoq5OCD0PhxCijA4l7ejDnWW3d5bgSi+zfVaLybVqa+EQOxpNejQWtTna7tmsAXjMN9N43Q==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.2.0.tgz", + "integrity": "sha512-E/2NHhq+VMo18DpKkoty8Sjey8Kps5Cqa88A8NP757s6JjYqPdioMuyUBhDiIOGCdQByEp0ou3jskkTszMS0nw==", "dev": true, "requires": { - "@jest/console": "^27.1.1", - "@jest/reporters": "^27.1.1", - "@jest/test-result": "^27.1.1", - "@jest/transform": "^27.1.1", + "@jest/console": "^27.2.0", + "@jest/reporters": "^27.2.0", + "@jest/test-result": "^27.2.0", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -11124,18 +11125,18 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.1.1", - "jest-config": "^27.1.1", - "jest-haste-map": "^27.1.1", - "jest-message-util": "^27.1.1", + "jest-config": "^27.2.0", + "jest-haste-map": "^27.2.0", + "jest-message-util": "^27.2.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.1.1", - "jest-resolve-dependencies": "^27.1.1", - "jest-runner": "^27.1.1", - "jest-runtime": "^27.1.1", - "jest-snapshot": "^27.1.1", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", - "jest-watcher": "^27.1.1", + "jest-resolve": "^27.2.0", + "jest-resolve-dependencies": "^27.2.0", + "jest-runner": "^27.2.0", + "jest-runtime": "^27.2.0", + "jest-snapshot": "^27.2.0", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", + "jest-watcher": "^27.2.0", "micromatch": "^4.0.4", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -11144,52 +11145,52 @@ } }, "@jest/environment": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.1.1.tgz", - "integrity": "sha512-+y882/ZdxhyqF5RzxIrNIANjHj991WH7jifdcplzMDosDUOyCACFYUyVTBGbSTocbU+s1cesroRzkwi8hZ9SHg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.2.0.tgz", + "integrity": "sha512-iPWmQI0wRIYSZX3wKu4FXHK4eIqkfq6n1DCDJS+v3uby7SOXrHvX4eiTBuEdSvtDRMTIH2kjrSkjHf/F9JIYyQ==", "dev": true, "requires": { - "@jest/fake-timers": "^27.1.1", + "@jest/fake-timers": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1" } }, "@jest/fake-timers": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.1.1.tgz", - "integrity": "sha512-u8TJ5VlsVYTsGFatoyIae2l25pku4Bu15QCPTx2Gs5z+R//Ee3tHN85462Vc9yGVcdDvgADbqNkhOLxbEwPjMQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.0.tgz", + "integrity": "sha512-gSu3YHvQOoVaTWYGgHFB7IYFtcF2HBzX4l7s47VcjvkUgL4/FBnE20x7TNLa3W6ABERtGd5gStSwsA8bcn+c4w==", "dev": true, "requires": { "@jest/types": "^27.1.1", "@sinonjs/fake-timers": "^7.0.2", "@types/node": "*", - "jest-message-util": "^27.1.1", + "jest-message-util": "^27.2.0", "jest-mock": "^27.1.1", - "jest-util": "^27.1.1" + "jest-util": "^27.2.0" } }, "@jest/globals": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.1.1.tgz", - "integrity": "sha512-Q3JcTPmY+DAEHnr4MpnBV3mwy50EGrTC6oSDTNnW7FNGGacTJAfpWNk02D7xv422T1OzK2A2BKx+26xJOvHkyw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.2.0.tgz", + "integrity": "sha512-raqk9Gf9WC3hlBa57rmRmJfRl9hom2b+qEE/ifheMtwn5USH5VZxzrHHOZg0Zsd/qC2WJ8UtyTwHKQAnNlDMdg==", "dev": true, "requires": { - "@jest/environment": "^27.1.1", + "@jest/environment": "^27.2.0", "@jest/types": "^27.1.1", - "expect": "^27.1.1" + "expect": "^27.2.0" } }, "@jest/reporters": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.1.1.tgz", - "integrity": "sha512-cEERs62n1P4Pqox9HWyNOEkP57G95aK2mBjB6D8Ruz1Yc98fKH53b58rlVEnsY5nLmkLNZk65fxNi9C0Yds/8w==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.0.tgz", + "integrity": "sha512-7wfkE3iRTLaT0F51h1mnxH3nQVwDCdbfgXiLuCcNkF1FnxXLH9utHqkSLIiwOTV1AtmiE0YagHbOvx4rnMP/GA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.1.1", - "@jest/test-result": "^27.1.1", - "@jest/transform": "^27.1.1", + "@jest/console": "^27.2.0", + "@jest/test-result": "^27.2.0", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -11201,10 +11202,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.1.1", - "jest-resolve": "^27.1.1", - "jest-util": "^27.1.1", - "jest-worker": "^27.1.1", + "jest-haste-map": "^27.2.0", + "jest-resolve": "^27.2.0", + "jest-util": "^27.2.0", + "jest-worker": "^27.2.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -11224,33 +11225,33 @@ } }, "@jest/test-result": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.1.1.tgz", - "integrity": "sha512-8vy75A0Jtfz9DqXFUkjC5Co/wRla+D7qRFdShUY8SbPqBS3GBx3tpba7sGKFos8mQrdbe39n+c1zgVKtarfy6A==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.0.tgz", + "integrity": "sha512-JPPqn8h0RGr4HyeY1Km+FivDIjTFzDROU46iAvzVjD42ooGwYoqYO/MQTilhfajdz6jpVnnphFrKZI5OYrBONA==", "dev": true, "requires": { - "@jest/console": "^27.1.1", + "@jest/console": "^27.2.0", "@jest/types": "^27.1.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.1.1.tgz", - "integrity": "sha512-l8zD3EdeixvwmLNlJoMX3hhj8iIze95okj4sqmBzOq/zW8gZLElUveH4bpKEMuR+Nweazjlwc7L6g4C26M/y6Q==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.0.tgz", + "integrity": "sha512-PrqarcpzOU1KSAK7aPwfL8nnpaqTMwPe7JBPnaOYRDSe/C6AoJiL5Kbnonqf1+DregxZIRAoDg69R9/DXMGqXA==", "dev": true, "requires": { - "@jest/test-result": "^27.1.1", + "@jest/test-result": "^27.2.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.1.1", - "jest-runtime": "^27.1.1" + "jest-haste-map": "^27.2.0", + "jest-runtime": "^27.2.0" } }, "@jest/transform": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.1.1.tgz", - "integrity": "sha512-qM19Eu75U6Jc5zosXXVnq900Nl9JDpoGaZ4Mg6wZs7oqbu3heYSMOZS19DlwjlhWdfNRjF4UeAgkrCJCK3fEXg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.2.0.tgz", + "integrity": "sha512-Q8Q/8xXIZYllk1AF7Ou5sV3egOZsdY/Wlv09CSbcexBRcC1Qt6lVZ7jRFAZtbHsEEzvOCyFEC4PcrwKwyjXtCg==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -11260,9 +11261,9 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.1.1", + "jest-haste-map": "^27.2.0", "jest-regex-util": "^27.0.6", - "jest-util": "^27.1.1", + "jest-util": "^27.2.0", "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -11998,16 +11999,16 @@ } }, "babel-jest": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.1.1.tgz", - "integrity": "sha512-JA+dzJl4n2RBvWQEnph6HJaTHrsIPiXGQYatt/D8nR4UpX9UG4GaDzykVVPQBbrdTebZREkRb6SOxyIXJRab6Q==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.0.tgz", + "integrity": "sha512-bS2p+KGGVVmWXBa8+i6SO/xzpiz2Q/2LnqLbQknPKefWXVZ67YIjA4iXup/jMOEZplga9PpWn+wrdb3UdDwRaA==", "dev": true, "requires": { - "@jest/transform": "^27.1.1", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^27.0.6", + "babel-preset-jest": "^27.2.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" @@ -12027,9 +12028,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", - "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz", + "integrity": "sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -12059,12 +12060,12 @@ } }, "babel-preset-jest": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", - "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz", + "integrity": "sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^27.0.6", + "babel-plugin-jest-hoist": "^27.2.0", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -13013,9 +13014,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.3.0.tgz", - "integrity": "sha512-d/BvOLDjI4i7yf9tqCuLL2fFGA2TrM/D9PyRpua+rJolG0qrwp/FohP02L0m+44kmPpofIo4l3NPwLmzyKKimA==", + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.4.0.tgz", + "integrity": "sha512-KJGWS2qa0xZXIMPMDUNkRVO8/JxRd4+M0ejYYOzu2LIQ5ijecPzNuNR9nvDkml9XyyRBzu975FkhJcwD17ietQ==", "devOptional": true, "requires": { "@electron/get": "^1.0.1", @@ -13486,16 +13487,16 @@ "dev": true }, "expect": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.1.1.tgz", - "integrity": "sha512-JQAzp0CJoFFHF1RnOtrMUNMdsfx/Tl0+FhRzVl8q0fa23N+JyWdPXwb3T5rkHCvyo9uttnK7lVdKCBl1b/9EDw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.0.tgz", + "integrity": "sha512-oOTbawMQv7AK1FZURbPTgGSzmhxkjFzoARSvDjOMnOpeWuYQx1tP6rXu9MIX5mrACmyCAM7fSNP8IJO2f1p0CQ==", "dev": true, "requires": { "@jest/types": "^27.1.1", "ansi-styles": "^5.0.0", "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.1.1", - "jest-message-util": "^27.1.1", + "jest-matcher-utils": "^27.2.0", + "jest-message-util": "^27.2.0", "jest-regex-util": "^27.0.6" }, "dependencies": { @@ -14566,14 +14567,14 @@ } }, "jest": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.1.1.tgz", - "integrity": "sha512-LFTEZOhoZNR/2DQM3OCaK5xC6c55c1OWhYh0njRsoHX0qd6x4nkcgenkSH0JKjsAGMTmmJAoL7/oqYHMfwhruA==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.0.tgz", + "integrity": "sha512-oUqVXyvh5YwEWl263KWdPUAqEzBFzGHdFLQ05hUnITr1tH+9SscEI9A/GH9eBClA+Nw1ct+KNuuOV6wlnmBPcg==", "dev": true, "requires": { - "@jest/core": "^27.1.1", + "@jest/core": "^27.2.0", "import-local": "^3.0.2", - "jest-cli": "^27.1.1" + "jest-cli": "^27.2.0" } }, "jest-changed-files": { @@ -14588,91 +14589,91 @@ } }, "jest-circus": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.1.1.tgz", - "integrity": "sha512-Xed1ApiMFu/yzqGMBToHr8sp2gkX/ARZf4nXoGrHJrXrTUdVIWiVYheayfcOaPdQvQEE/uyBLgW7I7YBLIrAXQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.0.tgz", + "integrity": "sha512-WwENhaZwOARB1nmcboYPSv/PwHBUGRpA4MEgszjr9DLCl97MYw0qZprBwLb7rNzvMwfIvNGG7pefQ5rxyBlzIA==", "dev": true, "requires": { - "@jest/environment": "^27.1.1", - "@jest/test-result": "^27.1.1", + "@jest/environment": "^27.2.0", + "@jest/test-result": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.1.1", + "expect": "^27.2.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.1.1", - "jest-matcher-utils": "^27.1.1", - "jest-message-util": "^27.1.1", - "jest-runtime": "^27.1.1", - "jest-snapshot": "^27.1.1", - "jest-util": "^27.1.1", - "pretty-format": "^27.1.1", + "jest-each": "^27.2.0", + "jest-matcher-utils": "^27.2.0", + "jest-message-util": "^27.2.0", + "jest-runtime": "^27.2.0", + "jest-snapshot": "^27.2.0", + "jest-util": "^27.2.0", + "pretty-format": "^27.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" } }, "jest-cli": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.1.1.tgz", - "integrity": "sha512-LCjfEYp9D3bcOeVUUpEol9Y1ijZYMWVqflSmtw/wX+6Fb7zP4IlO14/6s9v1pxsoM4Pn46+M2zABgKuQjyDpTw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.0.tgz", + "integrity": "sha512-bq1X/B/b1kT9y1zIFMEW3GFRX1HEhFybiqKdbxM+j11XMMYSbU9WezfyWIhrSOmPT+iODLATVjfsCnbQs7cfIA==", "dev": true, "requires": { - "@jest/core": "^27.1.1", - "@jest/test-result": "^27.1.1", + "@jest/core": "^27.2.0", + "@jest/test-result": "^27.2.0", "@jest/types": "^27.1.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.1.1", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", + "jest-config": "^27.2.0", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", "prompts": "^2.0.1", "yargs": "^16.0.3" } }, "jest-config": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.1.1.tgz", - "integrity": "sha512-2iSd5zoJV4MsWPcLCGwUVUY/j6pZXm4Qd3rnbCtrd9EHNTg458iHw8PZztPQXfxKBKJxLfBk7tbZqYF8MGtxJA==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.0.tgz", + "integrity": "sha512-Z1romHpxeNwLxQtouQ4xt07bY6HSFGKTo0xJcvOK3u6uJHveA4LB2P+ty9ArBLpTh3AqqPxsyw9l9GMnWBYS9A==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.1.1", + "@jest/test-sequencer": "^27.2.0", "@jest/types": "^27.1.1", - "babel-jest": "^27.1.1", + "babel-jest": "^27.2.0", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", "is-ci": "^3.0.0", - "jest-circus": "^27.1.1", - "jest-environment-jsdom": "^27.1.1", - "jest-environment-node": "^27.1.1", + "jest-circus": "^27.2.0", + "jest-environment-jsdom": "^27.2.0", + "jest-environment-node": "^27.2.0", "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.1.1", + "jest-jasmine2": "^27.2.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.1.1", - "jest-runner": "^27.1.1", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", + "jest-resolve": "^27.2.0", + "jest-runner": "^27.2.0", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", "micromatch": "^4.0.4", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" } }, "jest-diff": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.1.1.tgz", - "integrity": "sha512-m/6n5158rqEriTazqHtBpOa2B/gGgXJijX6nsEgZfbJ/3pxQcdpVXBe+FP39b1dxWHyLVVmuVXddmAwtqFO4Lg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.0.tgz", + "integrity": "sha512-QSO9WC6btFYWtRJ3Hac0sRrkspf7B01mGrrQEiCW6TobtViJ9RWL0EmOs/WnBsZDsI/Y2IoSHZA2x6offu0sYw==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", "jest-get-type": "^27.0.6", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" } }, "jest-docblock": { @@ -14685,30 +14686,30 @@ } }, "jest-each": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.1.1.tgz", - "integrity": "sha512-r6hOsTLavUBb1xN0uDa89jdDeBmJ+K49fWpbyxeGRA2pLY46PlC4z551/cWNQzrj+IUa5/gSRsCIV/01HdNPug==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.2.0.tgz", + "integrity": "sha512-biDmmUQjg+HZOB7MfY2RHSFL3j418nMoC3TK3pGAj880fQQSxvQe1y2Wy23JJJNUlk6YXiGU0yWy86Le1HBPmA==", "dev": true, "requires": { "@jest/types": "^27.1.1", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", - "jest-util": "^27.1.1", - "pretty-format": "^27.1.1" + "jest-util": "^27.2.0", + "pretty-format": "^27.2.0" } }, "jest-environment-jsdom": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.1.1.tgz", - "integrity": "sha512-6vOnoZ6IaExuw7FvnuJhA1qFYv1DDSnN0sQowzolNwxQp7bG1YhLxj2YU1sVXAYA3IR3MbH2mbnJUsLUWfyfzw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.0.tgz", + "integrity": "sha512-wNQJi6Rd/AkUWqTc4gWhuTIFPo7tlMK0RPZXeM6AqRHZA3D3vwvTa9ktAktyVyWYmUoXdYstOfyYMG3w4jt7eA==", "dev": true, "requires": { - "@jest/environment": "^27.1.1", - "@jest/fake-timers": "^27.1.1", + "@jest/environment": "^27.2.0", + "@jest/fake-timers": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1", - "jest-util": "^27.1.1", + "jest-util": "^27.2.0", "jsdom": "^16.6.0" }, "dependencies": { @@ -14795,17 +14796,17 @@ } }, "jest-environment-node": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.1.1.tgz", - "integrity": "sha512-OEGeZh0PwzngNIYWYgWrvTcLygopV8OJbC9HNb0j70VBKgEIsdZkYhwcFnaURX83OHACMqf1pa9Tv5Pw5jemrg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.0.tgz", + "integrity": "sha512-WbW+vdM4u88iy6Q3ftUEQOSgMPtSgjm3qixYYK2AKEuqmFO2zmACTw1vFUB0qI/QN88X6hA6ZkVKIdIWWzz+yg==", "dev": true, "requires": { - "@jest/environment": "^27.1.1", - "@jest/fake-timers": "^27.1.1", + "@jest/environment": "^27.2.0", + "@jest/fake-timers": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1", - "jest-util": "^27.1.1" + "jest-util": "^27.2.0" } }, "jest-get-type": { @@ -14815,9 +14816,9 @@ "dev": true }, "jest-haste-map": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.1.1.tgz", - "integrity": "sha512-NGLYVAdh5C8Ezg5QBFzrNeYsfxptDBPlhvZNaicLiZX77F/rS27a9M6u9ripWAaaD54xnWdZNZpEkdjD5Eo5aQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.0.tgz", + "integrity": "sha512-laFet7QkNlWjwZtMGHCucLvF8o9PAh2cgePRck1+uadSM4E4XH9J4gnx4do+a6do8ZV5XHNEAXEkIoNg5XUH2Q==", "dev": true, "requires": { "@jest/types": "^27.1.1", @@ -14829,64 +14830,64 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^27.0.6", "jest-serializer": "^27.0.6", - "jest-util": "^27.1.1", - "jest-worker": "^27.1.1", + "jest-util": "^27.2.0", + "jest-worker": "^27.2.0", "micromatch": "^4.0.4", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.1.1.tgz", - "integrity": "sha512-0LAzUmcmvQwjIdJt0cXUVX4G5qjVXE8ELt6nbMNDzv2yAs2hYCCUtQq+Eje70GwAysWCGcS64QeYj5VPHYVxPg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.0.tgz", + "integrity": "sha512-NcPzZBk6IkDW3Z2V8orGueheGJJYfT5P0zI/vTO/Jp+R9KluUdgFrgwfvZ0A34Kw6HKgiWFILZmh3oQ/eS+UxA==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.1.1", + "@jest/environment": "^27.2.0", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.1.1", + "@jest/test-result": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.1.1", + "expect": "^27.2.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.1.1", - "jest-matcher-utils": "^27.1.1", - "jest-message-util": "^27.1.1", - "jest-runtime": "^27.1.1", - "jest-snapshot": "^27.1.1", - "jest-util": "^27.1.1", - "pretty-format": "^27.1.1", + "jest-each": "^27.2.0", + "jest-matcher-utils": "^27.2.0", + "jest-message-util": "^27.2.0", + "jest-runtime": "^27.2.0", + "jest-snapshot": "^27.2.0", + "jest-util": "^27.2.0", + "pretty-format": "^27.2.0", "throat": "^6.0.1" } }, "jest-leak-detector": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.1.1.tgz", - "integrity": "sha512-gwSgzmqShoeEsEVpgObymQPrM9P6557jt1EsFW5aCeJ46Cme0EdjYU7xr6llQZ5GpWDl56eOstUaPXiZOfiTKw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.0.tgz", + "integrity": "sha512-e91BIEmbZw5+MHkB4Hnrq7S86coTxUMCkz4n7DLmQYvl9pEKmRx9H/JFH87bBqbIU5B2Ju1soKxRWX6/eGFGpA==", "dev": true, "requires": { "jest-get-type": "^27.0.6", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" } }, "jest-matcher-utils": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.1.1.tgz", - "integrity": "sha512-Q1a10w9Y4sh0wegkdP6reQOa/Dtz7nAvDqBgrat1ItZAUvk4jzXAqyhXPu/ZuEtDaXaNKpdRPRQA8bvkOh2Eaw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.0.tgz", + "integrity": "sha512-F+LG3iTwJ0gPjxBX6HCyrARFXq6jjiqhwBQeskkJQgSLeF1j6ui1RTV08SR7O51XTUhtc8zqpDj8iCG4RGmdKw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.1.1", + "jest-diff": "^27.2.0", "jest-get-type": "^27.0.6", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" } }, "jest-message-util": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.1.1.tgz", - "integrity": "sha512-b697BOJV93+AVGvzLRtVZ0cTVRbd59OaWnbB2D75GRaIMc4I+Z9W0wHxbfjW01JWO+TqqW4yevT0aN7Fd0XWng==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.0.tgz", + "integrity": "sha512-y+sfT/94CiP8rKXgwCOzO1mUazIEdEhrLjuiu+RKmCP+8O/TJTSne9dqQRbFIHBtlR2+q7cddJlWGir8UATu5w==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", @@ -14895,7 +14896,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.1.1", + "pretty-format": "^27.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -14935,44 +14936,44 @@ "dev": true }, "jest-resolve": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.1.1.tgz", - "integrity": "sha512-M41YFmWhvDVstwe7XuV21zynOiBLJB5Sk0GrIsYYgTkjfEWNLVXDjAyq1W7PHseaYNOxIc0nOGq/r5iwcZNC1A==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.0.tgz", + "integrity": "sha512-v09p9Ib/VtpHM6Cz+i9lEAv1Z/M5NVxsyghRHRMEUOqwPQs3zwTdwp1xS3O/k5LocjKiGS0OTaJoBSpjbM2Jlw==", "dev": true, "requires": { "@jest/types": "^27.1.1", "chalk": "^4.0.0", "escalade": "^3.1.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.1.1", + "jest-haste-map": "^27.2.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", "resolve": "^1.20.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.1.1.tgz", - "integrity": "sha512-sYZR+uBjFDCo4VhYeazZf/T+ryYItvdLKu9vHatqkUqHGjDMrdEPOykiqC2iEpaCFTS+3iL/21CYiJuKdRbniw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.0.tgz", + "integrity": "sha512-EY5jc/Y0oxn+oVEEldTidmmdVoZaknKPyDORA012JUdqPyqPL+lNdRyI3pGti0RCydds6coaw6xt4JQY54dKsg==", "dev": true, "requires": { "@jest/types": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-snapshot": "^27.1.1" + "jest-snapshot": "^27.2.0" } }, "jest-runner": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.1.1.tgz", - "integrity": "sha512-lP3MBNQhg75/sQtVkC8dsAQZumvy3lHK/YIwYPfEyqGIX1qEcnYIRxP89q0ZgC5ngvi1vN2P5UFHszQxguWdng==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.0.tgz", + "integrity": "sha512-Cl+BHpduIc0cIVTjwoyx0pQk4Br8gn+wkr35PmKCmzEdOUnQ2wN7QVXA8vXnMQXSlFkN/+KWnk20TAVBmhgrww==", "dev": true, "requires": { - "@jest/console": "^27.1.1", - "@jest/environment": "^27.1.1", - "@jest/test-result": "^27.1.1", - "@jest/transform": "^27.1.1", + "@jest/console": "^27.2.0", + "@jest/environment": "^27.2.0", + "@jest/test-result": "^27.2.0", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", @@ -14980,32 +14981,32 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.0.6", - "jest-environment-jsdom": "^27.1.1", - "jest-environment-node": "^27.1.1", - "jest-haste-map": "^27.1.1", - "jest-leak-detector": "^27.1.1", - "jest-message-util": "^27.1.1", - "jest-resolve": "^27.1.1", - "jest-runtime": "^27.1.1", - "jest-util": "^27.1.1", - "jest-worker": "^27.1.1", + "jest-environment-jsdom": "^27.2.0", + "jest-environment-node": "^27.2.0", + "jest-haste-map": "^27.2.0", + "jest-leak-detector": "^27.2.0", + "jest-message-util": "^27.2.0", + "jest-resolve": "^27.2.0", + "jest-runtime": "^27.2.0", + "jest-util": "^27.2.0", + "jest-worker": "^27.2.0", "source-map-support": "^0.5.6", "throat": "^6.0.1" } }, "jest-runtime": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.1.1.tgz", - "integrity": "sha512-FEwy+tSzmsvuKaQpyYsUyk31KG5vMmA2r2BSTHgv0yNfcooQdm2Ke91LM9Ud8D3xz8CLDHJWAI24haMFTwrsPg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.0.tgz", + "integrity": "sha512-6gRE9AVVX49hgBbWQ9PcNDeM4upMUXzTpBs0kmbrjyotyUyIJixLPsYjpeTFwAA07PVLDei1iAm2chmWycdGdQ==", "dev": true, "requires": { - "@jest/console": "^27.1.1", - "@jest/environment": "^27.1.1", - "@jest/fake-timers": "^27.1.1", - "@jest/globals": "^27.1.1", + "@jest/console": "^27.2.0", + "@jest/environment": "^27.2.0", + "@jest/fake-timers": "^27.2.0", + "@jest/globals": "^27.2.0", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.1.1", - "@jest/transform": "^27.1.1", + "@jest/test-result": "^27.2.0", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -15015,14 +15016,14 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.1.1", - "jest-message-util": "^27.1.1", + "jest-haste-map": "^27.2.0", + "jest-message-util": "^27.2.0", "jest-mock": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.1.1", - "jest-snapshot": "^27.1.1", - "jest-util": "^27.1.1", - "jest-validate": "^27.1.1", + "jest-resolve": "^27.2.0", + "jest-snapshot": "^27.2.0", + "jest-util": "^27.2.0", + "jest-validate": "^27.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^16.0.3" @@ -15039,9 +15040,9 @@ } }, "jest-snapshot": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.1.1.tgz", - "integrity": "sha512-Wi3QGiuRFo3lU+EbQmZnBOks0CJyAMPHvYoG7iJk00Do10jeOyuOEO0Jfoaoun8+8TDv+Nzl7Aswir/IK9+1jg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.0.tgz", + "integrity": "sha512-MukJvy3KEqemCT2FoT3Gum37CQqso/62PKTfIzWmZVTsLsuyxQmJd2PI5KPcBYFqLlA8LgZLHM8ZlazkVt8LsQ==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -15050,23 +15051,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.1.1", + "@jest/transform": "^27.2.0", "@jest/types": "^27.1.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.1.1", + "expect": "^27.2.0", "graceful-fs": "^4.2.4", - "jest-diff": "^27.1.1", + "jest-diff": "^27.2.0", "jest-get-type": "^27.0.6", - "jest-haste-map": "^27.1.1", - "jest-matcher-utils": "^27.1.1", - "jest-message-util": "^27.1.1", - "jest-resolve": "^27.1.1", - "jest-util": "^27.1.1", + "jest-haste-map": "^27.2.0", + "jest-matcher-utils": "^27.2.0", + "jest-message-util": "^27.2.0", + "jest-resolve": "^27.2.0", + "jest-util": "^27.2.0", "natural-compare": "^1.4.0", - "pretty-format": "^27.1.1", + "pretty-format": "^27.2.0", "semver": "^7.3.2" }, "dependencies": { @@ -15082,9 +15083,9 @@ } }, "jest-util": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.1.1.tgz", - "integrity": "sha512-zf9nEbrASWn2mC/L91nNb0K+GkhFvi4MP6XJG2HqnHzHvLYcs7ou/In68xYU1i1dSkJlrWcYfWXQE8nVR+nbOA==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.2.0.tgz", + "integrity": "sha512-T5ZJCNeFpqcLBpx+Hl9r9KoxBCUqeWlJ1Htli+vryigZVJ1vuLB9j35grEBASp4R13KFkV7jM52bBGnArpJN6A==", "dev": true, "requires": { "@jest/types": "^27.1.1", @@ -15096,9 +15097,9 @@ } }, "jest-validate": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.1.1.tgz", - "integrity": "sha512-N5Er5FKav/8m2dJwn7BGnZwnoD1BSc8jx5T+diG2OvyeugvZDhPeAt5DrNaGkkaKCrSUvuE7A5E4uHyT7Vj0Mw==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.0.tgz", + "integrity": "sha512-uIEZGkFKk3+4liA81Xu0maG5aGDyPLdp+4ed244c+Ql0k3aLWQYcMbaMLXOIFcb83LPHzYzqQ8hwNnIxTqfAGQ==", "dev": true, "requires": { "@jest/types": "^27.1.1", @@ -15106,7 +15107,7 @@ "chalk": "^4.0.0", "jest-get-type": "^27.0.6", "leven": "^3.1.0", - "pretty-format": "^27.1.1" + "pretty-format": "^27.2.0" }, "dependencies": { "camelcase": { @@ -15118,24 +15119,24 @@ } }, "jest-watcher": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.1.1.tgz", - "integrity": "sha512-XQzyHbxziDe+lZM6Dzs40fEt4q9akOGwitJnxQasJ9WG0bv3JGiRlsBgjw13znGapeMtFaEsyhL0Cl04IbaoWQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.0.tgz", + "integrity": "sha512-SjRWhnr+qO8aBsrcnYIyF+qRxNZk6MZH8TIDgvi+VlsyrvOyqg0d+Rm/v9KHiTtC9mGGeFi9BFqgavyWib6xLg==", "dev": true, "requires": { - "@jest/test-result": "^27.1.1", + "@jest/test-result": "^27.2.0", "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.1.1", + "jest-util": "^27.2.0", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", - "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", + "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", "dev": true, "requires": { "@types/node": "*", @@ -16440,9 +16441,9 @@ "devOptional": true }, "prettier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", - "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true }, "prettier-linter-helpers": { @@ -16455,9 +16456,9 @@ } }, "pretty-format": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.1.tgz", - "integrity": "sha512-zdBi/xlstKJL42UH7goQti5Hip/B415w1Mfj+WWWYMBylAYtKESnXGUtVVcMVid9ReVjypCotUV6CEevYPHv2g==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.0.tgz", + "integrity": "sha512-KyJdmgBkMscLqo8A7K77omgLx5PWPiXJswtTtFV7XgVZv2+qPk6UivpXXO+5k6ZEbWIbLoKdx1pZ6ldINzbwTA==", "dev": true, "requires": { "@jest/types": "^27.1.1", @@ -17456,12 +17457,13 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.4.tgz", + "integrity": "sha512-ERg+H//lSSYlZhBIUu+wJnqg30AbyBbpZlIhcshpn7BNzpoRODZgfyr9J+8ERf3ooC6af3u7Lcl01nleau7MrA==", "dev": true, "requires": { - "escape-string-regexp": "^2.0.0" + "escape-string-regexp": "^2.0.0", + "source-map-support": "^0.5.20" }, "dependencies": { "escape-string-regexp": { diff --git a/package.json b/package.json index 833010d1..5d15a245 100644 --- a/package.json +++ b/package.json @@ -52,11 +52,11 @@ "eslint-plugin-prettier": "^4.0.0", "express-basic-auth": "^1.2.0", "husky": "^7.0.2", - "jest": "^27.1.1", + "jest": "^27.2.0", "jsdom": "^17.0.0", "lodash": "^4.17.21", "nyc": "^15.1.0", - "prettier": "^2.4.0", + "prettier": "^2.4.1", "pretty-quick": "^3.1.1", "sinon": "^11.1.2", "spectron": "^15.0.0", @@ -67,7 +67,7 @@ "suncalc": "^1.8.0" }, "optionalDependencies": { - "electron": "^13.3.0" + "electron": "^13.4.0" }, "dependencies": { "colors": "^1.4.0", From c3c5307624232c2b539cb985233c63b4af6aa741 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Fri, 17 Sep 2021 20:03:57 +0200 Subject: [PATCH 07/37] fix basic-auth.js --- tests/electron/modules/basic-auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/electron/modules/basic-auth.js b/tests/electron/modules/basic-auth.js index a8b5b6d6..fc08ae40 100644 --- a/tests/electron/modules/basic-auth.js +++ b/tests/electron/modules/basic-auth.js @@ -12,7 +12,7 @@ app.use(basicAuth); // Set available directories const directories = ["/tests/configs"]; -const rootPath = path.resolve(__dirname + "/../../"); +const rootPath = path.resolve(__dirname + "/../../../"); for (let directory of directories) { app.use(directory, express.static(path.resolve(rootPath + directory))); From b4350278a073c364bb6f1af2f35a06e2c740e4dd Mon Sep 17 00:00:00 2001 From: karsten13 Date: Tue, 21 Sep 2021 23:48:29 +0200 Subject: [PATCH 08/37] first tests --- js/logger.js | 4 ++-- package.json | 3 +++ tests/configs/modules/display.js | 14 ++++++------ tests/e2e/mock-console.js | 9 ++++++++ tests/e2e/modules.js | 37 ++++++++++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 tests/e2e/mock-console.js create mode 100644 tests/e2e/modules.js diff --git a/js/logger.js b/js/logger.js index d469e702..16e310e8 100644 --- a/js/logger.js +++ b/js/logger.js @@ -35,8 +35,8 @@ groupCollapsed: Function.prototype.bind.call(console.groupCollapsed, console), groupEnd: Function.prototype.bind.call(console.groupEnd, console), time: Function.prototype.bind.call(console.time, console), - timeEnd: Function.prototype.bind.call(console.timeEnd, console), - timeStamp: Function.prototype.bind.call(console.timeStamp, console) + timeEnd: Function.prototype.bind.call(console.timeEnd, console) + // timeStamp: Function.prototype.bind.call(console.timeStamp, console) }; logLevel.setLogLevel = function (newLevel) { diff --git a/package.json b/package.json index 5d15a245..601fe53b 100644 --- a/package.json +++ b/package.json @@ -120,6 +120,9 @@ }, { "displayName": "e2e", + "setupFilesAfterEnv": [ + "/tests/e2e/mock-console.js" + ], "testMatch": [ "**/tests/e2e/**/*.[jt]s?(x)" ], diff --git a/tests/configs/modules/display.js b/tests/configs/modules/display.js index 070dc9e5..b9facce3 100644 --- a/tests/configs/modules/display.js +++ b/tests/configs/modules/display.js @@ -3,7 +3,13 @@ * By Rejas * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", + timeFormat: 24, + units: "metric", + modules: [ { module: "helloworld", @@ -21,11 +27,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); - -config.electronOptions.fullscreen = false; -config.electronOptions.width = 800; -config.electronOptions.height = 600; +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/e2e/mock-console.js b/tests/e2e/mock-console.js new file mode 100644 index 00000000..2d6751cd --- /dev/null +++ b/tests/e2e/mock-console.js @@ -0,0 +1,9 @@ +global.console = { + log: console.log, + dir: console.dir, + // error: jest.fn(), + error: console.error, + warn: console.warn, + info: console.info, + debug: console.debug +}; diff --git a/tests/e2e/modules.js b/tests/e2e/modules.js new file mode 100644 index 00000000..e4856a52 --- /dev/null +++ b/tests/e2e/modules.js @@ -0,0 +1,37 @@ +const jsdom = require("jsdom"); +const fetch = require("node-fetch"); +const helpers = require("./global-setup"); +let app = null; + +describe("test headers", function () { + beforeAll(function () { + // todo: require is not defined ... + // jest.mock("logger"); + app = helpers.startApplication("tests/configs/modules/display.js"); + // app = helpers.startApplication("config/config.js"); + }); + afterAll(function () { + helpers.stopApplication(app); + }); + + it("test", function (done) { + jsdom.JSDOM.fromURL("http://localhost:8080", { resources: "usable", runScripts: "dangerously" }).then((dom) => { + // console.log(dom.serialize()); + dom.window.onload = function () { + const doc = dom.window.document; + console.log(doc.querySelector("title").textContent); + const children = doc.body.getElementsByTagName("*"); + for (var i = 0, length = children.length; i < length; i++) { + child = children[i]; + if (child.id !== "") console.dir(child.id); + } + console.log(doc.querySelector("#module_0_helloworld .module-header").textContent); + // result ist leider lowercase wegen fehlendem css, siehe https://stackoverflow.com/questions/10318330/how-do-you-add-stylesheets-to-jsdom + // const elem = doc.getElementById("module_0_helloworld"); + // console.dir(elem); + done(); + }; + }); + // done(); + }); +}); From 60f8de282db9726f02105f0f3a99ec7a9592359b Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Thu, 23 Sep 2021 00:05:30 +0200 Subject: [PATCH 09/37] snapshot --- tests/e2e/mock-console.js | 21 +++++++----- tests/e2e/modules.js | 70 ++++++++++++++++++++++----------------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/tests/e2e/mock-console.js b/tests/e2e/mock-console.js index 2d6751cd..8cc246f8 100644 --- a/tests/e2e/mock-console.js +++ b/tests/e2e/mock-console.js @@ -1,9 +1,14 @@ -global.console = { - log: console.log, - dir: console.dir, - // error: jest.fn(), - error: console.error, - warn: console.warn, - info: console.info, - debug: console.debug +function myError(err) { + //console.dir(err); + if (err.includes("ECONNREFUSED")) { jest.fn() } else { console.dir(err) }; +}; + +global.console = { + log: jest.fn(), + dir: console.dir, + error: myError, +// error: console.error, + warn: console.warn, + info: jest.fn(), + debug: console.debug }; diff --git a/tests/e2e/modules.js b/tests/e2e/modules.js index e4856a52..227fd98f 100644 --- a/tests/e2e/modules.js +++ b/tests/e2e/modules.js @@ -1,37 +1,45 @@ const jsdom = require("jsdom"); -const fetch = require("node-fetch"); +// const fetch = require("node-fetch"); const helpers = require("./global-setup"); let app = null; -describe("test headers", function () { - beforeAll(function () { - // todo: require is not defined ... - // jest.mock("logger"); - app = helpers.startApplication("tests/configs/modules/display.js"); - // app = helpers.startApplication("config/config.js"); - }); - afterAll(function () { - helpers.stopApplication(app); - }); +describe("Display of modules", function () { + beforeAll(function () { + // todo: require is not defined ... + // jest.mock("logger"); + app = helpers.startApplication("tests/configs/modules/display.js"); + // app = helpers.startApplication("config/config.js"); + }); + afterAll(function () { + helpers.stopApplication(app); + }); - it("test", function (done) { - jsdom.JSDOM.fromURL("http://localhost:8080", { resources: "usable", runScripts: "dangerously" }).then((dom) => { - // console.log(dom.serialize()); - dom.window.onload = function () { - const doc = dom.window.document; - console.log(doc.querySelector("title").textContent); - const children = doc.body.getElementsByTagName("*"); - for (var i = 0, length = children.length; i < length; i++) { - child = children[i]; - if (child.id !== "") console.dir(child.id); - } - console.log(doc.querySelector("#module_0_helloworld .module-header").textContent); - // result ist leider lowercase wegen fehlendem css, siehe https://stackoverflow.com/questions/10318330/how-do-you-add-stylesheets-to-jsdom - // const elem = doc.getElementById("module_0_helloworld"); - // console.dir(elem); - done(); - }; - }); - // done(); - }); + it("should show the test header", function (done) { + jsdom.JSDOM.fromURL("http://localhost:8080", { resources: "usable", runScripts: "dangerously" }).then((dom) => { + // console.log(dom.serialize()); + dom.window.onload = function () { + const doc = dom.window.document; + let elem = doc.querySelector("title"); + expect(elem).not.toBe(null); + expect(elem.textContent).toBe("MagicMirror²"); +/* + const children = doc.body.getElementsByTagName("*"); + for (var i = 0, length = children.length; i < length; i++) { + child = children[i]; + if (child.id !== "") console.dir(child.id); + } +*/ + elem = doc.querySelector("#module_0_helloworld .module-header"); + expect(elem).not.toBe(null); + expect(elem.textContent).toBe("test_header"); + //result ist leider lowercase wegen fehlendem css, siehe https://stackoverflow.com/questions/10318330/how-do-you-add-stylesheets-to-jsdom + elem = doc.querySelector("#module_1_helloworld .module-header"); + expect(elem).not.toBe(null); + expect(elem.textContent).toBe("undefined"); + + //dom.window.close(); + done(); + }; + }); + }); }); From 54b04962a8e3c72d3b9ca2ef422e704a2cd04743 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Thu, 23 Sep 2021 22:52:32 +0200 Subject: [PATCH 10/37] snapshot --- .github/workflows/node-ci.js.yml | 1 + tests/e2e/global-setup.js | 11 ++++++++ tests/e2e/mock-console.js | 22 ++++++++------- tests/e2e/modules.js | 45 ------------------------------- tests/e2e/modules_display_spec.js | 25 +++++++++++++++++ 5 files changed, 49 insertions(+), 55 deletions(-) delete mode 100644 tests/e2e/modules.js create mode 100644 tests/e2e/modules_display_spec.js diff --git a/.github/workflows/node-ci.js.yml b/.github/workflows/node-ci.js.yml index 3a7391c2..258cf83d 100644 --- a/.github/workflows/node-ci.js.yml +++ b/.github/workflows/node-ci.js.yml @@ -26,6 +26,7 @@ jobs: Xvfb :99 -screen 0 1024x768x16 & export DISPLAY=:99 npm install + touch css/custom.css npm run test:prettier npm run test:js npm run test:css diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js index 1f9bce3b..a8b0278f 100644 --- a/tests/e2e/global-setup.js +++ b/tests/e2e/global-setup.js @@ -1,3 +1,5 @@ +const jsdom = require("jsdom"); + exports.startApplication = function (configFilename, exec) { jest.resetModules(); // Set config sample for use in test @@ -14,3 +16,12 @@ exports.stopApplication = function (app) { app.stop(); } }; + +exports.getDocument = function (url, callback) { + jsdom.JSDOM.fromURL(url, { resources: "usable", runScripts: "dangerously" }).then((dom) => { + dom.window.onload = function () { + global.document = dom.window.document; + callback(); + }; + }); +}; diff --git a/tests/e2e/mock-console.js b/tests/e2e/mock-console.js index 8cc246f8..a1ccfa55 100644 --- a/tests/e2e/mock-console.js +++ b/tests/e2e/mock-console.js @@ -1,14 +1,16 @@ function myError(err) { - //console.dir(err); - if (err.includes("ECONNREFUSED")) { jest.fn() } else { console.dir(err) }; -}; + if (err.includes("ECONNREFUSED")) { + jest.fn(); + } else { + console.dir(err); + } +} global.console = { - log: jest.fn(), - dir: console.dir, - error: myError, -// error: console.error, - warn: console.warn, - info: jest.fn(), - debug: console.debug + log: jest.fn(), + dir: console.dir, + error: myError, + warn: console.warn, + info: jest.fn(), + debug: console.debug }; diff --git a/tests/e2e/modules.js b/tests/e2e/modules.js deleted file mode 100644 index 227fd98f..00000000 --- a/tests/e2e/modules.js +++ /dev/null @@ -1,45 +0,0 @@ -const jsdom = require("jsdom"); -// const fetch = require("node-fetch"); -const helpers = require("./global-setup"); -let app = null; - -describe("Display of modules", function () { - beforeAll(function () { - // todo: require is not defined ... - // jest.mock("logger"); - app = helpers.startApplication("tests/configs/modules/display.js"); - // app = helpers.startApplication("config/config.js"); - }); - afterAll(function () { - helpers.stopApplication(app); - }); - - it("should show the test header", function (done) { - jsdom.JSDOM.fromURL("http://localhost:8080", { resources: "usable", runScripts: "dangerously" }).then((dom) => { - // console.log(dom.serialize()); - dom.window.onload = function () { - const doc = dom.window.document; - let elem = doc.querySelector("title"); - expect(elem).not.toBe(null); - expect(elem.textContent).toBe("MagicMirror²"); -/* - const children = doc.body.getElementsByTagName("*"); - for (var i = 0, length = children.length; i < length; i++) { - child = children[i]; - if (child.id !== "") console.dir(child.id); - } -*/ - elem = doc.querySelector("#module_0_helloworld .module-header"); - expect(elem).not.toBe(null); - expect(elem.textContent).toBe("test_header"); - //result ist leider lowercase wegen fehlendem css, siehe https://stackoverflow.com/questions/10318330/how-do-you-add-stylesheets-to-jsdom - elem = doc.querySelector("#module_1_helloworld .module-header"); - expect(elem).not.toBe(null); - expect(elem.textContent).toBe("undefined"); - - //dom.window.close(); - done(); - }; - }); - }); -}); diff --git a/tests/e2e/modules_display_spec.js b/tests/e2e/modules_display_spec.js new file mode 100644 index 00000000..1264ad5a --- /dev/null +++ b/tests/e2e/modules_display_spec.js @@ -0,0 +1,25 @@ +const helpers = require("./global-setup"); +let app = null; + +describe("Display of modules", function () { + beforeAll(function (done) { + app = helpers.startApplication("tests/configs/modules/display.js"); + helpers.getDocument("http://localhost:8080", done); + }); + afterAll(function () { + helpers.stopApplication(app); + }); + + it("should show the test header", function () { + elem = document.querySelector("#module_0_helloworld .module-header"); + expect(elem).not.toBe(null); + expect(elem.textContent).toBe("test_header"); + //result ist leider lowercase wegen fehlendem css, siehe https://stackoverflow.com/questions/10318330/how-do-you-add-stylesheets-to-jsdom + }); + + it("should show no header if no header text is specified", function () { + elem = document.querySelector("#module_1_helloworld .module-header"); + expect(elem).not.toBe(null); + expect(elem.textContent).toBe("undefined"); + }); +}); From 0ef6f89d441f65002dc592a6c9a97faeb3b9d743 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Fri, 24 Sep 2021 00:30:00 +0200 Subject: [PATCH 11/37] fix server.close() issue --- js/server.js | 11 +++++++++++ tests/e2e/modules_display_spec.js | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/js/server.js b/js/server.js index 35071091..92607d39 100644 --- a/js/server.js +++ b/js/server.js @@ -23,6 +23,7 @@ const Utils = require("./utils.js"); */ function Server(config, callback) { const port = process.env.MM_PORT || config.port; + const serverSockets = new Set(); let server = null; if (config.useHttps) { @@ -42,6 +43,13 @@ function Server(config, callback) { allowEIO3: true }); + server.on("connection", (socket) => { + serverSockets.add(socket); + socket.on("close", () => { + serverSockets.delete(socket); + }); + }); + Log.log(`Starting server on port ${port} ... `); server.listen(port, config.address || "localhost"); @@ -94,6 +102,9 @@ function Server(config, callback) { } this.close = function () { + for (const socket of serverSockets.values()) { + socket.destroy(); + } server.close(); }; } diff --git a/tests/e2e/modules_display_spec.js b/tests/e2e/modules_display_spec.js index 1264ad5a..865748cd 100644 --- a/tests/e2e/modules_display_spec.js +++ b/tests/e2e/modules_display_spec.js @@ -13,8 +13,8 @@ describe("Display of modules", function () { it("should show the test header", function () { elem = document.querySelector("#module_0_helloworld .module-header"); expect(elem).not.toBe(null); + // textContent gibt hier lowercase zurück, das uppercase wird durch css realisiert, was daher nicht in textContent landet expect(elem.textContent).toBe("test_header"); - //result ist leider lowercase wegen fehlendem css, siehe https://stackoverflow.com/questions/10318330/how-do-you-add-stylesheets-to-jsdom }); it("should show no header if no header text is specified", function () { From a1c7f2099021fd3c587cff35dadeea23dc727a7e Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Fri, 24 Sep 2021 21:30:51 +0200 Subject: [PATCH 12/37] fix logger.js, move jsdom in startApplication --- js/logger.js | 15 ++++++++++++--- package.json | 3 ++- tests/e2e/global-setup.js | 22 ++++++++++++---------- tests/e2e/modules_display_spec.js | 3 +-- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/js/logger.js b/js/logger.js index 16e310e8..7434ccd2 100644 --- a/js/logger.js +++ b/js/logger.js @@ -24,7 +24,16 @@ } })(this, function (config) { let logLevel; - if ((typeof exports === "object" && process.env.JEST_WORKER_ID === undefined) || typeof exports !== "object") { + let enableLog; + if (typeof exports === "object") { + // in nodejs and not running with jest + enableLog = (process.env.JEST_WORKER_ID === undefined); + } else { + // in browser and not running with jsdom + enableLog = (typeof window === 'object' && window.name === 'nodejs'); + }; + + if (enableLog) { logLevel = { debug: Function.prototype.bind.call(console.debug, console), log: Function.prototype.bind.call(console.log, console), @@ -35,8 +44,8 @@ groupCollapsed: Function.prototype.bind.call(console.groupCollapsed, console), groupEnd: Function.prototype.bind.call(console.groupEnd, console), time: Function.prototype.bind.call(console.time, console), - timeEnd: Function.prototype.bind.call(console.timeEnd, console) - // timeStamp: Function.prototype.bind.call(console.timeStamp, console) + timeEnd: Function.prototype.bind.call(console.timeEnd, console), + timeStamp: Function.prototype.bind.call(console.timeStamp, console) }; logLevel.setLogLevel = function (newLevel) { diff --git a/package.json b/package.json index 601fe53b..01d7ee42 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,8 @@ "/js/" ], "testPathIgnorePatterns": [ - "/tests/e2e/global-setup.js" + "/tests/e2e/global-setup.js", + "/tests/e2e/mock-console.js" ] } ] diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js index a8b0278f..415e946d 100644 --- a/tests/e2e/global-setup.js +++ b/tests/e2e/global-setup.js @@ -1,6 +1,7 @@ const jsdom = require("jsdom"); +const config = require("../configs/empty_ipWhiteList"); -exports.startApplication = function (configFilename, exec) { +exports.startApplication = function (configFilename, exec, callback) { jest.resetModules(); // Set config sample for use in test process.env.MM_CONFIG_FILE = configFilename; @@ -8,6 +9,16 @@ exports.startApplication = function (configFilename, exec) { const app = require("app.js"); app.start(); + if (callback) { + const url = "http://" + (config.address || "localhost") + ":" + (config.port || "8080"); + jsdom.JSDOM.fromURL(url, { resources: "usable", runScripts: "dangerously" }).then((dom) => { + dom.window.onload = function () { + global.document = dom.window.document; + callback(); + }; + }); + }; + return app; }; @@ -16,12 +27,3 @@ exports.stopApplication = function (app) { app.stop(); } }; - -exports.getDocument = function (url, callback) { - jsdom.JSDOM.fromURL(url, { resources: "usable", runScripts: "dangerously" }).then((dom) => { - dom.window.onload = function () { - global.document = dom.window.document; - callback(); - }; - }); -}; diff --git a/tests/e2e/modules_display_spec.js b/tests/e2e/modules_display_spec.js index 865748cd..5e07ae19 100644 --- a/tests/e2e/modules_display_spec.js +++ b/tests/e2e/modules_display_spec.js @@ -3,8 +3,7 @@ let app = null; describe("Display of modules", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/modules/display.js"); - helpers.getDocument("http://localhost:8080", done); + app = helpers.startApplication("tests/configs/modules/display.js", null, done); }); afterAll(function () { helpers.stopApplication(app); From c0ce52abe3de3686d448dbace9f0a73fae96cacc Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Fri, 24 Sep 2021 23:39:12 +0200 Subject: [PATCH 13/37] change getDocument, delay needed, now 2 tests moved --- js/logger.js | 6 ++-- tests/configs/modules/positions.js | 10 +++++-- tests/e2e/global-setup.js | 24 +++++++++------- tests/e2e/mock-console.js | 7 ++++- tests/e2e/modules_display_spec.js | 7 +++-- tests/e2e/modules_position_spec.js | 23 +++++++++++++++ tests/electron/modules_display_spec.js | 38 ------------------------- tests/electron/modules_position_spec.js | 38 ------------------------- 8 files changed, 57 insertions(+), 96 deletions(-) create mode 100644 tests/e2e/modules_position_spec.js delete mode 100644 tests/electron/modules_display_spec.js delete mode 100644 tests/electron/modules_position_spec.js diff --git a/js/logger.js b/js/logger.js index 7434ccd2..a42db925 100644 --- a/js/logger.js +++ b/js/logger.js @@ -27,11 +27,11 @@ let enableLog; if (typeof exports === "object") { // in nodejs and not running with jest - enableLog = (process.env.JEST_WORKER_ID === undefined); + enableLog = process.env.JEST_WORKER_ID === undefined; } else { // in browser and not running with jsdom - enableLog = (typeof window === 'object' && window.name === 'nodejs'); - }; + enableLog = typeof window === "object" && window.name === "nodejs"; + } if (enableLog) { logLevel = { diff --git a/tests/configs/modules/positions.js b/tests/configs/modules/positions.js index 479775c8..f4f5c453 100644 --- a/tests/configs/modules/positions.js +++ b/tests/configs/modules/positions.js @@ -3,7 +3,13 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", + timeFormat: 24, + units: "metric", + modules: // Using exotic content. This is why don't accept go to JSON configuration file (function () { @@ -20,7 +26,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } return modules; })() -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js index 415e946d..72bee653 100644 --- a/tests/e2e/global-setup.js +++ b/tests/e2e/global-setup.js @@ -1,7 +1,7 @@ const jsdom = require("jsdom"); const config = require("../configs/empty_ipWhiteList"); -exports.startApplication = function (configFilename, exec, callback) { +exports.startApplication = function (configFilename, exec) { jest.resetModules(); // Set config sample for use in test process.env.MM_CONFIG_FILE = configFilename; @@ -9,16 +9,6 @@ exports.startApplication = function (configFilename, exec, callback) { const app = require("app.js"); app.start(); - if (callback) { - const url = "http://" + (config.address || "localhost") + ":" + (config.port || "8080"); - jsdom.JSDOM.fromURL(url, { resources: "usable", runScripts: "dangerously" }).then((dom) => { - dom.window.onload = function () { - global.document = dom.window.document; - callback(); - }; - }); - }; - return app; }; @@ -27,3 +17,15 @@ exports.stopApplication = function (app) { app.stop(); } }; + +exports.getDocument = function (callback, ms) { + const url = "http://" + (config.address || "localhost") + ":" + (config.port || "8080"); + jsdom.JSDOM.fromURL(url, { resources: "usable", runScripts: "dangerously" }).then((dom) => { + dom.window.onload = function () { + global.document = dom.window.document; + setTimeout(() => { + callback(); + }, ms); + }; + }); +}; diff --git a/tests/e2e/mock-console.js b/tests/e2e/mock-console.js index a1ccfa55..745a8fbb 100644 --- a/tests/e2e/mock-console.js +++ b/tests/e2e/mock-console.js @@ -1,5 +1,10 @@ +/** + * Suppresses errors concerning web server already shut down. + * + * @param {string} err The error message. + */ function myError(err) { - if (err.includes("ECONNREFUSED")) { + if (err.includes("ECONNREFUSED") || err.includes("ECONNRESET") || err.includes("socket hang up")) { jest.fn(); } else { console.dir(err); diff --git a/tests/e2e/modules_display_spec.js b/tests/e2e/modules_display_spec.js index 5e07ae19..055ff8c1 100644 --- a/tests/e2e/modules_display_spec.js +++ b/tests/e2e/modules_display_spec.js @@ -3,21 +3,22 @@ let app = null; describe("Display of modules", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/modules/display.js", null, done); + app = helpers.startApplication("tests/configs/modules/display.js"); + helpers.getDocument(done); }); afterAll(function () { helpers.stopApplication(app); }); it("should show the test header", function () { - elem = document.querySelector("#module_0_helloworld .module-header"); + const elem = document.querySelector("#module_0_helloworld .module-header"); expect(elem).not.toBe(null); // textContent gibt hier lowercase zurück, das uppercase wird durch css realisiert, was daher nicht in textContent landet expect(elem.textContent).toBe("test_header"); }); it("should show no header if no header text is specified", function () { - elem = document.querySelector("#module_1_helloworld .module-header"); + const elem = document.querySelector("#module_1_helloworld .module-header"); expect(elem).not.toBe(null); expect(elem.textContent).toBe("undefined"); }); diff --git a/tests/e2e/modules_position_spec.js b/tests/e2e/modules_position_spec.js new file mode 100644 index 00000000..c23933b0 --- /dev/null +++ b/tests/e2e/modules_position_spec.js @@ -0,0 +1,23 @@ +const helpers = require("./global-setup"); +let app = null; + +describe("Position of modules", function () { + beforeAll(function (done) { + app = helpers.startApplication("tests/configs/modules/positions.js"); + helpers.getDocument(done, 1000); + }); + afterAll(function () { + helpers.stopApplication(app); + }); + + const positions = ["top_bar", "top_left", "top_center", "top_right", "upper_third", "middle_center", "lower_third", "bottom_left", "bottom_center", "bottom_right", "bottom_bar", "fullscreen_above", "fullscreen_below"]; + + for (const position of positions) { + const className = position.replace("_", "."); + it("should show text in " + position, function () { + const elem = document.querySelector("." + className); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("Text in " + position); + }); + } +}); diff --git a/tests/electron/modules_display_spec.js b/tests/electron/modules_display_spec.js deleted file mode 100644 index 6132c62f..00000000 --- a/tests/electron/modules_display_spec.js +++ /dev/null @@ -1,38 +0,0 @@ -const helpers = require("./global-setup"); - -describe("Display of modules", function () { - helpers.setupTimeout(this); - - let app = null; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - afterEach(function () { - return helpers.stopApplication(app); - }); - - describe("Using helloworld", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/display.js"; - }); - - it("should show the test header", async () => { - const elem = await app.client.$("#module_0_helloworld .module-header", 10000); - return expect(await elem.getText("#module_0_helloworld .module-header")).toBe("TEST_HEADER"); - }); - - it("should show no header if no header text is specified", async () => { - const elem = await app.client.$("#module_1_helloworld .module-header", 10000); - return expect(await elem.getText("#module_1_helloworld .module-header")).toBe(""); - }); - }); -}); diff --git a/tests/electron/modules_position_spec.js b/tests/electron/modules_position_spec.js deleted file mode 100644 index 7ac1cadd..00000000 --- a/tests/electron/modules_position_spec.js +++ /dev/null @@ -1,38 +0,0 @@ -const helpers = require("./global-setup"); - -describe("Position of modules", function () { - helpers.setupTimeout(this); - - let app = null; - - describe("Using helloworld", function () { - afterAll(function () { - return helpers.stopApplication(app); - }); - - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/positions.js"; - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - const positions = ["top_bar", "top_left", "top_center", "top_right", "upper_third", "middle_center", "lower_third", "bottom_left", "bottom_center", "bottom_right", "bottom_bar", "fullscreen_above", "fullscreen_below"]; - - for (const position of positions) { - const className = position.replace("_", "."); - it("should show text in " + position, function () { - return app.client.$("." + className).then((result) => { - return result.getText("." + className).then((text) => { - return expect(text).toContain("Text in " + position); - }); - }); - }); - } - }); -}); From 89e803ee426d386796990fb0db958fd5f16c292d Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Sat, 25 Sep 2021 22:12:53 +0200 Subject: [PATCH 14/37] update without_modules.js and env_spec.js --- tests/configs/without_modules.js | 11 ++++++---- tests/e2e/env_spec.js | 11 ++++++++-- tests/e2e/vendor_spec.js | 2 +- tests/e2e/without_modules.js | 24 +++++++++++++++++++++ tests/electron/without_modules.js | 36 ------------------------------- 5 files changed, 41 insertions(+), 43 deletions(-) create mode 100644 tests/e2e/without_modules.js delete mode 100644 tests/electron/without_modules.js diff --git a/tests/configs/without_modules.js b/tests/configs/without_modules.js index 02b767c0..d84f63b7 100644 --- a/tests/configs/without_modules.js +++ b/tests/configs/without_modules.js @@ -3,10 +3,13 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.10.1"] -}); -delete config.modules; +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.10.1"], + language: "en", + timeFormat: 24, + units: "metric", +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js index 825da0e6..65dce883 100644 --- a/tests/e2e/env_spec.js +++ b/tests/e2e/env_spec.js @@ -3,8 +3,9 @@ const helpers = require("./global-setup"); let app = null; describe("Electron app environment", function () { - beforeAll(function () { - app = helpers.startApplication("tests/configs/env.js"); + beforeAll(function (done) { + app = helpers.startApplication("tests/configs/default.js"); + helpers.getDocument(done); }); afterAll(function () { helpers.stopApplication(app); @@ -23,4 +24,10 @@ describe("Electron app environment", function () { done(); }); }); + + it("should show the title MagicMirror²", function () { + const elem = document.querySelector("title"); + expect(elem).not.toBe(null); + expect(elem.textContent).toBe("MagicMirror²"); + }); }); diff --git a/tests/e2e/vendor_spec.js b/tests/e2e/vendor_spec.js index e8dcde11..e28f2d84 100644 --- a/tests/e2e/vendor_spec.js +++ b/tests/e2e/vendor_spec.js @@ -4,7 +4,7 @@ let app = null; describe("Vendors", function () { beforeAll(function () { - app = helpers.startApplication("tests/configs/env.js"); + app = helpers.startApplication("tests/configs/default.js"); }); afterAll(function () { helpers.stopApplication(app); diff --git a/tests/e2e/without_modules.js b/tests/e2e/without_modules.js new file mode 100644 index 00000000..dce6c0b2 --- /dev/null +++ b/tests/e2e/without_modules.js @@ -0,0 +1,24 @@ +const helpers = require("./global-setup"); +let app = null; + +describe("Check configuration without modules", function () { + beforeAll(function (done) { + app = helpers.startApplication("tests/configs/without_modules.js"); + helpers.getDocument(done, 1000); + }); + afterAll(function () { + helpers.stopApplication(app); + }); + + it("Show the message MagicMirror title", function () { + const elem = document.querySelector("#module_1_helloworld .module-content"); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("Magic Mirror2"); + }); + + it("Show the text Michael's website", function () { + const elem = document.querySelector("#module_5_helloworld .module-content"); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("www.michaelteeuw.nl"); + }); +}); diff --git a/tests/electron/without_modules.js b/tests/electron/without_modules.js deleted file mode 100644 index 0214aed7..00000000 --- a/tests/electron/without_modules.js +++ /dev/null @@ -1,36 +0,0 @@ -const helpers = require("./global-setup"); - -describe("Check configuration without modules", function () { - helpers.setupTimeout(this); - - let app = null; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - afterEach(function () { - return helpers.stopApplication(app); - }); - - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/without_modules.js"; - }); - - it("Show the message MagicMirror title", async function () { - const elem = await app.client.$("#module_1_helloworld .module-content"); - return expect(await elem.getText("#module_1_helloworld .module-content")).toBe("Magic Mirror2"); - }); - - it("Show the text Michael's website", async function () { - const elem = await app.client.$("#module_5_helloworld .module-content"); - return expect(await elem.getText("#module_5_helloworld .module-content")).toBe("www.michaelteeuw.nl"); - }); -}); From 0183d7a0809238d6ceafcb9b4dd577f74b8f1316 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Sat, 25 Sep 2021 23:37:37 +0200 Subject: [PATCH 15/37] update modules alert and compliments --- tests/configs/modules/alert/default.js | 10 +- .../compliments/compliments_anytime.js | 8 +- .../modules/compliments/compliments_date.js | 8 +- .../compliments/compliments_only_anytime.js | 8 +- .../compliments/compliments_parts_day.js | 8 +- tests/e2e/compliments_spec.js | 84 ++++++++++++++ tests/e2e/global-setup.js | 8 +- tests/e2e/mock-console.js | 2 +- tests/e2e/modules/alert_spec.js | 18 +++ tests/electron/modules/alert_spec.js | 32 ------ tests/electron/modules/compliments_spec.js | 107 ------------------ 11 files changed, 141 insertions(+), 152 deletions(-) create mode 100644 tests/e2e/compliments_spec.js create mode 100644 tests/e2e/modules/alert_spec.js delete mode 100644 tests/electron/modules/alert_spec.js delete mode 100644 tests/electron/modules/compliments_spec.js diff --git a/tests/configs/modules/alert/default.js b/tests/configs/modules/alert/default.js index b75a41f8..d9c5c968 100644 --- a/tests/configs/modules/alert/default.js +++ b/tests/configs/modules/alert/default.js @@ -3,7 +3,13 @@ * By rejas * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", + timeFormat: 24, + units: "metric", + modules: [ { module: "alert", @@ -13,7 +19,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/compliments/compliments_anytime.js b/tests/configs/modules/compliments/compliments_anytime.js index f6731edf..813bd32c 100644 --- a/tests/configs/modules/compliments/compliments_anytime.js +++ b/tests/configs/modules/compliments/compliments_anytime.js @@ -3,8 +3,12 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -20,7 +24,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/compliments/compliments_date.js b/tests/configs/modules/compliments/compliments_date.js index c9549816..bf0ae2da 100644 --- a/tests/configs/modules/compliments/compliments_date.js +++ b/tests/configs/modules/compliments/compliments_date.js @@ -3,8 +3,12 @@ * By Rejas * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -21,7 +25,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/compliments/compliments_only_anytime.js b/tests/configs/modules/compliments/compliments_only_anytime.js index d65bc67d..6e52f57e 100644 --- a/tests/configs/modules/compliments/compliments_only_anytime.js +++ b/tests/configs/modules/compliments/compliments_only_anytime.js @@ -3,8 +3,12 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -17,7 +21,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/compliments/compliments_parts_day.js b/tests/configs/modules/compliments/compliments_parts_day.js index e490a710..89b06814 100644 --- a/tests/configs/modules/compliments/compliments_parts_day.js +++ b/tests/configs/modules/compliments/compliments_parts_day.js @@ -3,8 +3,12 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -19,7 +23,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/e2e/compliments_spec.js b/tests/e2e/compliments_spec.js new file mode 100644 index 00000000..aefb273e --- /dev/null +++ b/tests/e2e/compliments_spec.js @@ -0,0 +1,84 @@ +const helpers = require("../global-setup"); +let app = null; + +doTest = function (complimentsArray) { + let elem = document.querySelector(".compliments"); + expect(elem).not.toBe(null); + elem = document.querySelector(".module-content"); + expect(elem).not.toBe(null); + expect(complimentsArray).toContain(elem.textContent); +}; + +describe("Compliments module", function () { + afterAll(function () { + helpers.stopApplication(app); + }); + + describe("parts of days", function () { + beforeAll(function (done) { + app = helpers.startApplication("tests/configs/modules/compliments/compliments_parts_day.js"); + helpers.getDocument(done, 1000); + }); + + it("if Morning compliments for that part of day", function () { + const hour = new Date().getHours(); + if (hour >= 3 && hour < 12) { + // if morning check + doTest(["Hi", "Good Morning", "Morning test"]); + } + }); + + it("if Afternoon show Compliments for that part of day", function () { + const hour = new Date().getHours(); + if (hour >= 12 && hour < 17) { + // if afternoon check + doTest(["Hello", "Good Afternoon", "Afternoon test"]); + } + }); + + it("if Evening show Compliments for that part of day", function () { + const hour = new Date().getHours(); + if (!(hour >= 3 && hour < 12) && !(hour >= 12 && hour < 17)) { + // if evening check + doTest(["Hello There", "Good Evening", "Evening test"]); + } + }); + }); + + describe("Feature anytime in compliments module", function () { + describe("Set anytime and empty compliments for morning, evening and afternoon ", function () { + beforeAll(function (done) { + app = helpers.startApplication("tests/configs/modules/compliments/compliments_anytime.js"); + helpers.getDocument(done, 1000); + }); + + it("Show anytime because if configure empty parts of day compliments and set anytime compliments", async function () { + doTest(["Anytime here"]); + }); + }); + + describe("Only anytime present in configuration compliments", function () { + beforeAll(function (done) { + app = helpers.startApplication("tests/configs/modules/compliments/compliments_only_anytime.js"); + helpers.getDocument(done, 1000); + }); + + it("Show anytime compliments", async function () { + doTest(["Anytime here"]); + }); + }); + }); + + describe("Feature date in compliments module", function () { + describe("Set date and empty compliments for anytime, morning, evening and afternoon", function () { + beforeAll(function (done) { + app = helpers.startApplication("tests/configs/modules/compliments/compliments_date.js"); + helpers.getDocument(done, 1000); + }); + + it("Show happy new year compliment on new years day", async function () { + doTest(["Happy new year!"]); + }); + }); + }); +}); diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js index 72bee653..918047fe 100644 --- a/tests/e2e/global-setup.js +++ b/tests/e2e/global-setup.js @@ -3,12 +3,16 @@ const config = require("../configs/empty_ipWhiteList"); exports.startApplication = function (configFilename, exec) { jest.resetModules(); + let app = global.app; + if (app) { + app.stop(); + } // Set config sample for use in test process.env.MM_CONFIG_FILE = configFilename; if (exec) exec; - const app = require("app.js"); + app = require("app.js"); app.start(); - + global.app = app; return app; }; diff --git a/tests/e2e/mock-console.js b/tests/e2e/mock-console.js index 745a8fbb..03402a05 100644 --- a/tests/e2e/mock-console.js +++ b/tests/e2e/mock-console.js @@ -4,7 +4,7 @@ * @param {string} err The error message. */ function myError(err) { - if (err.includes("ECONNREFUSED") || err.includes("ECONNRESET") || err.includes("socket hang up")) { + if (err.includes("ECONNREFUSED") || err.includes("ECONNRESET") || err.includes("socket hang up") || err.includes("exports is not defined")) { jest.fn(); } else { console.dir(err); diff --git a/tests/e2e/modules/alert_spec.js b/tests/e2e/modules/alert_spec.js new file mode 100644 index 00000000..19f657a2 --- /dev/null +++ b/tests/e2e/modules/alert_spec.js @@ -0,0 +1,18 @@ +const helpers = require("../global-setup"); +let app = null; + +describe("Alert module", function () { + beforeAll(function (done) { + app = helpers.startApplication("tests/configs/modules/alert/default.js"); + helpers.getDocument(done, 1000); + }); + afterAll(function () { + helpers.stopApplication(app); + }); + + it("should show the welcome message", function () { + const elem = document.querySelector(".ns-box .ns-box-inner .light.bright.small"); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("Welcome, start was successful!"); + }); +}); diff --git a/tests/electron/modules/alert_spec.js b/tests/electron/modules/alert_spec.js deleted file mode 100644 index 12e724f0..00000000 --- a/tests/electron/modules/alert_spec.js +++ /dev/null @@ -1,32 +0,0 @@ -const helpers = require("../global-setup"); - -describe("Alert module", function () { - helpers.setupTimeout(this); - - let app = null; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - afterEach(function () { - return helpers.stopApplication(app); - }); - - describe("Default configuration", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/alert/default.js"; - }); - - it("should show the welcome message", function () { - return app.client.waitUntilTextExists(".ns-box .ns-box-inner .light.bright.small", "Welcome, start was successful!", 10000); - }); - }); -}); diff --git a/tests/electron/modules/compliments_spec.js b/tests/electron/modules/compliments_spec.js deleted file mode 100644 index 81c6e982..00000000 --- a/tests/electron/modules/compliments_spec.js +++ /dev/null @@ -1,107 +0,0 @@ -const helpers = require("../global-setup"); - -describe("Compliments module", function () { - helpers.setupTimeout(this); - - let app = null; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - afterEach(function () { - return helpers.stopApplication(app); - }); - - describe("parts of days", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/compliments/compliments_parts_day.js"; - }); - - it("if Morning compliments for that part of day", async function () { - const hour = new Date().getHours(); - if (hour >= 3 && hour < 12) { - // if morning check - const elem = await app.client.$(".compliments"); - return elem.getText(".compliments").then(function (text) { - expect(["Hi", "Good Morning", "Morning test"]).toContain(text); - }); - } - }); - - it("if Afternoon show Compliments for that part of day", async function () { - const hour = new Date().getHours(); - if (hour >= 12 && hour < 17) { - // if afternoon check - const elem = await app.client.$(".compliments"); - return elem.getText(".compliments").then(function (text) { - expect(["Hello", "Good Afternoon", "Afternoon test"]).toContain(text); - }); - } - }); - - it("if Evening show Compliments for that part of day", async function () { - const hour = new Date().getHours(); - if (!(hour >= 3 && hour < 12) && !(hour >= 12 && hour < 17)) { - // if evening check - const elem = await app.client.$(".compliments"); - return elem.getText(".compliments").then(function (text) { - expect(["Hello There", "Good Evening", "Evening test"]).toContain(text); - }); - } - }); - }); - - describe("Feature anytime in compliments module", function () { - describe("Set anytime and empty compliments for morning, evening and afternoon ", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/compliments/compliments_anytime.js"; - }); - - it("Show anytime because if configure empty parts of day compliments and set anytime compliments", async function () { - const elem = await app.client.$(".compliments"); - return elem.getText(".compliments").then(function (text) { - expect(["Anytime here"]).toContain(text); - }); - }); - }); - - describe("Only anytime present in configuration compliments", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/compliments/compliments_only_anytime.js"; - }); - - it("Show anytime compliments", async function () { - const elem = await app.client.$(".compliments"); - return elem.getText(".compliments").then(function (text) { - expect(["Anytime here"]).toContain(text); - }); - }); - }); - }); - - describe("Feature date in compliments module", function () { - describe("Set date and empty compliments for anytime, morning, evening and afternoon", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/compliments/compliments_date.js"; - }); - - it("Show happy new year compliment on new years day", async function () { - const elem = await app.client.$(".compliments"); - return elem.getText(".compliments").then(function (text) { - expect(["Happy new year!"]).toContain(text); - }); - }); - }); - }); -}); From 6595b6a44f92ed7c2bc26dcd423869c4f6115119 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Sat, 25 Sep 2021 23:45:34 +0200 Subject: [PATCH 16/37] refactor global-setup.js --- tests/e2e/env_spec.js | 5 ++--- tests/e2e/fonts.js | 5 ++--- tests/e2e/global-setup.js | 17 +++++++---------- tests/e2e/ipWhitelist_spec.js | 9 ++++----- tests/e2e/modules/alert_spec.js | 5 ++--- tests/e2e/{ => modules}/compliments_spec.js | 11 +++++------ tests/e2e/modules_display_spec.js | 5 ++--- tests/e2e/modules_position_spec.js | 5 ++--- tests/e2e/port_config.js | 9 ++++----- tests/e2e/vendor_spec.js | 5 ++--- tests/e2e/without_modules.js | 5 ++--- 11 files changed, 34 insertions(+), 47 deletions(-) rename tests/e2e/{ => modules}/compliments_spec.js (83%) diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js index 65dce883..b2a7238a 100644 --- a/tests/e2e/env_spec.js +++ b/tests/e2e/env_spec.js @@ -1,14 +1,13 @@ const fetch = require("node-fetch"); const helpers = require("./global-setup"); -let app = null; describe("Electron app environment", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/default.js"); + helpers.startApplication("tests/configs/default.js"); helpers.getDocument(done); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); it("get request from http://localhost:8080 should return 200", function (done) { diff --git a/tests/e2e/fonts.js b/tests/e2e/fonts.js index 105b9977..54cd2d87 100644 --- a/tests/e2e/fonts.js +++ b/tests/e2e/fonts.js @@ -1,6 +1,5 @@ const fetch = require("node-fetch"); const helpers = require("./global-setup"); -let app = null; describe("All font files from roboto.css should be downloadable", function () { const fontFiles = []; @@ -16,10 +15,10 @@ describe("All font files from roboto.css should be downloadable", function () { } beforeAll(function () { - app = helpers.startApplication("tests/configs/without_modules.js"); + helpers.startApplication("tests/configs/without_modules.js"); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); test.each(fontFiles)("should return 200 HTTP code for file '%s'", (fontFile, done) => { diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js index 918047fe..e524d47c 100644 --- a/tests/e2e/global-setup.js +++ b/tests/e2e/global-setup.js @@ -3,22 +3,19 @@ const config = require("../configs/empty_ipWhiteList"); exports.startApplication = function (configFilename, exec) { jest.resetModules(); - let app = global.app; - if (app) { - app.stop(); + if (global.app) { + global.app.stop(); } // Set config sample for use in test process.env.MM_CONFIG_FILE = configFilename; if (exec) exec; - app = require("app.js"); - app.start(); - global.app = app; - return app; + global.app = require("app.js"); + global.app.start(); }; -exports.stopApplication = function (app) { - if (app) { - app.stop(); +exports.stopApplication = function () { + if (global.app) { + global.app.stop(); } }; diff --git a/tests/e2e/ipWhitelist_spec.js b/tests/e2e/ipWhitelist_spec.js index eba92a3e..b518cfff 100644 --- a/tests/e2e/ipWhitelist_spec.js +++ b/tests/e2e/ipWhitelist_spec.js @@ -1,14 +1,13 @@ const fetch = require("node-fetch"); const helpers = require("./global-setup"); -let app = null; describe("ipWhitelist directive configuration", function () { describe("Set ipWhitelist without access", function () { beforeAll(function () { - app = helpers.startApplication("tests/configs/noIpWhiteList.js"); + helpers.startApplication("tests/configs/noIpWhiteList.js"); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); it("should return 403", function (done) { @@ -21,10 +20,10 @@ describe("ipWhitelist directive configuration", function () { describe("Set ipWhitelist []", function () { beforeAll(function () { - app = helpers.startApplication("tests/configs/empty_ipWhiteList.js"); + helpers.startApplication("tests/configs/empty_ipWhiteList.js"); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); it("should return 200", function (done) { diff --git a/tests/e2e/modules/alert_spec.js b/tests/e2e/modules/alert_spec.js index 19f657a2..a557acc5 100644 --- a/tests/e2e/modules/alert_spec.js +++ b/tests/e2e/modules/alert_spec.js @@ -1,13 +1,12 @@ const helpers = require("../global-setup"); -let app = null; describe("Alert module", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/modules/alert/default.js"); + helpers.startApplication("tests/configs/modules/alert/default.js"); helpers.getDocument(done, 1000); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); it("should show the welcome message", function () { diff --git a/tests/e2e/compliments_spec.js b/tests/e2e/modules/compliments_spec.js similarity index 83% rename from tests/e2e/compliments_spec.js rename to tests/e2e/modules/compliments_spec.js index aefb273e..6c0a2211 100644 --- a/tests/e2e/compliments_spec.js +++ b/tests/e2e/modules/compliments_spec.js @@ -1,5 +1,4 @@ const helpers = require("../global-setup"); -let app = null; doTest = function (complimentsArray) { let elem = document.querySelector(".compliments"); @@ -11,12 +10,12 @@ doTest = function (complimentsArray) { describe("Compliments module", function () { afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); describe("parts of days", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/modules/compliments/compliments_parts_day.js"); + helpers.startApplication("tests/configs/modules/compliments/compliments_parts_day.js"); helpers.getDocument(done, 1000); }); @@ -48,7 +47,7 @@ describe("Compliments module", function () { describe("Feature anytime in compliments module", function () { describe("Set anytime and empty compliments for morning, evening and afternoon ", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/modules/compliments/compliments_anytime.js"); + helpers.startApplication("tests/configs/modules/compliments/compliments_anytime.js"); helpers.getDocument(done, 1000); }); @@ -59,7 +58,7 @@ describe("Compliments module", function () { describe("Only anytime present in configuration compliments", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/modules/compliments/compliments_only_anytime.js"); + helpers.startApplication("tests/configs/modules/compliments/compliments_only_anytime.js"); helpers.getDocument(done, 1000); }); @@ -72,7 +71,7 @@ describe("Compliments module", function () { describe("Feature date in compliments module", function () { describe("Set date and empty compliments for anytime, morning, evening and afternoon", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/modules/compliments/compliments_date.js"); + helpers.startApplication("tests/configs/modules/compliments/compliments_date.js"); helpers.getDocument(done, 1000); }); diff --git a/tests/e2e/modules_display_spec.js b/tests/e2e/modules_display_spec.js index 055ff8c1..4042e810 100644 --- a/tests/e2e/modules_display_spec.js +++ b/tests/e2e/modules_display_spec.js @@ -1,13 +1,12 @@ const helpers = require("./global-setup"); -let app = null; describe("Display of modules", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/modules/display.js"); + helpers.startApplication("tests/configs/modules/display.js"); helpers.getDocument(done); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); it("should show the test header", function () { diff --git a/tests/e2e/modules_position_spec.js b/tests/e2e/modules_position_spec.js index c23933b0..79b9b96f 100644 --- a/tests/e2e/modules_position_spec.js +++ b/tests/e2e/modules_position_spec.js @@ -1,13 +1,12 @@ const helpers = require("./global-setup"); -let app = null; describe("Position of modules", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/modules/positions.js"); + helpers.startApplication("tests/configs/modules/positions.js"); helpers.getDocument(done, 1000); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); const positions = ["top_bar", "top_left", "top_center", "top_right", "upper_third", "middle_center", "lower_third", "bottom_left", "bottom_center", "bottom_right", "bottom_bar", "fullscreen_above", "fullscreen_below"]; diff --git a/tests/e2e/port_config.js b/tests/e2e/port_config.js index 6f6756a4..329acab6 100644 --- a/tests/e2e/port_config.js +++ b/tests/e2e/port_config.js @@ -1,14 +1,13 @@ const fetch = require("node-fetch"); const helpers = require("./global-setup"); -let app = null; describe("port directive configuration", function () { describe("Set port 8090", function () { beforeAll(function () { - app = helpers.startApplication("tests/configs/port_8090.js"); + helpers.startApplication("tests/configs/port_8090.js"); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); it("should return 200", function (done) { @@ -21,10 +20,10 @@ describe("port directive configuration", function () { describe("Set port 8100 on environment variable MM_PORT", function () { beforeAll(function () { - app = helpers.startApplication("tests/configs/port_8090.js", (process.env.MM_PORT = 8100)); + helpers.startApplication("tests/configs/port_8090.js", (process.env.MM_PORT = 8100)); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); it("should return 200", function (done) { diff --git a/tests/e2e/vendor_spec.js b/tests/e2e/vendor_spec.js index e28f2d84..f6917c0d 100644 --- a/tests/e2e/vendor_spec.js +++ b/tests/e2e/vendor_spec.js @@ -1,13 +1,12 @@ const fetch = require("node-fetch"); const helpers = require("./global-setup"); -let app = null; describe("Vendors", function () { beforeAll(function () { - app = helpers.startApplication("tests/configs/default.js"); + helpers.startApplication("tests/configs/default.js"); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); describe("Get list vendors", function () { diff --git a/tests/e2e/without_modules.js b/tests/e2e/without_modules.js index dce6c0b2..8aeeee28 100644 --- a/tests/e2e/without_modules.js +++ b/tests/e2e/without_modules.js @@ -1,13 +1,12 @@ const helpers = require("./global-setup"); -let app = null; describe("Check configuration without modules", function () { beforeAll(function (done) { - app = helpers.startApplication("tests/configs/without_modules.js"); + helpers.startApplication("tests/configs/without_modules.js"); helpers.getDocument(done, 1000); }); afterAll(function () { - helpers.stopApplication(app); + helpers.stopApplication(); }); it("Show the message MagicMirror title", function () { From e0906f3462b34e70fc3ae6d7f763e387484ac3d9 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Sat, 25 Sep 2021 23:51:32 +0200 Subject: [PATCH 17/37] update module helloworld --- .../configs/modules/helloworld/helloworld.js | 10 ++++- .../modules/helloworld/helloworld_default.js | 10 ++++- tests/e2e/modules/helloworld_spec.js | 33 ++++++++++++++ tests/electron/modules/helloworld_spec.js | 45 ------------------- 4 files changed, 49 insertions(+), 49 deletions(-) create mode 100644 tests/e2e/modules/helloworld_spec.js delete mode 100644 tests/electron/modules/helloworld_spec.js diff --git a/tests/configs/modules/helloworld/helloworld.js b/tests/configs/modules/helloworld/helloworld.js index 9845e4b8..a1d48278 100644 --- a/tests/configs/modules/helloworld/helloworld.js +++ b/tests/configs/modules/helloworld/helloworld.js @@ -3,7 +3,13 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", + timeFormat: 24, + units: "metric", + modules: [ { module: "helloworld", @@ -13,7 +19,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/helloworld/helloworld_default.js b/tests/configs/modules/helloworld/helloworld_default.js index 6400c9f7..5678488d 100644 --- a/tests/configs/modules/helloworld/helloworld_default.js +++ b/tests/configs/modules/helloworld/helloworld_default.js @@ -3,14 +3,20 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", + timeFormat: 24, + units: "metric", + modules: [ { module: "helloworld", position: "bottom_bar" } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/e2e/modules/helloworld_spec.js b/tests/e2e/modules/helloworld_spec.js new file mode 100644 index 00000000..8c11575a --- /dev/null +++ b/tests/e2e/modules/helloworld_spec.js @@ -0,0 +1,33 @@ +const helpers = require("../global-setup"); + +describe("Test helloworld module", function () { + afterAll(function () { + helpers.stopApplication(); + }); + + describe("helloworld set config text", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/helloworld/helloworld.js"); + helpers.getDocument(done, 1000); + }); + + it("Test message helloworld module", async function () { + const elem = document.querySelector(".helloworld"); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("Test HelloWorld Module"); + }); + }); + + describe("helloworld default config text", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/helloworld/helloworld_default.js"); + helpers.getDocument(done, 1000); + }); + + it("Test message helloworld module", async function () { + const elem = document.querySelector(".helloworld"); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("Hello World!"); + }); + }); +}); diff --git a/tests/electron/modules/helloworld_spec.js b/tests/electron/modules/helloworld_spec.js deleted file mode 100644 index 95ee1a2d..00000000 --- a/tests/electron/modules/helloworld_spec.js +++ /dev/null @@ -1,45 +0,0 @@ -const helpers = require("../global-setup"); - -describe("Test helloworld module", function () { - helpers.setupTimeout(this); - - let app = null; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - afterEach(function () { - return helpers.stopApplication(app); - }); - - describe("helloworld set config text", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/helloworld/helloworld.js"; - }); - - it("Test message helloworld module", async function () { - const elem = await app.client.$(".helloworld"); - return expect(await elem.getText(".helloworld")).toBe("Test HelloWorld Module"); - }); - }); - - describe("helloworld default config text", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/helloworld/helloworld_default.js"; - }); - - it("Test message helloworld module", async function () { - const elem = await app.client.$(".helloworld"); - return expect(await elem.getText(".helloworld")).toBe("Hello World!"); - }); - }); -}); From d831315e20262334af3dc145a954c0fb6bc46e12 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Sun, 26 Sep 2021 00:06:06 +0200 Subject: [PATCH 18/37] update module newsfeed --- tests/configs/modules/newsfeed/default.js | 8 ++- .../configs/modules/newsfeed/incorrect_url.js | 8 ++- .../modules/newsfeed/prohibited_words.js | 8 ++- tests/e2e/modules/newsfeed_spec.js | 63 +++++++++++++++++ tests/electron/modules/newsfeed_spec.js | 67 ------------------- 5 files changed, 81 insertions(+), 73 deletions(-) create mode 100644 tests/e2e/modules/newsfeed_spec.js delete mode 100644 tests/electron/modules/newsfeed_spec.js diff --git a/tests/configs/modules/newsfeed/default.js b/tests/configs/modules/newsfeed/default.js index 1a112566..160212f1 100644 --- a/tests/configs/modules/newsfeed/default.js +++ b/tests/configs/modules/newsfeed/default.js @@ -3,8 +3,12 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -20,7 +24,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/newsfeed/incorrect_url.js b/tests/configs/modules/newsfeed/incorrect_url.js index ab126aa4..bdaa0341 100644 --- a/tests/configs/modules/newsfeed/incorrect_url.js +++ b/tests/configs/modules/newsfeed/incorrect_url.js @@ -2,8 +2,12 @@ * * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -19,7 +23,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/newsfeed/prohibited_words.js b/tests/configs/modules/newsfeed/prohibited_words.js index f4040557..55c71e29 100644 --- a/tests/configs/modules/newsfeed/prohibited_words.js +++ b/tests/configs/modules/newsfeed/prohibited_words.js @@ -2,8 +2,12 @@ * * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -21,7 +25,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/e2e/modules/newsfeed_spec.js b/tests/e2e/modules/newsfeed_spec.js new file mode 100644 index 00000000..0b2869e2 --- /dev/null +++ b/tests/e2e/modules/newsfeed_spec.js @@ -0,0 +1,63 @@ +const helpers = require("../global-setup"); + +describe("Newsfeed module", function () { + afterAll(function () { + helpers.stopApplication(); + }); + + describe("Default configuration", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/newsfeed/default.js"); + helpers.getDocument(done, 3000); + }); + + it("should show the newsfeed title", function () { + const elem = document.querySelector(".newsfeed .newsfeed-source"); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("Rodrigo Ramirez Blog"); + }); + + it("should show the newsfeed article", function () { + const elem = document.querySelector(".newsfeed .newsfeed-title"); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("QPanel"); + }); + + it("should NOT show the newsfeed description", async () => { + const elem = document.querySelector(".newsfeed .newsfeed-desc"); + expect(elem).toBe(null); + }); + }); + + describe("Custom configuration", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/newsfeed/prohibited_words.js"); + helpers.getDocument(done, 3000); + }); + + it("should not show articles with prohibited words", function () { + const elem = document.querySelector(".newsfeed .newsfeed-title"); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("Problema VirtualBox"); + }); + + it("should show the newsfeed description", async () => { + const elem = document.querySelector(".newsfeed .newsfeed-desc"); + expect(elem).not.toBe(null); + expect(elem.textContent.length).not.toBe(0); + }); + }); + + describe("Invalid configuration", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/newsfeed/incorrect_url.js"); + helpers.getDocument(done, 3000); + }); + + it("should show malformed url warning", function () { + const elem = document.querySelector(".newsfeed .small"); + expect(elem).not.toBe(null); + expect(elem.textContent).toContain("Error in the Newsfeed module. Malformed url."); + }); + }); +}); diff --git a/tests/electron/modules/newsfeed_spec.js b/tests/electron/modules/newsfeed_spec.js deleted file mode 100644 index fe544a0b..00000000 --- a/tests/electron/modules/newsfeed_spec.js +++ /dev/null @@ -1,67 +0,0 @@ -const helpers = require("../global-setup"); - -describe("Newsfeed module", function () { - helpers.setupTimeout(this); - - let app = null; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - afterEach(function () { - return helpers.stopApplication(app); - }); - - describe("Default configuration", function () { - beforeAll(function () { - process.env.MM_CONFIG_FILE = "tests/configs/modules/newsfeed/default.js"; - }); - - it("should show the newsfeed title", function () { - return app.client.waitUntilTextExists(".newsfeed .newsfeed-source", "Rodrigo Ramirez Blog", 10000); - }); - - it("should show the newsfeed article", function () { - return app.client.waitUntilTextExists(".newsfeed .newsfeed-title", "QPanel", 10000); - }); - - it("should NOT show the newsfeed description", async () => { - await app.client.waitUntilTextExists(".newsfeed .newsfeed-title", "QPanel", 10000); - const events = await app.client.$$(".newsfeed .newsfeed-desc"); - return expect(events.length).toBe(0); - }); - }); - - describe("Custom configuration", function () { - beforeAll(function () { - process.env.MM_CONFIG_FILE = "tests/configs/modules/newsfeed/prohibited_words.js"; - }); - - it("should not show articles with prohibited words", function () { - return app.client.waitUntilTextExists(".newsfeed .newsfeed-title", "Problema VirtualBox", 10000); - }); - - it("should show the newsfeed description", async () => { - await app.client.waitUntilTextExists(".newsfeed .newsfeed-title", "Problema VirtualBox", 10000); - const events = await app.client.$$(".newsfeed .newsfeed-desc"); - return expect(events.length).toBe(1); - }); - }); - - describe("Invalid configuration", function () { - beforeAll(function () { - process.env.MM_CONFIG_FILE = "tests/configs/modules/newsfeed/incorrect_url.js"; - }); - - it("should show malformed url warning", function () { - return app.client.waitUntilTextExists(".newsfeed .small", "Error in the Newsfeed module. Malformed url.", 10000); - }); - }); -}); From 385e5aabaaf59ff9750eb938bf68ef6bbb709427 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Sun, 26 Sep 2021 00:29:03 +0200 Subject: [PATCH 19/37] prettier --- tests/configs/without_modules.js | 2 +- tests/e2e/modules/compliments_spec.js | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/configs/without_modules.js b/tests/configs/without_modules.js index d84f63b7..9cc097ae 100644 --- a/tests/configs/without_modules.js +++ b/tests/configs/without_modules.js @@ -8,7 +8,7 @@ let config = { ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.10.1"], language: "en", timeFormat: 24, - units: "metric", + units: "metric" }; /*************** DO NOT EDIT THE LINE BELOW ***************/ diff --git a/tests/e2e/modules/compliments_spec.js b/tests/e2e/modules/compliments_spec.js index 6c0a2211..0f3b74e8 100644 --- a/tests/e2e/modules/compliments_spec.js +++ b/tests/e2e/modules/compliments_spec.js @@ -1,12 +1,17 @@ const helpers = require("../global-setup"); -doTest = function (complimentsArray) { +/** + * move similar tests in function doTest + * + * @param {Array} complimentsArray The array of compliments. + */ +function doTest(complimentsArray) { let elem = document.querySelector(".compliments"); expect(elem).not.toBe(null); elem = document.querySelector(".module-content"); expect(elem).not.toBe(null); expect(complimentsArray).toContain(elem.textContent); -}; +} describe("Compliments module", function () { afterAll(function () { From a4a8504558132259c886d641cbd202203da22863 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Sun, 26 Sep 2021 21:58:59 +0200 Subject: [PATCH 20/37] update module clock --- tests/configs/modules/clock/clock_12hr.js | 8 +- tests/configs/modules/clock/clock_24hr.js | 10 +- tests/configs/modules/clock/clock_analog.js | 10 +- .../clock/clock_displaySeconds_false.js | 8 +- .../modules/clock/clock_showPeriodUpper.js | 8 +- tests/configs/modules/clock/clock_showTime.js | 8 +- tests/configs/modules/clock/clock_showWeek.js | 8 +- tests/e2e/modules/clock_spec.js | 116 +++++++++++++++ tests/e2e/modules/compliments_spec.js | 6 +- tests/e2e/modules/helloworld_spec.js | 4 +- tests/e2e/modules/newsfeed_spec.js | 4 +- tests/electron/modules/clock_spec.js | 134 ------------------ 12 files changed, 169 insertions(+), 155 deletions(-) create mode 100644 tests/e2e/modules/clock_spec.js delete mode 100644 tests/electron/modules/clock_spec.js diff --git a/tests/configs/modules/clock/clock_12hr.js b/tests/configs/modules/clock/clock_12hr.js index 35b45914..cb3563c7 100644 --- a/tests/configs/modules/clock/clock_12hr.js +++ b/tests/configs/modules/clock/clock_12hr.js @@ -3,8 +3,12 @@ * By Sergey Morozov * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -12,7 +16,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( position: "middle_center" } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/clock/clock_24hr.js b/tests/configs/modules/clock/clock_24hr.js index 01b2a36b..f77a600d 100644 --- a/tests/configs/modules/clock/clock_24hr.js +++ b/tests/configs/modules/clock/clock_24hr.js @@ -3,14 +3,20 @@ * By Sergey Morozov * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", + timeFormat: 24, + units: "metric", + modules: [ { module: "clock", position: "middle_center" } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/clock/clock_analog.js b/tests/configs/modules/clock/clock_analog.js index b33bd051..7f1353c6 100644 --- a/tests/configs/modules/clock/clock_analog.js +++ b/tests/configs/modules/clock/clock_analog.js @@ -2,7 +2,13 @@ * * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", + timeFormat: 24, + units: "metric", + modules: [ { module: "clock", @@ -13,7 +19,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/clock/clock_displaySeconds_false.js b/tests/configs/modules/clock/clock_displaySeconds_false.js index 1caef7e3..4e872377 100644 --- a/tests/configs/modules/clock/clock_displaySeconds_false.js +++ b/tests/configs/modules/clock/clock_displaySeconds_false.js @@ -3,8 +3,12 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -15,7 +19,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/clock/clock_showPeriodUpper.js b/tests/configs/modules/clock/clock_showPeriodUpper.js index b069c438..7ff7f20a 100644 --- a/tests/configs/modules/clock/clock_showPeriodUpper.js +++ b/tests/configs/modules/clock/clock_showPeriodUpper.js @@ -3,8 +3,12 @@ * By Sergey Morozov * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -15,7 +19,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/clock/clock_showTime.js b/tests/configs/modules/clock/clock_showTime.js index 93dd83de..2c130fb2 100644 --- a/tests/configs/modules/clock/clock_showTime.js +++ b/tests/configs/modules/clock/clock_showTime.js @@ -3,8 +3,12 @@ * By Johan Hammar * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -15,7 +19,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/clock/clock_showWeek.js b/tests/configs/modules/clock/clock_showWeek.js index b595ba70..1db31cb6 100644 --- a/tests/configs/modules/clock/clock_showWeek.js +++ b/tests/configs/modules/clock/clock_showWeek.js @@ -3,8 +3,12 @@ * By Johan Hammar * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], + language: "en", timeFormat: 12, + units: "metric", modules: [ { @@ -15,7 +19,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/e2e/modules/clock_spec.js b/tests/e2e/modules/clock_spec.js new file mode 100644 index 00000000..79e26f47 --- /dev/null +++ b/tests/e2e/modules/clock_spec.js @@ -0,0 +1,116 @@ +const helpers = require("../global-setup"); +const moment = require("moment"); + +describe("Clock module", function () { + afterAll(function () { + helpers.stopApplication(); + }); + + const testMatch = function (element, regex) { + const elem = document.querySelector(element); + expect(elem).not.toBe(null); + expect(elem.textContent).toMatch(regex); + }; + + describe("with default 24hr clock config", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/clock_24hr.js"); + helpers.getDocument(done, 1000); + }); + + it("should show the date in the correct format", function () { + const dateRegex = /^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}$/; + testMatch(".clock .date", dateRegex); + }); + + it("should show the time in 24hr format", function () { + const timeRegex = /^(?:2[0-3]|[01]\d):[0-5]\d[0-5]\d$/; + testMatch(".clock .time", timeRegex); + }); + }); + + describe("with default 12hr clock config", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/clock_12hr.js"); + helpers.getDocument(done, 1000); + }); + + it("should show the date in the correct format", function () { + const dateRegex = /^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}$/; + testMatch(".clock .date", dateRegex); + }); + + it("should show the time in 12hr format", function () { + const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[ap]m$/; + testMatch(".clock .time", timeRegex); + }); + }); + + describe("with showPeriodUpper config enabled", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/clock_showPeriodUpper.js"); + helpers.getDocument(done, 1000); + }); + + it("should show 12hr time with upper case AM/PM", function () { + const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[AP]M$/; + testMatch(".clock .time", timeRegex); + }); + }); + + describe("with displaySeconds config disabled", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/clock_displaySeconds_false.js"); + helpers.getDocument(done, 1000); + }); + + it("should show 12hr time without seconds am/pm", function () { + const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[ap]m$/; + testMatch(".clock .time", timeRegex); + }); + }); + + describe("with showTime config disabled", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/clock_showTime.js"); + helpers.getDocument(done, 1000); + }); + + it("should show not show the time when digital clock is shown", function () { + const elem = document.querySelector(".clock .digital .time"); + expect(elem).toBe(null); + }); + }); + + describe("with showWeek config enabled", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/clock_showWeek.js"); + helpers.getDocument(done, 1000); + }); + + it("should show the week in the correct format", function () { + const weekRegex = /^Week [0-9]{1,2}$/; + testMatch(".clock .week", weekRegex); + }); + + it("should show the week with the correct number of week of year", function () { + const currentWeekNumber = moment().week(); + const weekToShow = "Week " + currentWeekNumber; + const elem = document.querySelector(".clock .week"); + expect(elem).not.toBe(null); + expect(elem.textContent).toBe(weekToShow); + }); + }); + + describe("with analog clock face enabled", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/clock_analog.js"); + helpers.getDocument(done, 1000); + }); + + it("should show the analog clock face", () => { + const elem = document.querySelector(".clockCircle"); + expect(elem).not.toBe(null); + }); + }); +}); diff --git a/tests/e2e/modules/compliments_spec.js b/tests/e2e/modules/compliments_spec.js index 0f3b74e8..73f851c5 100644 --- a/tests/e2e/modules/compliments_spec.js +++ b/tests/e2e/modules/compliments_spec.js @@ -56,7 +56,7 @@ describe("Compliments module", function () { helpers.getDocument(done, 1000); }); - it("Show anytime because if configure empty parts of day compliments and set anytime compliments", async function () { + it("Show anytime because if configure empty parts of day compliments and set anytime compliments", function () { doTest(["Anytime here"]); }); }); @@ -67,7 +67,7 @@ describe("Compliments module", function () { helpers.getDocument(done, 1000); }); - it("Show anytime compliments", async function () { + it("Show anytime compliments", function () { doTest(["Anytime here"]); }); }); @@ -80,7 +80,7 @@ describe("Compliments module", function () { helpers.getDocument(done, 1000); }); - it("Show happy new year compliment on new years day", async function () { + it("Show happy new year compliment on new years day", function () { doTest(["Happy new year!"]); }); }); diff --git a/tests/e2e/modules/helloworld_spec.js b/tests/e2e/modules/helloworld_spec.js index 8c11575a..d8f1a3c6 100644 --- a/tests/e2e/modules/helloworld_spec.js +++ b/tests/e2e/modules/helloworld_spec.js @@ -11,7 +11,7 @@ describe("Test helloworld module", function () { helpers.getDocument(done, 1000); }); - it("Test message helloworld module", async function () { + it("Test message helloworld module", function () { const elem = document.querySelector(".helloworld"); expect(elem).not.toBe(null); expect(elem.textContent).toContain("Test HelloWorld Module"); @@ -24,7 +24,7 @@ describe("Test helloworld module", function () { helpers.getDocument(done, 1000); }); - it("Test message helloworld module", async function () { + it("Test message helloworld module", function () { const elem = document.querySelector(".helloworld"); expect(elem).not.toBe(null); expect(elem.textContent).toContain("Hello World!"); diff --git a/tests/e2e/modules/newsfeed_spec.js b/tests/e2e/modules/newsfeed_spec.js index 0b2869e2..d7a3b9fe 100644 --- a/tests/e2e/modules/newsfeed_spec.js +++ b/tests/e2e/modules/newsfeed_spec.js @@ -23,7 +23,7 @@ describe("Newsfeed module", function () { expect(elem.textContent).toContain("QPanel"); }); - it("should NOT show the newsfeed description", async () => { + it("should NOT show the newsfeed description", () => { const elem = document.querySelector(".newsfeed .newsfeed-desc"); expect(elem).toBe(null); }); @@ -41,7 +41,7 @@ describe("Newsfeed module", function () { expect(elem.textContent).toContain("Problema VirtualBox"); }); - it("should show the newsfeed description", async () => { + it("should show the newsfeed description", () => { const elem = document.querySelector(".newsfeed .newsfeed-desc"); expect(elem).not.toBe(null); expect(elem.textContent.length).not.toBe(0); diff --git a/tests/electron/modules/clock_spec.js b/tests/electron/modules/clock_spec.js deleted file mode 100644 index c2e03fc9..00000000 --- a/tests/electron/modules/clock_spec.js +++ /dev/null @@ -1,134 +0,0 @@ -const helpers = require("../global-setup"); -const moment = require("moment"); - -describe("Clock module", function () { - helpers.setupTimeout(this); - - let app = null; - - const testMatch = async function (element, regex) { - await app.client.waitUntilWindowLoaded(); - const elem = await app.client.$(element); - const txt = await elem.getText(element); - return expect(txt).toMatch(regex); - }; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - afterEach(function () { - return helpers.stopApplication(app); - }); - - describe("with default 24hr clock config", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_24hr.js"; - }); - - it("should show the date in the correct format", async function () { - const dateRegex = /^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}$/; - return testMatch(".clock .date", dateRegex); - }); - - it("should show the time in 24hr format", async function () { - const timeRegex = /^(?:2[0-3]|[01]\d):[0-5]\d[0-5]\d$/; - return testMatch(".clock .time", timeRegex); - }); - }); - - describe("with default 12hr clock config", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_12hr.js"; - }); - - it("should show the date in the correct format", async function () { - const dateRegex = /^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}$/; - return testMatch(".clock .date", dateRegex); - }); - - it("should show the time in 12hr format", async function () { - const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[ap]m$/; - return testMatch(".clock .time", timeRegex); - }); - }); - - describe("with showPeriodUpper config enabled", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_showPeriodUpper.js"; - }); - - it("should show 12hr time with upper case AM/PM", async function () { - const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[AP]M$/; - return testMatch(".clock .time", timeRegex); - }); - }); - - describe("with displaySeconds config disabled", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_displaySeconds_false.js"; - }); - - it("should show 12hr time without seconds am/pm", async function () { - const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[ap]m$/; - return testMatch(".clock .time", timeRegex); - }); - }); - - describe("with showTime config disabled", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_showTime.js"; - }); - - it("should show not show the time when digital clock is shown", async function () { - await app.client.waitUntilWindowLoaded(); - const time = await app.client.$$(".clock .digital .time"); - return expect(time.length).toBe(0); - }); - }); - - describe("with showWeek config enabled", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_showWeek.js"; - }); - - it("should show the week in the correct format", async function () { - const weekRegex = /^Week [0-9]{1,2}$/; - return testMatch(".clock .week", weekRegex); - }); - - it("should show the week with the correct number of week of year", async function () { - const currentWeekNumber = moment().week(); - const weekToShow = "Week " + currentWeekNumber; - await app.client.waitUntilWindowLoaded(); - const elem = await app.client.$(".clock .week"); - const txt = await elem.getText(".clock .week"); - return expect(txt).toBe(weekToShow); - }); - }); - - describe("with analog clock face enabled", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/clock_analog.js"; - }); - - it("should show the analog clock face", async () => { - await app.client.waitUntilWindowLoaded(); - const clock = await app.client.$$(".clockCircle"); - return expect(clock.length).toBe(1); - }); - }); -}); From f750436b64c54a090767d2c88a36e87da3138356 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Sun, 26 Sep 2021 22:09:41 +0200 Subject: [PATCH 21/37] update module clock_es --- tests/configs/modules/clock/es/clock_12hr.js | 7 +- tests/configs/modules/clock/es/clock_24hr.js | 8 +- .../modules/clock/es/clock_showPeriodUpper.js | 7 +- .../modules/clock/es/clock_showWeek.js | 7 +- tests/e2e/modules/clock_es_spec.js | 71 +++++++++++++++ tests/electron/modules/clock_es_spec.js | 86 ------------------- 6 files changed, 92 insertions(+), 94 deletions(-) create mode 100644 tests/e2e/modules/clock_es_spec.js delete mode 100644 tests/electron/modules/clock_es_spec.js diff --git a/tests/configs/modules/clock/es/clock_12hr.js b/tests/configs/modules/clock/es/clock_12hr.js index addbeb9f..57d1c7a9 100644 --- a/tests/configs/modules/clock/es/clock_12hr.js +++ b/tests/configs/modules/clock/es/clock_12hr.js @@ -3,9 +3,12 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], language: "es", timeFormat: 12, + units: "metric", modules: [ { @@ -13,7 +16,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( position: "middle_center" } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/clock/es/clock_24hr.js b/tests/configs/modules/clock/es/clock_24hr.js index a5fe49ca..60cfa109 100644 --- a/tests/configs/modules/clock/es/clock_24hr.js +++ b/tests/configs/modules/clock/es/clock_24hr.js @@ -3,8 +3,12 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], language: "es", + timeFormat: 24, + units: "metric", modules: [ { @@ -12,7 +16,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( position: "middle_center" } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/clock/es/clock_showPeriodUpper.js b/tests/configs/modules/clock/es/clock_showPeriodUpper.js index 4a5ab636..5d0c28bb 100644 --- a/tests/configs/modules/clock/es/clock_showPeriodUpper.js +++ b/tests/configs/modules/clock/es/clock_showPeriodUpper.js @@ -3,9 +3,12 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], language: "es", timeFormat: 12, + units: "metric", modules: [ { @@ -16,7 +19,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/configs/modules/clock/es/clock_showWeek.js b/tests/configs/modules/clock/es/clock_showWeek.js index b4a436a6..f8f71982 100644 --- a/tests/configs/modules/clock/es/clock_showWeek.js +++ b/tests/configs/modules/clock/es/clock_showWeek.js @@ -4,9 +4,12 @@ * By Rodrigo Ramírez Norambuena https://rodrigoramirez.com * MIT Licensed. */ -let config = require(process.cwd() + "/tests/configs/default.js").configFactory({ +let config = { + port: 8080, + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], language: "es", timeFormat: 12, + units: "metric", modules: [ { @@ -17,7 +20,7 @@ let config = require(process.cwd() + "/tests/configs/default.js").configFactory( } } ] -}); +}; /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") { diff --git a/tests/e2e/modules/clock_es_spec.js b/tests/e2e/modules/clock_es_spec.js new file mode 100644 index 00000000..78818014 --- /dev/null +++ b/tests/e2e/modules/clock_es_spec.js @@ -0,0 +1,71 @@ +const helpers = require("../global-setup"); + +describe("Clock set to spanish language module", function () { + afterAll(function () { + helpers.stopApplication(); + }); + + const testMatch = function (element, regex) { + const elem = document.querySelector(element); + expect(elem).not.toBe(null); + expect(elem.textContent).toMatch(regex); + }; + + describe("with default 24hr clock config", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/es/clock_24hr.js"); + helpers.getDocument(done, 1000); + }); + + it("shows date with correct format", function () { + const dateRegex = /^(?:lunes|martes|miércoles|jueves|viernes|sábado|domingo), \d{1,2} de (?:enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre) de \d{4}$/; + testMatch(".clock .date", dateRegex); + }); + + it("shows time in 24hr format", function () { + const timeRegex = /^(?:2[0-3]|[01]\d):[0-5]\d[0-5]\d$/; + testMatch(".clock .time", timeRegex); + }); + }); + + describe("with default 12hr clock config", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/es/clock_12hr.js"); + helpers.getDocument(done, 1000); + }); + + it("shows date with correct format", function () { + const dateRegex = /^(?:lunes|martes|miércoles|jueves|viernes|sábado|domingo), \d{1,2} de (?:enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre) de \d{4}$/; + testMatch(".clock .date", dateRegex); + }); + + it("shows time in 12hr format", function () { + const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[ap]m$/; + testMatch(".clock .time", timeRegex); + }); + }); + + describe("with showPeriodUpper config enabled", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/es/clock_showPeriodUpper.js"); + helpers.getDocument(done, 1000); + }); + + it("shows 12hr time with upper case AM/PM", function () { + const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[AP]M$/; + testMatch(".clock .time", timeRegex); + }); + }); + + describe("with showWeek config enabled", function () { + beforeAll(function (done) { + helpers.startApplication("tests/configs/modules/clock/es/clock_showWeek.js"); + helpers.getDocument(done, 1000); + }); + + it("shows week with correct format", function () { + const weekRegex = /^Semana [0-9]{1,2}$/; + testMatch(".clock .week", weekRegex); + }); + }); +}); diff --git a/tests/electron/modules/clock_es_spec.js b/tests/electron/modules/clock_es_spec.js deleted file mode 100644 index 4c39a241..00000000 --- a/tests/electron/modules/clock_es_spec.js +++ /dev/null @@ -1,86 +0,0 @@ -const helpers = require("../global-setup"); - -describe("Clock set to spanish language module", function () { - helpers.setupTimeout(this); - - let app = null; - - const testMatch = async function (element, regex) { - await app.client.waitUntilWindowLoaded(); - const elem = await app.client.$(element); - const txt = await elem.getText(element); - return expect(txt).toMatch(regex); - }; - - beforeEach(function () { - return helpers - .startApplication({ - args: ["js/electron.js"] - }) - .then(function (startedApp) { - app = startedApp; - }); - }); - - afterEach(function () { - return helpers.stopApplication(app); - }); - - describe("with default 24hr clock config", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/es/clock_24hr.js"; - }); - - it("shows date with correct format", async function () { - const dateRegex = /^(?:lunes|martes|miércoles|jueves|viernes|sábado|domingo), \d{1,2} de (?:enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre) de \d{4}$/; - return testMatch(".clock .date", dateRegex); - }); - - it("shows time in 24hr format", async function () { - const timeRegex = /^(?:2[0-3]|[01]\d):[0-5]\d[0-5]\d$/; - return testMatch(".clock .time", timeRegex); - }); - }); - - describe("with default 12hr clock config", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/es/clock_12hr.js"; - }); - - it("shows date with correct format", async function () { - const dateRegex = /^(?:lunes|martes|miércoles|jueves|viernes|sábado|domingo), \d{1,2} de (?:enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre) de \d{4}$/; - return testMatch(".clock .date", dateRegex); - }); - - it("shows time in 12hr format", async function () { - const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[ap]m$/; - return testMatch(".clock .time", timeRegex); - }); - }); - - describe("with showPeriodUpper config enabled", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/es/clock_showPeriodUpper.js"; - }); - - it("shows 12hr time with upper case AM/PM", async function () { - const timeRegex = /^(?:1[0-2]|[1-9]):[0-5]\d[0-5]\d[AP]M$/; - return testMatch(".clock .time", timeRegex); - }); - }); - - describe("with showWeek config enabled", function () { - beforeAll(function () { - // Set config sample for use in test - process.env.MM_CONFIG_FILE = "tests/configs/modules/clock/es/clock_showWeek.js"; - }); - - it("shows week with correct format", async function () { - const weekRegex = /^Semana [0-9]{1,2}$/; - return testMatch(".clock .week", weekRegex); - }); - }); -}); From eb6d8d4f83c5652ceb1f426818bac63c01e22653 Mon Sep 17 00:00:00 2001 From: veeck Date: Tue, 28 Sep 2021 12:14:16 +0200 Subject: [PATCH 22/37] Remove unused file --- .github/header.psd | Bin 225118 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/header.psd diff --git a/.github/header.psd b/.github/header.psd deleted file mode 100644 index 6b97142ef77693635efd2f09c14c35198340400e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225118 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 From 9eb08420b6814eb2de5be1495eefa98f02e659c3 Mon Sep 17 00:00:00 2001 From: veeck Date: Tue, 28 Sep 2021 12:14:39 +0200 Subject: [PATCH 23/37] Add proper names to github action steps --- .../workflows/{node-ci.js.yml => automated-tests.yml} | 6 ++++-- .github/workflows/codecov-test-suites.yml | 9 ++++++--- .github/workflows/enforce-changelog.yml | 6 ++++-- 3 files changed, 14 insertions(+), 7 deletions(-) rename .github/workflows/{node-ci.js.yml => automated-tests.yml} (88%) diff --git a/.github/workflows/node-ci.js.yml b/.github/workflows/automated-tests.yml similarity index 88% rename from .github/workflows/node-ci.js.yml rename to .github/workflows/automated-tests.yml index 3a7391c2..33f9c833 100644 --- a/.github/workflows/node-ci.js.yml +++ b/.github/workflows/automated-tests.yml @@ -17,12 +17,14 @@ jobs: matrix: node-version: [12.x, 14.x, 16.x] steps: - - uses: actions/checkout@v2 + - name: Checkout code + uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - - run: | + - name: Install dependencies and run tests + run: | Xvfb :99 -screen 0 1024x768x16 & export DISPLAY=:99 npm install diff --git a/.github/workflows/codecov-test-suites.yml b/.github/workflows/codecov-test-suites.yml index 88b7574d..f2d210eb 100644 --- a/.github/workflows/codecov-test-suites.yml +++ b/.github/workflows/codecov-test-suites.yml @@ -13,13 +13,16 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v2 - - run: | + - name: Checkout code + uses: actions/checkout@v2 + - name: Install dependencies and run coverage + run: | Xvfb :99 -screen 0 1024x768x16 & export DISPLAY=:99 npm ci npm run test:coverage - - uses: codecov/codecov-action@v1 + - name: Upload coverage results to codecov + uses: codecov/codecov-action@v1 with: file: ./coverage/lcov.info fail_ci_if_error: true diff --git a/.github/workflows/enforce-changelog.yml b/.github/workflows/enforce-changelog.yml index a4f5d246..e1c2856d 100644 --- a/.github/workflows/enforce-changelog.yml +++ b/.github/workflows/enforce-changelog.yml @@ -11,8 +11,10 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v2 - - uses: dangoslen/changelog-enforcer@v1.6.1 + - name: Checkout code + uses: actions/checkout@v2 + - name: Enforce changelog️ + uses: dangoslen/changelog-enforcer@v1.6.1 with: changeLogPath: "CHANGELOG.md" skipLabels: "Skip Changelog" From 31ec848aec3e40f27e05f94f8c0f184d94f77a30 Mon Sep 17 00:00:00 2001 From: veeck Date: Tue, 28 Sep 2021 12:14:47 +0200 Subject: [PATCH 24/37] Update dependencies --- package-lock.json | 1000 +++++++++++++++++++++++---------------------- package.json | 8 +- 2 files changed, 526 insertions(+), 482 deletions(-) diff --git a/package-lock.json b/package-lock.json index a46bed61..bb78f731 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,18 +21,18 @@ "iconv-lite": "^0.6.3", "module-alias": "^2.2.2", "moment": "^2.29.1", - "node-fetch": "^2.6.2", + "node-fetch": "^2.6.5", "node-ical": "^0.13.0", "socket.io": "^4.2.0" }, "devDependencies": { "eslint-config-prettier": "^8.3.0", - "eslint-plugin-jest": "^24.4.0", + "eslint-plugin-jest": "^24.4.2", "eslint-plugin-jsdoc": "^36.1.0", "eslint-plugin-prettier": "^4.0.0", "express-basic-auth": "^1.2.0", "husky": "^7.0.2", - "jest": "^27.2.0", + "jest": "^27.2.2", "jsdom": "^17.0.0", "lodash": "^4.17.21", "nyc": "^15.1.0", @@ -50,7 +50,7 @@ "node": ">=12" }, "optionalDependencies": { - "electron": "^13.4.0" + "electron": "^13.5.0" } }, "node_modules/@babel/code-frame": { @@ -788,15 +788,15 @@ } }, "node_modules/@jest/console": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.2.0.tgz", - "integrity": "sha512-35z+RqsK2CCgNxn+lWyK8X4KkaDtfL4BggT7oeZ0JffIiAiEYFYPo5B67V50ZubqDS1ehBrdCR2jduFnIrZOYw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.2.2.tgz", + "integrity": "sha512-m7tbzPWyvSFfoanTknJoDnaeruDARsUe555tkVjG/qeaRDKwyPqqbgs4yFx583gmoETiAts1deeYozR5sVRhNA==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.2.0", + "jest-message-util": "^27.2.2", "jest-util": "^27.2.0", "slash": "^3.0.0" }, @@ -805,15 +805,15 @@ } }, "node_modules/@jest/core": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.2.0.tgz", - "integrity": "sha512-E/2NHhq+VMo18DpKkoty8Sjey8Kps5Cqa88A8NP757s6JjYqPdioMuyUBhDiIOGCdQByEp0ou3jskkTszMS0nw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.2.2.tgz", + "integrity": "sha512-4b9km/h9pAGdCkwWYtbfoeiOtajOlGmr5rL1Eq6JCAVbOevOqxWHxJ6daWxRJW9eF6keXJoJ1H+uVAVcdZu8Bg==", "dev": true, "dependencies": { - "@jest/console": "^27.2.0", - "@jest/reporters": "^27.2.0", - "@jest/test-result": "^27.2.0", - "@jest/transform": "^27.2.0", + "@jest/console": "^27.2.2", + "@jest/reporters": "^27.2.2", + "@jest/test-result": "^27.2.2", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -822,18 +822,18 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.1.1", - "jest-config": "^27.2.0", - "jest-haste-map": "^27.2.0", - "jest-message-util": "^27.2.0", + "jest-config": "^27.2.2", + "jest-haste-map": "^27.2.2", + "jest-message-util": "^27.2.2", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.0", - "jest-resolve-dependencies": "^27.2.0", - "jest-runner": "^27.2.0", - "jest-runtime": "^27.2.0", - "jest-snapshot": "^27.2.0", + "jest-resolve": "^27.2.2", + "jest-resolve-dependencies": "^27.2.2", + "jest-runner": "^27.2.2", + "jest-runtime": "^27.2.2", + "jest-snapshot": "^27.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", - "jest-watcher": "^27.2.0", + "jest-validate": "^27.2.2", + "jest-watcher": "^27.2.2", "micromatch": "^4.0.4", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -853,12 +853,12 @@ } }, "node_modules/@jest/environment": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.2.0.tgz", - "integrity": "sha512-iPWmQI0wRIYSZX3wKu4FXHK4eIqkfq6n1DCDJS+v3uby7SOXrHvX4eiTBuEdSvtDRMTIH2kjrSkjHf/F9JIYyQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.2.2.tgz", + "integrity": "sha512-gO9gVnZfn5ldeOJ5q+35Kru9QWGHEqZCB7W/M+8mD6uCwOGC9HR6mzpLSNRuDsxY/KhaGBYHpgFqtpe4Rl1gDQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^27.2.0", + "@jest/fake-timers": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1" @@ -868,15 +868,15 @@ } }, "node_modules/@jest/fake-timers": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.0.tgz", - "integrity": "sha512-gSu3YHvQOoVaTWYGgHFB7IYFtcF2HBzX4l7s47VcjvkUgL4/FBnE20x7TNLa3W6ABERtGd5gStSwsA8bcn+c4w==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.2.tgz", + "integrity": "sha512-gDIIqs0yxyjyxEI9HlJ8SEJ4uCc8qr8BupG1Hcx7tvyk/SLocyXE63rFxL+HQ0ZLMvSyEcJUmYnvvHH1osWiGA==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "@sinonjs/fake-timers": "^7.0.2", "@types/node": "*", - "jest-message-util": "^27.2.0", + "jest-message-util": "^27.2.2", "jest-mock": "^27.1.1", "jest-util": "^27.2.0" }, @@ -885,29 +885,29 @@ } }, "node_modules/@jest/globals": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.2.0.tgz", - "integrity": "sha512-raqk9Gf9WC3hlBa57rmRmJfRl9hom2b+qEE/ifheMtwn5USH5VZxzrHHOZg0Zsd/qC2WJ8UtyTwHKQAnNlDMdg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.2.2.tgz", + "integrity": "sha512-fWa/Luwod1hyehnuep+zCnOTqTVvyc4HLUU/1VpFNOEu0tCWNSODyvKSSOjtb1bGOpCNjgaDcyjzo5f7rl6a7g==", "dev": true, "dependencies": { - "@jest/environment": "^27.2.0", + "@jest/environment": "^27.2.2", "@jest/types": "^27.1.1", - "expect": "^27.2.0" + "expect": "^27.2.2" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/reporters": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.0.tgz", - "integrity": "sha512-7wfkE3iRTLaT0F51h1mnxH3nQVwDCdbfgXiLuCcNkF1FnxXLH9utHqkSLIiwOTV1AtmiE0YagHbOvx4rnMP/GA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.2.tgz", + "integrity": "sha512-ufwZ8XoLChEfPffDeVGroYbhbcYPom3zKDiv4Flhe97rr/o2IfUXoWkDUDoyJ3/V36RFIMjokSu0IJ/pbFtbHg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.2.0", - "@jest/test-result": "^27.2.0", - "@jest/transform": "^27.2.0", + "@jest/console": "^27.2.2", + "@jest/test-result": "^27.2.2", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -919,10 +919,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.2.0", - "jest-resolve": "^27.2.0", + "jest-haste-map": "^27.2.2", + "jest-resolve": "^27.2.2", "jest-util": "^27.2.0", - "jest-worker": "^27.2.0", + "jest-worker": "^27.2.2", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -956,12 +956,12 @@ } }, "node_modules/@jest/test-result": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.0.tgz", - "integrity": "sha512-JPPqn8h0RGr4HyeY1Km+FivDIjTFzDROU46iAvzVjD42ooGwYoqYO/MQTilhfajdz6jpVnnphFrKZI5OYrBONA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.2.tgz", + "integrity": "sha512-yENoDEoWlEFI7l5z7UYyJb/y5Q8RqbPd4neAVhKr6l+vVaQOPKf8V/IseSMJI9+urDUIxgssA7RGNyCRhGjZvw==", "dev": true, "dependencies": { - "@jest/console": "^27.2.0", + "@jest/console": "^27.2.2", "@jest/types": "^27.1.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -971,24 +971,24 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.0.tgz", - "integrity": "sha512-PrqarcpzOU1KSAK7aPwfL8nnpaqTMwPe7JBPnaOYRDSe/C6AoJiL5Kbnonqf1+DregxZIRAoDg69R9/DXMGqXA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.2.tgz", + "integrity": "sha512-YnJqwNQP2Zeu0S4TMqkxg6NN7Y1EFq715n/nThNKrvIS9wmRZjDt2XYqsHbuvhAFjshi0iKDQ813NewFITBH+Q==", "dev": true, "dependencies": { - "@jest/test-result": "^27.2.0", + "@jest/test-result": "^27.2.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.0", - "jest-runtime": "^27.2.0" + "jest-haste-map": "^27.2.2", + "jest-runtime": "^27.2.2" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.2.0.tgz", - "integrity": "sha512-Q8Q/8xXIZYllk1AF7Ou5sV3egOZsdY/Wlv09CSbcexBRcC1Qt6lVZ7jRFAZtbHsEEzvOCyFEC4PcrwKwyjXtCg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.2.2.tgz", + "integrity": "sha512-l4Z/7PpajrOjCiXLWLfMY7fgljY0H8EwW7qdzPXXuv2aQF8kY2+Uyj3O+9Popnaw1V7JCw32L8EeI/thqFDkPA==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", @@ -998,7 +998,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.0", + "jest-haste-map": "^27.2.2", "jest-regex-util": "^27.0.6", "jest-util": "^27.2.0", "micromatch": "^4.0.4", @@ -1315,9 +1315,9 @@ "dev": true }, "node_modules/@types/prettier": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", - "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==", "dev": true }, "node_modules/@types/puppeteer": { @@ -1715,9 +1715,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } @@ -1924,12 +1924,12 @@ } }, "node_modules/babel-jest": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.0.tgz", - "integrity": "sha512-bS2p+KGGVVmWXBa8+i6SO/xzpiz2Q/2LnqLbQknPKefWXVZ67YIjA4iXup/jMOEZplga9PpWn+wrdb3UdDwRaA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.2.tgz", + "integrity": "sha512-XNFNNfGKnZXzhej7TleVP4s9ktH5JjRW8Rmcbb223JJwKB/gmTyeWN0JfiPtSgnjIjDXtKNoixiy0QUHtv3vFA==", "dev": true, "dependencies": { - "@jest/transform": "^27.2.0", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -3230,9 +3230,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.4.0.tgz", - "integrity": "sha512-KJGWS2qa0xZXIMPMDUNkRVO8/JxRd4+M0ejYYOzu2LIQ5ijecPzNuNR9nvDkml9XyyRBzu975FkhJcwD17ietQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.5.0.tgz", + "integrity": "sha512-s4+b1RFWkNKWp7WWrv2q60MuFljHUCbO7XAupBSCUz/NP1Hz4OenWbMPUt0H+fa8YZeN8CX3JDIA8Bet5uAJvw==", "devOptional": true, "hasInstallScript": true, "dependencies": { @@ -3612,9 +3612,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz", - "integrity": "sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==", + "version": "24.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.2.tgz", + "integrity": "sha512-jNMnqwX75z0RXRMXkxwb/+9ylKJYJLJ8nT8nBT0XFM5qx4IQGxP4edMawa0qGkSbHae0BDPBmi8I2QF0/F04XQ==", "dev": true, "dependencies": { "@typescript-eslint/experimental-utils": "^4.0.1" @@ -3908,16 +3908,16 @@ } }, "node_modules/expect": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.0.tgz", - "integrity": "sha512-oOTbawMQv7AK1FZURbPTgGSzmhxkjFzoARSvDjOMnOpeWuYQx1tP6rXu9MIX5mrACmyCAM7fSNP8IJO2f1p0CQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.2.tgz", + "integrity": "sha512-sjHBeEk47/eshN9oLbvPJZMgHQihOXXQzSMPCJ4MqKShbU9HOVFSNHEEU4dp4ujzxFSiNvPFzB2AMOFmkizhvA==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "ansi-styles": "^5.0.0", "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.2.0", - "jest-message-util": "^27.2.0", + "jest-matcher-utils": "^27.2.2", + "jest-message-util": "^27.2.2", "jest-regex-util": "^27.0.6" }, "engines": { @@ -5328,14 +5328,14 @@ } }, "node_modules/jest": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.0.tgz", - "integrity": "sha512-oUqVXyvh5YwEWl263KWdPUAqEzBFzGHdFLQ05hUnITr1tH+9SscEI9A/GH9eBClA+Nw1ct+KNuuOV6wlnmBPcg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.2.tgz", + "integrity": "sha512-XAB/9akDTe3/V0wPNKWfP9Y/NT1QPiCqyRBYGbC66EA9EvgAzdaFEqhFGLaDJ5UP2yIyXUMtju9a9IMrlYbZTQ==", "dev": true, "dependencies": { - "@jest/core": "^27.2.0", + "@jest/core": "^27.2.2", "import-local": "^3.0.2", - "jest-cli": "^27.2.0" + "jest-cli": "^27.2.2" }, "bin": { "jest": "bin/jest.js" @@ -5367,27 +5367,27 @@ } }, "node_modules/jest-circus": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.0.tgz", - "integrity": "sha512-WwENhaZwOARB1nmcboYPSv/PwHBUGRpA4MEgszjr9DLCl97MYw0qZprBwLb7rNzvMwfIvNGG7pefQ5rxyBlzIA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.2.tgz", + "integrity": "sha512-8txlqs0EDrvPasCgwfLMkG0l3F4FxqQa6lxOsvYfOl04eSJjRw3F4gk9shakuC00nMD+VT+SMtFYXxe64f0VZw==", "dev": true, "dependencies": { - "@jest/environment": "^27.2.0", - "@jest/test-result": "^27.2.0", + "@jest/environment": "^27.2.2", + "@jest/test-result": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.2.0", + "expect": "^27.2.2", "is-generator-fn": "^2.0.0", - "jest-each": "^27.2.0", - "jest-matcher-utils": "^27.2.0", - "jest-message-util": "^27.2.0", - "jest-runtime": "^27.2.0", - "jest-snapshot": "^27.2.0", + "jest-each": "^27.2.2", + "jest-matcher-utils": "^27.2.2", + "jest-message-util": "^27.2.2", + "jest-runtime": "^27.2.2", + "jest-snapshot": "^27.2.2", "jest-util": "^27.2.0", - "pretty-format": "^27.2.0", + "pretty-format": "^27.2.2", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" @@ -5397,21 +5397,21 @@ } }, "node_modules/jest-cli": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.0.tgz", - "integrity": "sha512-bq1X/B/b1kT9y1zIFMEW3GFRX1HEhFybiqKdbxM+j11XMMYSbU9WezfyWIhrSOmPT+iODLATVjfsCnbQs7cfIA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.2.tgz", + "integrity": "sha512-jbEythw22LR/IHYgNrjWdO74wO9wyujCxTMjbky0GLav4rC4y6qDQr4TqQ2JPP51eDYJ2awVn83advEVSs5Brg==", "dev": true, "dependencies": { - "@jest/core": "^27.2.0", - "@jest/test-result": "^27.2.0", + "@jest/core": "^27.2.2", + "@jest/test-result": "^27.2.2", "@jest/types": "^27.1.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.2.0", + "jest-config": "^27.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", + "jest-validate": "^27.2.2", "prompts": "^2.0.1", "yargs": "^16.0.3" }, @@ -5431,32 +5431,32 @@ } }, "node_modules/jest-config": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.0.tgz", - "integrity": "sha512-Z1romHpxeNwLxQtouQ4xt07bY6HSFGKTo0xJcvOK3u6uJHveA4LB2P+ty9ArBLpTh3AqqPxsyw9l9GMnWBYS9A==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.2.tgz", + "integrity": "sha512-2nhms3lp52ZpU0636bB6zIFHjDVtYxzFQIOHZjBFUeXcb6b41sEkWojbHaJ4FEIO44UbccTLa7tvNpiFCgPE7w==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.2.0", + "@jest/test-sequencer": "^27.2.2", "@jest/types": "^27.1.1", - "babel-jest": "^27.2.0", + "babel-jest": "^27.2.2", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", "is-ci": "^3.0.0", - "jest-circus": "^27.2.0", - "jest-environment-jsdom": "^27.2.0", - "jest-environment-node": "^27.2.0", + "jest-circus": "^27.2.2", + "jest-environment-jsdom": "^27.2.2", + "jest-environment-node": "^27.2.2", "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.2.0", + "jest-jasmine2": "^27.2.2", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.0", - "jest-runner": "^27.2.0", + "jest-resolve": "^27.2.2", + "jest-runner": "^27.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", + "jest-validate": "^27.2.2", "micromatch": "^4.0.4", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -5471,15 +5471,15 @@ } }, "node_modules/jest-diff": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.0.tgz", - "integrity": "sha512-QSO9WC6btFYWtRJ3Hac0sRrkspf7B01mGrrQEiCW6TobtViJ9RWL0EmOs/WnBsZDsI/Y2IoSHZA2x6offu0sYw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.2.tgz", + "integrity": "sha512-o3LaDbQDSaMJif4yztJAULI4xVatxbBasbKLbEw3K8CiRdDdbxMrLArS9EKDHQFYh6Tgfrm1PC2mIYR1xhu0hQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -5498,29 +5498,29 @@ } }, "node_modules/jest-each": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.2.0.tgz", - "integrity": "sha512-biDmmUQjg+HZOB7MfY2RHSFL3j418nMoC3TK3pGAj880fQQSxvQe1y2Wy23JJJNUlk6YXiGU0yWy86Le1HBPmA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.2.2.tgz", + "integrity": "sha512-ZCDhkvwHeXHsxoFxvW43fabL18iLiVDxaipG5XWG7dSd+XWXXpzMQvBWYT9Wvzhg5x4hvrLQ24LtiOKw3I09xA==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", "jest-util": "^27.2.0", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-environment-jsdom": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.0.tgz", - "integrity": "sha512-wNQJi6Rd/AkUWqTc4gWhuTIFPo7tlMK0RPZXeM6AqRHZA3D3vwvTa9ktAktyVyWYmUoXdYstOfyYMG3w4jt7eA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.2.tgz", + "integrity": "sha512-mzCLEdnpGWDJmNB6WIPLlZM+hpXdeiya9TryiByqcUdpliNV1O+LGC2SewzjmB4IblabGfvr3KcPN0Nme2wnDw==", "dev": true, "dependencies": { - "@jest/environment": "^27.2.0", - "@jest/fake-timers": "^27.2.0", + "@jest/environment": "^27.2.2", + "@jest/fake-timers": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1", @@ -5638,13 +5638,13 @@ } }, "node_modules/jest-environment-node": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.0.tgz", - "integrity": "sha512-WbW+vdM4u88iy6Q3ftUEQOSgMPtSgjm3qixYYK2AKEuqmFO2zmACTw1vFUB0qI/QN88X6hA6ZkVKIdIWWzz+yg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.2.tgz", + "integrity": "sha512-XgUscWs6H6UNqC96/QJjmUGZzzpql/JyprLSXVu7wkgM8tjbJdEkSqwrVAvJPm1yu526ImrmsIoh2BTHxkwL/g==", "dev": true, "dependencies": { - "@jest/environment": "^27.2.0", - "@jest/fake-timers": "^27.2.0", + "@jest/environment": "^27.2.2", + "@jest/fake-timers": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1", @@ -5664,9 +5664,9 @@ } }, "node_modules/jest-haste-map": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.0.tgz", - "integrity": "sha512-laFet7QkNlWjwZtMGHCucLvF8o9PAh2cgePRck1+uadSM4E4XH9J4gnx4do+a6do8ZV5XHNEAXEkIoNg5XUH2Q==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.2.tgz", + "integrity": "sha512-kaKiq+GbAvk6/sq++Ymor4Vzk6+lr0vbKs2HDVPdkKsHX2lIJRyvhypZG/QsNfQnROKWIZSpUpGuv2HySSosvA==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", @@ -5678,7 +5678,7 @@ "jest-regex-util": "^27.0.6", "jest-serializer": "^27.0.6", "jest-util": "^27.2.0", - "jest-worker": "^27.2.0", + "jest-worker": "^27.2.2", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -5690,28 +5690,28 @@ } }, "node_modules/jest-jasmine2": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.0.tgz", - "integrity": "sha512-NcPzZBk6IkDW3Z2V8orGueheGJJYfT5P0zI/vTO/Jp+R9KluUdgFrgwfvZ0A34Kw6HKgiWFILZmh3oQ/eS+UxA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.2.tgz", + "integrity": "sha512-SczhZNfmZID9HbJ1GHhO4EzeL/PMRGeAUw23ddPUdd6kFijEZpT2yOxyNCBUKAsVQ/14OB60kjgnbuFOboZUNg==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.2.0", + "@jest/environment": "^27.2.2", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.2.0", + "@jest/test-result": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.2.0", + "expect": "^27.2.2", "is-generator-fn": "^2.0.0", - "jest-each": "^27.2.0", - "jest-matcher-utils": "^27.2.0", - "jest-message-util": "^27.2.0", - "jest-runtime": "^27.2.0", - "jest-snapshot": "^27.2.0", + "jest-each": "^27.2.2", + "jest-matcher-utils": "^27.2.2", + "jest-message-util": "^27.2.2", + "jest-runtime": "^27.2.2", + "jest-snapshot": "^27.2.2", "jest-util": "^27.2.0", - "pretty-format": "^27.2.0", + "pretty-format": "^27.2.2", "throat": "^6.0.1" }, "engines": { @@ -5719,37 +5719,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.0.tgz", - "integrity": "sha512-e91BIEmbZw5+MHkB4Hnrq7S86coTxUMCkz4n7DLmQYvl9pEKmRx9H/JFH87bBqbIU5B2Ju1soKxRWX6/eGFGpA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.2.tgz", + "integrity": "sha512-fQIYKkhXUs/4EpE4wO1AVsv7aNH3o0km1BGq3vxvSfYdwG9GLMf+b0z/ghLmBYNxb+tVpm/zv2caoKm3GfTazg==", "dev": true, "dependencies": { "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.0.tgz", - "integrity": "sha512-F+LG3iTwJ0gPjxBX6HCyrARFXq6jjiqhwBQeskkJQgSLeF1j6ui1RTV08SR7O51XTUhtc8zqpDj8iCG4RGmdKw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.2.tgz", + "integrity": "sha512-xN3wT4p2i9DGB6zmL3XxYp5lJmq9Q6ff8XKlMtVVBS2SAshmgsPBALJFQ8dWRd2G/xf5q/N0SD0Mipt8QBA26A==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^27.2.0", + "jest-diff": "^27.2.2", "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-message-util": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.0.tgz", - "integrity": "sha512-y+sfT/94CiP8rKXgwCOzO1mUazIEdEhrLjuiu+RKmCP+8O/TJTSne9dqQRbFIHBtlR2+q7cddJlWGir8UATu5w==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.2.tgz", + "integrity": "sha512-/iS5/m2FSF7Nn6APFoxFymJpyhB/gPf0CJa7uFSkbYaWvrADUfQ9NTsuyjpszKErOS2/huFs44ysWhlQTKvL8Q==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -5758,7 +5758,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.2.0", + "pretty-format": "^27.2.2", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -5818,19 +5818,19 @@ } }, "node_modules/jest-resolve": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.0.tgz", - "integrity": "sha512-v09p9Ib/VtpHM6Cz+i9lEAv1Z/M5NVxsyghRHRMEUOqwPQs3zwTdwp1xS3O/k5LocjKiGS0OTaJoBSpjbM2Jlw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.2.tgz", + "integrity": "sha512-tfbHcBs/hJTb3fPQ/3hLWR+TsLNTzzK98TU+zIAsrL9nNzWfWROwopUOmiSUqmHMZW5t9au/433kSF2/Af+tTw==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "chalk": "^4.0.0", "escalade": "^3.1.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.0", + "jest-haste-map": "^27.2.2", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", + "jest-validate": "^27.2.2", "resolve": "^1.20.0", "slash": "^3.0.0" }, @@ -5839,29 +5839,29 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.0.tgz", - "integrity": "sha512-EY5jc/Y0oxn+oVEEldTidmmdVoZaknKPyDORA012JUdqPyqPL+lNdRyI3pGti0RCydds6coaw6xt4JQY54dKsg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.2.tgz", + "integrity": "sha512-nvJS+DyY51HHdZnMIwXg7fimQ5ylFx4+quQXspQXde2rXYy+4v75UYoX/J65Ln8mKCNc6YF8HEhfGaRBOrxxHg==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-snapshot": "^27.2.0" + "jest-snapshot": "^27.2.2" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runner": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.0.tgz", - "integrity": "sha512-Cl+BHpduIc0cIVTjwoyx0pQk4Br8gn+wkr35PmKCmzEdOUnQ2wN7QVXA8vXnMQXSlFkN/+KWnk20TAVBmhgrww==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.2.tgz", + "integrity": "sha512-+bUFwBq+yTnvsOFuxetoQtkuOnqdAk2YuIGjlLmc7xLAXn/V1vjhXrLencgij0BUTTUvG9Aul3+5XDss4Wa8Eg==", "dev": true, "dependencies": { - "@jest/console": "^27.2.0", - "@jest/environment": "^27.2.0", - "@jest/test-result": "^27.2.0", - "@jest/transform": "^27.2.0", + "@jest/console": "^27.2.2", + "@jest/environment": "^27.2.2", + "@jest/test-result": "^27.2.2", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", @@ -5869,15 +5869,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.0.6", - "jest-environment-jsdom": "^27.2.0", - "jest-environment-node": "^27.2.0", - "jest-haste-map": "^27.2.0", - "jest-leak-detector": "^27.2.0", - "jest-message-util": "^27.2.0", - "jest-resolve": "^27.2.0", - "jest-runtime": "^27.2.0", + "jest-environment-jsdom": "^27.2.2", + "jest-environment-node": "^27.2.2", + "jest-haste-map": "^27.2.2", + "jest-leak-detector": "^27.2.2", + "jest-message-util": "^27.2.2", + "jest-resolve": "^27.2.2", + "jest-runtime": "^27.2.2", "jest-util": "^27.2.0", - "jest-worker": "^27.2.0", + "jest-worker": "^27.2.2", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -5886,18 +5886,18 @@ } }, "node_modules/jest-runtime": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.0.tgz", - "integrity": "sha512-6gRE9AVVX49hgBbWQ9PcNDeM4upMUXzTpBs0kmbrjyotyUyIJixLPsYjpeTFwAA07PVLDei1iAm2chmWycdGdQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.2.tgz", + "integrity": "sha512-PtTHCK5jT+KrIpKpjJsltu/dK5uGhBtTNLOk1Z+ZD2Jrxam2qQsOqDFYLszcK0jc2TLTNsrVpclqSftn7y3aXA==", "dev": true, "dependencies": { - "@jest/console": "^27.2.0", - "@jest/environment": "^27.2.0", - "@jest/fake-timers": "^27.2.0", - "@jest/globals": "^27.2.0", + "@jest/console": "^27.2.2", + "@jest/environment": "^27.2.2", + "@jest/fake-timers": "^27.2.2", + "@jest/globals": "^27.2.2", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.2.0", - "@jest/transform": "^27.2.0", + "@jest/test-result": "^27.2.2", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -5907,14 +5907,14 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.0", - "jest-message-util": "^27.2.0", + "jest-haste-map": "^27.2.2", + "jest-message-util": "^27.2.2", "jest-mock": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.0", - "jest-snapshot": "^27.2.0", + "jest-resolve": "^27.2.2", + "jest-snapshot": "^27.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", + "jest-validate": "^27.2.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^16.0.3" @@ -5937,9 +5937,9 @@ } }, "node_modules/jest-snapshot": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.0.tgz", - "integrity": "sha512-MukJvy3KEqemCT2FoT3Gum37CQqso/62PKTfIzWmZVTsLsuyxQmJd2PI5KPcBYFqLlA8LgZLHM8ZlazkVt8LsQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.2.tgz", + "integrity": "sha512-7ODSvULMiiOVuuLvLZpDlpqqTqX9hDfdmijho5auVu9qRYREolvrvgH4kSNOKfcqV3EZOTuLKNdqsz1PM20PQA==", "dev": true, "dependencies": { "@babel/core": "^7.7.2", @@ -5948,23 +5948,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.2.0", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.2.0", + "expect": "^27.2.2", "graceful-fs": "^4.2.4", - "jest-diff": "^27.2.0", + "jest-diff": "^27.2.2", "jest-get-type": "^27.0.6", - "jest-haste-map": "^27.2.0", - "jest-matcher-utils": "^27.2.0", - "jest-message-util": "^27.2.0", - "jest-resolve": "^27.2.0", + "jest-haste-map": "^27.2.2", + "jest-matcher-utils": "^27.2.2", + "jest-message-util": "^27.2.2", + "jest-resolve": "^27.2.2", "jest-util": "^27.2.0", "natural-compare": "^1.4.0", - "pretty-format": "^27.2.0", + "pretty-format": "^27.2.2", "semver": "^7.3.2" }, "engines": { @@ -6004,9 +6004,9 @@ } }, "node_modules/jest-validate": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.0.tgz", - "integrity": "sha512-uIEZGkFKk3+4liA81Xu0maG5aGDyPLdp+4ed244c+Ql0k3aLWQYcMbaMLXOIFcb83LPHzYzqQ8hwNnIxTqfAGQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.2.tgz", + "integrity": "sha512-01mwTAs2kgDuX98Ua3Xhdhp5lXsLU4eyg6k56adTtrXnU/GbLd9uAsh5nc4MWVtUXMeNmHUyEiD4ibLqE8MuNw==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", @@ -6014,7 +6014,7 @@ "chalk": "^4.0.0", "jest-get-type": "^27.0.6", "leven": "^3.1.0", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -6033,12 +6033,12 @@ } }, "node_modules/jest-watcher": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.0.tgz", - "integrity": "sha512-SjRWhnr+qO8aBsrcnYIyF+qRxNZk6MZH8TIDgvi+VlsyrvOyqg0d+Rm/v9KHiTtC9mGGeFi9BFqgavyWib6xLg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.2.tgz", + "integrity": "sha512-7HJwZq06BCfM99RacCVzXO90B20/dNJvq+Ouiu/VrFdFRCpbnnqlQUEk4KAhBSllgDrTPgKu422SCF5KKBHDRA==", "dev": true, "dependencies": { - "@jest/test-result": "^27.2.0", + "@jest/test-result": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -6051,9 +6051,9 @@ } }, "node_modules/jest-worker": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", - "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.2.tgz", + "integrity": "sha512-aG1xq9KgWB2CPC8YdMIlI8uZgga2LFNcGbHJxO8ctfXAydSaThR4EewKQGg3tBOC+kS3vhPGgymsBdi9VINjPw==", "dev": true, "dependencies": { "@types/node": "*", @@ -6948,13 +6948,35 @@ } }, "node_modules/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { "node": "4.x || >=6.0.0" } }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-ical": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/node-ical/-/node-ical-0.13.0.tgz", @@ -7765,13 +7787,13 @@ } }, "node_modules/pretty-format": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.0.tgz", - "integrity": "sha512-KyJdmgBkMscLqo8A7K77omgLx5PWPiXJswtTtFV7XgVZv2+qPk6UivpXXO+5k6ZEbWIbLoKdx1pZ6ldINzbwTA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.2.tgz", + "integrity": "sha512-+DdLh+rtaElc2SQOE/YPH8k2g3Rf2OXWEpy06p8Szs3hdVSYD87QOOlYRHWAeb/59XTmeVmRKvDD0svHqf6ycA==", "dev": true, "dependencies": { "@jest/types": "^27.1.1", - "ansi-regex": "^5.0.0", + "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, @@ -9064,13 +9086,12 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "node_modules/stack-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.4.tgz", - "integrity": "sha512-ERg+H//lSSYlZhBIUu+wJnqg30AbyBbpZlIhcshpn7BNzpoRODZgfyr9J+8ERf3ooC6af3u7Lcl01nleau7MrA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dev": true, "dependencies": { - "escape-string-regexp": "^2.0.0", - "source-map-support": "^0.5.20" + "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" @@ -9888,9 +9909,9 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "node_modules/v8-to-istanbul": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", - "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", + "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -11094,29 +11115,29 @@ "dev": true }, "@jest/console": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.2.0.tgz", - "integrity": "sha512-35z+RqsK2CCgNxn+lWyK8X4KkaDtfL4BggT7oeZ0JffIiAiEYFYPo5B67V50ZubqDS1ehBrdCR2jduFnIrZOYw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.2.2.tgz", + "integrity": "sha512-m7tbzPWyvSFfoanTknJoDnaeruDARsUe555tkVjG/qeaRDKwyPqqbgs4yFx583gmoETiAts1deeYozR5sVRhNA==", "dev": true, "requires": { "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.2.0", + "jest-message-util": "^27.2.2", "jest-util": "^27.2.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.2.0.tgz", - "integrity": "sha512-E/2NHhq+VMo18DpKkoty8Sjey8Kps5Cqa88A8NP757s6JjYqPdioMuyUBhDiIOGCdQByEp0ou3jskkTszMS0nw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.2.2.tgz", + "integrity": "sha512-4b9km/h9pAGdCkwWYtbfoeiOtajOlGmr5rL1Eq6JCAVbOevOqxWHxJ6daWxRJW9eF6keXJoJ1H+uVAVcdZu8Bg==", "dev": true, "requires": { - "@jest/console": "^27.2.0", - "@jest/reporters": "^27.2.0", - "@jest/test-result": "^27.2.0", - "@jest/transform": "^27.2.0", + "@jest/console": "^27.2.2", + "@jest/reporters": "^27.2.2", + "@jest/test-result": "^27.2.2", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -11125,18 +11146,18 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^27.1.1", - "jest-config": "^27.2.0", - "jest-haste-map": "^27.2.0", - "jest-message-util": "^27.2.0", + "jest-config": "^27.2.2", + "jest-haste-map": "^27.2.2", + "jest-message-util": "^27.2.2", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.0", - "jest-resolve-dependencies": "^27.2.0", - "jest-runner": "^27.2.0", - "jest-runtime": "^27.2.0", - "jest-snapshot": "^27.2.0", + "jest-resolve": "^27.2.2", + "jest-resolve-dependencies": "^27.2.2", + "jest-runner": "^27.2.2", + "jest-runtime": "^27.2.2", + "jest-snapshot": "^27.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", - "jest-watcher": "^27.2.0", + "jest-validate": "^27.2.2", + "jest-watcher": "^27.2.2", "micromatch": "^4.0.4", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -11145,52 +11166,52 @@ } }, "@jest/environment": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.2.0.tgz", - "integrity": "sha512-iPWmQI0wRIYSZX3wKu4FXHK4eIqkfq6n1DCDJS+v3uby7SOXrHvX4eiTBuEdSvtDRMTIH2kjrSkjHf/F9JIYyQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.2.2.tgz", + "integrity": "sha512-gO9gVnZfn5ldeOJ5q+35Kru9QWGHEqZCB7W/M+8mD6uCwOGC9HR6mzpLSNRuDsxY/KhaGBYHpgFqtpe4Rl1gDQ==", "dev": true, "requires": { - "@jest/fake-timers": "^27.2.0", + "@jest/fake-timers": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1" } }, "@jest/fake-timers": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.0.tgz", - "integrity": "sha512-gSu3YHvQOoVaTWYGgHFB7IYFtcF2HBzX4l7s47VcjvkUgL4/FBnE20x7TNLa3W6ABERtGd5gStSwsA8bcn+c4w==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.2.tgz", + "integrity": "sha512-gDIIqs0yxyjyxEI9HlJ8SEJ4uCc8qr8BupG1Hcx7tvyk/SLocyXE63rFxL+HQ0ZLMvSyEcJUmYnvvHH1osWiGA==", "dev": true, "requires": { "@jest/types": "^27.1.1", "@sinonjs/fake-timers": "^7.0.2", "@types/node": "*", - "jest-message-util": "^27.2.0", + "jest-message-util": "^27.2.2", "jest-mock": "^27.1.1", "jest-util": "^27.2.0" } }, "@jest/globals": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.2.0.tgz", - "integrity": "sha512-raqk9Gf9WC3hlBa57rmRmJfRl9hom2b+qEE/ifheMtwn5USH5VZxzrHHOZg0Zsd/qC2WJ8UtyTwHKQAnNlDMdg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.2.2.tgz", + "integrity": "sha512-fWa/Luwod1hyehnuep+zCnOTqTVvyc4HLUU/1VpFNOEu0tCWNSODyvKSSOjtb1bGOpCNjgaDcyjzo5f7rl6a7g==", "dev": true, "requires": { - "@jest/environment": "^27.2.0", + "@jest/environment": "^27.2.2", "@jest/types": "^27.1.1", - "expect": "^27.2.0" + "expect": "^27.2.2" } }, "@jest/reporters": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.0.tgz", - "integrity": "sha512-7wfkE3iRTLaT0F51h1mnxH3nQVwDCdbfgXiLuCcNkF1FnxXLH9utHqkSLIiwOTV1AtmiE0YagHbOvx4rnMP/GA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.2.tgz", + "integrity": "sha512-ufwZ8XoLChEfPffDeVGroYbhbcYPom3zKDiv4Flhe97rr/o2IfUXoWkDUDoyJ3/V36RFIMjokSu0IJ/pbFtbHg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.2.0", - "@jest/test-result": "^27.2.0", - "@jest/transform": "^27.2.0", + "@jest/console": "^27.2.2", + "@jest/test-result": "^27.2.2", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -11202,10 +11223,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.2.0", - "jest-resolve": "^27.2.0", + "jest-haste-map": "^27.2.2", + "jest-resolve": "^27.2.2", "jest-util": "^27.2.0", - "jest-worker": "^27.2.0", + "jest-worker": "^27.2.2", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -11225,33 +11246,33 @@ } }, "@jest/test-result": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.0.tgz", - "integrity": "sha512-JPPqn8h0RGr4HyeY1Km+FivDIjTFzDROU46iAvzVjD42ooGwYoqYO/MQTilhfajdz6jpVnnphFrKZI5OYrBONA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.2.tgz", + "integrity": "sha512-yENoDEoWlEFI7l5z7UYyJb/y5Q8RqbPd4neAVhKr6l+vVaQOPKf8V/IseSMJI9+urDUIxgssA7RGNyCRhGjZvw==", "dev": true, "requires": { - "@jest/console": "^27.2.0", + "@jest/console": "^27.2.2", "@jest/types": "^27.1.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.0.tgz", - "integrity": "sha512-PrqarcpzOU1KSAK7aPwfL8nnpaqTMwPe7JBPnaOYRDSe/C6AoJiL5Kbnonqf1+DregxZIRAoDg69R9/DXMGqXA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.2.tgz", + "integrity": "sha512-YnJqwNQP2Zeu0S4TMqkxg6NN7Y1EFq715n/nThNKrvIS9wmRZjDt2XYqsHbuvhAFjshi0iKDQ813NewFITBH+Q==", "dev": true, "requires": { - "@jest/test-result": "^27.2.0", + "@jest/test-result": "^27.2.2", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.0", - "jest-runtime": "^27.2.0" + "jest-haste-map": "^27.2.2", + "jest-runtime": "^27.2.2" } }, "@jest/transform": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.2.0.tgz", - "integrity": "sha512-Q8Q/8xXIZYllk1AF7Ou5sV3egOZsdY/Wlv09CSbcexBRcC1Qt6lVZ7jRFAZtbHsEEzvOCyFEC4PcrwKwyjXtCg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.2.2.tgz", + "integrity": "sha512-l4Z/7PpajrOjCiXLWLfMY7fgljY0H8EwW7qdzPXXuv2aQF8kY2+Uyj3O+9Popnaw1V7JCw32L8EeI/thqFDkPA==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -11261,7 +11282,7 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.0", + "jest-haste-map": "^27.2.2", "jest-regex-util": "^27.0.6", "jest-util": "^27.2.0", "micromatch": "^4.0.4", @@ -11546,9 +11567,9 @@ "dev": true }, "@types/prettier": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", - "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==", "dev": true }, "@types/puppeteer": { @@ -11840,9 +11861,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -11999,12 +12020,12 @@ } }, "babel-jest": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.0.tgz", - "integrity": "sha512-bS2p+KGGVVmWXBa8+i6SO/xzpiz2Q/2LnqLbQknPKefWXVZ67YIjA4iXup/jMOEZplga9PpWn+wrdb3UdDwRaA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.2.tgz", + "integrity": "sha512-XNFNNfGKnZXzhej7TleVP4s9ktH5JjRW8Rmcbb223JJwKB/gmTyeWN0JfiPtSgnjIjDXtKNoixiy0QUHtv3vFA==", "dev": true, "requires": { - "@jest/transform": "^27.2.0", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -13014,9 +13035,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.4.0.tgz", - "integrity": "sha512-KJGWS2qa0xZXIMPMDUNkRVO8/JxRd4+M0ejYYOzu2LIQ5ijecPzNuNR9nvDkml9XyyRBzu975FkhJcwD17ietQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.5.0.tgz", + "integrity": "sha512-s4+b1RFWkNKWp7WWrv2q60MuFljHUCbO7XAupBSCUz/NP1Hz4OenWbMPUt0H+fa8YZeN8CX3JDIA8Bet5uAJvw==", "devOptional": true, "requires": { "@electron/get": "^1.0.1", @@ -13299,9 +13320,9 @@ "requires": {} }, "eslint-plugin-jest": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz", - "integrity": "sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==", + "version": "24.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.2.tgz", + "integrity": "sha512-jNMnqwX75z0RXRMXkxwb/+9ylKJYJLJ8nT8nBT0XFM5qx4IQGxP4edMawa0qGkSbHae0BDPBmi8I2QF0/F04XQ==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^4.0.1" @@ -13487,16 +13508,16 @@ "dev": true }, "expect": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.0.tgz", - "integrity": "sha512-oOTbawMQv7AK1FZURbPTgGSzmhxkjFzoARSvDjOMnOpeWuYQx1tP6rXu9MIX5mrACmyCAM7fSNP8IJO2f1p0CQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.2.tgz", + "integrity": "sha512-sjHBeEk47/eshN9oLbvPJZMgHQihOXXQzSMPCJ4MqKShbU9HOVFSNHEEU4dp4ujzxFSiNvPFzB2AMOFmkizhvA==", "dev": true, "requires": { "@jest/types": "^27.1.1", "ansi-styles": "^5.0.0", "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.2.0", - "jest-message-util": "^27.2.0", + "jest-matcher-utils": "^27.2.2", + "jest-message-util": "^27.2.2", "jest-regex-util": "^27.0.6" }, "dependencies": { @@ -14567,14 +14588,14 @@ } }, "jest": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.0.tgz", - "integrity": "sha512-oUqVXyvh5YwEWl263KWdPUAqEzBFzGHdFLQ05hUnITr1tH+9SscEI9A/GH9eBClA+Nw1ct+KNuuOV6wlnmBPcg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.2.tgz", + "integrity": "sha512-XAB/9akDTe3/V0wPNKWfP9Y/NT1QPiCqyRBYGbC66EA9EvgAzdaFEqhFGLaDJ5UP2yIyXUMtju9a9IMrlYbZTQ==", "dev": true, "requires": { - "@jest/core": "^27.2.0", + "@jest/core": "^27.2.2", "import-local": "^3.0.2", - "jest-cli": "^27.2.0" + "jest-cli": "^27.2.2" } }, "jest-changed-files": { @@ -14589,91 +14610,91 @@ } }, "jest-circus": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.0.tgz", - "integrity": "sha512-WwENhaZwOARB1nmcboYPSv/PwHBUGRpA4MEgszjr9DLCl97MYw0qZprBwLb7rNzvMwfIvNGG7pefQ5rxyBlzIA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.2.tgz", + "integrity": "sha512-8txlqs0EDrvPasCgwfLMkG0l3F4FxqQa6lxOsvYfOl04eSJjRw3F4gk9shakuC00nMD+VT+SMtFYXxe64f0VZw==", "dev": true, "requires": { - "@jest/environment": "^27.2.0", - "@jest/test-result": "^27.2.0", + "@jest/environment": "^27.2.2", + "@jest/test-result": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.2.0", + "expect": "^27.2.2", "is-generator-fn": "^2.0.0", - "jest-each": "^27.2.0", - "jest-matcher-utils": "^27.2.0", - "jest-message-util": "^27.2.0", - "jest-runtime": "^27.2.0", - "jest-snapshot": "^27.2.0", + "jest-each": "^27.2.2", + "jest-matcher-utils": "^27.2.2", + "jest-message-util": "^27.2.2", + "jest-runtime": "^27.2.2", + "jest-snapshot": "^27.2.2", "jest-util": "^27.2.0", - "pretty-format": "^27.2.0", + "pretty-format": "^27.2.2", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" } }, "jest-cli": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.0.tgz", - "integrity": "sha512-bq1X/B/b1kT9y1zIFMEW3GFRX1HEhFybiqKdbxM+j11XMMYSbU9WezfyWIhrSOmPT+iODLATVjfsCnbQs7cfIA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.2.tgz", + "integrity": "sha512-jbEythw22LR/IHYgNrjWdO74wO9wyujCxTMjbky0GLav4rC4y6qDQr4TqQ2JPP51eDYJ2awVn83advEVSs5Brg==", "dev": true, "requires": { - "@jest/core": "^27.2.0", - "@jest/test-result": "^27.2.0", + "@jest/core": "^27.2.2", + "@jest/test-result": "^27.2.2", "@jest/types": "^27.1.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.2.0", + "jest-config": "^27.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", + "jest-validate": "^27.2.2", "prompts": "^2.0.1", "yargs": "^16.0.3" } }, "jest-config": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.0.tgz", - "integrity": "sha512-Z1romHpxeNwLxQtouQ4xt07bY6HSFGKTo0xJcvOK3u6uJHveA4LB2P+ty9ArBLpTh3AqqPxsyw9l9GMnWBYS9A==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.2.tgz", + "integrity": "sha512-2nhms3lp52ZpU0636bB6zIFHjDVtYxzFQIOHZjBFUeXcb6b41sEkWojbHaJ4FEIO44UbccTLa7tvNpiFCgPE7w==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.2.0", + "@jest/test-sequencer": "^27.2.2", "@jest/types": "^27.1.1", - "babel-jest": "^27.2.0", + "babel-jest": "^27.2.2", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", "is-ci": "^3.0.0", - "jest-circus": "^27.2.0", - "jest-environment-jsdom": "^27.2.0", - "jest-environment-node": "^27.2.0", + "jest-circus": "^27.2.2", + "jest-environment-jsdom": "^27.2.2", + "jest-environment-node": "^27.2.2", "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.2.0", + "jest-jasmine2": "^27.2.2", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.0", - "jest-runner": "^27.2.0", + "jest-resolve": "^27.2.2", + "jest-runner": "^27.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", + "jest-validate": "^27.2.2", "micromatch": "^4.0.4", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" } }, "jest-diff": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.0.tgz", - "integrity": "sha512-QSO9WC6btFYWtRJ3Hac0sRrkspf7B01mGrrQEiCW6TobtViJ9RWL0EmOs/WnBsZDsI/Y2IoSHZA2x6offu0sYw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.2.tgz", + "integrity": "sha512-o3LaDbQDSaMJif4yztJAULI4xVatxbBasbKLbEw3K8CiRdDdbxMrLArS9EKDHQFYh6Tgfrm1PC2mIYR1xhu0hQ==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" } }, "jest-docblock": { @@ -14686,26 +14707,26 @@ } }, "jest-each": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.2.0.tgz", - "integrity": "sha512-biDmmUQjg+HZOB7MfY2RHSFL3j418nMoC3TK3pGAj880fQQSxvQe1y2Wy23JJJNUlk6YXiGU0yWy86Le1HBPmA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.2.2.tgz", + "integrity": "sha512-ZCDhkvwHeXHsxoFxvW43fabL18iLiVDxaipG5XWG7dSd+XWXXpzMQvBWYT9Wvzhg5x4hvrLQ24LtiOKw3I09xA==", "dev": true, "requires": { "@jest/types": "^27.1.1", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", "jest-util": "^27.2.0", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" } }, "jest-environment-jsdom": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.0.tgz", - "integrity": "sha512-wNQJi6Rd/AkUWqTc4gWhuTIFPo7tlMK0RPZXeM6AqRHZA3D3vwvTa9ktAktyVyWYmUoXdYstOfyYMG3w4jt7eA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.2.tgz", + "integrity": "sha512-mzCLEdnpGWDJmNB6WIPLlZM+hpXdeiya9TryiByqcUdpliNV1O+LGC2SewzjmB4IblabGfvr3KcPN0Nme2wnDw==", "dev": true, "requires": { - "@jest/environment": "^27.2.0", - "@jest/fake-timers": "^27.2.0", + "@jest/environment": "^27.2.2", + "@jest/fake-timers": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1", @@ -14796,13 +14817,13 @@ } }, "jest-environment-node": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.0.tgz", - "integrity": "sha512-WbW+vdM4u88iy6Q3ftUEQOSgMPtSgjm3qixYYK2AKEuqmFO2zmACTw1vFUB0qI/QN88X6hA6ZkVKIdIWWzz+yg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.2.tgz", + "integrity": "sha512-XgUscWs6H6UNqC96/QJjmUGZzzpql/JyprLSXVu7wkgM8tjbJdEkSqwrVAvJPm1yu526ImrmsIoh2BTHxkwL/g==", "dev": true, "requires": { - "@jest/environment": "^27.2.0", - "@jest/fake-timers": "^27.2.0", + "@jest/environment": "^27.2.2", + "@jest/fake-timers": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "jest-mock": "^27.1.1", @@ -14816,9 +14837,9 @@ "dev": true }, "jest-haste-map": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.0.tgz", - "integrity": "sha512-laFet7QkNlWjwZtMGHCucLvF8o9PAh2cgePRck1+uadSM4E4XH9J4gnx4do+a6do8ZV5XHNEAXEkIoNg5XUH2Q==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.2.tgz", + "integrity": "sha512-kaKiq+GbAvk6/sq++Ymor4Vzk6+lr0vbKs2HDVPdkKsHX2lIJRyvhypZG/QsNfQnROKWIZSpUpGuv2HySSosvA==", "dev": true, "requires": { "@jest/types": "^27.1.1", @@ -14831,63 +14852,63 @@ "jest-regex-util": "^27.0.6", "jest-serializer": "^27.0.6", "jest-util": "^27.2.0", - "jest-worker": "^27.2.0", + "jest-worker": "^27.2.2", "micromatch": "^4.0.4", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.0.tgz", - "integrity": "sha512-NcPzZBk6IkDW3Z2V8orGueheGJJYfT5P0zI/vTO/Jp+R9KluUdgFrgwfvZ0A34Kw6HKgiWFILZmh3oQ/eS+UxA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.2.tgz", + "integrity": "sha512-SczhZNfmZID9HbJ1GHhO4EzeL/PMRGeAUw23ddPUdd6kFijEZpT2yOxyNCBUKAsVQ/14OB60kjgnbuFOboZUNg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.2.0", + "@jest/environment": "^27.2.2", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.2.0", + "@jest/test-result": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.2.0", + "expect": "^27.2.2", "is-generator-fn": "^2.0.0", - "jest-each": "^27.2.0", - "jest-matcher-utils": "^27.2.0", - "jest-message-util": "^27.2.0", - "jest-runtime": "^27.2.0", - "jest-snapshot": "^27.2.0", + "jest-each": "^27.2.2", + "jest-matcher-utils": "^27.2.2", + "jest-message-util": "^27.2.2", + "jest-runtime": "^27.2.2", + "jest-snapshot": "^27.2.2", "jest-util": "^27.2.0", - "pretty-format": "^27.2.0", + "pretty-format": "^27.2.2", "throat": "^6.0.1" } }, "jest-leak-detector": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.0.tgz", - "integrity": "sha512-e91BIEmbZw5+MHkB4Hnrq7S86coTxUMCkz4n7DLmQYvl9pEKmRx9H/JFH87bBqbIU5B2Ju1soKxRWX6/eGFGpA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.2.tgz", + "integrity": "sha512-fQIYKkhXUs/4EpE4wO1AVsv7aNH3o0km1BGq3vxvSfYdwG9GLMf+b0z/ghLmBYNxb+tVpm/zv2caoKm3GfTazg==", "dev": true, "requires": { "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" } }, "jest-matcher-utils": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.0.tgz", - "integrity": "sha512-F+LG3iTwJ0gPjxBX6HCyrARFXq6jjiqhwBQeskkJQgSLeF1j6ui1RTV08SR7O51XTUhtc8zqpDj8iCG4RGmdKw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.2.tgz", + "integrity": "sha512-xN3wT4p2i9DGB6zmL3XxYp5lJmq9Q6ff8XKlMtVVBS2SAshmgsPBALJFQ8dWRd2G/xf5q/N0SD0Mipt8QBA26A==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.2.0", + "jest-diff": "^27.2.2", "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" } }, "jest-message-util": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.0.tgz", - "integrity": "sha512-y+sfT/94CiP8rKXgwCOzO1mUazIEdEhrLjuiu+RKmCP+8O/TJTSne9dqQRbFIHBtlR2+q7cddJlWGir8UATu5w==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.2.tgz", + "integrity": "sha512-/iS5/m2FSF7Nn6APFoxFymJpyhB/gPf0CJa7uFSkbYaWvrADUfQ9NTsuyjpszKErOS2/huFs44ysWhlQTKvL8Q==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", @@ -14896,7 +14917,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.2.0", + "pretty-format": "^27.2.2", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -14936,44 +14957,44 @@ "dev": true }, "jest-resolve": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.0.tgz", - "integrity": "sha512-v09p9Ib/VtpHM6Cz+i9lEAv1Z/M5NVxsyghRHRMEUOqwPQs3zwTdwp1xS3O/k5LocjKiGS0OTaJoBSpjbM2Jlw==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.2.tgz", + "integrity": "sha512-tfbHcBs/hJTb3fPQ/3hLWR+TsLNTzzK98TU+zIAsrL9nNzWfWROwopUOmiSUqmHMZW5t9au/433kSF2/Af+tTw==", "dev": true, "requires": { "@jest/types": "^27.1.1", "chalk": "^4.0.0", "escalade": "^3.1.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.0", + "jest-haste-map": "^27.2.2", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", + "jest-validate": "^27.2.2", "resolve": "^1.20.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.0.tgz", - "integrity": "sha512-EY5jc/Y0oxn+oVEEldTidmmdVoZaknKPyDORA012JUdqPyqPL+lNdRyI3pGti0RCydds6coaw6xt4JQY54dKsg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.2.tgz", + "integrity": "sha512-nvJS+DyY51HHdZnMIwXg7fimQ5ylFx4+quQXspQXde2rXYy+4v75UYoX/J65Ln8mKCNc6YF8HEhfGaRBOrxxHg==", "dev": true, "requires": { "@jest/types": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-snapshot": "^27.2.0" + "jest-snapshot": "^27.2.2" } }, "jest-runner": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.0.tgz", - "integrity": "sha512-Cl+BHpduIc0cIVTjwoyx0pQk4Br8gn+wkr35PmKCmzEdOUnQ2wN7QVXA8vXnMQXSlFkN/+KWnk20TAVBmhgrww==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.2.tgz", + "integrity": "sha512-+bUFwBq+yTnvsOFuxetoQtkuOnqdAk2YuIGjlLmc7xLAXn/V1vjhXrLencgij0BUTTUvG9Aul3+5XDss4Wa8Eg==", "dev": true, "requires": { - "@jest/console": "^27.2.0", - "@jest/environment": "^27.2.0", - "@jest/test-result": "^27.2.0", - "@jest/transform": "^27.2.0", + "@jest/console": "^27.2.2", + "@jest/environment": "^27.2.2", + "@jest/test-result": "^27.2.2", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", @@ -14981,32 +15002,32 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.0.6", - "jest-environment-jsdom": "^27.2.0", - "jest-environment-node": "^27.2.0", - "jest-haste-map": "^27.2.0", - "jest-leak-detector": "^27.2.0", - "jest-message-util": "^27.2.0", - "jest-resolve": "^27.2.0", - "jest-runtime": "^27.2.0", + "jest-environment-jsdom": "^27.2.2", + "jest-environment-node": "^27.2.2", + "jest-haste-map": "^27.2.2", + "jest-leak-detector": "^27.2.2", + "jest-message-util": "^27.2.2", + "jest-resolve": "^27.2.2", + "jest-runtime": "^27.2.2", "jest-util": "^27.2.0", - "jest-worker": "^27.2.0", + "jest-worker": "^27.2.2", "source-map-support": "^0.5.6", "throat": "^6.0.1" } }, "jest-runtime": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.0.tgz", - "integrity": "sha512-6gRE9AVVX49hgBbWQ9PcNDeM4upMUXzTpBs0kmbrjyotyUyIJixLPsYjpeTFwAA07PVLDei1iAm2chmWycdGdQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.2.tgz", + "integrity": "sha512-PtTHCK5jT+KrIpKpjJsltu/dK5uGhBtTNLOk1Z+ZD2Jrxam2qQsOqDFYLszcK0jc2TLTNsrVpclqSftn7y3aXA==", "dev": true, "requires": { - "@jest/console": "^27.2.0", - "@jest/environment": "^27.2.0", - "@jest/fake-timers": "^27.2.0", - "@jest/globals": "^27.2.0", + "@jest/console": "^27.2.2", + "@jest/environment": "^27.2.2", + "@jest/fake-timers": "^27.2.2", + "@jest/globals": "^27.2.2", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.2.0", - "@jest/transform": "^27.2.0", + "@jest/test-result": "^27.2.2", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -15016,14 +15037,14 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.0", - "jest-message-util": "^27.2.0", + "jest-haste-map": "^27.2.2", + "jest-message-util": "^27.2.2", "jest-mock": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.0", - "jest-snapshot": "^27.2.0", + "jest-resolve": "^27.2.2", + "jest-snapshot": "^27.2.2", "jest-util": "^27.2.0", - "jest-validate": "^27.2.0", + "jest-validate": "^27.2.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^16.0.3" @@ -15040,9 +15061,9 @@ } }, "jest-snapshot": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.0.tgz", - "integrity": "sha512-MukJvy3KEqemCT2FoT3Gum37CQqso/62PKTfIzWmZVTsLsuyxQmJd2PI5KPcBYFqLlA8LgZLHM8ZlazkVt8LsQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.2.tgz", + "integrity": "sha512-7ODSvULMiiOVuuLvLZpDlpqqTqX9hDfdmijho5auVu9qRYREolvrvgH4kSNOKfcqV3EZOTuLKNdqsz1PM20PQA==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -15051,23 +15072,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.2.0", + "@jest/transform": "^27.2.2", "@jest/types": "^27.1.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.2.0", + "expect": "^27.2.2", "graceful-fs": "^4.2.4", - "jest-diff": "^27.2.0", + "jest-diff": "^27.2.2", "jest-get-type": "^27.0.6", - "jest-haste-map": "^27.2.0", - "jest-matcher-utils": "^27.2.0", - "jest-message-util": "^27.2.0", - "jest-resolve": "^27.2.0", + "jest-haste-map": "^27.2.2", + "jest-matcher-utils": "^27.2.2", + "jest-message-util": "^27.2.2", + "jest-resolve": "^27.2.2", "jest-util": "^27.2.0", "natural-compare": "^1.4.0", - "pretty-format": "^27.2.0", + "pretty-format": "^27.2.2", "semver": "^7.3.2" }, "dependencies": { @@ -15097,9 +15118,9 @@ } }, "jest-validate": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.0.tgz", - "integrity": "sha512-uIEZGkFKk3+4liA81Xu0maG5aGDyPLdp+4ed244c+Ql0k3aLWQYcMbaMLXOIFcb83LPHzYzqQ8hwNnIxTqfAGQ==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.2.tgz", + "integrity": "sha512-01mwTAs2kgDuX98Ua3Xhdhp5lXsLU4eyg6k56adTtrXnU/GbLd9uAsh5nc4MWVtUXMeNmHUyEiD4ibLqE8MuNw==", "dev": true, "requires": { "@jest/types": "^27.1.1", @@ -15107,7 +15128,7 @@ "chalk": "^4.0.0", "jest-get-type": "^27.0.6", "leven": "^3.1.0", - "pretty-format": "^27.2.0" + "pretty-format": "^27.2.2" }, "dependencies": { "camelcase": { @@ -15119,12 +15140,12 @@ } }, "jest-watcher": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.0.tgz", - "integrity": "sha512-SjRWhnr+qO8aBsrcnYIyF+qRxNZk6MZH8TIDgvi+VlsyrvOyqg0d+Rm/v9KHiTtC9mGGeFi9BFqgavyWib6xLg==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.2.tgz", + "integrity": "sha512-7HJwZq06BCfM99RacCVzXO90B20/dNJvq+Ouiu/VrFdFRCpbnnqlQUEk4KAhBSllgDrTPgKu422SCF5KKBHDRA==", "dev": true, "requires": { - "@jest/test-result": "^27.2.0", + "@jest/test-result": "^27.2.2", "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -15134,9 +15155,9 @@ } }, "jest-worker": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", - "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.2.tgz", + "integrity": "sha512-aG1xq9KgWB2CPC8YdMIlI8uZgga2LFNcGbHJxO8ctfXAydSaThR4EewKQGg3tBOC+kS3vhPGgymsBdi9VINjPw==", "dev": true, "requires": { "@types/node": "*", @@ -15828,9 +15849,33 @@ } }, "node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==" + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } }, "node-ical": { "version": "0.13.0", @@ -16456,13 +16501,13 @@ } }, "pretty-format": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.0.tgz", - "integrity": "sha512-KyJdmgBkMscLqo8A7K77omgLx5PWPiXJswtTtFV7XgVZv2+qPk6UivpXXO+5k6ZEbWIbLoKdx1pZ6ldINzbwTA==", + "version": "27.2.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.2.tgz", + "integrity": "sha512-+DdLh+rtaElc2SQOE/YPH8k2g3Rf2OXWEpy06p8Szs3hdVSYD87QOOlYRHWAeb/59XTmeVmRKvDD0svHqf6ycA==", "dev": true, "requires": { "@jest/types": "^27.1.1", - "ansi-regex": "^5.0.0", + "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, @@ -17457,13 +17502,12 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "stack-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.4.tgz", - "integrity": "sha512-ERg+H//lSSYlZhBIUu+wJnqg30AbyBbpZlIhcshpn7BNzpoRODZgfyr9J+8ERf3ooC6af3u7Lcl01nleau7MrA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dev": true, "requires": { - "escape-string-regexp": "^2.0.0", - "source-map-support": "^0.5.20" + "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { @@ -18069,9 +18113,9 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "v8-to-istanbul": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", - "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz", + "integrity": "sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", diff --git a/package.json b/package.json index 5d15a245..2e1a3229 100644 --- a/package.json +++ b/package.json @@ -47,12 +47,12 @@ "homepage": "https://magicmirror.builders", "devDependencies": { "eslint-config-prettier": "^8.3.0", - "eslint-plugin-jest": "^24.4.0", + "eslint-plugin-jest": "^24.4.2", "eslint-plugin-jsdoc": "^36.1.0", "eslint-plugin-prettier": "^4.0.0", "express-basic-auth": "^1.2.0", "husky": "^7.0.2", - "jest": "^27.2.0", + "jest": "^27.2.2", "jsdom": "^17.0.0", "lodash": "^4.17.21", "nyc": "^15.1.0", @@ -67,7 +67,7 @@ "suncalc": "^1.8.0" }, "optionalDependencies": { - "electron": "^13.4.0" + "electron": "^13.5.0" }, "dependencies": { "colors": "^1.4.0", @@ -81,7 +81,7 @@ "iconv-lite": "^0.6.3", "module-alias": "^2.2.2", "moment": "^2.29.1", - "node-fetch": "^2.6.2", + "node-fetch": "^2.6.5", "node-ical": "^0.13.0", "socket.io": "^4.2.0" }, From f7f24dbdfec44d861a8534f8a6b2e582964c5b9a Mon Sep 17 00:00:00 2001 From: veeck Date: Tue, 28 Sep 2021 12:15:07 +0200 Subject: [PATCH 25/37] Update CHANGELOGE --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8961cfd..7bc44f70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ _This release is scheduled to be released on 2021-10-01._ - Use of `logger.js` in jest tests. - Run prettier over all relevant files. - Move test needing electron in new category `electron`, use `server only` mode in `e2e` tests. +- Update dependencies in package.json. ### Fixed From 1034171e91e4f650c3a38469ad40fba5dfd9edc4 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Tue, 28 Sep 2021 21:10:24 +0200 Subject: [PATCH 26/37] add CHANGELOG --- CHANGELOG.md | 2 +- tests/e2e/mock-console.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8961cfd..7530e579 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ _This release is scheduled to be released on 2021-10-01._ - Refactored methods from weatherproviders into weatherobject (isDaytime, updateSunTime). - Use of `logger.js` in jest tests. - Run prettier over all relevant files. -- Move test needing electron in new category `electron`, use `server only` mode in `e2e` tests. +- Move tests needing electron in new category `electron`, use `server only` mode in `e2e` tests. ### Fixed diff --git a/tests/e2e/mock-console.js b/tests/e2e/mock-console.js index 03402a05..90b70f12 100644 --- a/tests/e2e/mock-console.js +++ b/tests/e2e/mock-console.js @@ -3,7 +3,7 @@ * * @param {string} err The error message. */ -function myError(err) { +function mockError(err) { if (err.includes("ECONNREFUSED") || err.includes("ECONNRESET") || err.includes("socket hang up") || err.includes("exports is not defined")) { jest.fn(); } else { @@ -14,7 +14,7 @@ function myError(err) { global.console = { log: jest.fn(), dir: console.dir, - error: myError, + error: mockError, warn: console.warn, info: jest.fn(), debug: console.debug From abcee8aa5600fe2dc1c27d799107a5ab3e510ce6 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Tue, 28 Sep 2021 21:23:59 +0200 Subject: [PATCH 27/37] fix global-setup.js --- tests/e2e/global-setup.js | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js index e524d47c..8e940d9b 100644 --- a/tests/e2e/global-setup.js +++ b/tests/e2e/global-setup.js @@ -1,5 +1,4 @@ const jsdom = require("jsdom"); -const config = require("../configs/empty_ipWhiteList"); exports.startApplication = function (configFilename, exec) { jest.resetModules(); From 8224a6ac35dfffdfc9a7e859de4b12502c30a887 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Tue, 28 Sep 2021 21:38:30 +0200 Subject: [PATCH 28/37] add custom.css before testing --- .github/workflows/codecov-test-suites.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/codecov-test-suites.yml b/.github/workflows/codecov-test-suites.yml index f2d210eb..8c2be8da 100644 --- a/.github/workflows/codecov-test-suites.yml +++ b/.github/workflows/codecov-test-suites.yml @@ -20,6 +20,7 @@ jobs: Xvfb :99 -screen 0 1024x768x16 & export DISPLAY=:99 npm ci + touch css/custom.css npm run test:coverage - name: Upload coverage results to codecov uses: codecov/codecov-action@v1 From c67320f1852a1fbd8f4b95120b3cebb72891047f Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Tue, 28 Sep 2021 22:08:21 +0200 Subject: [PATCH 29/37] fix logger.js --- js/logger.js | 2 +- tests/e2e/global-setup.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/js/logger.js b/js/logger.js index a42db925..0ea523d7 100644 --- a/js/logger.js +++ b/js/logger.js @@ -30,7 +30,7 @@ enableLog = process.env.JEST_WORKER_ID === undefined; } else { // in browser and not running with jsdom - enableLog = typeof window === "object" && window.name === "nodejs"; + enableLog = typeof window === "object" && window.name !== "jsdom"; } if (enableLog) { diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js index 8e940d9b..45726493 100644 --- a/tests/e2e/global-setup.js +++ b/tests/e2e/global-setup.js @@ -21,6 +21,7 @@ exports.stopApplication = function () { exports.getDocument = function (callback, ms) { const url = "http://" + (config.address || "localhost") + ":" + (config.port || "8080"); jsdom.JSDOM.fromURL(url, { resources: "usable", runScripts: "dangerously" }).then((dom) => { + dom.window.name = "jsdom"; dom.window.onload = function () { global.document = dom.window.document; setTimeout(() => { From 997aec8cc22b5af4a4559feb2a095d04b48104b9 Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Wed, 29 Sep 2021 21:02:52 +0200 Subject: [PATCH 30/37] remove default values from test configs --- tests/configs/default.js | 6 ------ tests/configs/modules/alert/default.js | 6 ------ tests/configs/modules/clock/clock_12hr.js | 4 ---- tests/configs/modules/clock/clock_24hr.js | 6 ------ tests/configs/modules/clock/clock_analog.js | 6 ------ tests/configs/modules/clock/clock_displaySeconds_false.js | 4 ---- tests/configs/modules/clock/clock_showPeriodUpper.js | 4 ---- tests/configs/modules/clock/clock_showTime.js | 4 ---- tests/configs/modules/clock/clock_showWeek.js | 4 ---- tests/configs/modules/clock/es/clock_12hr.js | 3 --- tests/configs/modules/clock/es/clock_24hr.js | 4 ---- tests/configs/modules/clock/es/clock_showPeriodUpper.js | 3 --- tests/configs/modules/clock/es/clock_showWeek.js | 3 --- tests/configs/modules/compliments/compliments_anytime.js | 4 ---- tests/configs/modules/compliments/compliments_date.js | 4 ---- .../configs/modules/compliments/compliments_only_anytime.js | 4 ---- tests/configs/modules/compliments/compliments_parts_day.js | 4 ---- tests/configs/modules/display.js | 6 ------ tests/configs/modules/helloworld/helloworld.js | 6 ------ tests/configs/modules/helloworld/helloworld_default.js | 6 ------ tests/configs/modules/newsfeed/default.js | 4 ---- tests/configs/modules/newsfeed/incorrect_url.js | 4 ---- tests/configs/modules/newsfeed/prohibited_words.js | 4 ---- tests/configs/modules/positions.js | 6 ------ tests/configs/without_modules.js | 4 +--- 25 files changed, 1 insertion(+), 112 deletions(-) diff --git a/tests/configs/default.js b/tests/configs/default.js index e3236318..5568e5e0 100644 --- a/tests/configs/default.js +++ b/tests/configs/default.js @@ -6,12 +6,6 @@ exports.configFactory = function (options) { return Object.assign( { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - - language: "en", - timeFormat: 24, - units: "metric", electronOptions: { webPreferences: { nodeIntegration: true, diff --git a/tests/configs/modules/alert/default.js b/tests/configs/modules/alert/default.js index d9c5c968..423260c7 100644 --- a/tests/configs/modules/alert/default.js +++ b/tests/configs/modules/alert/default.js @@ -4,12 +4,6 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", - timeFormat: 24, - units: "metric", - modules: [ { module: "alert", diff --git a/tests/configs/modules/clock/clock_12hr.js b/tests/configs/modules/clock/clock_12hr.js index cb3563c7..6b8917bd 100644 --- a/tests/configs/modules/clock/clock_12hr.js +++ b/tests/configs/modules/clock/clock_12hr.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/clock/clock_24hr.js b/tests/configs/modules/clock/clock_24hr.js index f77a600d..27f89d0c 100644 --- a/tests/configs/modules/clock/clock_24hr.js +++ b/tests/configs/modules/clock/clock_24hr.js @@ -4,12 +4,6 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", - timeFormat: 24, - units: "metric", - modules: [ { module: "clock", diff --git a/tests/configs/modules/clock/clock_analog.js b/tests/configs/modules/clock/clock_analog.js index 7f1353c6..cbe3fecc 100644 --- a/tests/configs/modules/clock/clock_analog.js +++ b/tests/configs/modules/clock/clock_analog.js @@ -3,12 +3,6 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", - timeFormat: 24, - units: "metric", - modules: [ { module: "clock", diff --git a/tests/configs/modules/clock/clock_displaySeconds_false.js b/tests/configs/modules/clock/clock_displaySeconds_false.js index 4e872377..57bf006a 100644 --- a/tests/configs/modules/clock/clock_displaySeconds_false.js +++ b/tests/configs/modules/clock/clock_displaySeconds_false.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/clock/clock_showPeriodUpper.js b/tests/configs/modules/clock/clock_showPeriodUpper.js index 7ff7f20a..1e01644f 100644 --- a/tests/configs/modules/clock/clock_showPeriodUpper.js +++ b/tests/configs/modules/clock/clock_showPeriodUpper.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/clock/clock_showTime.js b/tests/configs/modules/clock/clock_showTime.js index 2c130fb2..37bdc5cc 100644 --- a/tests/configs/modules/clock/clock_showTime.js +++ b/tests/configs/modules/clock/clock_showTime.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/clock/clock_showWeek.js b/tests/configs/modules/clock/clock_showWeek.js index 1db31cb6..2c421e85 100644 --- a/tests/configs/modules/clock/clock_showWeek.js +++ b/tests/configs/modules/clock/clock_showWeek.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/clock/es/clock_12hr.js b/tests/configs/modules/clock/es/clock_12hr.js index 57d1c7a9..07e5206a 100644 --- a/tests/configs/modules/clock/es/clock_12hr.js +++ b/tests/configs/modules/clock/es/clock_12hr.js @@ -4,11 +4,8 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], language: "es", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/clock/es/clock_24hr.js b/tests/configs/modules/clock/es/clock_24hr.js index 60cfa109..469f4e3b 100644 --- a/tests/configs/modules/clock/es/clock_24hr.js +++ b/tests/configs/modules/clock/es/clock_24hr.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], language: "es", - timeFormat: 24, - units: "metric", modules: [ { diff --git a/tests/configs/modules/clock/es/clock_showPeriodUpper.js b/tests/configs/modules/clock/es/clock_showPeriodUpper.js index 5d0c28bb..0253c28c 100644 --- a/tests/configs/modules/clock/es/clock_showPeriodUpper.js +++ b/tests/configs/modules/clock/es/clock_showPeriodUpper.js @@ -4,11 +4,8 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], language: "es", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/clock/es/clock_showWeek.js b/tests/configs/modules/clock/es/clock_showWeek.js index f8f71982..dd8f6cd2 100644 --- a/tests/configs/modules/clock/es/clock_showWeek.js +++ b/tests/configs/modules/clock/es/clock_showWeek.js @@ -5,11 +5,8 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], language: "es", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/compliments/compliments_anytime.js b/tests/configs/modules/compliments/compliments_anytime.js index 813bd32c..2034b379 100644 --- a/tests/configs/modules/compliments/compliments_anytime.js +++ b/tests/configs/modules/compliments/compliments_anytime.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/compliments/compliments_date.js b/tests/configs/modules/compliments/compliments_date.js index bf0ae2da..a89dd7de 100644 --- a/tests/configs/modules/compliments/compliments_date.js +++ b/tests/configs/modules/compliments/compliments_date.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/compliments/compliments_only_anytime.js b/tests/configs/modules/compliments/compliments_only_anytime.js index 6e52f57e..5261e58b 100644 --- a/tests/configs/modules/compliments/compliments_only_anytime.js +++ b/tests/configs/modules/compliments/compliments_only_anytime.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/compliments/compliments_parts_day.js b/tests/configs/modules/compliments/compliments_parts_day.js index 89b06814..08c9d94e 100644 --- a/tests/configs/modules/compliments/compliments_parts_day.js +++ b/tests/configs/modules/compliments/compliments_parts_day.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/display.js b/tests/configs/modules/display.js index b9facce3..03aa4f19 100644 --- a/tests/configs/modules/display.js +++ b/tests/configs/modules/display.js @@ -4,12 +4,6 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", - timeFormat: 24, - units: "metric", - modules: [ { module: "helloworld", diff --git a/tests/configs/modules/helloworld/helloworld.js b/tests/configs/modules/helloworld/helloworld.js index a1d48278..39480bc1 100644 --- a/tests/configs/modules/helloworld/helloworld.js +++ b/tests/configs/modules/helloworld/helloworld.js @@ -4,12 +4,6 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", - timeFormat: 24, - units: "metric", - modules: [ { module: "helloworld", diff --git a/tests/configs/modules/helloworld/helloworld_default.js b/tests/configs/modules/helloworld/helloworld_default.js index 5678488d..ea95ad83 100644 --- a/tests/configs/modules/helloworld/helloworld_default.js +++ b/tests/configs/modules/helloworld/helloworld_default.js @@ -4,12 +4,6 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", - timeFormat: 24, - units: "metric", - modules: [ { module: "helloworld", diff --git a/tests/configs/modules/newsfeed/default.js b/tests/configs/modules/newsfeed/default.js index 160212f1..7758da0c 100644 --- a/tests/configs/modules/newsfeed/default.js +++ b/tests/configs/modules/newsfeed/default.js @@ -4,11 +4,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/newsfeed/incorrect_url.js b/tests/configs/modules/newsfeed/incorrect_url.js index bdaa0341..522fa2d1 100644 --- a/tests/configs/modules/newsfeed/incorrect_url.js +++ b/tests/configs/modules/newsfeed/incorrect_url.js @@ -3,11 +3,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/newsfeed/prohibited_words.js b/tests/configs/modules/newsfeed/prohibited_words.js index 55c71e29..68d22f54 100644 --- a/tests/configs/modules/newsfeed/prohibited_words.js +++ b/tests/configs/modules/newsfeed/prohibited_words.js @@ -3,11 +3,7 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", timeFormat: 12, - units: "metric", modules: [ { diff --git a/tests/configs/modules/positions.js b/tests/configs/modules/positions.js index f4f5c453..186c25f9 100644 --- a/tests/configs/modules/positions.js +++ b/tests/configs/modules/positions.js @@ -4,12 +4,6 @@ * MIT Licensed. */ let config = { - port: 8080, - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1"], - language: "en", - timeFormat: 24, - units: "metric", - modules: // Using exotic content. This is why don't accept go to JSON configuration file (function () { diff --git a/tests/configs/without_modules.js b/tests/configs/without_modules.js index 9cc097ae..a90115d4 100644 --- a/tests/configs/without_modules.js +++ b/tests/configs/without_modules.js @@ -4,10 +4,8 @@ * MIT Licensed. */ let config = { - port: 8080, ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.10.1"], - language: "en", - timeFormat: 24, + units: "metric" }; From b3bddb2c990cc0adfd64851428781ba3f4691daa Mon Sep 17 00:00:00 2001 From: Karsten Hassel Date: Wed, 29 Sep 2021 21:59:22 +0200 Subject: [PATCH 31/37] fix without_modules.js --- tests/configs/without_modules.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/configs/without_modules.js b/tests/configs/without_modules.js index a90115d4..50ff521e 100644 --- a/tests/configs/without_modules.js +++ b/tests/configs/without_modules.js @@ -4,9 +4,7 @@ * MIT Licensed. */ let config = { - ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.10.1"], - - units: "metric" + ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1", "::1", "::ffff:192.168.10.1"] }; /*************** DO NOT EDIT THE LINE BELOW ***************/ From f7465679c0cb60f7d50e5995356763c5aea6a7e8 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Fri, 1 Oct 2021 15:06:26 +0200 Subject: [PATCH 32/37] Prepare 2.17.0 Release --- CHANGELOG.md | 4 +- package-lock.json | 4 +- package.json | 2 +- vendor/package-lock.json | 304 +++++++++++++++++++-------------------- 4 files changed, 157 insertions(+), 157 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7baddc79..e468b929 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,9 @@ This project adheres to [Semantic Versioning](https://semver.org/). ❤️ **Donate:** Enjoying MagicMirror²? [Please consider a donation!](https://magicmirror.builders/donate) With your help we can continue to improve the MagicMirror² -## [2.17.0] - Unreleased (Develop Branch) +## [2.17.0] - 2021-10-01 -_This release is scheduled to be released on 2021-10-01._ +Special thanks to the following contributors: @apiontek, @eouia, @jupadin, @khassel and @rejas. ### Added diff --git a/package-lock.json b/package-lock.json index bb78f731..c42d4b2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "magicmirror", - "version": "2.17.0-develop", + "version": "2.17.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "magicmirror", - "version": "2.17.0-develop", + "version": "2.17.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 1a272935..3b8a42d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.17.0-develop", + "version": "2.17.0", "description": "The open source modular smart mirror platform.", "main": "js/electron.js", "scripts": { diff --git a/vendor/package-lock.json b/vendor/package-lock.json index 7aaf2391..8654c60b 100644 --- a/vendor/package-lock.json +++ b/vendor/package-lock.json @@ -1,154 +1,154 @@ { - "name": "magicmirror-vendors", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "magicmirror-vendors", - "license": "MIT", - "dependencies": { - "@fortawesome/fontawesome-free": "^5.15.4", - "moment": "^2.29.1", - "moment-timezone": "^0.5.33", - "nunjucks": "^3.2.3", - "suncalc": "^1.8.0", - "weathericons": "^2.1.0" - } - }, - "node_modules/@fortawesome/fontawesome-free": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", - "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.33", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", - "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", - "dependencies": { - "moment": ">= 2.9.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nunjucks": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", - "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", - "dependencies": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - }, - "bin": { - "nunjucks-precompile": "bin/precompile" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/suncalc": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/suncalc/-/suncalc-1.8.0.tgz", - "integrity": "sha1-HZiYEJVjB4dQ9JlKlZ5lTYdqy/U=" - }, - "node_modules/weathericons": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/weathericons/-/weathericons-2.1.0.tgz", - "integrity": "sha1-dFOho14gAkXjiftQd9Un7/MLc7Q=" - } - }, - "dependencies": { - "@fortawesome/fontawesome-free": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", - "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" - }, - "a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "moment": { - "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.33", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", - "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", - "requires": { - "moment": ">= 2.9.0" - } - }, - "nunjucks": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", - "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", - "requires": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - } - }, - "suncalc": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/suncalc/-/suncalc-1.8.0.tgz", - "integrity": "sha1-HZiYEJVjB4dQ9JlKlZ5lTYdqy/U=" - }, - "weathericons": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/weathericons/-/weathericons-2.1.0.tgz", - "integrity": "sha1-dFOho14gAkXjiftQd9Un7/MLc7Q=" - } - } + "name": "magicmirror-vendors", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "magicmirror-vendors", + "license": "MIT", + "dependencies": { + "@fortawesome/fontawesome-free": "^5.15.4", + "moment": "^2.29.1", + "moment-timezone": "^0.5.33", + "nunjucks": "^3.2.3", + "suncalc": "^1.8.0", + "weathericons": "^2.1.0" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.33", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", + "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nunjucks": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", + "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/suncalc": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/suncalc/-/suncalc-1.8.0.tgz", + "integrity": "sha1-HZiYEJVjB4dQ9JlKlZ5lTYdqy/U=" + }, + "node_modules/weathericons": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/weathericons/-/weathericons-2.1.0.tgz", + "integrity": "sha1-dFOho14gAkXjiftQd9Un7/MLc7Q=" + } + }, + "dependencies": { + "@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" + }, + "a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "moment": { + "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.33", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", + "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "nunjucks": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.3.tgz", + "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + } + }, + "suncalc": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/suncalc/-/suncalc-1.8.0.tgz", + "integrity": "sha1-HZiYEJVjB4dQ9JlKlZ5lTYdqy/U=" + }, + "weathericons": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/weathericons/-/weathericons-2.1.0.tgz", + "integrity": "sha1-dFOho14gAkXjiftQd9Un7/MLc7Q=" + } + } } From a49459b25342599bbf93b959306db0cb150dc132 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Fri, 1 Oct 2021 15:25:54 +0200 Subject: [PATCH 33/37] Prepare 2.18.0 Dev Branch --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e468b929..9604a554 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ This project adheres to [Semantic Versioning](https://semver.org/). ❤️ **Donate:** Enjoying MagicMirror²? [Please consider a donation!](https://magicmirror.builders/donate) With your help we can continue to improve the MagicMirror² + +## [2.18.0] - Unreleased (Develop Branch) + +_This release is scheduled to be released on 2022-01-01._ + +### Added + +### Updated + +### Fixed + ## [2.17.0] - 2021-10-01 Special thanks to the following contributors: @apiontek, @eouia, @jupadin, @khassel and @rejas. diff --git a/package-lock.json b/package-lock.json index c42d4b2d..b52fed82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "magicmirror", - "version": "2.17.0", + "version": "2.18.0-develop", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "magicmirror", - "version": "2.17.0", + "version": "2.18.0-develop", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 3b8a42d7..d177d02e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.17.0", + "version": "2.18.0-develop", "description": "The open source modular smart mirror platform.", "main": "js/electron.js", "scripts": { From 1735ca57d5b993a05def2a2fd6f9e3360e11e502 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Fri, 1 Oct 2021 16:03:29 +0200 Subject: [PATCH 34/37] Fix Formatting --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9604a554..760cb588 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,6 @@ This project adheres to [Semantic Versioning](https://semver.org/). ❤️ **Donate:** Enjoying MagicMirror²? [Please consider a donation!](https://magicmirror.builders/donate) With your help we can continue to improve the MagicMirror² - ## [2.18.0] - Unreleased (Develop Branch) _This release is scheduled to be released on 2022-01-01._ From 83cc18f64830e644abde1ceb7ad369fab9abc38d Mon Sep 17 00:00:00 2001 From: veeck Date: Fri, 1 Oct 2021 18:03:10 +0200 Subject: [PATCH 35/37] Update electron to fix certificate errors --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c42d4b2d..0ac47311 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,7 @@ "node": ">=12" }, "optionalDependencies": { - "electron": "^13.5.0" + "electron": "^13.5.1" } }, "node_modules/@babel/code-frame": { @@ -3230,9 +3230,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.5.0.tgz", - "integrity": "sha512-s4+b1RFWkNKWp7WWrv2q60MuFljHUCbO7XAupBSCUz/NP1Hz4OenWbMPUt0H+fa8YZeN8CX3JDIA8Bet5uAJvw==", + "version": "13.5.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.5.1.tgz", + "integrity": "sha512-ZyxhIhmdaeE3xiIGObf0zqEyCyuIDqZQBv9NKX8w5FNzGm87j4qR0H1+GQg6vz+cA1Nnv1x175Zvimzc0/UwEQ==", "devOptional": true, "hasInstallScript": true, "dependencies": { @@ -13035,9 +13035,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.5.0.tgz", - "integrity": "sha512-s4+b1RFWkNKWp7WWrv2q60MuFljHUCbO7XAupBSCUz/NP1Hz4OenWbMPUt0H+fa8YZeN8CX3JDIA8Bet5uAJvw==", + "version": "13.5.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.5.1.tgz", + "integrity": "sha512-ZyxhIhmdaeE3xiIGObf0zqEyCyuIDqZQBv9NKX8w5FNzGm87j4qR0H1+GQg6vz+cA1Nnv1x175Zvimzc0/UwEQ==", "devOptional": true, "requires": { "@electron/get": "^1.0.1", diff --git a/package.json b/package.json index 3b8a42d7..516e0f62 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "suncalc": "^1.8.0" }, "optionalDependencies": { - "electron": "^13.5.0" + "electron": "^13.5.1" }, "dependencies": { "colors": "^1.4.0", From 33387b60cc93968cf96b083d70766fdeabc09316 Mon Sep 17 00:00:00 2001 From: veeck Date: Fri, 1 Oct 2021 18:30:06 +0200 Subject: [PATCH 36/37] Update CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e468b929..4a1639db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ This project adheres to [Semantic Versioning](https://semver.org/). ❤️ **Donate:** Enjoying MagicMirror²? [Please consider a donation!](https://magicmirror.builders/donate) With your help we can continue to improve the MagicMirror² +## [2.17.1] - 2021-10-01 + +### Fixed + +- Fixed error when accessing letsencrypt certificates + ## [2.17.0] - 2021-10-01 Special thanks to the following contributors: @apiontek, @eouia, @jupadin, @khassel and @rejas. From 72f7106086459dff7946927d5090d1067daca12f Mon Sep 17 00:00:00 2001 From: veeck Date: Fri, 1 Oct 2021 18:31:29 +0200 Subject: [PATCH 37/37] Update version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ac47311..f1c3bd33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "magicmirror", - "version": "2.17.0", + "version": "2.17.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "magicmirror", - "version": "2.17.0", + "version": "2.17.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 516e0f62..b821a8c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.17.0", + "version": "2.17.1", "description": "The open source modular smart mirror platform.", "main": "js/electron.js", "scripts": {