From 1109e700191c7aa8ba5343bde5844fde5d0aa222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 19:14:07 -0300 Subject: [PATCH 01/27] use v2 API URL --- main.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.js b/main.js index b86bb1b..5b99219 100644 --- a/main.js +++ b/main.js @@ -75,7 +75,8 @@ class eWeLink { * @returns {string} */ getApiUrl() { - return `https://${this.region}-api.coolkit.cc:8080/api`; + const domain = this.region === 'cn' ? 'cn' : 'cc'; + return `https://${this.region}-apia.coolkit.${domain}`; } /** From 012d0ee092d318f46449cf2210496a7630339b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 19:15:22 -0300 Subject: [PATCH 02/27] getCredentials: use v2 API --- src/mixins/getCredentials.js | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/src/mixins/getCredentials.js b/src/mixins/getCredentials.js index dbdc502..1fa11db 100644 --- a/src/mixins/getCredentials.js +++ b/src/mixins/getCredentials.js @@ -1,50 +1,41 @@ const fetch = require('node-fetch'); const { _get } = require('../helpers/utilities'); -const credentialsPayload = require('../payloads/credentialsPayload'); const { makeAuthorizationSign } = require('../helpers/ewelink'); -const errors = require('../data/errors'); module.exports = { /** * Returns user credentials information - * - * @returns {Promise<{msg: string, error: *}>} */ async getCredentials() { const { APP_ID, APP_SECRET } = this; - const body = credentialsPayload({ - appid: APP_ID, + const body = { + countryCode: '+1', email: this.email, - phoneNumber: this.phoneNumber, password: this.password, - }); + }; + + if (this.phoneNumber) { + body.phoneNumber = this.phoneNumber; + } - const request = await fetch(`${this.getApiUrl()}/user/login`, { + const request = await fetch(`${this.getApiUrl()}/v2/user/login`, { method: 'post', headers: { Authorization: `Sign ${makeAuthorizationSign(APP_SECRET, body)}`, + 'Content-Type': 'application/json', + 'X-CK-Appid': APP_ID, }, body: JSON.stringify(body), }); - let response = await request.json(); + const response = await request.json(); const error = _get(response, 'error', false); - const region = _get(response, 'region', false); - - if (error && [400, 401, 404].indexOf(parseInt(error)) !== -1) { - return { error: 406, msg: errors['406'] }; - } - if (error && parseInt(error) === 301 && region) { - if (this.region !== region) { - this.region = region; - response = await this.getCredentials(); - return response; - } - return { error, msg: 'Region does not exist' }; + if (error) { + throw new Error(`Error ${error}: ${response.msg}`); } this.apiKey = _get(response, 'user.apikey', ''); From 2f4716f3791cb6243fa86a17754630a8e6924fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 19:28:37 -0300 Subject: [PATCH 03/27] getCredentials: fix getting api key and access token --- src/mixins/getCredentials.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mixins/getCredentials.js b/src/mixins/getCredentials.js index 1fa11db..a78b6bf 100644 --- a/src/mixins/getCredentials.js +++ b/src/mixins/getCredentials.js @@ -37,9 +37,9 @@ module.exports = { if (error) { throw new Error(`Error ${error}: ${response.msg}`); } + this.apiKey = _get(response, 'data.user.apikey', ''); + this.at = _get(response, 'data.at', ''); - this.apiKey = _get(response, 'user.apikey', ''); - this.at = _get(response, 'at', ''); return response; }, }; From d274a8d5601e4740adc819f7d7bf518e3f4c31f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 19:44:28 -0300 Subject: [PATCH 04/27] getCredentials: improved error message --- src/mixins/getCredentials.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mixins/getCredentials.js b/src/mixins/getCredentials.js index a78b6bf..a63d8f2 100644 --- a/src/mixins/getCredentials.js +++ b/src/mixins/getCredentials.js @@ -35,8 +35,9 @@ module.exports = { const error = _get(response, 'error', false); if (error) { - throw new Error(`Error ${error}: ${response.msg}`); + throw new Error(`[${error}] ${response.msg}`); } + this.apiKey = _get(response, 'data.user.apikey', ''); this.at = _get(response, 'data.at', ''); From 03307994eaf2ed21a44a70ef8b767a5ef25e21f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 19:45:49 -0300 Subject: [PATCH 05/27] makeRequest: use v2 API --- src/mixins/makeRequest.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mixins/makeRequest.js b/src/mixins/makeRequest.js index e371b90..5eafcee 100644 --- a/src/mixins/makeRequest.js +++ b/src/mixins/makeRequest.js @@ -14,7 +14,7 @@ module.exports = { * @returns {Promise<{msg: *, error: *}|*>} */ async makeRequest({ method = 'get', url, uri, body = {}, qs = {} }) { - const { at } = this; + const { at, APP_ID } = this; if (!at) { await this.getCredentials(); @@ -31,6 +31,7 @@ module.exports = { headers: { Authorization: `Bearer ${this.at}`, 'Content-Type': 'application/json', + 'X-CK-Appid': APP_ID, }, }; @@ -43,12 +44,23 @@ module.exports = { const request = await fetch(requestUrl, payload); + /** Catch request status code other than 200 */ if (!request.ok) { - return { error: request.status, msg: errors[request.status] }; + throw new Error(`Error ${request.status}: ${errors[request.status]}`); } + /** Parse API response */ const response = await request.json(); - return response + /** Catch errors with status code 200 */ + const error = _get(response, 'error', false); + + /** Throw error if needed */ + if (error) { + throw new Error(`Error ${error}: ${response.msg}`); + } + + /** Return response data */ + return response.data; }, }; From 16772a5c54a3c93c193d5135a6715c25aa3290e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 19:49:05 -0300 Subject: [PATCH 06/27] makeRequest: improved error message --- src/mixins/makeRequest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixins/makeRequest.js b/src/mixins/makeRequest.js index 5eafcee..99c5240 100644 --- a/src/mixins/makeRequest.js +++ b/src/mixins/makeRequest.js @@ -57,7 +57,7 @@ module.exports = { /** Throw error if needed */ if (error) { - throw new Error(`Error ${error}: ${response.msg}`); + throw new Error(`[${error}] ${response.msg}`); } /** Return response data */ From 9c00d8280aa96148b77947ec64dc72bf60d91a8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 19:49:59 -0300 Subject: [PATCH 07/27] getDevice: use v2 API --- src/data/errors.js | 1 + src/mixins/getDevice.js | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/data/errors.js b/src/data/errors.js index 60030a6..d5926bd 100644 --- a/src/data/errors.js +++ b/src/data/errors.js @@ -11,6 +11,7 @@ const errors = { const customErrors = { ch404: 'Device channel does not exist', unknown: 'An unknown error occurred', + noDevice: 'No device found', noDevices: 'No devices found', noPower: 'No power usage data found', noSensor: "Can't read sensor data from device", diff --git a/src/mixins/getDevice.js b/src/mixins/getDevice.js index f3910a8..be08375 100644 --- a/src/mixins/getDevice.js +++ b/src/mixins/getDevice.js @@ -1,4 +1,4 @@ -const { nonce, timestamp, _get } = require('../helpers/utilities'); +const { _get } = require('../helpers/utilities'); const errors = require('../data/errors'); module.exports = { @@ -16,13 +16,12 @@ module.exports = { const { APP_ID } = this; const device = await this.makeRequest({ - uri: `/user/device/${deviceId}`, - qs: { - deviceid: deviceId, - appid: APP_ID, - nonce, - ts: timestamp, - version: 8, + method: 'post', + uri: `/v2/device/thing/`, + body: { + thingList: [ + { id: deviceId, itemType: 1 } + ] }, }); @@ -32,6 +31,10 @@ module.exports = { return { error, msg: errors[error] }; } - return device; + if (device.thingList.length === 0) { + throw new Error(`${errors.noDevice}`); + } + + return device.thingList.shift().itemData; }, }; From 94b3bc084a4e38da466373884f5124c5e4f0fd95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 19:58:51 -0300 Subject: [PATCH 08/27] makeRequest: improved error message --- src/mixins/makeRequest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixins/makeRequest.js b/src/mixins/makeRequest.js index 99c5240..f93abd3 100644 --- a/src/mixins/makeRequest.js +++ b/src/mixins/makeRequest.js @@ -46,7 +46,7 @@ module.exports = { /** Catch request status code other than 200 */ if (!request.ok) { - throw new Error(`Error ${request.status}: ${errors[request.status]}`); + throw new Error(`[${request.status}] ${errors[request.status]}`); } /** Parse API response */ From 47fd13f105557cb11d9e7b3b94173f75d145763e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 19:59:08 -0300 Subject: [PATCH 09/27] getDevice: improved error message --- src/mixins/getDevice.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mixins/getDevice.js b/src/mixins/getDevice.js index be08375..e3853a8 100644 --- a/src/mixins/getDevice.js +++ b/src/mixins/getDevice.js @@ -13,8 +13,6 @@ module.exports = { return this.devicesCache.find(dev => dev.deviceid === deviceId) || null; } - const { APP_ID } = this; - const device = await this.makeRequest({ method: 'post', uri: `/v2/device/thing/`, @@ -28,7 +26,7 @@ module.exports = { const error = _get(device, 'error', false); if (error) { - return { error, msg: errors[error] }; + throw new Error(`[${error}] ${errors[error]}`); } if (device.thingList.length === 0) { From 45b1c4363a6ae63b88e5a3f6caa77dd636267030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 20:03:11 -0300 Subject: [PATCH 10/27] DEV: update eslint + prettier + jest --- package-lock.json | 738 +++++++++++++++++++++++----------------------- package.json | 12 +- 2 files changed, 372 insertions(+), 378 deletions(-) diff --git a/package-lock.json b/package-lock.json index a1bd5f6..6c44224 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,19 +14,19 @@ } }, "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -72,12 +72,6 @@ "minimist": "^1.2.5" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -87,12 +81,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "dev": true, "requires": { - "@babel/types": "^7.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -118,42 +112,44 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" }, "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true } } @@ -174,25 +170,24 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -211,14 +206,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", + "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", "dev": true, "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/highlight": { @@ -233,9 +228,9 @@ } }, "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -257,9 +252,9 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -396,17 +391,17 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" @@ -437,19 +432,13 @@ "chalk": "^2.0.0", "js-tokens": "^4.0.0" } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true } } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -462,12 +451,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true } } }, @@ -599,16 +582,16 @@ "dev": true }, "@jest/console": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.5.2.tgz", - "integrity": "sha512-lJELzKINpF1v74DXHbCRIkQ/+nUV1M+ntj+X1J8LxCgpmJZjfLmhFejiMSbjjD66fayxl5Z06tbs3HMyuik6rw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.5.2", - "jest-util": "^26.5.2", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", "slash": "^3.0.0" }, "dependencies": { @@ -664,34 +647,34 @@ } }, "@jest/core": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.5.3.tgz", - "integrity": "sha512-CiU0UKFF1V7KzYTVEtFbFmGLdb2g4aTtY0WlyUfLgj/RtoTnJFhh50xKKr7OYkdmBUlGFSa2mD1TU3UZ6OLd4g==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.0.tgz", + "integrity": "sha512-7wbunxosnC5zXjxrEtTQSblFjRVOT8qz1eSytw8riEeWgegy3ct91NLPEP440CDuWrmW3cOLcEGxIf9q2u6O9Q==", "dev": true, "requires": { - "@jest/console": "^26.5.2", - "@jest/reporters": "^26.5.3", - "@jest/test-result": "^26.5.2", - "@jest/transform": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/console": "^26.6.0", + "@jest/reporters": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.5.2", - "jest-config": "^26.5.3", - "jest-haste-map": "^26.5.2", - "jest-message-util": "^26.5.2", + "jest-changed-files": "^26.6.0", + "jest-config": "^26.6.0", + "jest-haste-map": "^26.6.0", + "jest-message-util": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.5.2", - "jest-resolve-dependencies": "^26.5.3", - "jest-runner": "^26.5.3", - "jest-runtime": "^26.5.3", - "jest-snapshot": "^26.5.3", - "jest-util": "^26.5.2", - "jest-validate": "^26.5.3", - "jest-watcher": "^26.5.2", + "jest-resolve": "^26.6.0", + "jest-resolve-dependencies": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", + "jest-watcher": "^26.6.0", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -760,53 +743,53 @@ } }, "@jest/environment": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.5.2.tgz", - "integrity": "sha512-YjhCD/Zhkz0/1vdlS/QN6QmuUdDkpgBdK4SdiVg4Y19e29g4VQYN5Xg8+YuHjdoWGY7wJHMxc79uDTeTOy9Ngw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.0.tgz", + "integrity": "sha512-l+5MSdiC4rUUrz8xPdj0TwHBwuoqMcAbFnsYDTn5FkenJl8b+lvC5NdJl1tVICGHWnx0fnjdd1luRZ7u3U4xyg==", "dev": true, "requires": { - "@jest/fake-timers": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/fake-timers": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", - "jest-mock": "^26.5.2" + "jest-mock": "^26.6.0" } }, "@jest/fake-timers": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.5.2.tgz", - "integrity": "sha512-09Hn5Oraqt36V1akxQeWMVL0fR9c6PnEhpgLaYvREXZJAh2H2Y+QLCsl0g7uMoJeoWJAuz4tozk1prbR1Fc1sw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.0.tgz", + "integrity": "sha512-7VQpjChrwlwvGNysS10lDBLOVLxMvMtpx0Xo6aIotzNVyojYk0NN0CR8R4T6h/eu7Zva/LB3P71jqwGdtADoag==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.5.2", - "jest-mock": "^26.5.2", - "jest-util": "^26.5.2" + "jest-message-util": "^26.6.0", + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0" } }, "@jest/globals": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.5.3.tgz", - "integrity": "sha512-7QztI0JC2CuB+Wx1VdnOUNeIGm8+PIaqngYsZXQCkH2QV0GFqzAYc9BZfU0nuqA6cbYrWh5wkuMzyii3P7deug==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.0.tgz", + "integrity": "sha512-rs3a/a8Lq8FgTx11SxbqIU2bDjsFU2PApl2oK2oUVlo84RSF76afFm2nLojW93AGssr715GHUwhq5b6mpCI5BQ==", "dev": true, "requires": { - "@jest/environment": "^26.5.2", - "@jest/types": "^26.5.2", - "expect": "^26.5.3" + "@jest/environment": "^26.6.0", + "@jest/types": "^26.6.0", + "expect": "^26.6.0" } }, "@jest/reporters": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.5.3.tgz", - "integrity": "sha512-X+vR0CpfMQzYcYmMFKNY9n4jklcb14Kffffp7+H/MqitWnb0440bW2L76NGWKAa+bnXhNoZr+lCVtdtPmfJVOQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.0.tgz", + "integrity": "sha512-PXbvHhdci5Rj1VFloolgLb+0kkdtzswhG8MzVENKJRI3O1ndwr52G6E/2QupjwrRcYnApZOelFf4nNpf5+SDxA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.5.2", - "@jest/test-result": "^26.5.2", - "@jest/transform": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/console": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -817,9 +800,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.5.2", - "jest-resolve": "^26.5.2", - "jest-util": "^26.5.2", + "jest-haste-map": "^26.6.0", + "jest-resolve": "^26.6.0", + "jest-util": "^26.6.0", "jest-worker": "^26.5.0", "node-notifier": "^8.0.0", "slash": "^3.0.0", @@ -906,46 +889,46 @@ } }, "@jest/test-result": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.5.2.tgz", - "integrity": "sha512-E/Zp6LURJEGSCWpoMGmCFuuEI1OWuI3hmZwmULV0GsgJBh7u0rwqioxhRU95euUuviqBDN8ruX/vP/4bwYolXw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", "dev": true, "requires": { - "@jest/console": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.5.3.tgz", - "integrity": "sha512-Wqzb7aQ13L3T47xHdpUqYMOpiqz6Dx2QDDghp5AV/eUDXR7JieY+E1s233TQlNyl+PqtqgjVokmyjzX/HA51BA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.0.tgz", + "integrity": "sha512-rWPTMa+8rejvePZnJmnKkmKWh0qILFDPpN0qbSif+KNGvFxqqDGafMo4P2Y8+I9XWrZQBeXL9IxPL4ZzDgRlbw==", "dev": true, "requires": { - "@jest/test-result": "^26.5.2", + "@jest/test-result": "^26.6.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.5.2", - "jest-runner": "^26.5.3", - "jest-runtime": "^26.5.3" + "jest-haste-map": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0" } }, "@jest/transform": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.5.2.tgz", - "integrity": "sha512-AUNjvexh+APhhmS8S+KboPz+D3pCxPvEAGduffaAJYxIFxGi/ytZQkrqcKDUU0ERBAo5R7087fyOYr2oms1seg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.0.tgz", + "integrity": "sha512-NUNA1NMCyVV9g5NIQF1jzW7QutQhB/HAocteCiUyH0VhmLXnGMTfPYQu1G6IjPk+k1SWdh2PD+Zs1vMqbavWzg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.5.2", + "jest-haste-map": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-util": "^26.5.2", + "jest-util": "^26.6.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -1011,9 +994,9 @@ } }, "@jest/types": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.5.2.tgz", - "integrity": "sha512-QDs5d0gYiyetI8q+2xWdkixVQMklReZr4ltw7GFDtb4fuJIBCE6mzj2LnitGqCuAlLap6wPyb8fpoHgwZz5fdg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -1134,9 +1117,9 @@ } }, "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", "dev": true, "requires": { "@types/node": "*" @@ -1173,9 +1156,9 @@ "dev": true }, "@types/node": { - "version": "14.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", - "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==", + "version": "14.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.2.tgz", + "integrity": "sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg==", "dev": true }, "@types/normalize-package-data": { @@ -1185,9 +1168,9 @@ "dev": true }, "@types/prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-IiPhNnenzkqdSdQH3ifk9LoX7oQe61ZlDdDO4+MUv6FyWdPGDPr26gCPVs3oguZEMq//nFZZpwUZcVuNJsG+DQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", "dev": true }, "@types/stack-utils": { @@ -1197,9 +1180,9 @@ "dev": true }, "@types/yargs": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.8.tgz", - "integrity": "sha512-b0BYzFUzBpOhPjpl1wtAHU994jBeKF4TKVlT7ssFv44T617XNcPdRoG4AzHLVshLzlrF7i3lTelH7UbuNYV58Q==", + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -1617,13 +1600,13 @@ } }, "babel-jest": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.5.2.tgz", - "integrity": "sha512-U3KvymF3SczA3vOL/cgiUFOznfMET+XDIXiWnoJV45siAp2pLMG8i2+/MGZlAC3f/F6Q40LR4M4qDrWZ9wkK8A==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.0.tgz", + "integrity": "sha512-JI66yILI7stzjHccAoQtRKcUwJrJb4oMIxLTirL3GdAjGpaUBQSjZDFi9LsPkN4gftsS4R2AThAJwOjJxadwbg==", "dev": true, "requires": { - "@jest/transform": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", "babel-preset-jest": "^26.5.0", @@ -2368,9 +2351,9 @@ } }, "emittery": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", - "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true }, "emoji-regex": { @@ -2686,18 +2669,18 @@ } }, "eslint-config-prettier": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz", - "integrity": "sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz", + "integrity": "sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==", "dev": true, "requires": { "get-stdin": "^6.0.0" } }, "eslint-config-wesbos": { - "version": "0.0.19", - "resolved": "https://registry.npmjs.org/eslint-config-wesbos/-/eslint-config-wesbos-0.0.19.tgz", - "integrity": "sha512-2NTh0BzSMd1VEE5jEgC40T3QQTrdCEe19mm15m/CV1/314lYtPp5GmM2t26AojxrjfKhBkJR9Thiv6w1U8i/zg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-wesbos/-/eslint-config-wesbos-1.0.1.tgz", + "integrity": "sha512-CHlJ/B2hrVsfRm3OaRH+UFD6DINV4SzFtPODzMw1y7VH5bPZqlvndcqKRnicEK9bmu2U3AT43XWU2QT2vBRDFg==", "dev": true }, "eslint-import-resolver-node": { @@ -2848,9 +2831,9 @@ } }, "eslint-plugin-react": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.4.tgz", - "integrity": "sha512-uHeQ8A0hg0ltNDXFu3qSfFqTNPXm1XithH6/SY318UX76CMj7Q599qWpgmMhVQyvhq36pm7qvoN3pb6/3jsTFg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz", + "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -2862,7 +2845,7 @@ "object.fromentries": "^2.0.2", "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.17.0", + "resolve": "^1.18.1", "string.prototype.matchall": "^4.0.2" }, "dependencies": { @@ -2874,13 +2857,23 @@ "requires": { "esutils": "^2.0.2" } + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dev": true, + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } } } }, "eslint-plugin-react-hooks": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.2.tgz", - "integrity": "sha512-ykUeqkGyUGgwTtk78C0o8UG2fzwmgJ0qxBGPp2WqRKsTwcLuVf01kTDRAtOsd4u6whX2XOC8749n2vPydP82fg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", "dev": true }, "eslint-scope": { @@ -3108,16 +3101,16 @@ } }, "expect": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.5.3.tgz", - "integrity": "sha512-kkpOhGRWGOr+TEFUnYAjfGvv35bfP+OlPtqPIJpOCR9DVtv8QV+p8zG0Edqafh80fsjeE+7RBcVUq1xApnYglw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.0.tgz", + "integrity": "sha512-EzhbZ1tbwcaa5Ok39BI11flIMeIUSlg1QsnXOrleaMvltwHsvIQPBtL710l+ma+qDFLUgktCXK4YuQzmHdm7cg==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.5.2", - "jest-message-util": "^26.5.2", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", "jest-regex-util": "^26.0.0" }, "dependencies": { @@ -3801,6 +3794,15 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", + "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4078,14 +4080,14 @@ } }, "jest": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.5.3.tgz", - "integrity": "sha512-uJi3FuVSLmkZrWvaDyaVTZGLL8WcfynbRnFXyAHuEtYiSZ+ijDDIMOw1ytmftK+y/+OdAtsG9QrtbF7WIBmOyA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", "dev": true, "requires": { - "@jest/core": "^26.5.3", + "@jest/core": "^26.6.0", "import-local": "^3.0.2", - "jest-cli": "^26.5.3" + "jest-cli": "^26.6.0" }, "dependencies": { "ansi-styles": { @@ -4129,22 +4131,22 @@ "dev": true }, "jest-cli": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.5.3.tgz", - "integrity": "sha512-HkbSvtugpSXBf2660v9FrNVUgxvPkssN8CRGj9gPM8PLhnaa6zziFiCEKQAkQS4uRzseww45o0TR+l6KeRYV9A==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.0.tgz", + "integrity": "sha512-lJAMZGpmML+y3Kfln6L5DGRTfKGQ+n1JDM1RQstojSLUhe/EaXWR8vmcx70v4CyJKvFZs7c/0QDkPX5ra/aDew==", "dev": true, "requires": { - "@jest/core": "^26.5.3", - "@jest/test-result": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/core": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^26.5.3", - "jest-util": "^26.5.2", - "jest-validate": "^26.5.3", + "jest-config": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", "prompts": "^2.0.1", "yargs": "^15.4.1" } @@ -4161,12 +4163,12 @@ } }, "jest-changed-files": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.5.2.tgz", - "integrity": "sha512-qSmssmiIdvM5BWVtyK/nqVpN3spR5YyvkvPqz1x3BR1bwIxsWmU/MGwLoCrPNLbkG2ASAKfvmJpOduEApBPh2w==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.0.tgz", + "integrity": "sha512-k8PZzlp3cRWDe0fDc/pYs+c4w36+hiWXe1PpW/pW1UJmu1TNTAcQfZUrVYleij+uEqlY6z4mPv7Iff3kY0o5SQ==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "execa": "^4.0.0", "throat": "^5.0.0" }, @@ -4215,29 +4217,29 @@ } }, "jest-config": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.5.3.tgz", - "integrity": "sha512-NVhZiIuN0GQM6b6as4CI5FSCyXKxdrx5ACMCcv/7Pf+TeCajJhJc+6dwgdAVPyerUFB9pRBIz3bE7clSrRge/w==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.0.tgz", + "integrity": "sha512-RCR1Kf7MGJ5waVCvrj/k3nCAJKquWZlzs8rkskzj0KlG392hNBOaYd5FQ4cCac08j6pwfIDOwNvMcy0/FqguJg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.5.3", - "@jest/types": "^26.5.2", - "babel-jest": "^26.5.2", + "@jest/test-sequencer": "^26.6.0", + "@jest/types": "^26.6.0", + "babel-jest": "^26.6.0", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.5.2", - "jest-environment-node": "^26.5.2", + "jest-environment-jsdom": "^26.6.0", + "jest-environment-node": "^26.6.0", "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.5.3", + "jest-jasmine2": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.5.2", - "jest-util": "^26.5.2", - "jest-validate": "^26.5.3", + "jest-resolve": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", "micromatch": "^4.0.2", - "pretty-format": "^26.5.2" + "pretty-format": "^26.6.0" }, "dependencies": { "ansi-styles": { @@ -4292,15 +4294,15 @@ } }, "jest-diff": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.5.2.tgz", - "integrity": "sha512-HCSWDUGwsov5oTlGzrRM+UPJI/Dpqi9jzeV0fdRNi3Ch5bnoXhnyJMmVg2juv9081zLIy3HGPI5mcuGgXM2xRA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.0.tgz", + "integrity": "sha512-IH09rKsdWY8YEY7ii2BHlSq59oXyF2pK3GoK+hOK9eD/x6009eNB5Jv1shLMKgxekodPzLlV7eZP1jPFQYds8w==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^26.5.0", "jest-get-type": "^26.3.0", - "pretty-format": "^26.5.2" + "pretty-format": "^26.6.0" }, "dependencies": { "ansi-styles": { @@ -4364,16 +4366,16 @@ } }, "jest-each": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.5.2.tgz", - "integrity": "sha512-w7D9FNe0m2D3yZ0Drj9CLkyF/mGhmBSULMQTypzAKR746xXnjUrK8GUJdlLTWUF6dd0ks3MtvGP7/xNFr9Aphg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.0.tgz", + "integrity": "sha512-7LzSNwNviYnm4FWK46itIE03NqD/8O8/7tVQ5rwTdTNrmPMQoQ1Z7hEFQ1uzRReluOFislpurpnQ0QsclSiDkA==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-util": "^26.5.2", - "pretty-format": "^26.5.2" + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0" }, "dependencies": { "ansi-styles": { @@ -4428,32 +4430,32 @@ } }, "jest-environment-jsdom": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.5.2.tgz", - "integrity": "sha512-fWZPx0bluJaTQ36+PmRpvUtUlUFlGGBNyGX1SN3dLUHHMcQ4WseNEzcGGKOw4U5towXgxI4qDoI3vwR18H0RTw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.0.tgz", + "integrity": "sha512-bXO9IG7a3YlyiHxwfKF+OWoTA+GIw4FrD+Y0pb6CC+nKs5JuSRZmR2ovEX6PWo6KY42ka3JoZOp3KEnXiFPPCg==", "dev": true, "requires": { - "@jest/environment": "^26.5.2", - "@jest/fake-timers": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/environment": "^26.6.0", + "@jest/fake-timers": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", - "jest-mock": "^26.5.2", - "jest-util": "^26.5.2", + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0", "jsdom": "^16.4.0" } }, "jest-environment-node": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.5.2.tgz", - "integrity": "sha512-YHjnDsf/GKFCYMGF1V+6HF7jhY1fcLfLNBDjhAOvFGvt6d8vXvNdJGVM7uTZ2VO/TuIyEFhPGaXMX5j3h7fsrA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.0.tgz", + "integrity": "sha512-kWU6ZD1h6fs7sIl6ufuK0sXW/3d6WLaj48iow0NxhgU6eY89d9K+0MVmE0cRcVlh53yMyxTK6b+TnhLOnlGp/A==", "dev": true, "requires": { - "@jest/environment": "^26.5.2", - "@jest/fake-timers": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/environment": "^26.6.0", + "@jest/fake-timers": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", - "jest-mock": "^26.5.2", - "jest-util": "^26.5.2" + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0" } }, "jest-get-type": { @@ -4463,12 +4465,12 @@ "dev": true }, "jest-haste-map": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.5.2.tgz", - "integrity": "sha512-lJIAVJN3gtO3k4xy+7i2Xjtwh8CfPcH08WYjZpe9xzveDaqGw9fVNCpkYu6M525wKFVkLmyi7ku+DxCAP1lyMA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", + "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -4477,7 +4479,7 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", "jest-serializer": "^26.5.0", - "jest-util": "^26.5.2", + "jest-util": "^26.6.0", "jest-worker": "^26.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", @@ -4485,28 +4487,28 @@ } }, "jest-jasmine2": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.5.3.tgz", - "integrity": "sha512-nFlZOpnGlNc7y/+UkkeHnvbOM+rLz4wB1AimgI9QhtnqSZte0wYjbAm8hf7TCwXlXgDwZxAXo6z0a2Wzn9FoOg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.0.tgz", + "integrity": "sha512-2E3c+0A9y2OIK5caw5qlcm3b4doaf8FSfXKTX3xqKTUJoR4zXh0xvERBNWxZP9xMNXEi/2Z3LVsZpR2hROgixA==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.5.2", + "@jest/environment": "^26.6.0", "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.5.3", + "expect": "^26.6.0", "is-generator-fn": "^2.0.0", - "jest-each": "^26.5.2", - "jest-matcher-utils": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-runtime": "^26.5.3", - "jest-snapshot": "^26.5.3", - "jest-util": "^26.5.2", - "pretty-format": "^26.5.2", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", "throat": "^5.0.0" }, "dependencies": { @@ -4562,25 +4564,25 @@ } }, "jest-leak-detector": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.5.2.tgz", - "integrity": "sha512-h7ia3dLzBFItmYERaLPEtEKxy3YlcbcRSjj0XRNJgBEyODuu+3DM2o62kvIFvs3PsaYoIIv+e+nLRI61Dj1CNw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.0.tgz", + "integrity": "sha512-3oMv34imWTl1/nwKnmE/DxYo3QqHnZeF3nO6UzldppkhW0Za7OY2DYyWiamqVzwdUrjhoQkY5g+aF6Oc3alYEQ==", "dev": true, "requires": { "jest-get-type": "^26.3.0", - "pretty-format": "^26.5.2" + "pretty-format": "^26.6.0" } }, "jest-matcher-utils": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.5.2.tgz", - "integrity": "sha512-W9GO9KBIC4gIArsNqDUKsLnhivaqf8MSs6ujO/JDcPIQrmY+aasewweXVET8KdrJ6ADQaUne5UzysvF/RR7JYA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.0.tgz", + "integrity": "sha512-BUy/dQYb7ELGRazmK4ZVkbfPYCaNnrMtw1YljVhcKzWUxBM0xQ+bffrfnMLdRZp4wUUcT4ahaVnA3VWZtXWP9Q==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.5.2", + "jest-diff": "^26.6.0", "jest-get-type": "^26.3.0", - "pretty-format": "^26.5.2" + "pretty-format": "^26.6.0" }, "dependencies": { "ansi-styles": { @@ -4635,13 +4637,13 @@ } }, "jest-message-util": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.5.2.tgz", - "integrity": "sha512-Ocp9UYZ5Jl15C5PNsoDiGEk14A4NG0zZKknpWdZGoMzJuGAkVt10e97tnEVMYpk7LnQHZOfuK2j/izLBMcuCZw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -4702,12 +4704,12 @@ } }, "jest-mock": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.5.2.tgz", - "integrity": "sha512-9SiU4b5PtO51v0MtJwVRqeGEroH66Bnwtq4ARdNP7jNXbpT7+ByeWNAk4NeT/uHfNSVDXEXgQo1XRuwEqS6Rdw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.0.tgz", + "integrity": "sha512-HsNmL8vVIn1rL1GWA21Drpy9Cl+7GImwbWz/0fkWHrUXVzuaG7rP0vwLtE+/n70Mt0U8nPkz8fxioi3SC0wqhw==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "@types/node": "*" } }, @@ -4724,16 +4726,16 @@ "dev": true }, "jest-resolve": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.5.2.tgz", - "integrity": "sha512-XsPxojXGRA0CoDD7Vis59ucz2p3cQFU5C+19tz3tLEAlhYKkK77IL0cjYjikY9wXnOaBeEdm1rOgSJjbZWpcZg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.5.2", + "jest-util": "^26.6.0", "read-pkg-up": "^7.0.1", "resolve": "^1.17.0", "slash": "^3.0.0" @@ -4883,39 +4885,39 @@ } }, "jest-resolve-dependencies": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.5.3.tgz", - "integrity": "sha512-+KMDeke/BFK+mIQ2IYSyBz010h7zQaVt4Xie6cLqUGChorx66vVeQVv4ErNoMwInnyYHi1Ud73tDS01UbXbfLQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.0.tgz", + "integrity": "sha512-4di+XUT7LwJJ8b8qFEEDQssC5+aeVjLhvRICCaS4alh/EVS9JCT1armfJ3pnSS8t4o6659WbMmKVo82H4LuUVw==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.5.3" + "jest-snapshot": "^26.6.0" } }, "jest-runner": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.5.3.tgz", - "integrity": "sha512-qproP0Pq7IIule+263W57k2+8kWCszVJTC9TJWGUz0xJBr+gNiniGXlG8rotd0XxwonD5UiJloYoSO5vbUr5FQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.0.tgz", + "integrity": "sha512-QpeN6pje8PQvFgT+wYOlzeycKd67qAvSw5FgYBiX2cTW+QTiObTzv/k09qRvT09rcCntFxUhy9VB1mgNGFLYIA==", "dev": true, "requires": { - "@jest/console": "^26.5.2", - "@jest/environment": "^26.5.2", - "@jest/test-result": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/console": "^26.6.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.5.3", + "jest-config": "^26.6.0", "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.5.2", - "jest-leak-detector": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-resolve": "^26.5.2", - "jest-runtime": "^26.5.3", - "jest-util": "^26.5.2", + "jest-haste-map": "^26.6.0", + "jest-leak-detector": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-resolve": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-util": "^26.6.0", "jest-worker": "^26.5.0", "source-map-support": "^0.5.6", "throat": "^5.0.0" @@ -4973,34 +4975,34 @@ } }, "jest-runtime": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.5.3.tgz", - "integrity": "sha512-IDjalmn2s/Tc4GvUwhPHZ0iaXCdMRq5p6taW9P8RpU+FpG01O3+H8z+p3rDCQ9mbyyyviDgxy/LHPLzrIOKBkQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.0.tgz", + "integrity": "sha512-JEz4YGnybFvtN4NLID6lsZf0bcd8jccwjWcG5TRE3fYVnxoX1egTthPjnC4btIwWJ6QaaHhtOQ/E3AGn8iClAw==", "dev": true, "requires": { - "@jest/console": "^26.5.2", - "@jest/environment": "^26.5.2", - "@jest/fake-timers": "^26.5.2", - "@jest/globals": "^26.5.3", + "@jest/console": "^26.6.0", + "@jest/environment": "^26.6.0", + "@jest/fake-timers": "^26.6.0", + "@jest/globals": "^26.6.0", "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.5.2", - "@jest/transform": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/test-result": "^26.6.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.5.3", - "jest-haste-map": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-mock": "^26.5.2", + "jest-config": "^26.6.0", + "jest-haste-map": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-mock": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.5.2", - "jest-snapshot": "^26.5.3", - "jest-util": "^26.5.2", - "jest-validate": "^26.5.3", + "jest-resolve": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.4.1" @@ -5074,26 +5076,26 @@ } }, "jest-snapshot": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.5.3.tgz", - "integrity": "sha512-ZgAk0Wm0JJ75WS4lGaeRfa0zIgpL0KD595+XmtwlIEMe8j4FaYHyZhP1LNOO+8fXq7HJ3hll54+sFV9X4+CGVw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.0.tgz", + "integrity": "sha512-mcqJZeIZqxomvBcsaiIbiEe2g7K1UxnUpTwjMoHb+DX4uFGnuZoZ6m28YOYRyCfZsdU9mmq73rNBnEH2atTR4Q==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^26.5.3", + "expect": "^26.6.0", "graceful-fs": "^4.2.4", - "jest-diff": "^26.5.2", + "jest-diff": "^26.6.0", "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.5.2", - "jest-matcher-utils": "^26.5.2", - "jest-message-util": "^26.5.2", - "jest-resolve": "^26.5.2", + "jest-haste-map": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-resolve": "^26.6.0", "natural-compare": "^1.4.0", - "pretty-format": "^26.5.2", + "pretty-format": "^26.6.0", "semver": "^7.3.2" }, "dependencies": { @@ -5149,12 +5151,12 @@ } }, "jest-util": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.5.2.tgz", - "integrity": "sha512-WTL675bK+GSSAYgS8z9FWdCT2nccO1yTIplNLPlP0OD8tUk/H5IrWKMMRudIQQ0qp8bb4k+1Qa8CxGKq9qnYdg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -5214,17 +5216,17 @@ } }, "jest-validate": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.5.3.tgz", - "integrity": "sha512-LX07qKeAtY+lsU0o3IvfDdN5KH9OulEGOMN1sFo6PnEf5/qjS1LZIwNk9blcBeW94pQUI9dLN9FlDYDWI5tyaA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.0.tgz", + "integrity": "sha512-FKHNqvh1Pgs4NWas56gsTPmjcIoGAAzSVUCK1+g8euzuCGbmdEr8LRTtOEFjd29uMZUk0PhzmzKGlHPe6j3UWw==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.5.2" + "pretty-format": "^26.6.0" }, "dependencies": { "ansi-styles": { @@ -5285,17 +5287,17 @@ } }, "jest-watcher": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.5.2.tgz", - "integrity": "sha512-i3m1NtWzF+FXfJ3ljLBB/WQEp4uaNhX7QcQUWMokcifFTUQBDFyUMEwk0JkJ1kopHbx7Een3KX0Q7+9koGM/Pw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.0.tgz", + "integrity": "sha512-gw5BvcgPi0PKpMlNWQjUet5C5A4JOYrT7gexdP6+DR/f7mRm7wE0o1GqwPwcTsTwo0/FNf9c/kIDXTRaSAYwlw==", "dev": true, "requires": { - "@jest/test-result": "^26.5.2", - "@jest/types": "^26.5.2", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.5.2", + "jest-util": "^26.6.0", "string-length": "^4.0.1" }, "dependencies": { @@ -6185,9 +6187,9 @@ "dev": true }, "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", "dev": true }, "prettier-linter-helpers": { @@ -6200,12 +6202,12 @@ } }, "pretty-format": { - "version": "26.5.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.5.2.tgz", - "integrity": "sha512-VizyV669eqESlkOikKJI8Ryxl/kPpbdLwNdPs2GrbQs18MpySB5S0Yo0N7zkg2xTRiFq4CFw8ct5Vg4a0xP0og==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", "dev": true, "requires": { - "@jest/types": "^26.5.2", + "@jest/types": "^26.6.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -6502,14 +6504,6 @@ "dev": true, "requires": { "lodash": "^4.17.19" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - } } }, "request-promise-native": { diff --git a/package.json b/package.json index 5828b4c..5ceb503 100644 --- a/package.json +++ b/package.json @@ -52,16 +52,16 @@ "babel-eslint": "^10.1.0", "eslint": "^7.11.0", "eslint-config-airbnb": "^18.2.0", - "eslint-config-prettier": "^6.12.0", - "eslint-config-wesbos": "0.0.19", + "eslint-config-prettier": "^6.14.0", + "eslint-config-wesbos": "1.0.1", "eslint-plugin-html": "^6.1.0", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jsx-a11y": "^6.3.1", "eslint-plugin-prettier": "^3.1.4", - "eslint-plugin-react": "^7.21.4", - "eslint-plugin-react-hooks": "^4.1.2", - "jest": "^26.5.3", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "jest": "^26.6.0", "nock": "^12.0.3", - "prettier": "^1.19.1" + "prettier": "^2.1.2" } } From 996c678204c54144a8d0436e9c83599189d2fe42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 20:12:13 -0300 Subject: [PATCH 11/27] getDevices: use v2 API --- src/mixins/getDevice.js | 6 ++---- src/mixins/getDevices.js | 21 ++++++--------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/mixins/getDevice.js b/src/mixins/getDevice.js index e3853a8..d7f2f9b 100644 --- a/src/mixins/getDevice.js +++ b/src/mixins/getDevice.js @@ -10,16 +10,14 @@ module.exports = { */ async getDevice(deviceId) { if (this.devicesCache) { - return this.devicesCache.find(dev => dev.deviceid === deviceId) || null; + return this.devicesCache.find((dev) => dev.deviceid === deviceId) || null; } const device = await this.makeRequest({ method: 'post', uri: `/v2/device/thing/`, body: { - thingList: [ - { id: deviceId, itemType: 1 } - ] + thingList: [{ id: deviceId, itemType: 1 }], }, }); diff --git a/src/mixins/getDevices.js b/src/mixins/getDevices.js index 050e78c..8960439 100644 --- a/src/mixins/getDevices.js +++ b/src/mixins/getDevices.js @@ -1,4 +1,4 @@ -const { _get, timestamp } = require('../helpers/utilities'); +const { _get } = require('../helpers/utilities'); const errors = require('../data/errors'); module.exports = { @@ -8,30 +8,21 @@ module.exports = { * @returns {Promise<{msg: string, error: number}|*>} */ async getDevices() { - const { APP_ID } = this; - const response = await this.makeRequest({ - uri: '/user/device', - qs: { - lang: 'en', - appid: APP_ID, - ts: timestamp, - version: 8, - getTags: 1, - }, + uri: `/v2/device/thing/`, }); const error = _get(response, 'error', false); - const devicelist = _get(response, 'devicelist', false); + const thingList = _get(response, 'thingList', false); if (error) { return { error, msg: errors[error] }; } - if (!devicelist) { - return { error: 404, msg: errors.noDevices }; + if (!thingList) { + throw new Error(`${errors.noDevices}`); } - return devicelist; + return thingList.map((thing) => thing.itemData); }, }; From 930cf2878cec8e78a7b89feda6122fa44068a7aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 20:12:50 -0300 Subject: [PATCH 12/27] getDevices: improved error message --- src/mixins/getDevices.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixins/getDevices.js b/src/mixins/getDevices.js index 8960439..7ed504f 100644 --- a/src/mixins/getDevices.js +++ b/src/mixins/getDevices.js @@ -16,7 +16,7 @@ module.exports = { const thingList = _get(response, 'thingList', false); if (error) { - return { error, msg: errors[error] }; + throw new Error(`[${error}] ${errors[error]}`); } if (!thingList) { From 2a64768822dfeaa0850591bdc1a7d3b860356103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 20:23:01 -0300 Subject: [PATCH 13/27] getDevicePowerState: use v2 API --- src/mixins/getDevicePowerState.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/mixins/getDevicePowerState.js b/src/mixins/getDevicePowerState.js index 87780fb..7b2cd50 100644 --- a/src/mixins/getDevicePowerState.js +++ b/src/mixins/getDevicePowerState.js @@ -1,8 +1,6 @@ const { _get } = require('../helpers/utilities'); const errors = require('../data/errors'); -const deviceStatusPayload = require('../payloads/deviceStatus'); - module.exports = { /** * Get current power state for a specific device @@ -14,19 +12,18 @@ module.exports = { */ async getDevicePowerState(deviceId, channel = 1) { const status = await this.makeRequest({ - uri: '/user/device/status', - qs: deviceStatusPayload({ - appid: this.APP_ID, - deviceId, + uri: '/v2/device/thing/status', + qs: { + type: 1, + id: deviceId, params: 'switch|switches', - }), + }, }); const error = _get(status, 'error', false); if (error) { - const err = error === 400 ? 404 : error; - return { error: err, msg: errors[err] }; + throw new Error(`[${error}] ${errors[error]}`); } let state = _get(status, 'params.switch', false); @@ -35,7 +32,7 @@ module.exports = { const switchesAmount = switches ? switches.length : 1; if (switchesAmount > 0 && switchesAmount < channel) { - return { error: 404, msg: errors.ch404 }; + throw new Error(`${errors.ch404}`); } if (switches) { From ac80e06b0f0ad5365985bbd2a30b6743fe51b82c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 21:00:23 -0300 Subject: [PATCH 14/27] setDevicePowerState: use v2 API --- src/mixins/setDevicePowerState.js | 52 +++++++++++++------------------ 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/src/mixins/setDevicePowerState.js b/src/mixins/setDevicePowerState.js index 728f209..b8aab21 100644 --- a/src/mixins/setDevicePowerState.js +++ b/src/mixins/setDevicePowerState.js @@ -1,10 +1,6 @@ -const { _get, timestamp, nonce } = require('../helpers/utilities'); +const { _get } = require('../helpers/utilities'); const errors = require('../data/errors'); -const { getDeviceChannelCount } = require('../helpers/ewelink'); - -const ChangeStateZeroconf = require('../classes/ChangeStateZeroconf'); - module.exports = { /** * Change power state for a specific device @@ -17,20 +13,20 @@ module.exports = { */ async setDevicePowerState(deviceId, state, channel = 1) { const device = await this.getDevice(deviceId); + + /** Check for errors */ const error = _get(device, 'error', false); - const uiid = _get(device, 'extra.extra.uiid', false); + if (error) { + throw new Error(`[${error}] ${errors[error]}`); + } let status = _get(device, 'params.switch', false); const switches = _get(device, 'params.switches', false); - const switchesAmount = getDeviceChannelCount(uiid); + const switchesAmount = switches.length; if (switchesAmount > 0 && switchesAmount < channel) { - return { error: 404, msg: errors.ch404 }; - } - - if (error || (!status && !switches)) { - return { error, msg: errors[error] }; + throw new Error(`${errors.ch404}`); } let stateToSwitch = state; @@ -51,35 +47,31 @@ module.exports = { params.switch = stateToSwitch; } - if (this.devicesCache) { - return ChangeStateZeroconf.set({ - url: this.getZeroconfUrl(device), - device, - params, - switches, - state: stateToSwitch, - }); - } - - const { APP_ID } = this; + // DISABLED DURING v4.0.0 DEVELOPMENT + // if (this.devicesCache) { + // return ChangeStateZeroconf.set({ + // url: this.getZeroconfUrl(device), + // device, + // params, + // switches, + // state: stateToSwitch, + // }); + // } const response = await this.makeRequest({ method: 'post', - uri: '/user/device/status', + uri: '/v2/device/thing/status', body: { - deviceid: deviceId, + type: 1, + id: deviceId, params, - appid: APP_ID, - nonce, - ts: timestamp, - version: 8, }, }); const responseError = _get(response, 'error', false); if (responseError) { - return { error: responseError, msg: errors[responseError] }; + throw new Error(`[${error}] ${errors[error]}`); } return { status: 'ok', state, channel }; From bf6ab1159063723c3c9912c058ae1f465b0bf8e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 21:11:39 -0300 Subject: [PATCH 15/27] toggleDevicePowerState: renamed to toggleDevicePowerState --- src/mixins/index.js | 4 ++-- src/mixins/{toggleDevice.js => toggleDevicePowerState.js} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/mixins/{toggleDevice.js => toggleDevicePowerState.js} (83%) diff --git a/src/mixins/index.js b/src/mixins/index.js index e6e716e..ec71864 100644 --- a/src/mixins/index.js +++ b/src/mixins/index.js @@ -16,7 +16,7 @@ const { makeRequest } = require('./makeRequest'); const { openWebSocket } = require('./openWebSocket'); const { saveDevicesCache } = require('./saveDevicesCache'); const { setDevicePowerState } = require('./setDevicePowerState'); -const { toggleDevice } = require('./toggleDevice'); +const { toggleDevicePowerState } = require('./toggleDevicePowerState'); const mixins = { checkDevicesUpdates, @@ -37,7 +37,7 @@ const mixins = { openWebSocket, saveDevicesCache, setDevicePowerState, - toggleDevice, + toggleDevicePowerState, }; module.exports = mixins; diff --git a/src/mixins/toggleDevice.js b/src/mixins/toggleDevicePowerState.js similarity index 83% rename from src/mixins/toggleDevice.js rename to src/mixins/toggleDevicePowerState.js index d7e1da0..32d8a20 100644 --- a/src/mixins/toggleDevice.js +++ b/src/mixins/toggleDevicePowerState.js @@ -7,7 +7,7 @@ module.exports = { * * @returns {Promise<{state: *, status: string}|{msg: string, error: *}>} */ - async toggleDevice(deviceId, channel = 1) { + async toggleDevicePowerState(deviceId, channel = 1) { return this.setDevicePowerState(deviceId, 'toggle', channel); }, }; From e5242589f890b8ce8182b76959b7075da152f97d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 21:18:21 -0300 Subject: [PATCH 16/27] getDeviceCurrentTH: improved error handling --- src/mixins/getDeviceCurrentTH.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/mixins/getDeviceCurrentTH.js b/src/mixins/getDeviceCurrentTH.js index 8dac8ad..aca84de 100644 --- a/src/mixins/getDeviceCurrentTH.js +++ b/src/mixins/getDeviceCurrentTH.js @@ -10,16 +10,12 @@ module.exports = { */ async getDeviceCurrentTH(deviceId, type = '') { const device = await this.getDevice(deviceId); - const error = _get(device, 'error', false); + const temperature = _get(device, 'params.currentTemperature', false); const humidity = _get(device, 'params.currentHumidity', false); - if (error) { - return device; - } - if (!temperature || !humidity) { - return { error: 404, msg: errors.noSensor }; + throw new Error(`${errors.noSensor}`); } const data = { status: 'ok', temperature, humidity }; From ad2d72f4cedbf63fb6e53c44715450cb373b93bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 21:19:01 -0300 Subject: [PATCH 17/27] setDevicePowerState: improved error handling --- src/mixins/setDevicePowerState.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/mixins/setDevicePowerState.js b/src/mixins/setDevicePowerState.js index b8aab21..63a4280 100644 --- a/src/mixins/setDevicePowerState.js +++ b/src/mixins/setDevicePowerState.js @@ -14,12 +14,6 @@ module.exports = { async setDevicePowerState(deviceId, state, channel = 1) { const device = await this.getDevice(deviceId); - /** Check for errors */ - const error = _get(device, 'error', false); - if (error) { - throw new Error(`[${error}] ${errors[error]}`); - } - let status = _get(device, 'params.switch', false); const switches = _get(device, 'params.switches', false); From 894aa6f5ca76ae53f7ae852f949b4e4cf7c43e93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 21:24:17 -0300 Subject: [PATCH 18/27] getDeviceChannelCount: use v2 API --- src/mixins/getDeviceChannelCount.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/mixins/getDeviceChannelCount.js b/src/mixins/getDeviceChannelCount.js index e52d0c9..412b628 100644 --- a/src/mixins/getDeviceChannelCount.js +++ b/src/mixins/getDeviceChannelCount.js @@ -1,7 +1,4 @@ const { _get } = require('../helpers/utilities'); -const errors = require('../data/errors'); - -const { getDeviceChannelCount } = require('../helpers/ewelink'); module.exports = { /** @@ -13,12 +10,18 @@ module.exports = { */ async getDeviceChannelCount(deviceId) { const device = await this.getDevice(deviceId); - const error = _get(device, 'error', false); - const uiid = _get(device, 'extra.extra.uiid', false); - const switchesAmount = getDeviceChannelCount(uiid); - if (error) { - return { error, msg: errors[error] }; + const paramSwitch = _get(device, 'params.switch', false); + const paramSwitches = _get(device, 'params.switches', false); + + let switchesAmount; + + if (paramSwitches) { + switchesAmount = paramSwitches.length; + } + + if (!paramSwitches && paramSwitch) { + switchesAmount = 1; } return { status: 'ok', switchesAmount }; From 9e7bef86ff2c230413aef4fa1b338262d394093d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Wed, 21 Oct 2020 21:26:34 -0300 Subject: [PATCH 19/27] getFirmwareVersion: use v2 API --- src/mixins/getFirmwareVersion.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mixins/getFirmwareVersion.js b/src/mixins/getFirmwareVersion.js index 707f825..aa270ff 100644 --- a/src/mixins/getFirmwareVersion.js +++ b/src/mixins/getFirmwareVersion.js @@ -11,11 +11,11 @@ module.exports = { */ async getFirmwareVersion(deviceId) { const device = await this.getDevice(deviceId); - const error = _get(device, 'error', false); + const fwVersion = _get(device, 'params.fwVersion', false); - if (error || !fwVersion) { - return { error, msg: errors[error] }; + if (!fwVersion) { + throw new Error(`${errors.noFirmware}`); } return { status: 'ok', fwVersion }; From 4038c8c7bda828913f331dd6da27ae1f4fc9a6ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Thu, 22 Oct 2020 02:18:53 -0300 Subject: [PATCH 20/27] checkDeviceUpdate: use v2 API --- src/mixins/checkDeviceUpdate.js | 39 ++++++++++------------------- src/parsers/parseFirmwareUpdates.js | 8 +++--- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/src/mixins/checkDeviceUpdate.js b/src/mixins/checkDeviceUpdate.js index e88ecff..107fced 100644 --- a/src/mixins/checkDeviceUpdate.js +++ b/src/mixins/checkDeviceUpdate.js @@ -11,38 +11,25 @@ module.exports = { */ async checkDeviceUpdate(deviceId) { const device = await this.getDevice(deviceId); - - const error = _get(device, 'error', false); - - if (error) { - return device; - } - const deviceInfoList = parseFirmwareUpdates([device]); - const deviceInfoListError = _get(deviceInfoList, 'error', false); - - if (deviceInfoListError) { - return deviceInfoList; - } - const update = await this.makeRequest({ method: 'post', - url: this.getOtaUrl(), - uri: '/app', + uri: '/v2/device/ota/query', body: { deviceInfoList }, }); - const isUpdate = _get(update, 'upgradeInfoList.0.version', false); - - if (!isUpdate) { - return { status: 'ok', msg: 'No update available' }; - } - - return { - status: 'ok', - msg: 'Update available', - version: isUpdate, - }; + const isUpdate = _get(update, 'otaInfoList.0.version', false); + + return isUpdate + ? { + status: 'ok', + msg: 'Update available', + version: isUpdate, + } + : { + status: 'ok', + msg: 'No update available', + }; }, }; diff --git a/src/parsers/parseFirmwareUpdates.js b/src/parsers/parseFirmwareUpdates.js index 47e760c..79ff2b7 100644 --- a/src/parsers/parseFirmwareUpdates.js +++ b/src/parsers/parseFirmwareUpdates.js @@ -1,13 +1,13 @@ const { _get } = require('../helpers/utilities'); const errors = require('../data/errors'); -const parseFirmwareUpdates = devicesList => - devicesList.map(device => { - const model = _get(device, 'extra.extra.model', false); +const parseFirmwareUpdates = (devicesList) => + devicesList.map((device) => { + const model = _get(device, 'extra.model', false); const fwVersion = _get(device, 'params.fwVersion', false); if (!model || !fwVersion) { - return { error: 500, msg: errors.noFirmware }; + throw new Error(`${errors.noFirmware}`); } return { model, version: fwVersion, deviceid: device.deviceid }; From 646dfed03ca55146368ca95b99983182fecfb4bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Thu, 22 Oct 2020 02:44:07 -0300 Subject: [PATCH 21/27] checkDevicesUpdates: use v2 API --- package-lock.json | 5 ++++ package.json | 1 + src/data/errors.js | 3 +- src/mixins/checkDevicesUpdates.js | 49 ++++++++++++------------------- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c44224..e9c03ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2036,6 +2036,11 @@ "delayed-stream": "~1.0.0" } }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", diff --git a/package.json b/package.json index 5ceb503..9ef19ac 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ }, "dependencies": { "arpping": "github:skydiver/arpping", + "compare-versions": "^3.6.0", "crypto-js": "^4.0.0", "delay": "^4.4.0", "node-fetch": "^2.6.1", diff --git a/src/data/errors.js b/src/data/errors.js index d5926bd..32004be 100644 --- a/src/data/errors.js +++ b/src/data/errors.js @@ -5,7 +5,7 @@ const errors = { 403: 'Forbidden', 404: 'Device does not exist', 406: 'Authentication failed', - 503: 'Service Temporarily Unavailable or Device is offline' + 503: 'Service Temporarily Unavailable or Device is offline', }; const customErrors = { @@ -16,6 +16,7 @@ const customErrors = { noPower: 'No power usage data found', noSensor: "Can't read sensor data from device", noFirmware: "Can't get model or firmware version", + noFirmwares: "Can't find firmware update information", invalidAuth: 'Library needs to be initialized using email and password', invalidCredentials: 'Invalid credentials provided', invalidPowerState: 'Invalid power state. Expecting: "on", "off" or "toggle"', diff --git a/src/mixins/checkDevicesUpdates.js b/src/mixins/checkDevicesUpdates.js index 65d2b4f..551e506 100644 --- a/src/mixins/checkDevicesUpdates.js +++ b/src/mixins/checkDevicesUpdates.js @@ -1,53 +1,42 @@ -const { _get } = require('../helpers/utilities'); +const compareVersions = require('compare-versions'); const parseFirmwareUpdates = require('../parsers/parseFirmwareUpdates'); +const errors = require('../data/errors'); module.exports = { async checkDevicesUpdates() { const devices = await this.getDevices(); - const error = _get(devices, 'error', false); - - if (error) { - return devices; - } - const deviceInfoList = parseFirmwareUpdates(devices); - const deviceInfoListError = _get(deviceInfoList, 'error', false); - - if (deviceInfoListError) { - return deviceInfoList; - } - const updates = await this.makeRequest({ method: 'post', - url: this.getOtaUrl(), - uri: '/app', + uri: '/v2/device/ota/query', body: { deviceInfoList }, }); - const upgradeInfoList = _get(updates, 'upgradeInfoList', false); + const { otaInfoList } = updates; - if (!upgradeInfoList) { - return { error: "Can't find firmware update information" }; + if (!otaInfoList) { + throw new Error(`${errors.noFirmwares}`); } - return upgradeInfoList.map(device => { - const upd = _get(device, 'version', false); + /** Get current versions */ + const currentVersions = {}; + deviceInfoList.forEach((device) => { + currentVersions[device.deviceid] = device.version; + }); - if (!upd) { - return { - status: 'ok', - deviceId: device.deviceid, - msg: 'No update available', - }; - } + return otaInfoList.map((device) => { + const current = currentVersions[device.deviceid]; + const { version } = device; + const outdated = compareVersions(version, current); return { - status: 'ok', + update: !!outdated, deviceId: device.deviceid, - msg: 'Update available', - version: upd, + msg: outdated ? 'Update available' : 'No update available', + current, + version, }; }); }, From f2a39c34b4a48ce3d13fad283efa02563866aad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Thu, 22 Oct 2020 02:50:54 -0300 Subject: [PATCH 22/27] checkDeviceUpdate: refactor --- src/mixins/checkDeviceUpdate.js | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/src/mixins/checkDeviceUpdate.js b/src/mixins/checkDeviceUpdate.js index 107fced..eb83a5d 100644 --- a/src/mixins/checkDeviceUpdate.js +++ b/src/mixins/checkDeviceUpdate.js @@ -1,5 +1,4 @@ -const { _get } = require('../helpers/utilities'); -const parseFirmwareUpdates = require('../parsers/parseFirmwareUpdates'); +const errors = require('../data/errors'); module.exports = { /** @@ -10,26 +9,14 @@ module.exports = { * @returns {Promise<{msg: string, version: *}|{msg: string, error: number}|{msg: string, error: *}|Device|{msg: string}>} */ async checkDeviceUpdate(deviceId) { - const device = await this.getDevice(deviceId); - const deviceInfoList = parseFirmwareUpdates([device]); + const updates = await this.checkDevicesUpdates(); - const update = await this.makeRequest({ - method: 'post', - uri: '/v2/device/ota/query', - body: { deviceInfoList }, - }); + const update = updates.find((device) => device.deviceId === deviceId); - const isUpdate = _get(update, 'otaInfoList.0.version', false); + if (!update) { + throw new Error(`${errors.noFirmware}`); + } - return isUpdate - ? { - status: 'ok', - msg: 'Update available', - version: isUpdate, - } - : { - status: 'ok', - msg: 'No update available', - }; + return update; }, }; From f81fd771a6b65b48451043dc78f5d8a9eebfe5e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Thu, 22 Oct 2020 02:53:40 -0300 Subject: [PATCH 23/27] saveDevicesCache: use v2 API --- src/mixins/saveDevicesCache.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/mixins/saveDevicesCache.js b/src/mixins/saveDevicesCache.js index e020e0d..ef812bf 100644 --- a/src/mixins/saveDevicesCache.js +++ b/src/mixins/saveDevicesCache.js @@ -1,7 +1,5 @@ const fs = require('fs'); -const { _get } = require('../helpers/utilities'); - module.exports = { /** * Save devices cache file (useful for using zeroconf) @@ -10,20 +8,13 @@ module.exports = { async saveDevicesCache(fileName = './devices-cache.json') { const devices = await this.getDevices(); - const error = _get(devices, 'error', false); - - if (error || !devices) { - return devices; - } - const jsonContent = JSON.stringify(devices, null, 2); try { fs.writeFileSync(fileName, jsonContent, 'utf8'); return { status: 'ok', file: fileName }; } catch (e) { - console.log('An error occured while writing JSON Object to File.'); - return { error: e.toString() }; + throw new Error('An error occured while writing JSON Object to File.'); } }, }; From 979664dc344aa1454acedc9537c66492fe1c21cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Thu, 22 Oct 2020 02:59:00 -0300 Subject: [PATCH 24/27] getDeviceIP: refactor --- src/data/errors.js | 1 + src/mixins/getDeviceIP.js | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/data/errors.js b/src/data/errors.js index 32004be..52a045d 100644 --- a/src/data/errors.js +++ b/src/data/errors.js @@ -11,6 +11,7 @@ const errors = { const customErrors = { ch404: 'Device channel does not exist', unknown: 'An unknown error occurred', + noARP: 'No ARP information found. You need to generate the ARP file.', noDevice: 'No device found', noDevices: 'No devices found', noPower: 'No power usage data found', diff --git a/src/mixins/getDeviceIP.js b/src/mixins/getDeviceIP.js index db2e109..fdcea75 100644 --- a/src/mixins/getDeviceIP.js +++ b/src/mixins/getDeviceIP.js @@ -1,3 +1,5 @@ +const errors = require('../data/errors'); + module.exports = { /** * Get local IP address from a given MAC @@ -6,10 +8,16 @@ module.exports = { * @returns {Promise} */ getDeviceIP(device) { - const mac = device.extra.extra.staMac; + if (!this.arpTable) { + throw new Error(errors.noARP); + } + + const mac = device.extra.staMac; + const arpItem = this.arpTable.find( - item => item.mac.toLowerCase() === mac.toLowerCase() + (item) => item.mac.toLowerCase() === mac.toLowerCase() ); + return arpItem.ip; }, }; From 08e84b5fea79153b5a96c81f6a322c7bd40c1994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Mon, 26 Oct 2020 20:48:08 -0300 Subject: [PATCH 25/27] updated dependencies --- package-lock.json | 797 +++++++++++++++++++++++----------------------- package.json | 10 +- 2 files changed, 411 insertions(+), 396 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9c03ca..f3dce36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -333,18 +333,18 @@ } }, "@babel/runtime": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", - "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", + "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz", - "integrity": "sha512-RMafpmrNB5E/bwdSphLr8a8++9TosnyJp98RZzI6VOx2R2CCMpsXXXRvmI700O9oEKpXdZat6oEK68/F0zjd4A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.1.tgz", + "integrity": "sha512-umhPIcMrlBZ2aTWlWjUseW9LjQKxi1dpFlQS8DzsxB//5K+u6GLTC/JliPKHsd5kJVPIU6X/Hy0YvWOYPcMxBw==", "dev": true, "requires": { "core-js-pure": "^3.0.0", @@ -471,9 +471,9 @@ } }, "@eslint/eslintrc": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", - "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.0.tgz", + "integrity": "sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -496,12 +496,6 @@ "requires": { "type-fest": "^0.8.1" } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true } } }, @@ -582,16 +576,16 @@ "dev": true }, "@jest/console": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", - "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.1.tgz", + "integrity": "sha512-cjqcXepwC5M+VeIhwT6Xpi/tT4AiNzlIx8SMJ9IihduHnsSrnWNvTBfKIpmqOOCNOPqtbBx6w2JqfoLOJguo8g==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.0", - "jest-util": "^26.6.0", + "jest-message-util": "^26.6.1", + "jest-util": "^26.6.1", "slash": "^3.0.0" }, "dependencies": { @@ -647,34 +641,34 @@ } }, "@jest/core": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.0.tgz", - "integrity": "sha512-7wbunxosnC5zXjxrEtTQSblFjRVOT8qz1eSytw8riEeWgegy3ct91NLPEP440CDuWrmW3cOLcEGxIf9q2u6O9Q==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.1.tgz", + "integrity": "sha512-p4F0pgK3rKnoS9olXXXOkbus1Bsu6fd8pcvLMPsUy4CVXZ8WSeiwQ1lK5hwkCIqJ+amZOYPd778sbPha/S8Srw==", "dev": true, "requires": { - "@jest/console": "^26.6.0", - "@jest/reporters": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/transform": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/reporters": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.0", - "jest-config": "^26.6.0", - "jest-haste-map": "^26.6.0", - "jest-message-util": "^26.6.0", + "jest-changed-files": "^26.6.1", + "jest-config": "^26.6.1", + "jest-haste-map": "^26.6.1", + "jest-message-util": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.0", - "jest-resolve-dependencies": "^26.6.0", - "jest-runner": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "jest-validate": "^26.6.0", - "jest-watcher": "^26.6.0", + "jest-resolve": "^26.6.1", + "jest-resolve-dependencies": "^26.6.1", + "jest-runner": "^26.6.1", + "jest-runtime": "^26.6.1", + "jest-snapshot": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", + "jest-watcher": "^26.6.1", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -743,53 +737,53 @@ } }, "@jest/environment": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.0.tgz", - "integrity": "sha512-l+5MSdiC4rUUrz8xPdj0TwHBwuoqMcAbFnsYDTn5FkenJl8b+lvC5NdJl1tVICGHWnx0fnjdd1luRZ7u3U4xyg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.1.tgz", + "integrity": "sha512-GNvHwkOFJtNgSwdzH9flUPzF9AYAZhUg124CBoQcwcZCM9s5TLz8Y3fMtiaWt4ffbigoetjGk5PU2Dd8nLrSEw==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/fake-timers": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", - "jest-mock": "^26.6.0" + "jest-mock": "^26.6.1" } }, "@jest/fake-timers": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.0.tgz", - "integrity": "sha512-7VQpjChrwlwvGNysS10lDBLOVLxMvMtpx0Xo6aIotzNVyojYk0NN0CR8R4T6h/eu7Zva/LB3P71jqwGdtADoag==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.1.tgz", + "integrity": "sha512-T/SkMLgOquenw/nIisBRD6XAYpFir0kNuclYLkse5BpzeDUukyBr+K31xgAo9M0hgjU9ORlekAYPSzc0DKfmKg==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.6.0", - "jest-mock": "^26.6.0", - "jest-util": "^26.6.0" + "jest-message-util": "^26.6.1", + "jest-mock": "^26.6.1", + "jest-util": "^26.6.1" } }, "@jest/globals": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.0.tgz", - "integrity": "sha512-rs3a/a8Lq8FgTx11SxbqIU2bDjsFU2PApl2oK2oUVlo84RSF76afFm2nLojW93AGssr715GHUwhq5b6mpCI5BQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.1.tgz", + "integrity": "sha512-acxXsSguuLV/CeMYmBseefw6apO7NuXqpE+v5r3yD9ye2PY7h1nS20vY7Obk2w6S7eJO4OIAJeDnoGcLC/McEQ==", "dev": true, "requires": { - "@jest/environment": "^26.6.0", - "@jest/types": "^26.6.0", - "expect": "^26.6.0" + "@jest/environment": "^26.6.1", + "@jest/types": "^26.6.1", + "expect": "^26.6.1" } }, "@jest/reporters": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.0.tgz", - "integrity": "sha512-PXbvHhdci5Rj1VFloolgLb+0kkdtzswhG8MzVENKJRI3O1ndwr52G6E/2QupjwrRcYnApZOelFf4nNpf5+SDxA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.1.tgz", + "integrity": "sha512-J6OlXVFY3q1SXWJhjme5i7qT/BAZSikdOK2t8Ht5OS32BDo6KfG5CzIzzIFnAVd82/WWbc9Hb7SJ/jwSvVH9YA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/transform": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -800,10 +794,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.0", - "jest-resolve": "^26.6.0", - "jest-util": "^26.6.0", - "jest-worker": "^26.5.0", + "jest-haste-map": "^26.6.1", + "jest-resolve": "^26.6.1", + "jest-util": "^26.6.1", + "jest-worker": "^26.6.1", "node-notifier": "^8.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", @@ -889,46 +883,46 @@ } }, "@jest/test-result": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", - "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.1.tgz", + "integrity": "sha512-wqAgIerIN2gSdT2A8WeA5+AFh9XQBqYGf8etK143yng3qYd0mF0ie2W5PVmgnjw4VDU6ammI9NdXrKgNhreawg==", "dev": true, "requires": { - "@jest/console": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/types": "^26.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.0.tgz", - "integrity": "sha512-rWPTMa+8rejvePZnJmnKkmKWh0qILFDPpN0qbSif+KNGvFxqqDGafMo4P2Y8+I9XWrZQBeXL9IxPL4ZzDgRlbw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.1.tgz", + "integrity": "sha512-0csqA/XApZiNeTIPYh6koIDCACSoR6hi29T61tKJMtCZdEC+tF3PoNt7MS0oK/zKC6daBgCbqXxia5ztr/NyCQ==", "dev": true, "requires": { - "@jest/test-result": "^26.6.0", + "@jest/test-result": "^26.6.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.0", - "jest-runner": "^26.6.0", - "jest-runtime": "^26.6.0" + "jest-haste-map": "^26.6.1", + "jest-runner": "^26.6.1", + "jest-runtime": "^26.6.1" } }, "@jest/transform": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.0.tgz", - "integrity": "sha512-NUNA1NMCyVV9g5NIQF1jzW7QutQhB/HAocteCiUyH0VhmLXnGMTfPYQu1G6IjPk+k1SWdh2PD+Zs1vMqbavWzg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.1.tgz", + "integrity": "sha512-oNFAqVtqRxZRx6vXL3I4bPKUK0BIlEeaalkwxyQGGI8oXDQBtYQBpiMe5F7qPs4QdvvFYB42gPGIMMcxXaBBxQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.0", + "jest-haste-map": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.0", + "jest-util": "^26.6.1", "micromatch": "^4.0.2", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -994,9 +988,9 @@ } }, "@jest/types": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", - "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", + "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -1156,9 +1150,9 @@ "dev": true }, "@types/node": { - "version": "14.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.2.tgz", - "integrity": "sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg==", + "version": "14.14.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.5.tgz", + "integrity": "sha512-H5Wn24s/ZOukBmDn03nnGTp18A60ny9AmCwnEcgJiTgSGsCO7k+NWP7zjCCbhlcnVCoI+co52dUAt9GMhOSULw==", "dev": true }, "@types/normalize-package-data": { @@ -1429,9 +1423,9 @@ "dev": true }, "axe-core": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.5.tgz", - "integrity": "sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.0.2.tgz", + "integrity": "sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA==", "dev": true }, "axobject-query": { @@ -1600,13 +1594,13 @@ } }, "babel-jest": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.0.tgz", - "integrity": "sha512-JI66yILI7stzjHccAoQtRKcUwJrJb4oMIxLTirL3GdAjGpaUBQSjZDFi9LsPkN4gftsS4R2AThAJwOjJxadwbg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.1.tgz", + "integrity": "sha512-duMWEOKrSBYRVTTNpL2SipNIWnZOjP77auOBMPQ3zXAdnDbyZQWU8r/RxNWpUf9N6cgPFecQYelYLytTVXVDtA==", "dev": true, "requires": { - "@jest/transform": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", "babel-preset-jest": "^26.5.0", @@ -1931,6 +1925,12 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "cjs-module-lexer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.4.3.tgz", + "integrity": "sha512-5RLK0Qfs0PNDpEyBXIr3bIT1Muw3ojSlvpw6dAmkUcO0+uTrsBn7GuEIgx40u+OzbCBLDta7nvmud85P4EmTsQ==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -2404,7 +2404,6 @@ "version": "1.17.6", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -2422,8 +2421,7 @@ "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" } } }, @@ -2431,7 +2429,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -2535,13 +2532,13 @@ } }, "eslint": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz", - "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz", + "integrity": "sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.1.3", + "@eslint/eslintrc": "^0.2.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2634,12 +2631,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2800,29 +2791,98 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.3.1.tgz", - "integrity": "sha512-i1S+P+c3HOlBJzMFORRbC58tHa65Kbo8b52/TwCwSKLohwvpfT5rm2GjGWzOHTEuq4xxf2aRlHHTtmExDQOP+g==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", "dev": true, "requires": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.11.2", "aria-query": "^4.2.2", "array-includes": "^3.1.1", "ast-types-flow": "^0.0.7", - "axe-core": "^3.5.4", - "axobject-query": "^2.1.2", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", "damerau-levenshtein": "^1.0.6", "emoji-regex": "^9.0.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", + "jsx-ast-utils": "^3.1.0", "language-tags": "^1.0.5" }, "dependencies": { "emoji-regex": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.0.0.tgz", - "integrity": "sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", + "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==", + "dev": true + }, + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "jsx-ast-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz", + "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.1" + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } } } }, @@ -3106,16 +3166,16 @@ } }, "expect": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.0.tgz", - "integrity": "sha512-EzhbZ1tbwcaa5Ok39BI11flIMeIUSlg1QsnXOrleaMvltwHsvIQPBtL710l+ma+qDFLUgktCXK4YuQzmHdm7cg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.1.tgz", + "integrity": "sha512-BRfxIBHagghMmr1D2MRY0Qv5d3Nc8HCqgbDwNXw/9izmM5eBb42a2YjLKSbsqle76ozGkAEPELQX4IdNHAKRNA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", + "jest-matcher-utils": "^26.6.1", + "jest-message-util": "^26.6.1", "jest-regex-util": "^26.0.0" }, "dependencies": { @@ -3787,8 +3847,7 @@ "is-callable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" }, "is-ci": { "version": "2.0.0", @@ -3923,7 +3982,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", - "dev": true, "requires": { "has-symbols": "^1.0.1" }, @@ -3931,8 +3989,7 @@ "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" } } }, @@ -4085,14 +4142,14 @@ } }, "jest": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", - "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.1.tgz", + "integrity": "sha512-f+ahfqw3Ffy+9vA7sWFGpTmhtKEMsNAZiWBVXDkrpIO73zIz22iimjirnV78kh/eWlylmvLh/0WxHN6fZraZdA==", "dev": true, "requires": { - "@jest/core": "^26.6.0", + "@jest/core": "^26.6.1", "import-local": "^3.0.2", - "jest-cli": "^26.6.0" + "jest-cli": "^26.6.1" }, "dependencies": { "ansi-styles": { @@ -4136,22 +4193,22 @@ "dev": true }, "jest-cli": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.0.tgz", - "integrity": "sha512-lJAMZGpmML+y3Kfln6L5DGRTfKGQ+n1JDM1RQstojSLUhe/EaXWR8vmcx70v4CyJKvFZs7c/0QDkPX5ra/aDew==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.1.tgz", + "integrity": "sha512-aPLoEjlwFrCWhiPpW5NUxQA1X1kWsAnQcQ0SO/fHsCvczL3W75iVAcH9kP6NN+BNqZcHNEvkhxT5cDmBfEAh+w==", "dev": true, "requires": { - "@jest/core": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/core": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^26.6.0", - "jest-util": "^26.6.0", - "jest-validate": "^26.6.0", + "jest-config": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", "prompts": "^2.0.1", "yargs": "^15.4.1" } @@ -4168,12 +4225,12 @@ } }, "jest-changed-files": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.0.tgz", - "integrity": "sha512-k8PZzlp3cRWDe0fDc/pYs+c4w36+hiWXe1PpW/pW1UJmu1TNTAcQfZUrVYleij+uEqlY6z4mPv7Iff3kY0o5SQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.1.tgz", + "integrity": "sha512-NhSdZ5F6b/rIN5V46x1l31vrmukD/bJUXgYAY8VtP1SknYdJwjYDRxuLt7Z8QryIdqCjMIn2C0Cd98EZ4umo8Q==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "execa": "^4.0.0", "throat": "^5.0.0" }, @@ -4222,29 +4279,29 @@ } }, "jest-config": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.0.tgz", - "integrity": "sha512-RCR1Kf7MGJ5waVCvrj/k3nCAJKquWZlzs8rkskzj0KlG392hNBOaYd5FQ4cCac08j6pwfIDOwNvMcy0/FqguJg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.1.tgz", + "integrity": "sha512-mtJzIynIwW1d1nMlKCNCQiSgWaqFn8cH/fOSNY97xG7Y9tBCZbCSuW2GTX0RPmceSJGO7l27JgwC18LEg0Vg+g==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.0", - "@jest/types": "^26.6.0", - "babel-jest": "^26.6.0", + "@jest/test-sequencer": "^26.6.1", + "@jest/types": "^26.6.1", + "babel-jest": "^26.6.1", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.0", - "jest-environment-node": "^26.6.0", + "jest-environment-jsdom": "^26.6.1", + "jest-environment-node": "^26.6.1", "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.0", + "jest-jasmine2": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.0", - "jest-util": "^26.6.0", - "jest-validate": "^26.6.0", + "jest-resolve": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", "micromatch": "^4.0.2", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" }, "dependencies": { "ansi-styles": { @@ -4299,15 +4356,15 @@ } }, "jest-diff": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.0.tgz", - "integrity": "sha512-IH09rKsdWY8YEY7ii2BHlSq59oXyF2pK3GoK+hOK9eD/x6009eNB5Jv1shLMKgxekodPzLlV7eZP1jPFQYds8w==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz", + "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^26.5.0", "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" }, "dependencies": { "ansi-styles": { @@ -4371,16 +4428,16 @@ } }, "jest-each": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.0.tgz", - "integrity": "sha512-7LzSNwNviYnm4FWK46itIE03NqD/8O8/7tVQ5rwTdTNrmPMQoQ1Z7hEFQ1uzRReluOFislpurpnQ0QsclSiDkA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.1.tgz", + "integrity": "sha512-gSn8eB3buchuq45SU7pLB7qmCGax1ZSxfaWuEFblCyNMtyokYaKFh9dRhYPujK6xYL57dLIPhLKatjmB5XWzGA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-util": "^26.6.0", - "pretty-format": "^26.6.0" + "jest-util": "^26.6.1", + "pretty-format": "^26.6.1" }, "dependencies": { "ansi-styles": { @@ -4435,32 +4492,32 @@ } }, "jest-environment-jsdom": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.0.tgz", - "integrity": "sha512-bXO9IG7a3YlyiHxwfKF+OWoTA+GIw4FrD+Y0pb6CC+nKs5JuSRZmR2ovEX6PWo6KY42ka3JoZOp3KEnXiFPPCg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.1.tgz", + "integrity": "sha512-A17RiXuHYNVlkM+3QNcQ6n5EZyAc6eld8ra9TW26luounGWpku4tj03uqRgHJCI1d4uHr5rJiuCH5JFRtdmrcA==", "dev": true, "requires": { - "@jest/environment": "^26.6.0", - "@jest/fake-timers": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/environment": "^26.6.1", + "@jest/fake-timers": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", - "jest-mock": "^26.6.0", - "jest-util": "^26.6.0", + "jest-mock": "^26.6.1", + "jest-util": "^26.6.1", "jsdom": "^16.4.0" } }, "jest-environment-node": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.0.tgz", - "integrity": "sha512-kWU6ZD1h6fs7sIl6ufuK0sXW/3d6WLaj48iow0NxhgU6eY89d9K+0MVmE0cRcVlh53yMyxTK6b+TnhLOnlGp/A==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.1.tgz", + "integrity": "sha512-YffaCp6h0j1kbcf1NVZ7umC6CPgD67YS+G1BeornfuSkx5s3xdhuwG0DCxSiHPXyT81FfJzA1L7nXvhq50OWIg==", "dev": true, "requires": { - "@jest/environment": "^26.6.0", - "@jest/fake-timers": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/environment": "^26.6.1", + "@jest/fake-timers": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", - "jest-mock": "^26.6.0", - "jest-util": "^26.6.0" + "jest-mock": "^26.6.1", + "jest-util": "^26.6.1" } }, "jest-get-type": { @@ -4470,12 +4527,12 @@ "dev": true }, "jest-haste-map": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", - "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.1.tgz", + "integrity": "sha512-9kPafkv0nX6ta1PrshnkiyhhoQoFWncrU/uUBt3/AP1r78WSCU5iLceYRTwDvJl67H3RrXqSlSVDDa/AsUB7OQ==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -4484,36 +4541,36 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", "jest-serializer": "^26.5.0", - "jest-util": "^26.6.0", - "jest-worker": "^26.5.0", + "jest-util": "^26.6.1", + "jest-worker": "^26.6.1", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.0.tgz", - "integrity": "sha512-2E3c+0A9y2OIK5caw5qlcm3b4doaf8FSfXKTX3xqKTUJoR4zXh0xvERBNWxZP9xMNXEi/2Z3LVsZpR2hROgixA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.1.tgz", + "integrity": "sha512-2uYdT32o/ZzSxYAPduAgokO8OlAL1YdG/9oxcEY138EDNpIK5XRRJDaGzTZdIBWSxk0aR8XxN44FvfXtHB+Fiw==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.0", + "@jest/environment": "^26.6.1", "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.6.0", + "expect": "^26.6.1", "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "pretty-format": "^26.6.0", + "jest-each": "^26.6.1", + "jest-matcher-utils": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-runtime": "^26.6.1", + "jest-snapshot": "^26.6.1", + "jest-util": "^26.6.1", + "pretty-format": "^26.6.1", "throat": "^5.0.0" }, "dependencies": { @@ -4569,25 +4626,25 @@ } }, "jest-leak-detector": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.0.tgz", - "integrity": "sha512-3oMv34imWTl1/nwKnmE/DxYo3QqHnZeF3nO6UzldppkhW0Za7OY2DYyWiamqVzwdUrjhoQkY5g+aF6Oc3alYEQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.1.tgz", + "integrity": "sha512-j9ZOtJSJKlHjrs4aIxWjiQUjyrffPdiAQn2Iw0916w7qZE5Lk0T2KhIH6E9vfhzP6sw0Q0jtnLLb4vQ71o1HlA==", "dev": true, "requires": { "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" } }, "jest-matcher-utils": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.0.tgz", - "integrity": "sha512-BUy/dQYb7ELGRazmK4ZVkbfPYCaNnrMtw1YljVhcKzWUxBM0xQ+bffrfnMLdRZp4wUUcT4ahaVnA3VWZtXWP9Q==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz", + "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.6.0", + "jest-diff": "^26.6.1", "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" }, "dependencies": { "ansi-styles": { @@ -4642,13 +4699,13 @@ } }, "jest-message-util": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", - "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.1.tgz", + "integrity": "sha512-cqM4HnqncIebBNdTKrBoWR/4ufHTll0pK/FWwX0YasK+TlBQEMqw3IEdynuuOTjDPFO3ONlFn37280X48beByw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -4709,12 +4766,12 @@ } }, "jest-mock": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.0.tgz", - "integrity": "sha512-HsNmL8vVIn1rL1GWA21Drpy9Cl+7GImwbWz/0fkWHrUXVzuaG7rP0vwLtE+/n70Mt0U8nPkz8fxioi3SC0wqhw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.1.tgz", + "integrity": "sha512-my0lPTBu1awY8iVG62sB2sx9qf8zxNDVX+5aFgoB8Vbqjb6LqIOsfyFA8P1z6H2IsqMbvOX9oCJnK67Y3yUIMA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/node": "*" } }, @@ -4731,18 +4788,18 @@ "dev": true }, "jest-resolve": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", - "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", + "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.0", + "jest-util": "^26.6.1", "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", + "resolve": "^1.18.1", "slash": "^3.0.0" }, "dependencies": { @@ -4878,6 +4935,16 @@ "type-fest": "^0.8.1" } }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dev": true, + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4890,40 +4957,40 @@ } }, "jest-resolve-dependencies": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.0.tgz", - "integrity": "sha512-4di+XUT7LwJJ8b8qFEEDQssC5+aeVjLhvRICCaS4alh/EVS9JCT1armfJ3pnSS8t4o6659WbMmKVo82H4LuUVw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.1.tgz", + "integrity": "sha512-MN6lufbZJ3RBfTnJesZtHu3hUCBqPdHRe2+FhIt0yiqJ3fMgzWRqMRQyN/d/QwOE7KXwAG2ekZutbPhuD7s51A==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.0" + "jest-snapshot": "^26.6.1" } }, "jest-runner": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.0.tgz", - "integrity": "sha512-QpeN6pje8PQvFgT+wYOlzeycKd67qAvSw5FgYBiX2cTW+QTiObTzv/k09qRvT09rcCntFxUhy9VB1mgNGFLYIA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.1.tgz", + "integrity": "sha512-DmpNGdgsbl5s0FGkmsInmqnmqCtliCSnjWA2TFAJS1m1mL5atwfPsf+uoZ8uYQ2X0uDj4NM+nPcDnUpbNTRMBA==", "dev": true, "requires": { - "@jest/console": "^26.6.0", - "@jest/environment": "^26.6.0", - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/environment": "^26.6.1", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.0", + "jest-config": "^26.6.1", "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.0", - "jest-leak-detector": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-resolve": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-util": "^26.6.0", - "jest-worker": "^26.5.0", + "jest-haste-map": "^26.6.1", + "jest-leak-detector": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-resolve": "^26.6.1", + "jest-runtime": "^26.6.1", + "jest-util": "^26.6.1", + "jest-worker": "^26.6.1", "source-map-support": "^0.5.6", "throat": "^5.0.0" }, @@ -4980,34 +5047,35 @@ } }, "jest-runtime": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.0.tgz", - "integrity": "sha512-JEz4YGnybFvtN4NLID6lsZf0bcd8jccwjWcG5TRE3fYVnxoX1egTthPjnC4btIwWJ6QaaHhtOQ/E3AGn8iClAw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.1.tgz", + "integrity": "sha512-7uOCNeezXDWgjEyzYbRN2ViY7xNZzusNVGAMmU0UHRUNXuY4j4GBHKGMqPo/cBPZA9bSYp+lwK2DRRBU5Dv6YQ==", "dev": true, "requires": { - "@jest/console": "^26.6.0", - "@jest/environment": "^26.6.0", - "@jest/fake-timers": "^26.6.0", - "@jest/globals": "^26.6.0", + "@jest/console": "^26.6.1", + "@jest/environment": "^26.6.1", + "@jest/fake-timers": "^26.6.1", + "@jest/globals": "^26.6.1", "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.6.0", - "@jest/transform": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/test-result": "^26.6.1", + "@jest/transform": "^26.6.1", + "@jest/types": "^26.6.1", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", + "cjs-module-lexer": "^0.4.2", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.6.0", - "jest-haste-map": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-mock": "^26.6.0", + "jest-config": "^26.6.1", + "jest-haste-map": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-mock": "^26.6.1", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "jest-validate": "^26.6.0", + "jest-resolve": "^26.6.1", + "jest-snapshot": "^26.6.1", + "jest-util": "^26.6.1", + "jest-validate": "^26.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^15.4.1" @@ -5081,26 +5149,26 @@ } }, "jest-snapshot": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.0.tgz", - "integrity": "sha512-mcqJZeIZqxomvBcsaiIbiEe2g7K1UxnUpTwjMoHb+DX4uFGnuZoZ6m28YOYRyCfZsdU9mmq73rNBnEH2atTR4Q==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.1.tgz", + "integrity": "sha512-JA7bZp7HRTIJYAi85pJ/OZ2eur2dqmwIToA5/6d7Mn90isGEfeF9FvuhDLLEczgKP1ihreBzrJ6Vr7zteP5JNA==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^26.6.0", + "expect": "^26.6.1", "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.0", + "jest-diff": "^26.6.1", "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-resolve": "^26.6.0", + "jest-haste-map": "^26.6.1", + "jest-matcher-utils": "^26.6.1", + "jest-message-util": "^26.6.1", + "jest-resolve": "^26.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.0", + "pretty-format": "^26.6.1", "semver": "^7.3.2" }, "dependencies": { @@ -5156,12 +5224,12 @@ } }, "jest-util": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", - "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.1.tgz", + "integrity": "sha512-xCLZUqVoqhquyPLuDXmH7ogceGctbW8SMyQVjD9o+1+NPWI7t0vO08udcFLVPLgKWcvc+zotaUv/RuaR6l8HIA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -5221,17 +5289,17 @@ } }, "jest-validate": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.0.tgz", - "integrity": "sha512-FKHNqvh1Pgs4NWas56gsTPmjcIoGAAzSVUCK1+g8euzuCGbmdEr8LRTtOEFjd29uMZUk0PhzmzKGlHPe6j3UWw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.1.tgz", + "integrity": "sha512-BEFpGbylKocnNPZULcnk+TGaz1oFZQH/wcaXlaXABbu0zBwkOGczuWgdLucUouuQqn7VadHZZeTvo8VSFDLMOA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.6.0" + "pretty-format": "^26.6.1" }, "dependencies": { "ansi-styles": { @@ -5292,17 +5360,17 @@ } }, "jest-watcher": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.0.tgz", - "integrity": "sha512-gw5BvcgPi0PKpMlNWQjUet5C5A4JOYrT7gexdP6+DR/f7mRm7wE0o1GqwPwcTsTwo0/FNf9c/kIDXTRaSAYwlw==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.1.tgz", + "integrity": "sha512-0LBIPPncNi9CaLKK15bnxyd2E8OMl4kJg0PTiNOI+MXztXw1zVdtX/x9Pr6pXaQYps+eS/ts43O4+HByZ7yJSw==", "dev": true, "requires": { - "@jest/test-result": "^26.6.0", - "@jest/types": "^26.6.0", + "@jest/test-result": "^26.6.1", + "@jest/types": "^26.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.0", + "jest-util": "^26.6.1", "string-length": "^4.0.1" }, "dependencies": { @@ -5358,9 +5426,9 @@ } }, "jest-worker": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", - "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.1.tgz", + "integrity": "sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw==", "dev": true, "requires": { "@types/node": "*", @@ -5585,6 +5653,12 @@ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -5766,32 +5840,15 @@ "dev": true }, "nock": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz", - "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==", + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.0.4.tgz", + "integrity": "sha512-alqTV8Qt7TUbc74x1pKRLSENzfjp4nywovcJgi/1aXDiUxXdt7TkruSTF5MDWPP7UoPVgea4F9ghVdmX0xxnSA==", "dev": true, "requires": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.13", + "lodash.set": "^4.3.2", "propagate": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "node-fetch": { @@ -6207,15 +6264,15 @@ } }, "pretty-format": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", - "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", + "version": "26.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", + "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", "dev": true, "requires": { - "@jest/types": "^26.6.0", + "@jest/types": "^26.6.1", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" }, "dependencies": { "ansi-styles": { @@ -6241,6 +6298,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true } } }, @@ -6263,64 +6326,16 @@ "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.0", "function-bind": "^1.1.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "requires": { - "has": "^1.0.3" - } - } } }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" } }, "prop-types": { @@ -6407,9 +6422,9 @@ } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", "dev": true }, "regex-not": { @@ -7951,13 +7966,13 @@ } }, "websocket-as-promised": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/websocket-as-promised/-/websocket-as-promised-1.0.1.tgz", - "integrity": "sha512-+gBevna4yxisb8cigL8NxcS8s241cvfMeyy1fNFcFgBcX/6vknMT84MwMmBNLYmsYH2giVoxOSEiAeeb7txFOw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/websocket-as-promised/-/websocket-as-promised-1.1.0.tgz", + "integrity": "sha512-agq8bPsPFKBWinKQkoXwY7LoBYe+2fQ7Gnuxx964+BTIiyAdL130FnB60bXuVQdUCdaS17R/MyRaaO4WIqtl4Q==", "requires": { - "chnl": "^1.0.0", + "chnl": "^1.2.0", "promise-controller": "^1.0.0", - "promise.prototype.finally": "^3.1.1" + "promise.prototype.finally": "^3.1.2" } }, "whatwg-encoding": { diff --git a/package.json b/package.json index 9ef19ac..d9c5d0e 100644 --- a/package.json +++ b/package.json @@ -47,22 +47,22 @@ "node-fetch": "^2.6.1", "random": "^2.2.0", "websocket": "^1.0.32", - "websocket-as-promised": "^1.0.1" + "websocket-as-promised": "^1.1.0" }, "devDependencies": { "babel-eslint": "^10.1.0", - "eslint": "^7.11.0", + "eslint": "^7.12.0", "eslint-config-airbnb": "^18.2.0", "eslint-config-prettier": "^6.14.0", "eslint-config-wesbos": "1.0.1", "eslint-plugin-html": "^6.1.0", "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-react": "^7.21.5", "eslint-plugin-react-hooks": "^4.2.0", - "jest": "^26.6.0", - "nock": "^12.0.3", + "jest": "^26.6.1", + "nock": "^13.0.4", "prettier": "^2.1.2" } } From 82f152d624ca6228ef3bbc77d018d77e2da8a95c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Mon, 26 Oct 2020 21:10:51 -0300 Subject: [PATCH 26/27] openWebSocket: use v2 API --- main.js | 5 +++++ src/mixins/index.js | 4 ++-- src/mixins/openWebSocket.js | 22 +++++++++++++++++++--- src/payloads/wssLoginPayload.js | 6 +++--- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/main.js b/main.js index 5b99219..b04ccd3 100644 --- a/main.js +++ b/main.js @@ -96,6 +96,11 @@ class eWeLink { return `wss://${this.region}-pconnect3.coolkit.cc:8080/api/ws`; } + getDispatchServiceUrl() { + const domain = this.region === 'cn' ? 'cn' : 'cc'; + return `https://${this.region}-dispa.coolkit.${domain}`; + } + /** * Generate Zeroconf URL * @param device diff --git a/src/mixins/index.js b/src/mixins/index.js index ec71864..cb47833 100644 --- a/src/mixins/index.js +++ b/src/mixins/index.js @@ -13,7 +13,7 @@ const { getDevices } = require('./getDevices'); const { getFirmwareVersion } = require('./getFirmwareVersion'); const { getRegion } = require('./getRegion'); const { makeRequest } = require('./makeRequest'); -const { openWebSocket } = require('./openWebSocket'); +const openWebSocket = require('./openWebSocket'); const { saveDevicesCache } = require('./saveDevicesCache'); const { setDevicePowerState } = require('./setDevicePowerState'); const { toggleDevicePowerState } = require('./toggleDevicePowerState'); @@ -34,7 +34,7 @@ const mixins = { getFirmwareVersion, getRegion, makeRequest, - openWebSocket, + ...openWebSocket, saveDevicesCache, setDevicePowerState, toggleDevicePowerState, diff --git a/src/mixins/openWebSocket.js b/src/mixins/openWebSocket.js index 6660edc..81b0a65 100644 --- a/src/mixins/openWebSocket.js +++ b/src/mixins/openWebSocket.js @@ -1,7 +1,9 @@ +const fetch = require('node-fetch'); const W3CWebSocket = require('websocket').w3cwebsocket; const WebSocketAsPromised = require('websocket-as-promised'); const wssLoginPayload = require('../payloads/wssLoginPayload'); +const errors = require('../data/errors'); module.exports = { /** @@ -13,17 +15,20 @@ module.exports = { * @returns {Promise} */ async openWebSocket(callback, ...{ heartbeat = 120000 }) { + const dispatch = await this.getWebSocketServer(); + const WSS_URL = `wss://${dispatch.domain}:${dispatch.port}/api/ws`; + const payloadLogin = wssLoginPayload({ at: this.at, apiKey: this.apiKey, appid: this.APP_ID, }); - const wsp = new WebSocketAsPromised(this.getApiWebSocket(), { - createWebSocket: wss => new W3CWebSocket(wss), + const wsp = new WebSocketAsPromised(WSS_URL, { + createWebSocket: (wss) => new W3CWebSocket(wss), }); - wsp.onMessage.addListener(message => { + wsp.onMessage.addListener((message) => { try { const data = JSON.parse(message); callback(data); @@ -41,4 +46,15 @@ module.exports = { return wsp; }, + + async getWebSocketServer() { + const requestUrl = this.getDispatchServiceUrl(); + const request = await fetch(`${requestUrl}/dispatch/app`); + + if (!request.ok) { + throw new Error(`[${request.status}] ${errors[request.status]}`); + } + + return request.json(); + }, }; diff --git a/src/payloads/wssLoginPayload.js b/src/payloads/wssLoginPayload.js index 034ee99..eb082f2 100644 --- a/src/payloads/wssLoginPayload.js +++ b/src/payloads/wssLoginPayload.js @@ -3,14 +3,14 @@ const { timestamp, nonce } = require('../helpers/utilities'); const wssLoginPayload = ({ at, apiKey, appid }) => { const payload = { action: 'userOnline', + version: 8, + ts: timestamp, at, + userAgent: 'app', apikey: apiKey, appid, nonce, - ts: timestamp, - userAgent: 'app', sequence: Math.floor(timestamp * 1000), - version: 8, }; return JSON.stringify(payload); From b3655b095d8dc83dbed7f35a61a871f3f8c92fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marti=CC=81n=20M?= Date: Mon, 26 Oct 2020 21:17:01 -0300 Subject: [PATCH 27/27] getRegion: use v2 API --- src/mixins/getCredentials.js | 2 +- src/mixins/getRegion.js | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/mixins/getCredentials.js b/src/mixins/getCredentials.js index a63d8f2..47368b8 100644 --- a/src/mixins/getCredentials.js +++ b/src/mixins/getCredentials.js @@ -41,6 +41,6 @@ module.exports = { this.apiKey = _get(response, 'data.user.apikey', ''); this.at = _get(response, 'data.at', ''); - return response; + return response.data; }, }; diff --git a/src/mixins/getRegion.js b/src/mixins/getRegion.js index 1fdc22e..c052f6e 100644 --- a/src/mixins/getRegion.js +++ b/src/mixins/getRegion.js @@ -3,16 +3,12 @@ const errors = require('../data/errors'); module.exports = { async getRegion() { - if (!this.email || !this.password) { - return { error: 406, msg: errors.invalidAuth }; - } - const credentials = await this.getCredentials(); const error = _get(credentials, 'error', false); if (error) { - return credentials; + throw new Error(`[${error}] ${errors[error]}`); } return {