From 53964af0bc54267e2ea8bd0912f39390a63d0762 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Wed, 8 May 2024 00:49:38 -0500 Subject: [PATCH 01/27] add statusCode --- src/devices/device.ts | 27 +++++++++++++++++++++++++++ src/devices/lock.ts | 9 +++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index 42d078a..1426379 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -112,9 +112,36 @@ export abstract class deviceBase { } } + async statusCode(statusCode: number): Promise { + switch (statusCode) { + case 100: + this.debugLog(`Lock: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`); + break; + case 200: + this.debugLog(`Lock: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`); + break; + case 400: + this.errorLog(`Lock: ${this.accessory.displayName} Bad Request, statusCode: ${statusCode}`); + break; + case 429: + this.errorLog(`Lock: ${this.accessory.displayName} Too Many Requests, exceeded the number of ` + + `requests allowed for a given time window, statusCode: ${statusCode}`); + break; + default: + this.infoLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCode}, Submit Bugs Here: ' + + 'https://tinyurl.com/AugustYaleBug`); + } + } + /** * Logging for Device */ + successLog(...log: any[]): void { + if (this.enablingDeviceLogging()) { + this.platform.log.success(String(...log)); + } + } + infoLog(...log: any[]): void { if (this.enablingDeviceLogging()) { this.log.info(String(...log)); diff --git a/src/devices/lock.ts b/src/devices/lock.ts index 33a99f4..3c31f2a 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -254,8 +254,9 @@ export class LockMechanism extends deviceBase { this.parseStatus(); this.updateHomeKitCharacteristics(); } catch (e: any) { - this.errorLog(`refreshStatus: ${e}`); - this.errorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error Message: ${JSON.stringify(e.message)}`); + this.statusCode(e.statusCode); + this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error: ${JSON.stringify(e)}`); + this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error Message: ${JSON.stringify(e.message)}`); } } @@ -266,11 +267,11 @@ export class LockMechanism extends deviceBase { try { await this.platform.augustCredentials(); if (this.Lock!.LockTargetState === this.hap.Characteristic.LockTargetState.UNSECURED) { - this.debugWarnLog(`Lock: ${this.accessory.displayName} Sending request to August API: Unlock (${this.Lock!.LockTargetState})`); + this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: Unlock (${this.Lock!.LockTargetState})`); const lockStatus = await this.platform.augustConfig.unlock(this.device.lockId); this.debugWarnLog(`Lock: ${this.accessory.displayName} (pushChanges-unlock) lockStatus: ${JSON.stringify(lockStatus)}`); } else if (this.Lock!.LockTargetState === this.hap.Characteristic.LockTargetState.SECURED) { - this.debugWarnLog(`Lock: ${this.accessory.displayName} Sending request to August API: Lock (${this.Lock!.LockTargetState})`); + this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: Lock (${this.Lock!.LockTargetState})`); const lockStatus = await this.platform.augustConfig.lock(this.device.lockId); this.debugWarnLog(`Lock: ${this.accessory.displayName} (pushChanges-lock) lockStatus: ${JSON.stringify(lockStatus)}`); } else { From 325556a7561c89ecb2114719cdb355e1a86e25f8 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Wed, 8 May 2024 06:47:50 -0500 Subject: [PATCH 02/27] better statusCode logging --- src/devices/device.ts | 23 ++++++++++------------- src/devices/lock.ts | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index 1426379..e2da7a5 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -112,24 +112,21 @@ export abstract class deviceBase { } } - async statusCode(statusCode: number): Promise { - switch (statusCode) { - case 100: + async statusCode(device: device & devicesConfig, statusCode: string): Promise { + if (!device.hide_device) { + if (statusCode.includes('100')) { this.debugLog(`Lock: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`); - break; - case 200: + } else if (statusCode.includes('200')) { this.debugLog(`Lock: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`); - break; - case 400: + } else if (statusCode.includes('400')) { this.errorLog(`Lock: ${this.accessory.displayName} Bad Request, statusCode: ${statusCode}`); - break; - case 429: + } else if (statusCode.includes('429')) { this.errorLog(`Lock: ${this.accessory.displayName} Too Many Requests, exceeded the number of ` - + `requests allowed for a given time window, statusCode: ${statusCode}`); - break; - default: + + `requests allowed for a given time window, statusCode: ${statusCode}`); + } else { this.infoLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCode}, Submit Bugs Here: ' - + 'https://tinyurl.com/AugustYaleBug`); + + 'https://tinyurl.com/AugustYaleBug`); + } } } diff --git a/src/devices/lock.ts b/src/devices/lock.ts index 3c31f2a..468b133 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -254,7 +254,7 @@ export class LockMechanism extends deviceBase { this.parseStatus(); this.updateHomeKitCharacteristics(); } catch (e: any) { - this.statusCode(e.statusCode); + this.statusCode(this.device, e); this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error: ${JSON.stringify(e)}`); this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error Message: ${JSON.stringify(e.message)}`); } From b89aab313624e20eebea87b71697e88e0db71d2c Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Wed, 8 May 2024 07:10:51 -0500 Subject: [PATCH 03/27] Update device.ts --- src/devices/device.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index e2da7a5..fc6a057 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -114,17 +114,18 @@ export abstract class deviceBase { async statusCode(device: device & devicesConfig, statusCode: string): Promise { if (!device.hide_device) { - if (statusCode.includes('100')) { - this.debugLog(`Lock: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`); - } else if (statusCode.includes('200')) { - this.debugLog(`Lock: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`); - } else if (statusCode.includes('400')) { - this.errorLog(`Lock: ${this.accessory.displayName} Bad Request, statusCode: ${statusCode}`); - } else if (statusCode.includes('429')) { - this.errorLog(`Lock: ${this.accessory.displayName} Too Many Requests, exceeded the number of ` - + `requests allowed for a given time window, statusCode: ${statusCode}`); + const statusCodeString = String(statusCode); // Convert statusCode to a string + if (statusCodeString.includes('100')) { + this.debugLog(`Lock: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCodeString}`); + } else if (statusCodeString.includes('200')) { + this.debugLog(`Lock: ${this.accessory.displayName} Request successful, statusCode: ${statusCodeString}`); + } else if (statusCodeString.includes('400')) { + this.errorLog(`Lock: ${this.accessory.displayName} Bad Request, statusCode: ${statusCodeString}`); + } else if (statusCodeString.includes('429')) { + this.errorLog(`Lock: ${this.accessory.displayName} Too Many Requests, exceeded the number of ` + + `requests allowed for a given time window, statusCode: ${statusCodeString}`); } else { - this.infoLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCode}, Submit Bugs Here: ' + this.infoLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCodeString}, Submit Bugs Here: ' + 'https://tinyurl.com/AugustYaleBug`); } } From 1188ee28553a0808bdd71e72caafb030a6b2df7d Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Wed, 8 May 2024 07:23:04 -0500 Subject: [PATCH 04/27] Update device.ts --- src/devices/device.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index fc6a057..ee2309e 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -124,7 +124,7 @@ export abstract class deviceBase { } else if (statusCodeString.includes('429')) { this.errorLog(`Lock: ${this.accessory.displayName} Too Many Requests, exceeded the number of ` + `requests allowed for a given time window, statusCode: ${statusCodeString}`); - } else { + } else if (statusCodeString !== 'undefined') { this.infoLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCodeString}, Submit Bugs Here: ' + 'https://tinyurl.com/AugustYaleBug`); } From 758fb7110607c0487b337ad71feccc596e76b5d6 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Wed, 8 May 2024 07:41:29 -0500 Subject: [PATCH 05/27] Update device.ts --- src/devices/device.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index ee2309e..27d6f3b 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -124,8 +124,8 @@ export abstract class deviceBase { } else if (statusCodeString.includes('429')) { this.errorLog(`Lock: ${this.accessory.displayName} Too Many Requests, exceeded the number of ` + `requests allowed for a given time window, statusCode: ${statusCodeString}`); - } else if (statusCodeString !== 'undefined') { - this.infoLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCodeString}, Submit Bugs Here: ' + } else { + this.debugLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCodeString}, Submit Bugs Here: ' + 'https://tinyurl.com/AugustYaleBug`); } } From fa1a2294f3d135df217ab8da16910bedb435559c Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Wed, 8 May 2024 07:43:31 -0500 Subject: [PATCH 06/27] only display error and error message when not when of the set statusCodes --- src/devices/device.ts | 6 ++++-- src/devices/lock.ts | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index 27d6f3b..daca2fb 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -112,9 +112,9 @@ export abstract class deviceBase { } } - async statusCode(device: device & devicesConfig, statusCode: string): Promise { + async statusCode(device: device & devicesConfig, error: { message: string; }): Promise { if (!device.hide_device) { - const statusCodeString = String(statusCode); // Convert statusCode to a string + const statusCodeString = String(error); // Convert statusCode to a string if (statusCodeString.includes('100')) { this.debugLog(`Lock: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCodeString}`); } else if (statusCodeString.includes('200')) { @@ -127,6 +127,8 @@ export abstract class deviceBase { } else { this.debugLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCodeString}, Submit Bugs Here: ' + 'https://tinyurl.com/AugustYaleBug`); + this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error: ${JSON.stringify(error)}`); + this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error Message: ${JSON.stringify(error.message)}`); } } } diff --git a/src/devices/lock.ts b/src/devices/lock.ts index 468b133..c235556 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -255,8 +255,6 @@ export class LockMechanism extends deviceBase { this.updateHomeKitCharacteristics(); } catch (e: any) { this.statusCode(this.device, e); - this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error: ${JSON.stringify(e)}`); - this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error Message: ${JSON.stringify(e.message)}`); } } From b0ece6d3be0f0e3f6317cac0c83f1ecf8207a6bb Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sat, 18 May 2024 11:44:30 -0500 Subject: [PATCH 07/27] fix linting --- eslint.config.js | 85 ++ package-lock.json | 1737 ++++++++++++++++------------------- package.json | 19 +- src/homebridge-ui/server.ts | 2 +- 4 files changed, 914 insertions(+), 929 deletions(-) create mode 100644 eslint.config.js diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..da699f3 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,85 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; + + +export default [ + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + { + ignores: [".dist/*"] + }, + { + rules: { + "quotes": [ + "warn", + "single" + ], + "indent": [ + "warn", + 2, + { + "SwitchCase": 1 + } + ], + "linebreak-style": [ + "warn", + "unix" + ], + "semi": [ + "warn", + "always" + ], + "comma-dangle": [ + "warn", + "always-multiline" + ], + "dot-notation": "off", + "eqeqeq": "warn", + "curly": [ + "warn", + "all" + ], + "brace-style": [ + "warn" + ], + "prefer-arrow-callback": [ + "warn" + ], + "max-len": [ + "warn", + 150 + ], + "no-console": [ + "warn" + ], // use the provided Homebridge log method instead + "no-non-null-assertion": [ + "off" + ], + "comma-spacing": [ + "error" + ], + "no-multi-spaces": [ + "warn", + { + "ignoreEOLComments": true + } + ], + "no-trailing-spaces": [ + "warn" + ], + "lines-between-class-members": [ + "warn", + "always", + { + "exceptAfterSingleLine": true + } + ], + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "off" + } + } +]; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9c273d8..3b8a7a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,32 +24,26 @@ "rxjs": "^7.8.1" }, "devDependencies": { - "@types/node": "^20.12.10", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "eslint": "^8.57.0", - "homebridge": "^1.8.1", + "@eslint/js": "^9.3.0", + "@stylistic/eslint-plugin-js": "^2.1.0", + "@types/eslint__js": "^8.42.3", + "@types/node": "^20.12.12", + "eslint": "^9.3.0", + "globals": "^15.2.0", + "homebridge": "^1.8.2", "homebridge-config-ui-x": "4.56.2", "nodemon": "^3.1.0", "npm-check-updates": "^16.14.20", - "rimraf": "^5.0.5", + "rimraf": "^5.0.7", "ts-node": "^10.9.2", - "typescript": "^5.4.5" + "typescript": "^5.4.5", + "typescript-eslint": "^8.0.0-alpha.13" }, "engines": { - "homebridge": "^1.8.1", + "homebridge": "^1.8.2", "node": "^18 || ^20 || ^22" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -63,16 +57,6 @@ "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", @@ -149,16 +133,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", @@ -2331,6 +2305,16 @@ "node": ">=12" } }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -2346,6 +2330,18 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", @@ -2356,15 +2352,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2372,41 +2368,31 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", + "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@fastify/accept-negotiator": { @@ -2430,15 +2416,15 @@ } }, "node_modules/@fastify/ajv-compiler/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -2533,9 +2519,9 @@ } }, "node_modules/@fastify/middie/node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", "dev": true }, "node_modules/@fastify/multipart": { @@ -2681,12 +2667,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -2694,28 +2680,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -2735,6 +2699,19 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -2875,16 +2852,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -2912,29 +2879,19 @@ "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "peer": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { @@ -3229,9 +3186,9 @@ } }, "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -3275,16 +3232,16 @@ } }, "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "installed-package-contents": "lib/index.js" + "installed-package-contents": "bin/index.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -3304,16 +3261,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@npmcli/move-file/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@npmcli/move-file/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3334,18 +3281,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/move-file/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@npmcli/move-file/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -3734,15 +3669,6 @@ "ws": "^6.2.2" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/@react-native-community/cli-tools": { "version": "13.6.6", "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-13.6.6.tgz", @@ -3975,16 +3901,6 @@ "@babel/preset-env": "^7.1.6" } }, - "node_modules/@react-native/codegen/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@react-native/codegen/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4005,18 +3921,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@react-native/codegen/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@react-native/community-cli-plugin": { "version": "0.74.83", "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.83.tgz", @@ -4104,15 +4008,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/@react-native/gradle-plugin": { "version": "0.74.83", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.74.83.tgz", @@ -4196,24 +4091,14 @@ } }, "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/@types/node": { - "version": "18.19.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.32.tgz", - "integrity": "sha512-2bkg93YBSDKk8DLmmHnmj/Rwr18TLx7/n+I23BigFwgexUJoMHZOd8X1OFxuF/W3NN0S2W2E5sVabI5CPinNvA==", + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "peer": true, "dependencies": { "undici-types": "~5.26.4" } }, - "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4234,18 +4119,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -4379,11 +4252,29 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.1.0.tgz", + "integrity": "sha512-gdXUjGNSsnY6nPyqxu6lmDTtVrwCOjun4x8PUn0x04d5ucLI74N3MT1Q0UhdcOR9No3bo5PGDyBgXK+KmD787A==", + "dev": true, + "dependencies": { + "@types/eslint": "^8.56.10", + "acorn": "^8.11.3", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", @@ -4456,6 +4347,30 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -4471,14 +4386,39 @@ "@types/node": "*" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", + "node_modules/@types/eslint__js": { + "version": "8.42.3", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", + "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", + "dev": true, + "dependencies": { + "@types/eslint": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "peer": true @@ -4517,9 +4457,9 @@ } }, "node_modules/@types/node": { - "version": "20.12.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", - "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { "undici-types": "~5.26.4" } @@ -4552,9 +4492,9 @@ "peer": true }, "node_modules/@types/validator": { - "version": "13.11.9", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", - "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==", + "version": "13.11.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", + "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==", "dev": true }, "node_modules/@types/yargs": { @@ -4573,16 +4513,16 @@ "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", - "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", + "version": "8.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.13.tgz", + "integrity": "sha512-FQeu2HGVZ6wDAn2m6MxpS+or7LyBEjjCXnFv79aCJtcJnxtgDQa0po88GHZv1tZwzIsgxQ3bnbz4vNgbPisMbA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/scope-manager": "8.0.0-alpha.13", + "@typescript-eslint/type-utils": "8.0.0-alpha.13", + "@typescript-eslint/utils": "8.0.0-alpha.13", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.13", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.3.1", @@ -4591,15 +4531,15 @@ "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4607,26 +4547,27 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", - "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "node_modules/@typescript-eslint/parser": { + "version": "8.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0-alpha.13.tgz", + "integrity": "sha512-CWFhVzrA6n7OeTHmvtxxUy+BSvUwHl8BcT6QsVi87MGcGQpLQZ1TeU0kYoIISkzFojoULF5q0de9hP/FbANi/g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/scope-manager": "8.0.0-alpha.13", + "@typescript-eslint/types": "8.0.0-alpha.13", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.13", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.13", + "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4634,83 +4575,54 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.13.tgz", + "integrity": "sha512-5XA+tfDumd6Y5GWVFMF2810HB8GIijMawdLgMptSeN3CeOfxQB1J3EBtmbgSWuValNSvV6jujIxKRVgnrZ/WpA==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/types": "8.0.0-alpha.13", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.13" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.13.tgz", + "integrity": "sha512-4Rkwf4YaQIqeF/l2/F9hqxiWlr9P5a0M7Ep0kK99WDYDAhABraIgvsScd2PAtKU1smJXdozbqKDywKCg6etH5Q==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4" + "@typescript-eslint/typescript-estree": "8.0.0-alpha.13", + "@typescript-eslint/utils": "8.0.0-alpha.13", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", - "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "version": "8.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0-alpha.13.tgz", + "integrity": "sha512-uJN8BSa8YHs9E/lFR9nkzLyaEijXGzMLgkh8DuQMlOP8epqJ9Jnzx+gOFUIyJV+C8uavpGp+YnCMvq4IDG9L+Q==", "dev": true, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4718,13 +4630,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", - "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "version": "8.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.13.tgz", + "integrity": "sha512-p5SZlikPhHg4510ttfqwjwMgBG7ehzRj5dLk8JR5x9bV0D8zWNotqkWNa0vftbYHb+mdGV6D9zNrJwDjWVd4ag==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/types": "8.0.0-alpha.13", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.13", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4733,7 +4645,7 @@ "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -4745,28 +4657,83 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0-alpha.13.tgz", + "integrity": "sha512-BMAbK/fC7RgvRjGQh8AixfQErFXIpCqL1DfFmMnp+oBZvYLON/4/iIj0yPPpY3E8gbljT7s4LHVkNSu7K/MQug==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "8.0.0-alpha.13", + "@typescript-eslint/types": "8.0.0-alpha.13", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.13", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", - "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "version": "8.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.13.tgz", + "integrity": "sha512-q8r/RVc5AtAnnRGqKBIoWMwChET2hqydVGqAXlvXXnB6JOE3prpMLvnpUp7JK1jma3VPt2JieCGhzX3YZSLY/Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/types": "8.0.0-alpha.13", "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/abbrev": { "version": "1.1.1", @@ -4903,15 +4870,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -4945,6 +4912,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-align/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -5412,6 +5388,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/boxen/node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -5437,12 +5425,12 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -5555,15 +5543,6 @@ "node": ">=0.2.0" } }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -5697,21 +5676,21 @@ } }, "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "peer": true, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001616", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", - "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", + "version": "1.0.30001620", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", + "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==", "funding": [ { "type": "opencollective", @@ -5903,9 +5882,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.4.tgz", - "integrity": "sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -5923,6 +5902,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/cli-table3/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -5957,6 +5945,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "peer": true }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -6165,6 +6162,24 @@ "url": "https://github.com/yeoman/configstore?sponsor=1" } }, + "node_modules/configstore/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -6235,9 +6250,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", - "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "peer": true, "dependencies": { "browserslist": "^4.23.0" @@ -6655,18 +6670,6 @@ "node": ">=6" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -6755,9 +6758,9 @@ "peer": true }, "node_modules/electron-to-chromium": { - "version": "1.4.758", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.758.tgz", - "integrity": "sha512-/o9x6TCdrYZBMdGeTifAP3wlF/gVT+TtWJe3BSmtNh92Mw81U9hrYwW9OAGUh+sEOX/yz5e34sksqRruZbjYrw==", + "version": "1.4.774", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.774.tgz", + "integrity": "sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==", "peer": true }, "node_modules/emoji-regex": { @@ -6832,6 +6835,27 @@ "node": ">= 0.6" } }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -6989,41 +7013,37 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.3.0.tgz", + "integrity": "sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.3.0", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -7037,74 +7057,52 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -7298,14 +7296,14 @@ "dev": true }, "node_modules/fast-json-stringify": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.13.0.tgz", - "integrity": "sha512-XjTDWKHP3GoMQUOfnjYUbqeHeEt+PvYgvBdG2fRSmYaORILbSr8xTJvZX+w1YSAP5pw2NwKrGRmQleYueZEoxw==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.15.1.tgz", + "integrity": "sha512-JopGtkvvguRqrS4gHXSSA2jf4pDgOZkeBAkLO1LbzOpiOMo7/kugoR+KiWifpLpluaVeYDkAuxCJOj4Gyc6L9A==", "dev": true, "dependencies": { "@fastify/merge-json-schemas": "^0.1.0", "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", + "ajv-formats": "^3.0.1", "fast-deep-equal": "^3.1.3", "fast-uri": "^2.1.0", "json-schema-ref-resolver": "^1.0.1", @@ -7313,21 +7311,38 @@ } }, "node_modules/fast-json-stringify/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/fast-json-stringify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -7386,9 +7401,9 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", - "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", + "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", "funding": [ { "type": "github", @@ -7465,15 +7480,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -7544,14 +7559,14 @@ } }, "node_modules/find-my-way": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.1.0.tgz", - "integrity": "sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", + "integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", - "safe-regex2": "^2.0.0" + "safe-regex2": "^3.1.0" }, "engines": { "node": ">=14" @@ -7573,74 +7588,16 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flat-cache/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" + "keyv": "^4.5.4" }, "engines": { - "node": "*" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { @@ -7656,9 +7613,9 @@ "peer": true }, "node_modules/flow-parser": { - "version": "0.235.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.235.1.tgz", - "integrity": "sha512-s04193L4JE+ntEcQXbD6jxRRlyj9QXcgEl2W6xSjH4l9x4b0eHoCHfbYHjqf9LdZFUiM5LhgpiqsvLj/AyOyYQ==", + "version": "0.236.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.236.0.tgz", + "integrity": "sha512-0OEk9Gr+Yj7wjDW2KgaNYUypKau71jAfFyeLQF5iVtxqc6uJHag/MT7pmaEApf4qM7u86DkBcd4ualddYMfbLw==", "peer": true, "engines": { "node": ">=0.4.0" @@ -7828,16 +7785,6 @@ "node": ">=0.6" } }, - "node_modules/fstream/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/fstream/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -7858,18 +7805,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fstream/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/fstream/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -7933,6 +7868,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/gauge/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -8034,22 +7978,22 @@ "dev": true }, "node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.3.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", + "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.6", "minimatch": "^9.0.1", "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "path-scurry": "^1.11.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8067,6 +8011,30 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", @@ -8092,15 +8060,12 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.2.0.tgz", + "integrity": "sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8175,9 +8140,9 @@ "dev": true }, "node_modules/hap-nodejs": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.12.0.tgz", - "integrity": "sha512-W+KPE4kCtudt/WTEHlXLiZmgIC5IgK8TXpUPmp27Qm7TOfKwWVGhKYXWRBEr3bkgSe3CGuGQN8vFeRB//mpfhQ==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.12.1.tgz", + "integrity": "sha512-iUUMaK6ucDKLMjT4m5Oz6CoLKkGg+omI6GR96weyL8fPGR1HYoCMtoJoUNW2NSIp4b2A6hx4zjNOEtLEaTA2MQ==", "dev": true, "dependencies": { "@homebridge/ciao": "^1.2.0", @@ -8350,17 +8315,17 @@ } }, "node_modules/homebridge": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-1.8.1.tgz", - "integrity": "sha512-tcyjT79m1SxBHf3bQyI9IEsXN0m1y0GPxPWvwhdJEycdliK0OyuYxzx4w1M5c7PHZknkZbQWCxFyaMTh7DHKUA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-1.8.2.tgz", + "integrity": "sha512-K0P9/qk3RdAKGLhGrmtF4skUjcygNlnBu0S/ssKIdp4p0kMzW2wjw2Q+z7TCxgZVy84/kaR09UD1n6uJAunTOQ==", "dev": true, "dependencies": { "chalk": "4.1.2", "commander": "12.0.0", "fs-extra": "11.2.0", - "hap-nodejs": "0.12.0", + "hap-nodejs": "0.12.1", "qrcode-terminal": "0.12.0", - "semver": "7.6.0", + "semver": "7.6.2", "source-map-support": "0.5.21" }, "bin": { @@ -8436,6 +8401,33 @@ "node": "^18 || ^20" } }, + "node_modules/homebridge-config-ui-x/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/homebridge-config-ui-x/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/hosted-git-info": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", @@ -8573,9 +8565,9 @@ "dev": true }, "node_modules/ignore-walk": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "dependencies": { "minimatch": "^9.0.0" @@ -8584,6 +8576,30 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/image-size": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", @@ -8893,11 +8909,12 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "peer": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/is-glob": { @@ -9374,18 +9391,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/jest-validate/node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -9523,23 +9528,6 @@ "@babel/preset-env": "^7.1.6" } }, - "node_modules/jscodeshift/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "peer": true - }, - "node_modules/jscodeshift/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9565,9 +9553,9 @@ "peer": true }, "node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -9748,9 +9736,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.60", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.60.tgz", - "integrity": "sha512-Ctgq2lXUpEJo5j1762NOzl2xo7z7pqmVWYai0p07LvAkQ32tbPv3wb+tcUeHEiXhKU5buM4H9MXsXo6OlM6C2g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.1.tgz", + "integrity": "sha512-Wze1LPwcnzvcKGcRHFGFECTaLzxOtujwpf924difr5zniyYv1C2PiW0419qDR7m8lKDxsImu5mwxFuXhXpjmvw==", "dev": true }, "node_modules/light-my-request": { @@ -9957,6 +9945,15 @@ "node": ">=8" } }, + "node_modules/logkitty/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/logkitty/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -10324,16 +10321,6 @@ "node": ">=18" } }, - "node_modules/metro-cache/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/metro-cache/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -10354,18 +10341,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/metro-cache/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/metro-cache/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -10580,16 +10555,6 @@ "node": ">=18" } }, - "node_modules/metro/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/metro/node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -10640,18 +10605,6 @@ "hermes-estree": "0.20.1" } }, - "node_modules/metro/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/metro/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -10767,18 +10720,14 @@ } }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, "node_modules/minimist": { @@ -10790,9 +10739,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -10823,9 +10772,9 @@ } }, "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -11058,9 +11007,9 @@ } }, "node_modules/node-abi": { - "version": "3.57.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.57.0.tgz", - "integrity": "sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==", + "version": "3.62.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz", + "integrity": "sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -11099,28 +11048,6 @@ "node": ">= 0.10.5" } }, - "node_modules/node-dir/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/node-dir/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -11188,13 +11115,12 @@ } }, "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/node-gyp/node_modules/cacache": { @@ -11226,15 +11152,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/node-gyp/node_modules/cacache/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -11325,18 +11242,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/node-gyp/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", @@ -11505,36 +11410,14 @@ "type": "opencollective", "url": "https://opencollective.com/nodemon" } - }, - "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=4" } }, "node_modules/nodemon/node_modules/supports-color": { @@ -11612,9 +11495,9 @@ } }, "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, "dependencies": { "npm-normalize-package-bin": "^3.0.0" @@ -11683,6 +11566,15 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/npm-check-updates/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/npm-check-updates/node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -11704,6 +11596,21 @@ "node": ">=14" } }, + "node_modules/npm-check-updates/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/npm-check-updates/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -12024,17 +11931,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -12385,25 +12292,25 @@ "peer": true }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -12440,9 +12347,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "peer": true }, "node_modules/picomatch": { @@ -12466,31 +12373,31 @@ } }, "node_modules/pino": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.19.0.tgz", - "integrity": "sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.21.0.tgz", + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.1.0", + "pino-abstract-transport": "^1.2.0", "pino-std-serializers": "^6.0.0", "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^3.7.0", - "thread-stream": "^2.0.0" + "thread-stream": "^2.6.0" }, "bin": { "pino": "bin.js" } }, "node_modules/pino-abstract-transport": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", - "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", "dev": true, "dependencies": { "readable-stream": "^4.0.0", @@ -12907,9 +12814,9 @@ "dev": true }, "node_modules/pubnub": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/pubnub/-/pubnub-8.0.1.tgz", - "integrity": "sha512-C3eaPjAFfvZm711d8LcwsEY9lo9iFzMW4xrADkJxgnlFoQYgByLcx+IzrM/mKB0lR1tXBCJoxI9nTUuPkXciSQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/pubnub/-/pubnub-8.1.0.tgz", + "integrity": "sha512-f8T+vh414WayMNokKueOZykn3tosxF1ruu3KAM/4uLy1GzLWsL5/k46lGaxqVljkMtplM/8nJlbzA+/k8kkQ3A==", "dependencies": { "agentkeepalive": "^3.5.2", "buffer": "^6.0.3", @@ -12924,9 +12831,9 @@ } }, "node_modules/pubnub/node_modules/agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.3.tgz", + "integrity": "sha512-yqXL+k5rr8+ZRpOAntkaaRgWgE5o8ESAj5DyRmVTCSoZxXmqemb9Dd7T4i5UzwuERdLAJUy6XzR9zFVuf0kzkw==", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -13129,9 +13036,9 @@ } }, "node_modules/react-devtools-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.1.0.tgz", - "integrity": "sha512-NRtLBqYVLrIY+lOa2oTpFiAhI7Hru0AUXI0tP9neCyaPPAzlZyeH0i+VZ0shIyRTJbpvyqbD/uCsewA2hpfZHw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.2.0.tgz", + "integrity": "sha512-vZK+/gvxxsieAoAyYaiRIVFxlajb7KXhgBDV7OsoMzaAE+IqGpoxusBjIgq5ibqA2IloKu0p9n7tE68z1xs18A==", "peer": true, "dependencies": { "shell-quote": "^1.6.1", @@ -13236,15 +13143,6 @@ "react-native": "*" } }, - "node_modules/react-native/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -13582,12 +13480,12 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/ret": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", - "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" } }, "node_modules/retry": { @@ -13615,9 +13513,9 @@ "dev": true }, "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", "dev": true, "dependencies": { "glob": "^10.3.7" @@ -13626,7 +13524,7 @@ "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -13682,12 +13580,12 @@ ] }, "node_modules/safe-regex2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", - "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", "dev": true, "dependencies": { - "ret": "~0.2.0" + "ret": "~0.4.0" } }, "node_modules/safe-stable-stringify": { @@ -13740,12 +13638,9 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -13774,17 +13669,6 @@ "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", "dev": true }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -14132,15 +14016,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "peer": true }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -14178,6 +14053,27 @@ "ws": "~8.11.0" } }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", @@ -14192,9 +14088,9 @@ } }, "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -14321,9 +14217,9 @@ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -14371,15 +14267,6 @@ "node": ">=6" } }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -14465,6 +14352,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -14757,16 +14653,6 @@ "node": ">=8" } }, - "node_modules/temp/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/temp/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -14787,18 +14673,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/temp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/temp/node_modules/rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -14857,9 +14731,9 @@ } }, "node_modules/thread-stream": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", - "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", "dev": true, "dependencies": { "real-require": "^0.2.0" @@ -14978,32 +14852,14 @@ } }, "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, "bin": { "nodetouch": "bin/nodetouch.js" } }, - "node_modules/touch/node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -15132,15 +14988,12 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/typedarray-to-buffer": { @@ -15165,6 +15018,29 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.0.0-alpha.13.tgz", + "integrity": "sha512-DMFKGlZTYPGrjejz1G8Cp0LuvxlelQqy1BY/T95yNVK13aVYTnDrAZ5ytW9a79OzserqBDoJnXs1AFaUqJoNEg==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.0.0-alpha.13", + "@typescript-eslint/parser": "8.0.0-alpha.13", + "@typescript-eslint/utils": "8.0.0-alpha.13" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/uid": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", @@ -15348,9 +15224,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", - "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "funding": [ { "type": "opencollective", @@ -15368,7 +15244,7 @@ "peer": true, "dependencies": { "escalade": "^3.1.2", - "picocolors": "^1.0.0" + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -15456,21 +15332,18 @@ } }, "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "dev": true, "engines": { "node": ">= 0.10" @@ -15636,6 +15509,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -15665,6 +15547,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -15706,6 +15597,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -15765,42 +15665,29 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "peer": true, "dependencies": { + "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.2" } }, "node_modules/write-file-atomic/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "peer": true }, "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" } }, "node_modules/xdg-basedir": { @@ -15858,7 +15745,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yaml": { "version": "2.4.2", @@ -15905,6 +15793,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "peer": true }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", diff --git a/package.json b/package.json index 57832e2..818d0be 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "url": "https://github.com/donavanbecker/homebridge-august/issues" }, "engines": { - "homebridge": "^1.8.1", + "homebridge": "^1.8.2", "node": "^18 || ^20 || ^22" }, "main": "dist/index.js", @@ -55,16 +55,19 @@ "rxjs": "^7.8.1" }, "devDependencies": { - "@types/node": "^20.12.10", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "eslint": "^8.57.0", - "homebridge": "^1.8.1", + "@eslint/js": "^9.3.0", + "@stylistic/eslint-plugin-js": "^2.1.0", + "@types/eslint__js": "^8.42.3", + "@types/node": "^20.12.12", + "eslint": "^9.3.0", + "globals": "^15.2.0", + "homebridge": "^1.8.2", "homebridge-config-ui-x": "4.56.2", "nodemon": "^3.1.0", "npm-check-updates": "^16.14.20", - "rimraf": "^5.0.5", + "rimraf": "^5.0.7", "ts-node": "^10.9.2", - "typescript": "^5.4.5" + "typescript": "^5.4.5", + "typescript-eslint": "^8.0.0-alpha.13" } } \ No newline at end of file diff --git a/src/homebridge-ui/server.ts b/src/homebridge-ui/server.ts index eccf961..57b7de0 100644 --- a/src/homebridge-ui/server.ts +++ b/src/homebridge-ui/server.ts @@ -35,7 +35,7 @@ class PluginUiServer extends HomebridgePluginUiServer { } // Return the array return devicesToReturn; - } catch (err) { + } catch { // Just return an empty accessory list in case of any errors return []; } From 4d8f349cf6170e78a761e2cb7672bbdbcacffad8 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sat, 18 May 2024 11:53:22 -0500 Subject: [PATCH 08/27] fix linting --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b8a7a1..7101204 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "license": "ISC", "dependencies": { "@homebridge/plugin-ui-utils": "^1.0.3", - "august-yale": "^1.0.0", + "august-yale": "^1.0.1-beta.0", "rxjs": "^7.8.1" }, "devDependencies": { @@ -5122,9 +5122,9 @@ } }, "node_modules/august-yale": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/august-yale/-/august-yale-1.0.0.tgz", - "integrity": "sha512-q8pftRLcM5D931azrgHITWXcLBsQez0jeyJQNyj5wGUwbwVJHmmxyrcQ1GZn+OL5XOUIPwTACNLOUMjRpZiYNw==", + "version": "1.0.1-beta.0", + "resolved": "https://registry.npmjs.org/august-yale/-/august-yale-1.0.1-beta.0.tgz", + "integrity": "sha512-Xbt+iLmDkySvh4m/ouVtg9NsAAMRVkg21IOrm0N5Sg+dLl+ARALy3V30gAEIMFiA3dEvtFxzEKz2rmKY1ac21Q==", "funding": [ { "type": "Paypal - donavanbecker", diff --git a/package.json b/package.json index 818d0be..a50b3a4 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ ], "dependencies": { "@homebridge/plugin-ui-utils": "^1.0.3", - "august-yale": "^1.0.0", + "august-yale": "^1.0.1-beta.0", "rxjs": "^7.8.1" }, "devDependencies": { From 87fc202307390dd0d2ecfac9a572a0c9d24ec47d Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 00:19:32 -0500 Subject: [PATCH 09/27] see if that makes it better --- eslint.config.js | 175 ++++++++-------- package-lock.json | 456 ++++++++++++++++++++++++++++++++++++------ package.json | 4 +- src/devices/device.ts | 48 ++--- src/devices/lock.ts | 238 +++++++++------------- src/index.ts | 5 +- src/platform.ts | 9 +- src/settings.ts | 25 ++- 8 files changed, 637 insertions(+), 323 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index da699f3..f18c994 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,85 +1,96 @@ -import globals from "globals"; -import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import stylistic from '@stylistic/eslint-plugin'; -export default [ - { languageOptions: { globals: globals.browser } }, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, - { - ignores: [".dist/*"] +export default tseslint.config({ + plugins: { + '@stylistic': stylistic, + '@typescript-eslint': tseslint.plugin, }, - { - rules: { - "quotes": [ - "warn", - "single" - ], - "indent": [ - "warn", - 2, - { - "SwitchCase": 1 - } - ], - "linebreak-style": [ - "warn", - "unix" - ], - "semi": [ - "warn", - "always" - ], - "comma-dangle": [ - "warn", - "always-multiline" - ], - "dot-notation": "off", - "eqeqeq": "warn", - "curly": [ - "warn", - "all" - ], - "brace-style": [ - "warn" - ], - "prefer-arrow-callback": [ - "warn" - ], - "max-len": [ - "warn", - 150 - ], - "no-console": [ - "warn" - ], // use the provided Homebridge log method instead - "no-non-null-assertion": [ - "off" - ], - "comma-spacing": [ - "error" - ], - "no-multi-spaces": [ - "warn", - { - "ignoreEOLComments": true - } - ], - "no-trailing-spaces": [ - "warn" - ], - "lines-between-class-members": [ - "warn", - "always", - { - "exceptAfterSingleLine": true - } - ], - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-explicit-any": "off" - } - } -]; \ No newline at end of file + languageOptions: { + parser: tseslint.parser, + parserOptions: { + project: true, + }, + }, + files: ['**/*.ts'], + ignores: ['.dist/*'], + extends: [ + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + ], + rules: { + '@typescript-eslint/array-type': 'error', + '@typescript-eslint/consistent-type-imports': 'error', + '@stylistic/type-annotation-spacing': 'error', + '@stylistic/quotes': [ + 'warn', + 'single', + ], + '@stylistic/indent': [ + 'warn', + 2, + { + 'SwitchCase': 1, + }, + ], + '@stylistic/linebreak-style': [ + 'warn', + 'unix', + ], + '@stylistic/semi': [ + 'warn', + 'always', + ], + '@stylistic/comma-dangle': [ + 'warn', + 'always-multiline', + ], + '@stylistic/dot-notation': 'off', + 'eqeqeq': 'warn', + 'curly': [ + 'warn', + 'all', + ], + '@stylistic/brace-style': [ + 'warn', + ], + 'prefer-arrow-callback': [ + 'warn', + ], + '@stylistic/max-len': [ + 'warn', + 150, + ], + 'no-console': [ + 'warn', + ], // use the provided Homebridge log method instead + 'no-non-null-assertion': [ + 'off', + ], + '@stylistic/comma-spacing': [ + 'error', + ], + '@stylistic/no-multi-spaces': [ + 'warn', + { + 'ignoreEOLComments': true, + }, + ], + '@stylistic/no-trailing-spaces': [ + 'warn', + ], + '@stylistic/lines-between-class-members': [ + 'warn', + 'always', + { + 'exceptAfterSingleLine': true, + }, + ], + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7101204..286ea5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ }, "devDependencies": { "@eslint/js": "^9.3.0", - "@stylistic/eslint-plugin-js": "^2.1.0", + "@stylistic/eslint-plugin": "^2.1.0", "@types/eslint__js": "^8.42.3", "@types/node": "^20.12.12", "eslint": "^9.3.0", @@ -37,7 +37,7 @@ "rimraf": "^5.0.7", "ts-node": "^10.9.2", "typescript": "^5.4.5", - "typescript-eslint": "^8.0.0-alpha.13" + "typescript-eslint": "^8.0.0-alpha.14" }, "engines": { "homebridge": "^1.8.2", @@ -4257,6 +4257,25 @@ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.1.0.tgz", + "integrity": "sha512-cBBowKP2u/+uE5CzgH5w8pE9VKqcM7BXdIDPIbGt2rmLJGnA6MJPr9vYGaqgMoJFs7R/FzsMQerMvvEP40g2uw==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "2.1.0", + "@stylistic/eslint-plugin-jsx": "2.1.0", + "@stylistic/eslint-plugin-plus": "2.1.0", + "@stylistic/eslint-plugin-ts": "2.1.0", + "@types/eslint": "^8.56.10" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, "node_modules/@stylistic/eslint-plugin-js": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.1.0.tgz", @@ -4275,6 +4294,332 @@ "eslint": ">=8.40.0" } }, + "node_modules/@stylistic/eslint-plugin-jsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-2.1.0.tgz", + "integrity": "sha512-mMD7S+IndZo2vxmwpHVTCwx2O1VdtE5tmpeNwgaEcXODzWV1WTWpnsc/PECQKIr/mkLPFWiSIqcuYNhQ/3l6AQ==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "^2.1.0", + "@types/eslint": "^8.56.10", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-jsx/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@stylistic/eslint-plugin-plus": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-2.1.0.tgz", + "integrity": "sha512-S5QAlgYXESJaSBFhBSBLZy9o36gXrXQwWSt6QkO+F0SrT9vpV5JF/VKoh+ojO7tHzd8Ckmyouq02TT9Sv2B0zQ==", + "dev": true, + "dependencies": { + "@types/eslint": "^8.56.10", + "@typescript-eslint/utils": "^7.8.0" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/scope-manager": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", + "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", + "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", + "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/utils": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", + "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/typescript-estree": "7.9.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", + "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.1.0.tgz", + "integrity": "sha512-2ioFibufHYBALx2TBrU4KXovCkN8qCqcb9yIHc0fyOfTaO5jw4d56WW7YRcF3Zgde6qFyXwAN6z/+w4pnmos1g==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "2.1.0", + "@types/eslint": "^8.56.10", + "@typescript-eslint/utils": "^7.8.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/scope-manager": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", + "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", + "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", + "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/utils": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", + "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/typescript-estree": "7.9.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", + "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", @@ -4473,12 +4818,6 @@ "@types/node": "*" } }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, "node_modules/@types/semver-utils": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz", @@ -4513,21 +4852,19 @@ "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.0.0-alpha.13", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.13.tgz", - "integrity": "sha512-FQeu2HGVZ6wDAn2m6MxpS+or7LyBEjjCXnFv79aCJtcJnxtgDQa0po88GHZv1tZwzIsgxQ3bnbz4vNgbPisMbA==", + "version": "8.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.0-alpha.14.tgz", + "integrity": "sha512-tfw3zfCg+ynwARhVsuMXKBrmWCtqQ2Cr/cjPAuyKhJGY8t069Lc0Y+F5H7oDLlmm+G54v8lAHkTkw4K/p+PpFQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.0.0-alpha.13", - "@typescript-eslint/type-utils": "8.0.0-alpha.13", - "@typescript-eslint/utils": "8.0.0-alpha.13", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.13", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "8.0.0-alpha.14", + "@typescript-eslint/type-utils": "8.0.0-alpha.14", + "@typescript-eslint/utils": "8.0.0-alpha.14", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.14", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { @@ -4548,15 +4885,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.0.0-alpha.13", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0-alpha.13.tgz", - "integrity": "sha512-CWFhVzrA6n7OeTHmvtxxUy+BSvUwHl8BcT6QsVi87MGcGQpLQZ1TeU0kYoIISkzFojoULF5q0de9hP/FbANi/g==", + "version": "8.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.0-alpha.14.tgz", + "integrity": "sha512-fD+DFo6aJJYyX4w712HzmE7QmUkoUvtlsFO/MqmYMeHIe0Pz5JZpJ1aYVbdxctazOb7NoW3p3RQgmpDcLT2pdQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.0.0-alpha.13", - "@typescript-eslint/types": "8.0.0-alpha.13", - "@typescript-eslint/typescript-estree": "8.0.0-alpha.13", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.13", + "@typescript-eslint/scope-manager": "8.0.0-alpha.14", + "@typescript-eslint/types": "8.0.0-alpha.14", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.14", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.14", "debug": "^4.3.4" }, "engines": { @@ -4576,13 +4913,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.0.0-alpha.13", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.13.tgz", - "integrity": "sha512-5XA+tfDumd6Y5GWVFMF2810HB8GIijMawdLgMptSeN3CeOfxQB1J3EBtmbgSWuValNSvV6jujIxKRVgnrZ/WpA==", + "version": "8.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.0-alpha.14.tgz", + "integrity": "sha512-6EmhoNZzfjd/sZGxichVguWUGCCgT12xyw3ppNZ9bM/m6qQCE66BqudGxzD58UPL4PpN++Y8KqVItax0gNq4BQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.0.0-alpha.13", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.13" + "@typescript-eslint/types": "8.0.0-alpha.14", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.14" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4593,13 +4930,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.0.0-alpha.13", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.13.tgz", - "integrity": "sha512-4Rkwf4YaQIqeF/l2/F9hqxiWlr9P5a0M7Ep0kK99WDYDAhABraIgvsScd2PAtKU1smJXdozbqKDywKCg6etH5Q==", + "version": "8.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.0-alpha.14.tgz", + "integrity": "sha512-F/rtAXWMrFPO49xK0XLw7hYtPVrjj+jRJhJRRcSBWRybcu7rvlEQ/Chk+QXvyp15QuwmMD5jAqNI+Fkbxgc0gQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.0.0-alpha.13", - "@typescript-eslint/utils": "8.0.0-alpha.13", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.14", + "@typescript-eslint/utils": "8.0.0-alpha.14", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -4617,9 +4954,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.0.0-alpha.13", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0-alpha.13.tgz", - "integrity": "sha512-uJN8BSa8YHs9E/lFR9nkzLyaEijXGzMLgkh8DuQMlOP8epqJ9Jnzx+gOFUIyJV+C8uavpGp+YnCMvq4IDG9L+Q==", + "version": "8.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.0-alpha.14.tgz", + "integrity": "sha512-2u0FBQ0usELnbTqZhHN6X8ngJlpCchFTroWFG5nvo0TOoiPYV+5AbGiRb0IWMsLfxSzeDJeasUzByVvOHn1t1A==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4630,13 +4967,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.0.0-alpha.13", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.13.tgz", - "integrity": "sha512-p5SZlikPhHg4510ttfqwjwMgBG7ehzRj5dLk8JR5x9bV0D8zWNotqkWNa0vftbYHb+mdGV6D9zNrJwDjWVd4ag==", + "version": "8.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.0-alpha.14.tgz", + "integrity": "sha512-FM0qHSJ4Sqg49wBCcljq//J9V8SJbq3XFmjaWCF8Tk2hIuYkYZp7joXHs0Ld3FnM+9rj84OQTqSq8zczArNMNg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.0.0-alpha.13", - "@typescript-eslint/visitor-keys": "8.0.0-alpha.13", + "@typescript-eslint/types": "8.0.0-alpha.14", + "@typescript-eslint/visitor-keys": "8.0.0-alpha.14", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4682,18 +5019,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.0.0-alpha.13", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0-alpha.13.tgz", - "integrity": "sha512-BMAbK/fC7RgvRjGQh8AixfQErFXIpCqL1DfFmMnp+oBZvYLON/4/iIj0yPPpY3E8gbljT7s4LHVkNSu7K/MQug==", + "version": "8.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.0-alpha.14.tgz", + "integrity": "sha512-hiH1uqRVyOPd+ZWqInwRob2s3Cq+p7LTIolvj+x7QJ6CpBCPrEMEPVuBiFibw2/rW+zJGTa3Ggjdpqy8bLb60g==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "8.0.0-alpha.13", - "@typescript-eslint/types": "8.0.0-alpha.13", - "@typescript-eslint/typescript-estree": "8.0.0-alpha.13", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "8.0.0-alpha.14", + "@typescript-eslint/types": "8.0.0-alpha.14", + "@typescript-eslint/typescript-estree": "8.0.0-alpha.14" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4707,12 +5041,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.0.0-alpha.13", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.13.tgz", - "integrity": "sha512-q8r/RVc5AtAnnRGqKBIoWMwChET2hqydVGqAXlvXXnB6JOE3prpMLvnpUp7JK1jma3VPt2JieCGhzX3YZSLY/Q==", + "version": "8.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.0-alpha.14.tgz", + "integrity": "sha512-LwUhX8+ttlzJWhqLAkiH7E1tX2WJS0zvK0D83w4L9DRl4TRSQBuGtPIM1+GvG90VMix8sjlGaybBzWfNji1cUw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.0.0-alpha.13", + "@typescript-eslint/types": "8.0.0-alpha.14", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -15019,14 +15353,14 @@ } }, "node_modules/typescript-eslint": { - "version": "8.0.0-alpha.13", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.0.0-alpha.13.tgz", - "integrity": "sha512-DMFKGlZTYPGrjejz1G8Cp0LuvxlelQqy1BY/T95yNVK13aVYTnDrAZ5ytW9a79OzserqBDoJnXs1AFaUqJoNEg==", + "version": "8.0.0-alpha.14", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.0.0-alpha.14.tgz", + "integrity": "sha512-Un2y0pbBCdvmk2YsY/S/oftSA/4tEZtRMfewHlXJ43LBR07V2HSXPC/t6RJ29KZ+N5ORqe61QUQLupquVBPZhQ==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.0.0-alpha.13", - "@typescript-eslint/parser": "8.0.0-alpha.13", - "@typescript-eslint/utils": "8.0.0-alpha.13" + "@typescript-eslint/eslint-plugin": "8.0.0-alpha.14", + "@typescript-eslint/parser": "8.0.0-alpha.14", + "@typescript-eslint/utils": "8.0.0-alpha.14" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index a50b3a4..eb98224 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ }, "devDependencies": { "@eslint/js": "^9.3.0", - "@stylistic/eslint-plugin-js": "^2.1.0", + "@stylistic/eslint-plugin": "^2.1.0", "@types/eslint__js": "^8.42.3", "@types/node": "^20.12.12", "eslint": "^9.3.0", @@ -68,6 +68,6 @@ "rimraf": "^5.0.7", "ts-node": "^10.9.2", "typescript": "^5.4.5", - "typescript-eslint": "^8.0.0-alpha.13" + "typescript-eslint": "^8.0.0-alpha.14" } } \ No newline at end of file diff --git a/src/devices/device.ts b/src/devices/device.ts index daca2fb..b7b6ac3 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -2,10 +2,9 @@ * * device.ts: homebridge-august. */ -import { API, HAP, Logging, PlatformAccessory } from 'homebridge'; - -import { AugustPlatform } from '../platform.js'; -import { AugustPlatformConfig, device, devicesConfig } from '../settings.js'; +import type { AugustPlatform } from '../platform.js'; +import type { device, devicesConfig, AugustPlatformConfig } from '../settings.js'; +import type { API, HAP, Logging, PlatformAccessory } from 'homebridge'; export abstract class deviceBase { public readonly api: API; @@ -16,7 +15,6 @@ export abstract class deviceBase { // Config protected deviceLogging!: string; protected deviceRefreshRate!: number; - protected hide_lock!: boolean; constructor( protected readonly platform: AugustPlatform, @@ -32,7 +30,6 @@ export abstract class deviceBase { this.getDeviceRefreshRate(device); this.deviceConfigOptions(device); this.deviceContext(accessory, device); - this.lock(device); // Set accessory information accessory @@ -76,19 +73,18 @@ export abstract class deviceBase { } async deviceConfigOptions(device: device & devicesConfig): Promise { - let config = {}; - if (device.lock) { - config = device.lock || ''; - } + const deviceConfig = {}; if (device.logging !== undefined) { - config['logging'] = device.logging; + deviceConfig['logging'] = device.logging; } if (device.refreshRate !== undefined) { - config['refreshRate'] = device.refreshRate; + deviceConfig['refreshRate'] = device.refreshRate; } - if (device.lock?.hide_lock !== undefined) { - config['hide_lock'] = this.hide_lock; + let lockConfig = {}; + if (device.lock) { + lockConfig = device.lock; } + const config = Object.assign({}, deviceConfig, lockConfig); if (Object.entries(config).length !== 0) { this.infoLog(`Lock: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`); } @@ -104,14 +100,6 @@ export abstract class deviceBase { } } - async lock(device: device & devicesConfig): Promise { - if (device.lock && device.lock.hide_lock) { - this.hide_lock = device.lock.hide_lock; - } else { - this.hide_lock = false; - } - } - async statusCode(device: device & devicesConfig, error: { message: string; }): Promise { if (!device.hide_device) { const statusCodeString = String(error); // Convert statusCode to a string @@ -123,7 +111,7 @@ export abstract class deviceBase { this.errorLog(`Lock: ${this.accessory.displayName} Bad Request, statusCode: ${statusCodeString}`); } else if (statusCodeString.includes('429')) { this.errorLog(`Lock: ${this.accessory.displayName} Too Many Requests, exceeded the number of ` - + `requests allowed for a given time window, statusCode: ${statusCodeString}`); + + `requests allowed for a given time window, statusCode: ${statusCodeString}`); } else { this.debugLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCodeString}, Submit Bugs Here: ' + 'https://tinyurl.com/AugustYaleBug`); @@ -136,15 +124,23 @@ export abstract class deviceBase { /** * Logging for Device */ + infoLog(...log: any[]): void { + if (this.enablingDeviceLogging()) { + this.log.info(String(...log)); + } + } + successLog(...log: any[]): void { if (this.enablingDeviceLogging()) { - this.platform.log.success(String(...log)); + this.log.success(String(...log)); } } - infoLog(...log: any[]): void { + debugSuccessLog(...log: any[]): void { if (this.enablingDeviceLogging()) { - this.log.info(String(...log)); + if (this.deviceLogging?.includes('debug')) { + this.log.success('[DEBUG]', String(...log)); + } } } diff --git a/src/devices/lock.ts b/src/devices/lock.ts index c235556..7bc5094 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -2,14 +2,15 @@ * * lock.ts: homebridge-august. */ -import { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'; import { interval, Subject } from 'rxjs'; import { debounceTime, skipWhile, take, tap } from 'rxjs/operators'; import { deviceBase } from './device.js'; -import { AugustPlatform } from '../platform.js'; -import { device, devicesConfig } from '../settings.js'; import August from 'august-yale'; +import type { AugustPlatform } from '../platform.js'; +import type { device, lockDetails, devicesConfig } from '../settings.js'; +import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'; + /** * Platform Accessory * An instance of this class is created for each accessory your platform registers @@ -17,7 +18,7 @@ import August from 'august-yale'; */ export class LockMechanism extends deviceBase { // Service - private Lock?: { + private LockMechanism?: { Service?: Service; LockTargetState?: CharacteristicValue; LockCurrentState?: CharacteristicValue; @@ -57,59 +58,53 @@ export class LockMechanism extends deviceBase { device: device & devicesConfig, ) { super(platform, accessory, device); - this.lock(device); - this.cacheState(); - // default placeholders // this is subject we use to track when we need to POST changes to the August API this.doLockUpdate = new Subject(); this.lockUpdateInProgress = false; - // Initial Device Parse - this.refreshStatus(); - - - // Lock Mechanism Service - if (this.hide_lock) { - this.warnLog(`Lock: ${accessory.displayName} Removing Lock Mechanism Service`); - this.Lock!.Service = this.accessory.getService(this.hap.Service.LockMechanism); - accessory.removeService(this.Lock!.Service!); - } else if (!this.Lock!.Service) { - this.debugLog(`Lock: ${accessory.displayName} Add Lock Mechanism Service`); - (this.Lock!.Service = - this.accessory.getService(this.hap.Service.LockMechanism) - || this.accessory.addService(this.hap.Service.LockMechanism)), accessory.displayName; + // Initialize Motion Sensor property + if (!device.lock?.hide_lock) { + this.LockMechanism = { + Service: accessory.getService(this.hap.Service.LockMechanism) || accessory.addService(this.hap.Service.LockMechanism) as Service, + LockTargetState: this.hap.Characteristic.LockTargetState.SECURED, + LockCurrentState: this.hap.Characteristic.LockCurrentState.SECURED, + }; // Service Name - this.Lock!.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName); - //Required Characteristics" see https://developers.homebridge.io/#/service/LockMechanism - + this.LockMechanism!.Service!.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName); // Create handlers for required characteristics - this.Lock!.Service.getCharacteristic(this.hap.Characteristic.LockTargetState).onSet(this.setLockTargetState.bind(this)); + this.LockMechanism!.Service!.getCharacteristic(this.hap.Characteristic.LockTargetState).onSet(this.setLockTargetState.bind(this)); } else { - this.warnLog(`Lock: ${accessory.displayName} Lock Mechanism Service Not Added`); + this.warnLog(`Lock: ${accessory.displayName} Removing Lock Mechanism Service`); + this.LockMechanism!.Service = accessory.getService(this.hap.Service.LockMechanism) as Service; + accessory.removeService(this.LockMechanism!.Service); } - // Contact Sensor Service - if (device.lock?.hide_contactsensor) { - this.warnLog(`Lock: ${accessory.displayName} Removing Contact Sensor Service`); - this.ContactSensor!.Service = this.accessory.getService(this.hap.Service.ContactSensor); - accessory.removeService(this.ContactSensor!.Service!); - } else if (!this.ContactSensor!.Service) { - this.debugLog(`Lock: ${accessory.displayName} Add Contact Sensor Service`); - (this.ContactSensor!.Service = - this.accessory.getService(this.hap.Service.ContactSensor) - || this.accessory.addService(this.hap.Service.ContactSensor)), `${accessory.displayName} Contact Sensor`; + + // Contact Sensor + if (!device.lock?.hide_contactsensor) { + this.ContactSensor = { + Service: accessory.getService(this.hap.Service.ContactSensor) || accessory.addService(this.hap.Service.ContactSensor) as Service, + ContactSensorState: accessory.context.ContactSensorState || this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED, + }; // Service Name - this.ContactSensor!.Service.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Contact Sensor`); - //Required Characteristics" see https://developers.homebridge.io/#/service/ContactSensor + this.ContactSensor!.Service!.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Contact Sensor`); } else { - this.warnLog(`Lock: ${accessory.displayName} Contact Sensor Service Not Added`); + this.warnLog(`Lock: ${accessory.displayName} Removing Contact Sensor Service`); + this.ContactSensor!.Service = accessory.getService(this.hap.Service.ContactSensor) as Service; + accessory.removeService(this.ContactSensor!.Service); } - // Battery Service - (this.Battery.Service = - this.accessory.getService(this.hap.Service.Battery) - || this.accessory.addService(this.hap.Service.Battery)), `${accessory.displayName} Battery`; + this.Battery = { + Service: accessory.getService(this.hap.Service.Battery) || accessory.addService(this.hap.Service.Battery) as Service, + BatteryLevel: this.accessory.context.BatteryLevel || 100, + StatusLowBattery: this.cacheStatusLowBattery(), + }; + // Service Name + this.Battery!.Service!.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Battery`); + + // Initial Device Parse + this.refreshStatus(); // Retrieve initial values and updateHomekit this.updateHomeKitCharacteristics(); @@ -135,7 +130,7 @@ export class LockMechanism extends deviceBase { ) .subscribe(async () => { try { - if (!this.hide_lock) { + if (!device.lock?.hide_lock) { await this.pushChanges(); } } catch (e: any) { @@ -155,24 +150,28 @@ export class LockMechanism extends deviceBase { /** * Parse the device status from the August api */ - async parseStatus(): Promise { + async parseStatus(lockDetails: lockDetails): Promise { this.debugLog(`Lock: ${this.accessory.displayName} parseStatus`); + //const lockStatus = lockDetails.LockStatus; + //this.platform.augustConfig.addSimpleProps(lockStatus); + + const retryCount = 1; // Lock Mechanism - if (!this.hide_lock) { - if (this.locked) { - this.Lock!.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED; - } else if (this.unlocked) { - this.Lock!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED; - } else if (this.retryCount > 1) { - this.Lock!.LockCurrentState = this.hap.Characteristic.LockCurrentState.JAMMED; + if (!this.device.lock?.hide_lock) { + if (lockDetails.LockStatus.state.locked) { + this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED; + } else if (lockDetails.LockStatus.state.unlocked) { + this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED; + } else if (retryCount > 1) { + this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.JAMMED; } else { - this.Lock!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNKNOWN; - this.refreshStatus(); + this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNKNOWN; + //await this.refreshStatus(); } } // Battery - this.Battery.BatteryLevel = Number(this.battery); + this.Battery.BatteryLevel = Number((lockDetails.battery * 100).toFixed()); this.Battery!.Service!.getCharacteristic(this.hap.Characteristic.BatteryLevel).updateValue(this.Battery.BatteryLevel); if (this.Battery.BatteryLevel < 15) { this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW; @@ -181,32 +180,36 @@ export class LockMechanism extends deviceBase { } this.debugLog(`Lock: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},` + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`); + // Contact Sensor if (!this.device.lock?.hide_contactsensor) { - if (this.open) { + if (lockDetails.LockStatus.state.open) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED; this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); - } else if (this.closed) { + } else if (lockDetails.LockStatus.state.closed) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED; this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); - } else if (this.doorState === 'open') { + } else if (lockDetails.LockStatus.doorState.includes('open')) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED; this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); - } else if (this.doorState === 'closed') { + } else if (lockDetails.LockStatus.doorState.includes('closed')) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED; this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); } else { - this.errorLog(`Lock: ${this.accessory.displayName} doorState: ${this.doorState}, closed: ${this.closed}, open: ${this.open}`); + this.errorLog(`Lock: ${this.accessory.displayName} doorState: ${this.doorState}, closed: ${lockDetails.LockStatus.state.closed},` + + ` open: ${lockDetails.LockStatus.state.open}`); } } - // Update Firmware - if (this.currentFirmwareVersion !== this.accessory.context.currentFirmwareVersion) { + + // Firmware Version + if (lockDetails.currentFirmwareVersion !== this.accessory.context.currentFirmwareVersion) { this.warnLog(`Lock: ${this.accessory.displayName} Firmware Version changed to Current Firmware Version: ${this.currentFirmwareVersion}`); this.accessory .getService(this.hap.Service.AccessoryInformation)! .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.currentFirmwareVersion) .getCharacteristic(this.hap.Characteristic.FirmwareRevision) .updateValue(this.currentFirmwareVersion); + this.accessory.context.currentFirmwareVersion = this.currentFirmwareVersion; } } @@ -218,41 +221,10 @@ export class LockMechanism extends deviceBase { //await this.platform.augustCredentials(); // Update Lock Details const lockDetails: any = await this.platform.augustConfig.details(this.device.lockId); - if (lockDetails) { - this.debugLog(`Lock: ${this.accessory.displayName} lockDetails (refreshStatus): ${JSON.stringify(lockDetails)}`); - - // Get Lock Status (use August-api helper function to resolve state) - const lockStatus = lockDetails.LockStatus; - this.platform.augustConfig.addSimpleProps(lockStatus); - if (lockStatus.state && !this.hide_lock) { - this.unlocked = lockStatus.state.unlocked; - this.state = lockStatus.state; - this.locked = lockStatus.state.locked; - } - - // TODO: Handle lock jammed - this.retryCount = 1; - - // Get Battery level - this.battery = (Number(lockDetails.battery) * 100).toFixed(); - this.debugLog(`Lock: ${this.accessory.displayName} battery (lockDetails): ${this.battery}`); - - // Get Firmware - this.currentFirmwareVersion = lockDetails.currentFirmwareVersion; - this.debugLog(`Lock: ${this.accessory.displayName} currentFirmwareVersion (lockDetails): ${this.currentFirmwareVersion}`); - - // Get door state if available - if (!this.device.lock?.hide_contactsensor) { - this.doorState = lockDetails.LockStatus.doorState; - this.open = lockStatus.state.open; - this.closed = lockStatus.state.closed; - } - } else { - this.debugErrorLog(`Lock: ${this.accessory.displayName} lockDetails (refreshStatus): ${JSON.stringify(lockDetails)}`); - } + this.debugSuccessLog(`Lock: ${this.accessory.displayName} (refreshStatus) lockDetails: ${JSON.stringify(lockDetails)}`); // Update HomeKit - this.parseStatus(); - this.updateHomeKitCharacteristics(); + await this.parseStatus(lockDetails); + await this.updateHomeKitCharacteristics(); } catch (e: any) { this.statusCode(this.device, e); } @@ -264,17 +236,17 @@ export class LockMechanism extends deviceBase { async pushChanges(): Promise { try { await this.platform.augustCredentials(); - if (this.Lock!.LockTargetState === this.hap.Characteristic.LockTargetState.UNSECURED) { - this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: Unlock (${this.Lock!.LockTargetState})`); + if (this.LockMechanism!.LockTargetState === this.hap.Characteristic.LockTargetState.UNSECURED) { + this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: Unlock (${this.LockMechanism!.LockTargetState})`); const lockStatus = await this.platform.augustConfig.unlock(this.device.lockId); this.debugWarnLog(`Lock: ${this.accessory.displayName} (pushChanges-unlock) lockStatus: ${JSON.stringify(lockStatus)}`); - } else if (this.Lock!.LockTargetState === this.hap.Characteristic.LockTargetState.SECURED) { - this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: Lock (${this.Lock!.LockTargetState})`); + } else if (this.LockMechanism!.LockTargetState === this.hap.Characteristic.LockTargetState.SECURED) { + this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: Lock (${this.LockMechanism!.LockTargetState})`); const lockStatus = await this.platform.augustConfig.lock(this.device.lockId); this.debugWarnLog(`Lock: ${this.accessory.displayName} (pushChanges-lock) lockStatus: ${JSON.stringify(lockStatus)}`); } else { this.errorLog(`Lock: ${this.accessory.displayName} lockStatus (pushChanges) failed,` - + ` this.LockTargetState: ${this.Lock!.LockTargetState}`); + + ` this.LockTargetState: ${this.LockMechanism!.LockTargetState}`); } } catch (e: any) { this.errorLog(`pushChanges: ${e}`); @@ -287,20 +259,20 @@ export class LockMechanism extends deviceBase { */ async updateHomeKitCharacteristics(): Promise { // Lock Mechanism - if (!this.hide_lock) { - if (this.Lock!.LockTargetState === undefined) { - this.debugLog(`Lock: ${this.accessory.displayName} LockTargetState: ${this.Lock!.LockTargetState}`); + if (!this.device.lock?.hide_lock) { + if (this.LockMechanism!.LockTargetState === undefined) { + this.debugLog(`Lock: ${this.accessory.displayName} LockTargetState: ${this.LockMechanism!.LockTargetState}`); } else { - this.accessory.context.LockCurrentState = this.Lock!.LockTargetState; - this.Lock!.Service!.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.Lock!.LockTargetState); - this.debugLog(`Lock: ${this.accessory.displayName} updateCharacteristic LockTargetState: ${this.Lock!.LockTargetState}`); + this.accessory.context.LockCurrentState = this.LockMechanism!.LockTargetState; + this.LockMechanism!.Service!.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.LockMechanism!.LockTargetState); + this.debugLog(`Lock: ${this.accessory.displayName} updateCharacteristic LockTargetState: ${this.LockMechanism!.LockTargetState}`); } - if (this.Lock!.LockCurrentState === undefined) { - this.debugLog(`Lock: ${this.accessory.displayName} LockCurrentState: ${this.Lock!.LockCurrentState}`); + if (this.LockMechanism!.LockCurrentState === undefined) { + this.debugLog(`Lock: ${this.accessory.displayName} LockCurrentState: ${this.LockMechanism!.LockCurrentState}`); } else { - this.accessory.context.LockCurrentState = this.Lock!.LockCurrentState; - this.Lock!.Service!.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.Lock!.LockCurrentState); - this.debugLog(`Lock: ${this.accessory.displayName} updateCharacteristic LockCurrentState: ${this.Lock!.LockCurrentState}`); + this.accessory.context.LockCurrentState = this.LockMechanism!.LockCurrentState; + this.LockMechanism!.Service!.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.LockMechanism!.LockCurrentState); + this.debugLog(`Lock: ${this.accessory.displayName} updateCharacteristic LockCurrentState: ${this.LockMechanism!.LockCurrentState}`); } } // Battery @@ -333,13 +305,13 @@ export class LockMechanism extends deviceBase { async setLockTargetState(value: CharacteristicValue): Promise { this.debugLog(`Lock: ${this.accessory.displayName} Set LockTargetState: ${value}`); - this.Lock!.LockTargetState = value; - this.accessory.context.LockTargetState = this.Lock!.LockTargetState; + this.LockMechanism!.LockTargetState = value; + this.accessory.context.LockTargetState = this.LockMechanism!.LockTargetState; this.doLockUpdate.next(); - if (this.Lock!.LockCurrentState === this.hap.Characteristic.LockCurrentState.UNSECURED) { + if (this.LockMechanism!.LockCurrentState === this.hap.Characteristic.LockCurrentState.UNSECURED) { this.infoLog(`Lock: ${this.accessory.displayName} was Unlocked`); } - if (this.Lock!.LockCurrentState === this.hap.Characteristic.LockCurrentState.SECURED) { + if (this.LockMechanism!.LockCurrentState === this.hap.Characteristic.LockCurrentState.SECURED) { this.infoLog(`Lock: ${this.accessory.displayName} was Locked`); } } @@ -349,17 +321,17 @@ export class LockMechanism extends deviceBase { await August.subscribe(this.config.credentials!, this.device.lockId, (AugustEvent: any, timestamp: any) => { this.debugLog(`Lock: ${this.accessory.displayName} AugustEvent: ${JSON.stringify(AugustEvent)}, ${JSON.stringify(timestamp)}`); //LockCurrentState - if (!this.hide_lock) { + if (!this.device.lock?.hide_lock) { if (AugustEvent.state.unlocked) { - this.Lock!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED; - this.Lock!.LockTargetState = this.hap.Characteristic.LockCurrentState.UNSECURED; - if (this.Lock!.LockCurrentState !== this.accessory.context.LockCurrentState) { + this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED; + this.LockMechanism!.LockTargetState = this.hap.Characteristic.LockCurrentState.UNSECURED; + if (this.LockMechanism!.LockCurrentState !== this.accessory.context.LockCurrentState) { this.infoLog(`Lock: ${this.accessory.displayName} was Unlocked`); } } else if (AugustEvent.state.locked) { - this.Lock!.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED; - this.Lock!.LockTargetState = this.hap.Characteristic.LockCurrentState.SECURED; - if (this.Lock!.LockCurrentState !== this.accessory.context.LockCurrentState) { + this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED; + this.LockMechanism!.LockTargetState = this.hap.Characteristic.LockCurrentState.SECURED; + if (this.LockMechanism!.LockCurrentState !== this.accessory.context.LockCurrentState) { this.infoLog(`Lock: ${this.accessory.displayName} was Locked`); } } else { @@ -389,26 +361,6 @@ export class LockMechanism extends deviceBase { }); } - - async cacheState() { - if (!this.hide_lock) { - this.Lock = { - LockCurrentState: this.accessory.context.LockCurrentState || this.hap.Characteristic.LockCurrentState.SECURED, - LockTargetState: this.accessory.context.LockTargetState || this.hap.Characteristic.LockTargetState.SECURED, - }; - } - // Contact Sensor - if (!this.device.lock?.hide_contactsensor) { - this.ContactSensor = { - ContactSensorState: this.accessory.context.ContactSensorState || this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED, - }; - } - this.Battery = { - BatteryLevel: this.accessory.context.BatteryLevel || 100, - StatusLowBattery: this.cacheStatusLowBattery(), - }; - } - cacheStatusLowBattery() { let StatusLowBattery: number = 0; if (this.Battery && this.Battery.BatteryLevel && Number(this.Battery.BatteryLevel) < 15) { diff --git a/src/index.ts b/src/index.ts index fb8e502..a9b1ab3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,9 +2,10 @@ * * index.ts: homebridge-august. */ -import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js'; -import { API } from 'homebridge'; import { AugustPlatform } from './platform.js'; +import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js'; + +import type { API } from 'homebridge'; // Register our platform with homebridge. export default (api: API): void => { diff --git a/src/platform.ts b/src/platform.ts index 585203f..3bc3612 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -4,11 +4,12 @@ * platform.ts: homebridge-august. */ import August from 'august-yale'; -/*import August from '/Users/Shared/GitHub/${}/august-yale/dist/index.js';*/ import { readFileSync, writeFileSync } from 'fs'; import { LockMechanism } from './devices/lock.js'; -import { API, DynamicPlatformPlugin, HAP, Logging, PlatformAccessory } from 'homebridge'; -import { AugustPlatformConfig, PLUGIN_NAME, PLATFORM_NAME, device, devicesConfig } from './settings.js'; +import { PLUGIN_NAME, PLATFORM_NAME } from './settings.js'; + +import type { AugustPlatformConfig, device, devicesConfig } from './settings.js'; +import type { API, DynamicPlatformPlugin, Logging, PlatformAccessory } from 'homebridge'; /** * HomebridgePlatform @@ -19,7 +20,6 @@ export class AugustPlatform implements DynamicPlatformPlugin { public accessories: PlatformAccessory[]; public readonly api: API; public readonly log: Logging; - protected readonly hap: HAP; public config!: AugustPlatformConfig; platformConfig!: AugustPlatformConfig['options']; @@ -38,7 +38,6 @@ export class AugustPlatform implements DynamicPlatformPlugin { ) { this.accessories = []; this.api = api; - this.hap = this.api.hap; this.log = log; if (!config) { diff --git a/src/settings.ts b/src/settings.ts index e0dd800..2777206 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -2,7 +2,7 @@ * * setting.ts: homebridge-august. */ -import { PlatformConfig } from 'homebridge'; +import type { PlatformConfig } from 'homebridge'; /** * This is the name of the platform that users will use to register the plugin in the Homebridge config.json */ @@ -131,4 +131,25 @@ export interface devicesConfig extends device { export type lock = { hide_lock?: boolean; hide_contactsensor?: boolean; -}; \ No newline at end of file +}; + +export type lockDetails = { + lockName: string; + battery: number; + LockStatus: lockStatus; + currentFirmwareVersion: string; +} + +export type lockStatus = { + lockID: string; + status: string; + doorState: string; + state: state; +} + +export type state = { + unlocked: boolean; + locked: boolean; + open: boolean; + closed: boolean; +} \ No newline at end of file From 115fba69e9a96363b1899d626175286b74aa502f Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 17:48:26 -0500 Subject: [PATCH 10/27] fix linting --- eslint.config.js | 2 +- package-lock.json | 75 ++++++++++---- package.json | 2 +- src/devices/device.ts | 10 +- src/devices/lock.ts | 236 +++++++++++++++++++++++------------------- 5 files changed, 193 insertions(+), 132 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index f18c994..6890c8c 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,6 +1,6 @@ import pluginJs from '@eslint/js'; import tseslint from 'typescript-eslint'; -import stylistic from '@stylistic/eslint-plugin'; +import stylistic from '@stylistic/eslint-plugin' export default tseslint.config({ diff --git a/package-lock.json b/package-lock.json index 286ea5b..eac8ec7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@types/eslint__js": "^8.42.3", "@types/node": "^20.12.12", "eslint": "^9.3.0", - "globals": "^15.2.0", + "globals": "^15.3.0", "homebridge": "^1.8.2", "homebridge-config-ui-x": "4.56.2", "nodemon": "^3.1.0", @@ -4312,18 +4312,6 @@ "eslint": ">=8.40.0" } }, - "node_modules/@stylistic/eslint-plugin-jsx/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@stylistic/eslint-plugin-plus": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-2.1.0.tgz", @@ -5335,6 +5323,17 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/appdirsjs": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", @@ -8394,9 +8393,9 @@ } }, "node_modules/globals": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.2.0.tgz", - "integrity": "sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.3.0.tgz", + "integrity": "sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==", "dev": true, "engines": { "node": ">=18" @@ -9696,6 +9695,18 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", @@ -11002,6 +11013,17 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -12687,11 +12709,12 @@ "peer": true }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -13552,6 +13575,18 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/readline": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", diff --git a/package.json b/package.json index eb98224..acd82f7 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@types/eslint__js": "^8.42.3", "@types/node": "^20.12.12", "eslint": "^9.3.0", - "globals": "^15.2.0", + "globals": "^15.3.0", "homebridge": "^1.8.2", "homebridge-config-ui-x": "4.56.2", "nodemon": "^3.1.0", diff --git a/src/devices/device.ts b/src/devices/device.ts index b7b6ac3..e79f60c 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -60,11 +60,15 @@ export abstract class deviceBase { async getDeviceRefreshRate(device: device & devicesConfig): Promise { if (device.refreshRate) { - if (device.refreshRate < 1800) { - device.refreshRate = 1800; + if (device.refreshRate === 0) { + this.deviceRefreshRate = 0; + } else if (device.refreshRate < 1800) { + this.deviceRefreshRate = 1800; this.warnLog('Refresh Rate cannot be set to lower the 5 mins, as Lock detail (battery level, etc) are unlikely to change within that period'); + } else { + this.deviceRefreshRate = device.refreshRate; } - this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate; + this.accessory.context.deviceRefreshRate = this.deviceRefreshRate; this.debugLog(`Lock: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`); } else if (this.config.refreshRate) { this.deviceRefreshRate = this.accessory.context.refreshRate = this.config.refreshRate; diff --git a/src/devices/lock.ts b/src/devices/lock.ts index 7bc5094..c9b32b4 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -3,7 +3,7 @@ * lock.ts: homebridge-august. */ import { interval, Subject } from 'rxjs'; -import { debounceTime, skipWhile, take, tap } from 'rxjs/operators'; +import { debounceTime, skipWhile, tap } from 'rxjs/operators'; import { deviceBase } from './device.js'; import August from 'august-yale'; @@ -19,20 +19,24 @@ import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge export class LockMechanism extends deviceBase { // Service private LockMechanism?: { + Name: CharacteristicValue; Service?: Service; LockTargetState?: CharacteristicValue; LockCurrentState?: CharacteristicValue; }; - private ContactSensor?: { + private Battery: { + Name: CharacteristicValue; Service?: Service; - ContactSensorState?: CharacteristicValue; + BatteryLevel: CharacteristicValue; + StatusLowBattery: CharacteristicValue; + ChargingState: CharacteristicValue; }; - private Battery!: { + private ContactSensor?: { + Name: CharacteristicValue; Service?: Service; - BatteryLevel: CharacteristicValue; - StatusLowBattery: CharacteristicValue; + ContactSensorState?: CharacteristicValue; }; // Lock Status @@ -63,48 +67,78 @@ export class LockMechanism extends deviceBase { this.doLockUpdate = new Subject(); this.lockUpdateInProgress = false; - // Initialize Motion Sensor property - if (!device.lock?.hide_lock) { - this.LockMechanism = { - Service: accessory.getService(this.hap.Service.LockMechanism) || accessory.addService(this.hap.Service.LockMechanism) as Service, - LockTargetState: this.hap.Characteristic.LockTargetState.SECURED, - LockCurrentState: this.hap.Characteristic.LockCurrentState.SECURED, - }; - // Service Name - this.LockMechanism!.Service!.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName); - // Create handlers for required characteristics - this.LockMechanism!.Service!.getCharacteristic(this.hap.Characteristic.LockTargetState).onSet(this.setLockTargetState.bind(this)); - } else { + // Initialize Lock Mechanism Service + if (device.lock?.hide_lock) { this.warnLog(`Lock: ${accessory.displayName} Removing Lock Mechanism Service`); this.LockMechanism!.Service = accessory.getService(this.hap.Service.LockMechanism) as Service; accessory.removeService(this.LockMechanism!.Service); + } else { + this.LockMechanism = { + Name: accessory.context.LockMechanism.Name ?? accessory.displayName, + Service: accessory.getService(this.hap.Service.LockMechanism) ?? accessory.addService(this.hap.Service.LockMechanism) as Service, + LockTargetState: accessory.context.LockTargetState ?? this.hap.Characteristic.LockTargetState.SECURED, + LockCurrentState: accessory.context.LockCurrentState ?? this.hap.Characteristic.LockCurrentState.SECURED, + }; + // Initialize Lock Mechanism Characteristics + this.LockMechanism!.Service! + .setCharacteristic(this.hap.Characteristic.Name, accessory.displayName) + .getCharacteristic(this.hap.Characteristic.LockTargetState) + .onGet(() => { + return this.LockMechanism!.LockTargetState!; + }) + .onSet(this.setLockTargetState.bind(this)); + accessory.context.LockMechanism.Name = this.LockMechanism.Name; } - - // Contact Sensor - if (!device.lock?.hide_contactsensor) { - this.ContactSensor = { - Service: accessory.getService(this.hap.Service.ContactSensor) || accessory.addService(this.hap.Service.ContactSensor) as Service, - ContactSensorState: accessory.context.ContactSensorState || this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED, - }; - // Service Name - this.ContactSensor!.Service!.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Contact Sensor`); - } else { + // Initialize Contact Sensor Service + if (device.lock?.hide_contactsensor) { this.warnLog(`Lock: ${accessory.displayName} Removing Contact Sensor Service`); this.ContactSensor!.Service = accessory.getService(this.hap.Service.ContactSensor) as Service; accessory.removeService(this.ContactSensor!.Service); + } else { + this.ContactSensor = { + Name: accessory.context.ContactSensor.Name ?? `${accessory.displayName} Contact Sensor`, + Service: accessory.getService(this.hap.Service.ContactSensor) ?? accessory.addService(this.hap.Service.ContactSensor) as Service, + ContactSensorState: accessory.context.ContactSensorState ?? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED, + }; + // Initialize Conact Sensor Characteristics + this.ContactSensor!.Service! + .setCharacteristic(this.hap.Characteristic.Name, this.ContactSensor.Name) + .getCharacteristic(this.hap.Characteristic.ContactSensorState) + .onGet(() => { + return this.ContactSensor!.ContactSensorState!; + }); + accessory.context.ContactSensor.Name = this.ContactSensor.Name; } + // Initialize Battery Service this.Battery = { - Service: accessory.getService(this.hap.Service.Battery) || accessory.addService(this.hap.Service.Battery) as Service, - BatteryLevel: this.accessory.context.BatteryLevel || 100, - StatusLowBattery: this.cacheStatusLowBattery(), + Name: accessory.context.Battery.Name ?? `${accessory.displayName} Battery`, + Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery) as Service, + BatteryLevel: accessory.context.BatteryLevel ?? 100, + StatusLowBattery: accessory.context.StatusLowBattery ?? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL, + ChargingState: accessory.context.ChargingState ?? this.hap.Characteristic.ChargingState.NOT_CHARGING, }; - // Service Name - this.Battery!.Service!.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Battery`); + // Initialize Battery Characteristics + this.Battery!.Service! + .setCharacteristic(this.hap.Characteristic.Name, this.Battery.Name) + .setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE) + .getCharacteristic(this.hap.Characteristic.BatteryLevel) + .onGet(() => { + return this.Battery.BatteryLevel!; + }); + + this.Battery.Service! + .getCharacteristic(this.hap.Characteristic.StatusLowBattery) + .onGet(() => { + return this.Battery.StatusLowBattery!; + }); + accessory.context.Battery.Name = this.Battery.Name; // Initial Device Parse - this.refreshStatus(); + if (this.deviceRefreshRate !== 0) { + this.refreshStatus(); + } // Retrieve initial values and updateHomekit this.updateHomeKitCharacteristics(); @@ -113,38 +147,35 @@ export class LockMechanism extends deviceBase { this.subscribeAugust(); // Start an update interval - interval(this.deviceRefreshRate * 1000) - .pipe(skipWhile(() => this.lockUpdateInProgress)) - .subscribe(async () => { - await this.refreshStatus(); - }); + + if (this.deviceRefreshRate !== 0) { + interval(this.deviceRefreshRate * 1000) + .pipe(skipWhile(() => this.lockUpdateInProgress)) + .subscribe(async () => { + await this.refreshStatus(); + }); + } // Watch for Lock change events // We put in a debounce of 100ms so we don't make duplicate calls - this.doLockUpdate - .pipe( - tap(() => { - this.lockUpdateInProgress = true; - }), - debounceTime(this.platform.config.options!.pushRate! * 1000), - ) - .subscribe(async () => { - try { - if (!device.lock?.hide_lock) { + if (!device.lock?.hide_lock) { + this.doLockUpdate + .pipe( + tap(() => { + this.lockUpdateInProgress = true; + }), + debounceTime(this.platform.config.options!.pushRate! * 1000), + ) + .subscribe(async () => { + try { await this.pushChanges(); - } - } catch (e: any) { - this.errorLog(`doLockUpdate pushChanges: ${e}`); - } - // Refresh the status from the API - interval(this.deviceRefreshRate * 500) - .pipe(skipWhile(() => this.lockUpdateInProgress)) - .pipe(take(1)) - .subscribe(async () => { + } catch (e: any) { + this.errorLog(`doLockUpdate pushChanges: ${e}`); await this.refreshStatus(); - }); - this.lockUpdateInProgress = false; - }); + } + this.lockUpdateInProgress = false; + }); + } } /** @@ -153,64 +184,66 @@ export class LockMechanism extends deviceBase { async parseStatus(lockDetails: lockDetails): Promise { this.debugLog(`Lock: ${this.accessory.displayName} parseStatus`); - //const lockStatus = lockDetails.LockStatus; - //this.platform.augustConfig.addSimpleProps(lockStatus); + // Battery + this.Battery.BatteryLevel = Number((lockDetails.battery * 100).toFixed()); + this.Battery!.Service!.getCharacteristic(this.hap.Characteristic.BatteryLevel).updateValue(this.Battery.BatteryLevel); + if (this.Battery.BatteryLevel < 15) { + this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW; + } else { + this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL; + } + this.debugLog(`Lock: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},` + + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`); + // Firmware Version + if (lockDetails.currentFirmwareVersion !== this.accessory.context.currentFirmwareVersion) { + this.warnLog(`Lock: ${this.accessory.displayName} Firmware Version changed to Current Firmware Version: ${this.currentFirmwareVersion}`); + this.accessory + .getService(this.hap.Service.AccessoryInformation)! + .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.currentFirmwareVersion) + .getCharacteristic(this.hap.Characteristic.FirmwareRevision) + .updateValue(this.currentFirmwareVersion); + this.accessory.context.currentFirmwareVersion = this.currentFirmwareVersion; + } + + // Lock Status const retryCount = 1; + const LockStatus = lockDetails.LockStatus; + this.platform.augustConfig.addSimpleProps(LockStatus); + // Lock Mechanism if (!this.device.lock?.hide_lock) { - if (lockDetails.LockStatus.state.locked) { + if (LockStatus.state.locked) { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED; - } else if (lockDetails.LockStatus.state.unlocked) { + } else if (LockStatus.state.unlocked) { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED; } else if (retryCount > 1) { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.JAMMED; } else { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNKNOWN; - //await this.refreshStatus(); + await this.refreshStatus(); } } - // Battery - this.Battery.BatteryLevel = Number((lockDetails.battery * 100).toFixed()); - this.Battery!.Service!.getCharacteristic(this.hap.Characteristic.BatteryLevel).updateValue(this.Battery.BatteryLevel); - if (this.Battery.BatteryLevel < 15) { - this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW; - } else { - this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL; - } - this.debugLog(`Lock: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},` - + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`); // Contact Sensor if (!this.device.lock?.hide_contactsensor) { - if (lockDetails.LockStatus.state.open) { + if (LockStatus.state.open) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED; this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); - } else if (lockDetails.LockStatus.state.closed) { + } else if (LockStatus.state.closed) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED; this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); - } else if (lockDetails.LockStatus.doorState.includes('open')) { + } else if (LockStatus.doorState.includes('open')) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED; this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); - } else if (lockDetails.LockStatus.doorState.includes('closed')) { + } else if (LockStatus.doorState.includes('closed')) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED; this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); } else { - this.errorLog(`Lock: ${this.accessory.displayName} doorState: ${this.doorState}, closed: ${lockDetails.LockStatus.state.closed},` - + ` open: ${lockDetails.LockStatus.state.open}`); + this.errorLog(`Lock: ${this.accessory.displayName} doorState: ${this.doorState}, closed: ${LockStatus.state.closed},` + + ` open: ${LockStatus.state.open}`); } } - - // Firmware Version - if (lockDetails.currentFirmwareVersion !== this.accessory.context.currentFirmwareVersion) { - this.warnLog(`Lock: ${this.accessory.displayName} Firmware Version changed to Current Firmware Version: ${this.currentFirmwareVersion}`); - this.accessory - .getService(this.hap.Service.AccessoryInformation)! - .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.currentFirmwareVersion) - .getCharacteristic(this.hap.Characteristic.FirmwareRevision) - .updateValue(this.currentFirmwareVersion); - this.accessory.context.currentFirmwareVersion = this.currentFirmwareVersion; - } } /** @@ -218,7 +251,6 @@ export class LockMechanism extends deviceBase { */ async refreshStatus(): Promise { try { - //await this.platform.augustCredentials(); // Update Lock Details const lockDetails: any = await this.platform.augustConfig.details(this.device.lockId); this.debugSuccessLog(`Lock: ${this.accessory.displayName} (refreshStatus) lockDetails: ${JSON.stringify(lockDetails)}`); @@ -318,7 +350,7 @@ export class LockMechanism extends deviceBase { async subscribeAugust(): Promise { await this.platform.augustCredentials(); - await August.subscribe(this.config.credentials!, this.device.lockId, (AugustEvent: any, timestamp: any) => { + await August.subscribe(this.config.credentials!, this.device.lockId, async (AugustEvent: any, timestamp: any) => { this.debugLog(`Lock: ${this.accessory.displayName} AugustEvent: ${JSON.stringify(AugustEvent)}, ${JSON.stringify(timestamp)}`); //LockCurrentState if (!this.device.lock?.hide_lock) { @@ -335,7 +367,7 @@ export class LockMechanism extends deviceBase { this.infoLog(`Lock: ${this.accessory.displayName} was Locked`); } } else { - this.refreshStatus(); + await this.refreshStatus(); } } // Contact Sensor @@ -353,21 +385,11 @@ export class LockMechanism extends deviceBase { this.infoLog(`Lock: ${this.accessory.displayName} was Closed`); } } else { - this.refreshStatus(); + await this.refreshStatus(); } } // Update HomeKit this.updateHomeKitCharacteristics(); }); } - - cacheStatusLowBattery() { - let StatusLowBattery: number = 0; - if (this.Battery && this.Battery.BatteryLevel && Number(this.Battery.BatteryLevel) < 15) { - StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW; - } else { - StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL; - } - return StatusLowBattery; - } } From 1ceac5e35904f103d1c812b7f9299f75b88b9d46 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 17:56:26 -0500 Subject: [PATCH 11/27] resolve Name --- src/devices/device.ts | 1 + src/devices/lock.ts | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index e79f60c..aaf07c0 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -62,6 +62,7 @@ export abstract class deviceBase { if (device.refreshRate) { if (device.refreshRate === 0) { this.deviceRefreshRate = 0; + this.warnLog('Refresh Rate set to 0, this will disable the refresh rate for this device'); } else if (device.refreshRate < 1800) { this.deviceRefreshRate = 1800; this.warnLog('Refresh Rate cannot be set to lower the 5 mins, as Lock detail (battery level, etc) are unlikely to change within that period'); diff --git a/src/devices/lock.ts b/src/devices/lock.ts index c9b32b4..5267f0f 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -19,7 +19,7 @@ import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge export class LockMechanism extends deviceBase { // Service private LockMechanism?: { - Name: CharacteristicValue; + Name?: CharacteristicValue; Service?: Service; LockTargetState?: CharacteristicValue; LockCurrentState?: CharacteristicValue; @@ -27,14 +27,14 @@ export class LockMechanism extends deviceBase { private Battery: { Name: CharacteristicValue; - Service?: Service; + Service: Service; BatteryLevel: CharacteristicValue; StatusLowBattery: CharacteristicValue; ChargingState: CharacteristicValue; }; private ContactSensor?: { - Name: CharacteristicValue; + Name?: CharacteristicValue; Service?: Service; ContactSensorState?: CharacteristicValue; }; @@ -102,8 +102,8 @@ export class LockMechanism extends deviceBase { ContactSensorState: accessory.context.ContactSensorState ?? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED, }; // Initialize Conact Sensor Characteristics - this.ContactSensor!.Service! - .setCharacteristic(this.hap.Characteristic.Name, this.ContactSensor.Name) + this.ContactSensor.Service! + .setCharacteristic(this.hap.Characteristic.Name, this.ContactSensor.Name!) .getCharacteristic(this.hap.Characteristic.ContactSensorState) .onGet(() => { return this.ContactSensor!.ContactSensorState!; From f4b71e607b7e6fc47cd6ad7b77dd557c70c49c03 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 17:58:10 -0500 Subject: [PATCH 12/27] Update lock.ts --- src/devices/lock.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/devices/lock.ts b/src/devices/lock.ts index 5267f0f..88303fe 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -74,14 +74,14 @@ export class LockMechanism extends deviceBase { accessory.removeService(this.LockMechanism!.Service); } else { this.LockMechanism = { - Name: accessory.context.LockMechanism.Name ?? accessory.displayName, + Name: accessory.context.LockMechanism.Name ?? device.LockName ?? accessory.displayName, Service: accessory.getService(this.hap.Service.LockMechanism) ?? accessory.addService(this.hap.Service.LockMechanism) as Service, LockTargetState: accessory.context.LockTargetState ?? this.hap.Characteristic.LockTargetState.SECURED, LockCurrentState: accessory.context.LockCurrentState ?? this.hap.Characteristic.LockCurrentState.SECURED, }; // Initialize Lock Mechanism Characteristics - this.LockMechanism!.Service! - .setCharacteristic(this.hap.Characteristic.Name, accessory.displayName) + this.LockMechanism.Service! + .setCharacteristic(this.hap.Characteristic.Name, this.LockMechanism.Name!) .getCharacteristic(this.hap.Characteristic.LockTargetState) .onGet(() => { return this.LockMechanism!.LockTargetState!; From 1637401412551e6c620ad2a2bc4443013f15005c Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 18:02:31 -0500 Subject: [PATCH 13/27] Update lock.ts --- src/devices/lock.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/devices/lock.ts b/src/devices/lock.ts index 88303fe..099cc25 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -19,10 +19,10 @@ import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge export class LockMechanism extends deviceBase { // Service private LockMechanism?: { - Name?: CharacteristicValue; - Service?: Service; - LockTargetState?: CharacteristicValue; - LockCurrentState?: CharacteristicValue; + Name: CharacteristicValue; + Service: Service; + LockTargetState: CharacteristicValue; + LockCurrentState: CharacteristicValue; }; private Battery: { @@ -74,17 +74,17 @@ export class LockMechanism extends deviceBase { accessory.removeService(this.LockMechanism!.Service); } else { this.LockMechanism = { - Name: accessory.context.LockMechanism.Name ?? device.LockName ?? accessory.displayName, + Name: device.LockName ?? accessory.context.LockMechanism.Name ?? accessory.displayName, Service: accessory.getService(this.hap.Service.LockMechanism) ?? accessory.addService(this.hap.Service.LockMechanism) as Service, LockTargetState: accessory.context.LockTargetState ?? this.hap.Characteristic.LockTargetState.SECURED, LockCurrentState: accessory.context.LockCurrentState ?? this.hap.Characteristic.LockCurrentState.SECURED, }; // Initialize Lock Mechanism Characteristics - this.LockMechanism.Service! - .setCharacteristic(this.hap.Characteristic.Name, this.LockMechanism.Name!) + this.LockMechanism.Service + .setCharacteristic(this.hap.Characteristic.Name, this.LockMechanism.Name) .getCharacteristic(this.hap.Characteristic.LockTargetState) .onGet(() => { - return this.LockMechanism!.LockTargetState!; + return this.LockMechanism!.LockTargetState; }) .onSet(this.setLockTargetState.bind(this)); accessory.context.LockMechanism.Name = this.LockMechanism.Name; From 398c4a8e41e4181a3fc62c91886891cec369a4ce Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 18:06:41 -0500 Subject: [PATCH 14/27] Update lock.ts --- src/devices/lock.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/devices/lock.ts b/src/devices/lock.ts index 099cc25..d991e20 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -19,14 +19,14 @@ import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge export class LockMechanism extends deviceBase { // Service private LockMechanism?: { - Name: CharacteristicValue; + Name: string; Service: Service; LockTargetState: CharacteristicValue; LockCurrentState: CharacteristicValue; }; private Battery: { - Name: CharacteristicValue; + Name: string; Service: Service; BatteryLevel: CharacteristicValue; StatusLowBattery: CharacteristicValue; @@ -34,9 +34,9 @@ export class LockMechanism extends deviceBase { }; private ContactSensor?: { - Name?: CharacteristicValue; - Service?: Service; - ContactSensorState?: CharacteristicValue; + Name: string; + Service: Service; + ContactSensorState: CharacteristicValue; }; // Lock Status @@ -102,11 +102,11 @@ export class LockMechanism extends deviceBase { ContactSensorState: accessory.context.ContactSensorState ?? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED, }; // Initialize Conact Sensor Characteristics - this.ContactSensor.Service! - .setCharacteristic(this.hap.Characteristic.Name, this.ContactSensor.Name!) + this.ContactSensor.Service + .setCharacteristic(this.hap.Characteristic.Name, this.ContactSensor.Name) .getCharacteristic(this.hap.Characteristic.ContactSensorState) .onGet(() => { - return this.ContactSensor!.ContactSensorState!; + return this.ContactSensor!.ContactSensorState; }); accessory.context.ContactSensor.Name = this.ContactSensor.Name; } From f80ead4fe16dd434847bdfd6528f7e2ca18e3320 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 18:11:04 -0500 Subject: [PATCH 15/27] Update lock.ts --- src/devices/lock.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/devices/lock.ts b/src/devices/lock.ts index d991e20..bcb3658 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -74,7 +74,7 @@ export class LockMechanism extends deviceBase { accessory.removeService(this.LockMechanism!.Service); } else { this.LockMechanism = { - Name: device.LockName ?? accessory.context.LockMechanism.Name ?? accessory.displayName, + Name: accessory.context.LockMechanismName ?? device.LockName ?? accessory.displayName, Service: accessory.getService(this.hap.Service.LockMechanism) ?? accessory.addService(this.hap.Service.LockMechanism) as Service, LockTargetState: accessory.context.LockTargetState ?? this.hap.Characteristic.LockTargetState.SECURED, LockCurrentState: accessory.context.LockCurrentState ?? this.hap.Characteristic.LockCurrentState.SECURED, @@ -87,7 +87,7 @@ export class LockMechanism extends deviceBase { return this.LockMechanism!.LockTargetState; }) .onSet(this.setLockTargetState.bind(this)); - accessory.context.LockMechanism.Name = this.LockMechanism.Name; + accessory.context.LockMechanismName = this.LockMechanism.Name; } // Initialize Contact Sensor Service @@ -97,7 +97,7 @@ export class LockMechanism extends deviceBase { accessory.removeService(this.ContactSensor!.Service); } else { this.ContactSensor = { - Name: accessory.context.ContactSensor.Name ?? `${accessory.displayName} Contact Sensor`, + Name: accessory.context.ContactSensorName ?? `${accessory.displayName} Contact Sensor`, Service: accessory.getService(this.hap.Service.ContactSensor) ?? accessory.addService(this.hap.Service.ContactSensor) as Service, ContactSensorState: accessory.context.ContactSensorState ?? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED, }; @@ -108,12 +108,12 @@ export class LockMechanism extends deviceBase { .onGet(() => { return this.ContactSensor!.ContactSensorState; }); - accessory.context.ContactSensor.Name = this.ContactSensor.Name; + accessory.context.ContactSensorName = this.ContactSensor.Name; } // Initialize Battery Service this.Battery = { - Name: accessory.context.Battery.Name ?? `${accessory.displayName} Battery`, + Name: accessory.context.BatteryName ?? `${accessory.displayName} Battery`, Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery) as Service, BatteryLevel: accessory.context.BatteryLevel ?? 100, StatusLowBattery: accessory.context.StatusLowBattery ?? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL, @@ -133,7 +133,7 @@ export class LockMechanism extends deviceBase { .onGet(() => { return this.Battery.StatusLowBattery!; }); - accessory.context.Battery.Name = this.Battery.Name; + accessory.context.BatteryName = this.Battery.Name; // Initial Device Parse if (this.deviceRefreshRate !== 0) { From 151a09e650caa6ed48aab84b39d89a6bd0db5e8d Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 18:29:53 -0500 Subject: [PATCH 16/27] Update lock.ts --- src/devices/lock.ts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/devices/lock.ts b/src/devices/lock.ts index bcb3658..f6ac545 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -19,14 +19,14 @@ import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge export class LockMechanism extends deviceBase { // Service private LockMechanism?: { - Name: string; + Name: CharacteristicValue; Service: Service; LockTargetState: CharacteristicValue; LockCurrentState: CharacteristicValue; }; private Battery: { - Name: string; + Name: CharacteristicValue; Service: Service; BatteryLevel: CharacteristicValue; StatusLowBattery: CharacteristicValue; @@ -34,7 +34,7 @@ export class LockMechanism extends deviceBase { }; private ContactSensor?: { - Name: string; + Name: CharacteristicValue; Service: Service; ContactSensorState: CharacteristicValue; }; @@ -73,6 +73,9 @@ export class LockMechanism extends deviceBase { this.LockMechanism!.Service = accessory.getService(this.hap.Service.LockMechanism) as Service; accessory.removeService(this.LockMechanism!.Service); } else { + if (!accessory.context.LockMechanism) { + accessory.context.LockMechanism = {}; + } this.LockMechanism = { Name: accessory.context.LockMechanismName ?? device.LockName ?? accessory.displayName, Service: accessory.getService(this.hap.Service.LockMechanism) ?? accessory.addService(this.hap.Service.LockMechanism) as Service, @@ -89,15 +92,17 @@ export class LockMechanism extends deviceBase { .onSet(this.setLockTargetState.bind(this)); accessory.context.LockMechanismName = this.LockMechanism.Name; } - // Initialize Contact Sensor Service if (device.lock?.hide_contactsensor) { this.warnLog(`Lock: ${accessory.displayName} Removing Contact Sensor Service`); this.ContactSensor!.Service = accessory.getService(this.hap.Service.ContactSensor) as Service; accessory.removeService(this.ContactSensor!.Service); } else { + if (!accessory.context.ContactSensor) { + accessory.context.ContactSensor = {}; + } this.ContactSensor = { - Name: accessory.context.ContactSensorName ?? `${accessory.displayName} Contact Sensor`, + Name: accessory.context.ContactSensor.Name ?? `${accessory.displayName} Contact Sensor`, Service: accessory.getService(this.hap.Service.ContactSensor) ?? accessory.addService(this.hap.Service.ContactSensor) as Service, ContactSensorState: accessory.context.ContactSensorState ?? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED, }; @@ -108,12 +113,15 @@ export class LockMechanism extends deviceBase { .onGet(() => { return this.ContactSensor!.ContactSensorState; }); - accessory.context.ContactSensorName = this.ContactSensor.Name; + accessory.context.ContactSensor.Name = this.ContactSensor.Name; } + if (!accessory.context.Battery) { + accessory.context.Battery = {}; + } // Initialize Battery Service this.Battery = { - Name: accessory.context.BatteryName ?? `${accessory.displayName} Battery`, + Name: accessory.context.Battery.Name ?? `${accessory.displayName} Battery`, Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery) as Service, BatteryLevel: accessory.context.BatteryLevel ?? 100, StatusLowBattery: accessory.context.StatusLowBattery ?? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL, @@ -133,7 +141,7 @@ export class LockMechanism extends deviceBase { .onGet(() => { return this.Battery.StatusLowBattery!; }); - accessory.context.BatteryName = this.Battery.Name; + accessory.context.Battery.Name = this.Battery.Name; // Initial Device Parse if (this.deviceRefreshRate !== 0) { From 0493738c8ee90a44f2bda050b3003186106f2a29 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 20:45:26 -0500 Subject: [PATCH 17/27] Update lock.ts --- src/devices/lock.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/devices/lock.ts b/src/devices/lock.ts index f6ac545..8905f70 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -155,7 +155,6 @@ export class LockMechanism extends deviceBase { this.subscribeAugust(); // Start an update interval - if (this.deviceRefreshRate !== 0) { interval(this.deviceRefreshRate * 1000) .pipe(skipWhile(() => this.lockUpdateInProgress)) @@ -179,7 +178,9 @@ export class LockMechanism extends deviceBase { await this.pushChanges(); } catch (e: any) { this.errorLog(`doLockUpdate pushChanges: ${e}`); - await this.refreshStatus(); + if (this.deviceRefreshRate !== 0) { + await this.refreshStatus(); + } } this.lockUpdateInProgress = false; }); @@ -229,7 +230,9 @@ export class LockMechanism extends deviceBase { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.JAMMED; } else { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNKNOWN; - await this.refreshStatus(); + if (this.deviceRefreshRate !== 0) { + await this.refreshStatus(); + } } } @@ -375,7 +378,9 @@ export class LockMechanism extends deviceBase { this.infoLog(`Lock: ${this.accessory.displayName} was Locked`); } } else { - await this.refreshStatus(); + if (this.deviceRefreshRate !== 0) { + await this.refreshStatus(); + } } } // Contact Sensor @@ -393,7 +398,9 @@ export class LockMechanism extends deviceBase { this.infoLog(`Lock: ${this.accessory.displayName} was Closed`); } } else { - await this.refreshStatus(); + if (this.deviceRefreshRate !== 0) { + await this.refreshStatus(); + } } } // Update HomeKit From 244cf58f6c640cd6611bc4112290acad679dcc74 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sun, 19 May 2024 21:13:43 -0500 Subject: [PATCH 18/27] update dependencies --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index eac8ec7..d12f593 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "license": "ISC", "dependencies": { "@homebridge/plugin-ui-utils": "^1.0.3", - "august-yale": "^1.0.1-beta.0", + "august-yale": "^1.0.1-beta.1", "rxjs": "^7.8.1" }, "devDependencies": { @@ -5455,9 +5455,9 @@ } }, "node_modules/august-yale": { - "version": "1.0.1-beta.0", - "resolved": "https://registry.npmjs.org/august-yale/-/august-yale-1.0.1-beta.0.tgz", - "integrity": "sha512-Xbt+iLmDkySvh4m/ouVtg9NsAAMRVkg21IOrm0N5Sg+dLl+ARALy3V30gAEIMFiA3dEvtFxzEKz2rmKY1ac21Q==", + "version": "1.0.1-beta.1", + "resolved": "https://registry.npmjs.org/august-yale/-/august-yale-1.0.1-beta.1.tgz", + "integrity": "sha512-p0UwPLIHCV1QsMMS708hGVm1OESIYVembOUioJ3zfO4a+iYhALNN/4RpV3FifHTKEdNHGOciG7IvEfLGCWbdFA==", "funding": [ { "type": "Paypal - donavanbecker", diff --git a/package.json b/package.json index acd82f7..1474bd4 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ ], "dependencies": { "@homebridge/plugin-ui-utils": "^1.0.3", - "august-yale": "^1.0.1-beta.0", + "august-yale": "^1.0.1-beta.1", "rxjs": "^7.8.1" }, "devDependencies": { From 4fd8f060a0cd959c5243726ac3d0bfb396ca9ac4 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Thu, 23 May 2024 09:18:23 -0500 Subject: [PATCH 19/27] see if this is better. --- src/devices/device.ts | 1 - src/devices/lock.ts | 39 ++++++++++++++++++++------------------- src/platform.ts | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index aaf07c0..72f0d70 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -121,7 +121,6 @@ export abstract class deviceBase { this.debugLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCodeString}, Submit Bugs Here: ' + 'https://tinyurl.com/AugustYaleBug`); this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error: ${JSON.stringify(error)}`); - this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error Message: ${JSON.stringify(error.message)}`); } } } diff --git a/src/devices/lock.ts b/src/devices/lock.ts index 8905f70..cd7b3d4 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -73,15 +73,14 @@ export class LockMechanism extends deviceBase { this.LockMechanism!.Service = accessory.getService(this.hap.Service.LockMechanism) as Service; accessory.removeService(this.LockMechanism!.Service); } else { - if (!accessory.context.LockMechanism) { - accessory.context.LockMechanism = {}; - } + accessory.context.LockMechanism = accessory.context.LockMechanism ?? {}; this.LockMechanism = { - Name: accessory.context.LockMechanismName ?? device.LockName ?? accessory.displayName, + Name: accessory.context.LockMechanism.Name ?? device.LockName ?? accessory.displayName, Service: accessory.getService(this.hap.Service.LockMechanism) ?? accessory.addService(this.hap.Service.LockMechanism) as Service, LockTargetState: accessory.context.LockTargetState ?? this.hap.Characteristic.LockTargetState.SECURED, LockCurrentState: accessory.context.LockCurrentState ?? this.hap.Characteristic.LockCurrentState.SECURED, }; + accessory.context.LockMechanism = this.LockMechanism as object; // Initialize Lock Mechanism Characteristics this.LockMechanism.Service .setCharacteristic(this.hap.Characteristic.Name, this.LockMechanism.Name) @@ -90,7 +89,6 @@ export class LockMechanism extends deviceBase { return this.LockMechanism!.LockTargetState; }) .onSet(this.setLockTargetState.bind(this)); - accessory.context.LockMechanismName = this.LockMechanism.Name; } // Initialize Contact Sensor Service if (device.lock?.hide_contactsensor) { @@ -98,14 +96,13 @@ export class LockMechanism extends deviceBase { this.ContactSensor!.Service = accessory.getService(this.hap.Service.ContactSensor) as Service; accessory.removeService(this.ContactSensor!.Service); } else { - if (!accessory.context.ContactSensor) { - accessory.context.ContactSensor = {}; - } + accessory.context.ContactSensor = accessory.context.ContactSensor ?? {}; this.ContactSensor = { Name: accessory.context.ContactSensor.Name ?? `${accessory.displayName} Contact Sensor`, Service: accessory.getService(this.hap.Service.ContactSensor) ?? accessory.addService(this.hap.Service.ContactSensor) as Service, ContactSensorState: accessory.context.ContactSensorState ?? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED, }; + accessory.context.ContactSensor = this.ContactSensor as object; // Initialize Conact Sensor Characteristics this.ContactSensor.Service .setCharacteristic(this.hap.Characteristic.Name, this.ContactSensor.Name) @@ -113,13 +110,13 @@ export class LockMechanism extends deviceBase { .onGet(() => { return this.ContactSensor!.ContactSensorState; }); - accessory.context.ContactSensor.Name = this.ContactSensor.Name; } if (!accessory.context.Battery) { accessory.context.Battery = {}; } // Initialize Battery Service + accessory.context.Battery = accessory.context.Battery ?? {}; this.Battery = { Name: accessory.context.Battery.Name ?? `${accessory.displayName} Battery`, Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery) as Service, @@ -127,6 +124,7 @@ export class LockMechanism extends deviceBase { StatusLowBattery: accessory.context.StatusLowBattery ?? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL, ChargingState: accessory.context.ChargingState ?? this.hap.Characteristic.ChargingState.NOT_CHARGING, }; + accessory.context.Battery = this.Battery as object; // Initialize Battery Characteristics this.Battery!.Service! .setCharacteristic(this.hap.Characteristic.Name, this.Battery.Name) @@ -141,7 +139,6 @@ export class LockMechanism extends deviceBase { .onGet(() => { return this.Battery.StatusLowBattery!; }); - accessory.context.Battery.Name = this.Battery.Name; // Initial Device Parse if (this.deviceRefreshRate !== 0) { @@ -228,6 +225,7 @@ export class LockMechanism extends deviceBase { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED; } else if (retryCount > 1) { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.JAMMED; + //this.pushChanges(); } else { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNKNOWN; if (this.deviceRefreshRate !== 0) { @@ -278,22 +276,25 @@ export class LockMechanism extends deviceBase { */ async pushChanges(): Promise { try { - await this.platform.augustCredentials(); + //await this.platform.augustCredentials(); if (this.LockMechanism!.LockTargetState === this.hap.Characteristic.LockTargetState.UNSECURED) { - this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: Unlock (${this.LockMechanism!.LockTargetState})`); - const lockStatus = await this.platform.augustConfig.unlock(this.device.lockId); - this.debugWarnLog(`Lock: ${this.accessory.displayName} (pushChanges-unlock) lockStatus: ${JSON.stringify(lockStatus)}`); + await this.platform.augustConfig.unlock(this.device.lockId); } else if (this.LockMechanism!.LockTargetState === this.hap.Characteristic.LockTargetState.SECURED) { - this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: Lock (${this.LockMechanism!.LockTargetState})`); - const lockStatus = await this.platform.augustConfig.lock(this.device.lockId); - this.debugWarnLog(`Lock: ${this.accessory.displayName} (pushChanges-lock) lockStatus: ${JSON.stringify(lockStatus)}`); + await this.platform.augustConfig.lock(this.device.lockId); } else { this.errorLog(`Lock: ${this.accessory.displayName} lockStatus (pushChanges) failed,` + ` this.LockTargetState: ${this.LockMechanism!.LockTargetState}`); } + if (this.deviceRefreshRate !== 0) { + await this.refreshStatus(); + } + if (this.LockMechanism) { + this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: ${(this.LockMechanism.LockTargetState === 1) + ? 'Locked' : 'Unlocked'}`); + } } catch (e: any) { - this.errorLog(`pushChanges: ${e}`); - this.errorLog(`Lock: ${this.accessory.displayName} failed pushChanges, Error Message: ${JSON.stringify(e.message)}`); + this.statusCode(this.device, e); + this.debugLog(`pushChanges: ${e}`); } } diff --git a/src/platform.ts b/src/platform.ts index 3bc3612..2b9bc26 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -210,7 +210,7 @@ export class AugustPlatform implements DynamicPlatformPlugin { if (!this.config.credentials) { throw 'Missing Credentials'; } else { - this.augustConfig = new August(this.config.credentials!); + this.augustConfig = new August(this.config.credentials); this.debugLog(`August Credentials: ${JSON.stringify(this.augustConfig)}`); } } From 0df5320ffe3bf7ea21a82cd0d9d8e3ece6308629 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Thu, 23 May 2024 09:34:01 -0500 Subject: [PATCH 20/27] Update device.ts --- src/devices/device.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index 72f0d70..17c2370 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -107,7 +107,7 @@ export abstract class deviceBase { async statusCode(device: device & devicesConfig, error: { message: string; }): Promise { if (!device.hide_device) { - const statusCodeString = String(error); // Convert statusCode to a string + const statusCodeString = JSON.stringify(error); // Convert statusCode to a string if (statusCodeString.includes('100')) { this.debugLog(`Lock: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCodeString}`); } else if (statusCodeString.includes('200')) { From 484b474f10e18405eeffbb91555fee01006e71e3 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Thu, 23 May 2024 16:30:47 -0500 Subject: [PATCH 21/27] more updates --- src/devices/device.ts | 86 +++++++++++++++++++++++++++++++++---------- src/devices/lock.ts | 40 +++++++++----------- src/settings.ts | 25 +++++++------ 3 files changed, 98 insertions(+), 53 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index 17c2370..07c7e1c 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -15,6 +15,8 @@ export abstract class deviceBase { // Config protected deviceLogging!: string; protected deviceRefreshRate!: number; + protected deviceUpdateRate!: number; + protected devicePushRate!: number; constructor( protected readonly platform: AugustPlatform, @@ -26,10 +28,10 @@ export abstract class deviceBase { this.config = this.platform.config; this.hap = this.api.hap; - this.deviceLogs(device); - this.getDeviceRefreshRate(device); - this.deviceConfigOptions(device); - this.deviceContext(accessory, device); + this.getDeviceLogSettings(accessory, device); + this.getDeviceRateSettings(accessory, device); + this.getDeviceConfigSettings(accessory, device); + this.getDeviceContext(accessory, device); // Set accessory information accessory @@ -42,7 +44,7 @@ export abstract class deviceBase { .updateValue(accessory.context.currentFirmwareVersion); } - async deviceLogs(device: device & devicesConfig): Promise { + async getDeviceLogSettings(accessory: PlatformAccessory, device: device & devicesConfig): Promise { if (this.platform.debugMode) { this.deviceLogging = this.accessory.context.logging = 'debugMode'; this.debugWarnLog(`Lock: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`); @@ -58,7 +60,7 @@ export abstract class deviceBase { } } - async getDeviceRefreshRate(device: device & devicesConfig): Promise { + async getDeviceRateSettings(accessory: PlatformAccessory, device: device & devicesConfig): Promise { if (device.refreshRate) { if (device.refreshRate === 0) { this.deviceRefreshRate = 0; @@ -75,9 +77,45 @@ export abstract class deviceBase { this.deviceRefreshRate = this.accessory.context.refreshRate = this.config.refreshRate; this.debugLog(`Lock: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`); } + // refreshRate + if (device.refreshRate) { + this.deviceRefreshRate = device.refreshRate; + this.debugLog(`${device.Type}: ${accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`); + } else if (this.config.options?.refreshRate) { + this.deviceRefreshRate = this.config.options.refreshRate; + this.debugLog(`${device.Type}: ${accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`); + } else { + this.deviceRefreshRate = 5; + this.debugLog(`${device.Type}: ${accessory.displayName} Using Default refreshRate: ${this.deviceRefreshRate}`); + } + accessory.context.deviceRefreshRate = this.deviceRefreshRate; + // updateRate + if (device.updateRate) { + this.deviceUpdateRate = device.updateRate; + this.debugLog(`${device.Type}: ${accessory.displayName} Using Device Config updateRate: ${this.deviceUpdateRate}`); + } else if (this.config.options?.updateRate) { + this.deviceUpdateRate = this.config.options.updateRate; + this.debugLog(`${device.Type}: ${accessory.displayName} Using Platform Config updateRate: ${this.deviceUpdateRate}`); + } else { + this.deviceUpdateRate = 5; + this.debugLog(`${device.Type}: ${accessory.displayName} Using Default updateRate: ${this.deviceUpdateRate}`); + } + accessory.context.deviceUpdateRate = this.deviceUpdateRate; + // pushRate + if (device.pushRate) { + this.devicePushRate = device.pushRate; + this.debugLog(`${device.Type}: ${accessory.displayName} Using Device Config pushRate: ${this.deviceUpdateRate}`); + } else if (this.config.options?.pushRate) { + this.devicePushRate = this.config.options.pushRate; + this.debugLog(`${device.Type}: ${accessory.displayName} Using Platform Config pushRate: ${this.deviceUpdateRate}`); + } else { + this.devicePushRate = 1; + this.debugLog(`${device.Type}: ${accessory.displayName} Using Default pushRate: ${this.deviceUpdateRate}`); + } + accessory.context.devicePushRate = this.devicePushRate; } - async deviceConfigOptions(device: device & devicesConfig): Promise { + async getDeviceConfigSettings(accessory: PlatformAccessory, device: device & devicesConfig): Promise { const deviceConfig = {}; if (device.logging !== undefined) { deviceConfig['logging'] = device.logging; @@ -85,17 +123,27 @@ export abstract class deviceBase { if (device.refreshRate !== undefined) { deviceConfig['refreshRate'] = device.refreshRate; } - let lockConfig = {}; + if (device.updateRate !== undefined) { + deviceConfig['refreshRate'] = device.updateRate; + } + if (device.pushRate !== undefined) { + deviceConfig['refreshRate'] = device.pushRate; + } if (device.lock) { - lockConfig = device.lock; + if (device.lock.hide_contactsensor === true) { + deviceConfig['hide_contactsensor'] = device.lock.hide_contactsensor; + } + if (device.lock.hide_lock === true) { + deviceConfig['hide_lock'] = device.lock.hide_lock; + } } - const config = Object.assign({}, deviceConfig, lockConfig); + const config = Object.assign({}, deviceConfig); if (Object.entries(config).length !== 0) { - this.infoLog(`Lock: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`); + this.infoLog(`Lock: ${accessory.displayName} Config: ${JSON.stringify(config)}`); } } - async deviceContext(accessory: PlatformAccessory, device: device & devicesConfig): Promise { + async getDeviceContext(accessory: PlatformAccessory, device: device & devicesConfig): Promise { if (device.firmware) { accessory.context.FirmwareRevision = device.firmware; } else if (accessory.context.FirmwareRevision === undefined) { @@ -105,22 +153,22 @@ export abstract class deviceBase { } } - async statusCode(device: device & devicesConfig, error: { message: string; }): Promise { + async statusCode(accessory: PlatformAccessory, device: device & devicesConfig, error: { message: string; }): Promise { if (!device.hide_device) { const statusCodeString = JSON.stringify(error); // Convert statusCode to a string if (statusCodeString.includes('100')) { - this.debugLog(`Lock: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCodeString}`); + this.debugLog(`Lock: ${accessory.displayName} Command successfully sent, statusCode: ${statusCodeString}`); } else if (statusCodeString.includes('200')) { - this.debugLog(`Lock: ${this.accessory.displayName} Request successful, statusCode: ${statusCodeString}`); + this.debugLog(`Lock: ${accessory.displayName} Request successful, statusCode: ${statusCodeString}`); } else if (statusCodeString.includes('400')) { - this.errorLog(`Lock: ${this.accessory.displayName} Bad Request, statusCode: ${statusCodeString}`); + this.errorLog(`Lock: ${accessory.displayName} Bad Request, statusCode: ${statusCodeString}`); } else if (statusCodeString.includes('429')) { - this.errorLog(`Lock: ${this.accessory.displayName} Too Many Requests, exceeded the number of ` + this.errorLog(`Lock: ${accessory.displayName} Too Many Requests, exceeded the number of ` + `requests allowed for a given time window, statusCode: ${statusCodeString}`); } else { - this.debugLog(`Lock: ${this.accessory.displayName} Unknown statusCode: ${statusCodeString}, Submit Bugs Here: ' + this.debugLog(`Lock: ${accessory.displayName} Unknown statusCode: ${statusCodeString}, Submit Bugs Here: ' + 'https://tinyurl.com/AugustYaleBug`); - this.debugErrorLog(`Lock: ${this.accessory.displayName} failed lockStatus (refreshStatus), Error: ${JSON.stringify(error)}`); + this.debugErrorLog(`Lock: ${accessory.displayName} failed lockStatus (refreshStatus), Error: ${JSON.stringify(error)}`); } } } diff --git a/src/devices/lock.ts b/src/devices/lock.ts index cd7b3d4..d291eb2 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -168,7 +168,7 @@ export class LockMechanism extends deviceBase { tap(() => { this.lockUpdateInProgress = true; }), - debounceTime(this.platform.config.options!.pushRate! * 1000), + debounceTime(this.devicePushRate * 1000), ) .subscribe(async () => { try { @@ -267,7 +267,7 @@ export class LockMechanism extends deviceBase { await this.parseStatus(lockDetails); await this.updateHomeKitCharacteristics(); } catch (e: any) { - this.statusCode(this.device, e); + this.statusCode(this.accessory, this.device, e); } } @@ -277,23 +277,22 @@ export class LockMechanism extends deviceBase { async pushChanges(): Promise { try { //await this.platform.augustCredentials(); - if (this.LockMechanism!.LockTargetState === this.hap.Characteristic.LockTargetState.UNSECURED) { - await this.platform.augustConfig.unlock(this.device.lockId); - } else if (this.LockMechanism!.LockTargetState === this.hap.Characteristic.LockTargetState.SECURED) { - await this.platform.augustConfig.lock(this.device.lockId); - } else { - this.errorLog(`Lock: ${this.accessory.displayName} lockStatus (pushChanges) failed,` - + ` this.LockTargetState: ${this.LockMechanism!.LockTargetState}`); - } - if (this.deviceRefreshRate !== 0) { - await this.refreshStatus(); - } if (this.LockMechanism) { + if (this.LockMechanism.LockTargetState === this.hap.Characteristic.LockTargetState.UNSECURED) { + await this.platform.augustConfig.unlock(this.device.lockId); + } else { + await this.platform.augustConfig.lock(this.device.lockId); + } this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: ${(this.LockMechanism.LockTargetState === 1) ? 'Locked' : 'Unlocked'}`); + if (this.deviceRefreshRate !== 0) { + await this.refreshStatus(); + } + } else { + this.errorLog(`Lock: ${this.accessory.displayName} lockTargetState: ${JSON.stringify(this.LockMechanism)}`); } } catch (e: any) { - this.statusCode(this.device, e); + this.statusCode(this.accessory, this.device, e); this.debugLog(`pushChanges: ${e}`); } } @@ -348,15 +347,10 @@ export class LockMechanism extends deviceBase { } async setLockTargetState(value: CharacteristicValue): Promise { - this.debugLog(`Lock: ${this.accessory.displayName} Set LockTargetState: ${value}`); - this.LockMechanism!.LockTargetState = value; - this.accessory.context.LockTargetState = this.LockMechanism!.LockTargetState; - this.doLockUpdate.next(); - if (this.LockMechanism!.LockCurrentState === this.hap.Characteristic.LockCurrentState.UNSECURED) { - this.infoLog(`Lock: ${this.accessory.displayName} was Unlocked`); - } - if (this.LockMechanism!.LockCurrentState === this.hap.Characteristic.LockCurrentState.SECURED) { - this.infoLog(`Lock: ${this.accessory.displayName} was Locked`); + if (this.LockMechanism) { + this.debugLog(`Lock: ${this.accessory.displayName} Set LockTargetState: ${value}`); + this.accessory.context.LockMechanism.LockTargetState = this.LockMechanism.LockTargetState = value; + this.doLockUpdate.next(); } } diff --git a/src/settings.ts b/src/settings.ts index 2777206..19a6b58 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -31,8 +31,9 @@ export type credentials = { }; export type options = { - devices?: Array; + devices?: devicesConfig[]; refreshRate?: number; + updateRate?: number; pushRate?: number; logging?: string; }; @@ -68,7 +69,7 @@ export type device = { ruleHash: any; cameras: any[]; lockId: string; -} +}; export type BatteryInfo = { level: number @@ -76,14 +77,14 @@ export type BatteryInfo = { infoUpdatedDate: string lastChangeDate: string lastChangeVoltage: number -} +}; export type HostLockInfo = { serialNumber: string manufacturer: string productID: number productTypeID: number -} +}; export type LockStatus = { status: string @@ -91,7 +92,7 @@ export type LockStatus = { isLockStatusChanged: boolean valid: boolean doorState: string -} +}; export type Bridge = { _id: string @@ -102,20 +103,20 @@ export type Bridge = { status: Status locks: Lock[] hyperBridge: boolean -} +}; export type Status = { current: string lastOffline: string updated: string lastOnline: string -} +}; export type Lock = { _id: string LockID: string macAddress: string -} +}; export interface devicesConfig extends device { configLockName?: string; @@ -125,6 +126,8 @@ export interface devicesConfig extends device { external?: boolean; logging?: string; refreshRate?: number; + updateRate?: number; + pushRate?: number; firmware?: string; } @@ -138,18 +141,18 @@ export type lockDetails = { battery: number; LockStatus: lockStatus; currentFirmwareVersion: string; -} +}; export type lockStatus = { lockID: string; status: string; doorState: string; state: state; -} +}; export type state = { unlocked: boolean; locked: boolean; open: boolean; closed: boolean; -} \ No newline at end of file +}; \ No newline at end of file From d03cf28ab6158e90987f80033d14635093039432 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Fri, 24 May 2024 00:32:07 -0500 Subject: [PATCH 22/27] getting there --- src/devices/device.ts | 2 +- src/devices/lock.ts | 97 +++++++++++++++++++++++-------------------- 2 files changed, 54 insertions(+), 45 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index 07c7e1c..4474878 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -117,7 +117,7 @@ export abstract class deviceBase { async getDeviceConfigSettings(accessory: PlatformAccessory, device: device & devicesConfig): Promise { const deviceConfig = {}; - if (device.logging !== undefined) { + if ((device.logging !== 'standard') || (device.logging !== undefined)) { deviceConfig['logging'] = device.logging; } if (device.refreshRate !== undefined) { diff --git a/src/devices/lock.ts b/src/devices/lock.ts index d291eb2..d983d38 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -69,15 +69,18 @@ export class LockMechanism extends deviceBase { // Initialize Lock Mechanism Service if (device.lock?.hide_lock) { - this.warnLog(`Lock: ${accessory.displayName} Removing Lock Mechanism Service`); - this.LockMechanism!.Service = accessory.getService(this.hap.Service.LockMechanism) as Service; - accessory.removeService(this.LockMechanism!.Service); + if (this.LockMechanism?.Service) { + this.debugLog(`${device.Type}: ${accessory.displayName} Removing Lock Mechanism Service`); + this.LockMechanism.Service = accessory.getService(this.hap.Service.LockMechanism) as Service; + accessory.removeService(this.LockMechanism.Service); + accessory.context.LockMechanism = {}; + } } else { accessory.context.LockMechanism = accessory.context.LockMechanism ?? {}; this.LockMechanism = { Name: accessory.context.LockMechanism.Name ?? device.LockName ?? accessory.displayName, Service: accessory.getService(this.hap.Service.LockMechanism) ?? accessory.addService(this.hap.Service.LockMechanism) as Service, - LockTargetState: accessory.context.LockTargetState ?? this.hap.Characteristic.LockTargetState.SECURED, + LockTargetState: accessory.context.LockTargetState ?? this.hap.Characteristic.LockTargetState.SECURED, LockCurrentState: accessory.context.LockCurrentState ?? this.hap.Characteristic.LockCurrentState.SECURED, }; accessory.context.LockMechanism = this.LockMechanism as object; @@ -92,9 +95,12 @@ export class LockMechanism extends deviceBase { } // Initialize Contact Sensor Service if (device.lock?.hide_contactsensor) { - this.warnLog(`Lock: ${accessory.displayName} Removing Contact Sensor Service`); - this.ContactSensor!.Service = accessory.getService(this.hap.Service.ContactSensor) as Service; - accessory.removeService(this.ContactSensor!.Service); + if (this.ContactSensor?.Service) { + this.debugLog(`${device.Type} ${accessory.displayName} Removing Conact Sensor Service`); + this.ContactSensor.Service = accessory.getService(this.hap.Service.ContactSensor) as Service; + accessory.removeService(this.ContactSensor.Service); + accessory.context.ContactSensor = {}; + } } else { accessory.context.ContactSensor = accessory.context.ContactSensor ?? {}; this.ContactSensor = { @@ -188,7 +194,7 @@ export class LockMechanism extends deviceBase { * Parse the device status from the August api */ async parseStatus(lockDetails: lockDetails): Promise { - this.debugLog(`Lock: ${this.accessory.displayName} parseStatus`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} parseStatus`); // Battery this.Battery.BatteryLevel = Number((lockDetails.battery * 100).toFixed()); @@ -198,12 +204,13 @@ export class LockMechanism extends deviceBase { } else { this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL; } - this.debugLog(`Lock: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},` + this.debugLog(`${this.device.Type} ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},` + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`); // Firmware Version if (lockDetails.currentFirmwareVersion !== this.accessory.context.currentFirmwareVersion) { - this.warnLog(`Lock: ${this.accessory.displayName} Firmware Version changed to Current Firmware Version: ${this.currentFirmwareVersion}`); + this.warnLog(`${this.device.Type} ${this.accessory.displayName} Firmware Version changed to ` + + `Current Firmware Version: ${this.currentFirmwareVersion}`); this.accessory .getService(this.hap.Service.AccessoryInformation)! .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.currentFirmwareVersion) @@ -238,18 +245,18 @@ export class LockMechanism extends deviceBase { if (!this.device.lock?.hide_contactsensor) { if (LockStatus.state.open) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED; - this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); } else if (LockStatus.state.closed) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED; - this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); } else if (LockStatus.doorState.includes('open')) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED; - this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); } else if (LockStatus.doorState.includes('closed')) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED; - this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); } else { - this.errorLog(`Lock: ${this.accessory.displayName} doorState: ${this.doorState}, closed: ${LockStatus.state.closed},` + this.errorLog(`${this.device.Type} ${this.accessory.displayName} doorState: ${this.doorState}, closed: ${LockStatus.state.closed},` + ` open: ${LockStatus.state.open}`); } } @@ -262,7 +269,7 @@ export class LockMechanism extends deviceBase { try { // Update Lock Details const lockDetails: any = await this.platform.augustConfig.details(this.device.lockId); - this.debugSuccessLog(`Lock: ${this.accessory.displayName} (refreshStatus) lockDetails: ${JSON.stringify(lockDetails)}`); + this.debugSuccessLog(`${this.device.Type} ${this.accessory.displayName} (refreshStatus) lockDetails: ${JSON.stringify(lockDetails)}`); // Update HomeKit await this.parseStatus(lockDetails); await this.updateHomeKitCharacteristics(); @@ -283,13 +290,13 @@ export class LockMechanism extends deviceBase { } else { await this.platform.augustConfig.lock(this.device.lockId); } - this.successLog(`Lock: ${this.accessory.displayName} Sending request to August API: ${(this.LockMechanism.LockTargetState === 1) + this.successLog(`${this.device.Type} ${this.accessory.displayName} Sending request to August API: ${(this.LockMechanism.LockTargetState === 1) ? 'Locked' : 'Unlocked'}`); if (this.deviceRefreshRate !== 0) { await this.refreshStatus(); } } else { - this.errorLog(`Lock: ${this.accessory.displayName} lockTargetState: ${JSON.stringify(this.LockMechanism)}`); + this.errorLog(`${this.device.Type} ${this.accessory.displayName} lockTargetState: ${JSON.stringify(this.LockMechanism)}`); } } catch (e: any) { this.statusCode(this.accessory, this.device, e); @@ -303,44 +310,46 @@ export class LockMechanism extends deviceBase { async updateHomeKitCharacteristics(): Promise { // Lock Mechanism if (!this.device.lock?.hide_lock) { - if (this.LockMechanism!.LockTargetState === undefined) { - this.debugLog(`Lock: ${this.accessory.displayName} LockTargetState: ${this.LockMechanism!.LockTargetState}`); + if (this.LockMechanism?.LockTargetState === undefined) { + this.debugLog(`${this.device.Type} ${this.accessory.displayName} LockTargetState: ${this.LockMechanism?.LockTargetState}`); } else { - this.accessory.context.LockCurrentState = this.LockMechanism!.LockTargetState; - this.LockMechanism!.Service!.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.LockMechanism!.LockTargetState); - this.debugLog(`Lock: ${this.accessory.displayName} updateCharacteristic LockTargetState: ${this.LockMechanism!.LockTargetState}`); + this.accessory.context.LockCurrentState = this.LockMechanism.LockTargetState; + this.LockMechanism.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.LockMechanism!.LockTargetState); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} updateCharacteristic` + + ` LockTargetState: ${this.LockMechanism.LockTargetState}`); } - if (this.LockMechanism!.LockCurrentState === undefined) { - this.debugLog(`Lock: ${this.accessory.displayName} LockCurrentState: ${this.LockMechanism!.LockCurrentState}`); + if (this.LockMechanism?.LockCurrentState === undefined) { + this.debugLog(`${this.device.Type} ${this.accessory.displayName} LockCurrentState: ${this.LockMechanism?.LockCurrentState}`); } else { this.accessory.context.LockCurrentState = this.LockMechanism!.LockCurrentState; - this.LockMechanism!.Service!.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.LockMechanism!.LockCurrentState); - this.debugLog(`Lock: ${this.accessory.displayName} updateCharacteristic LockCurrentState: ${this.LockMechanism!.LockCurrentState}`); + this.LockMechanism.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.LockMechanism.LockCurrentState); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} updateCharacteristic` + + ` LockCurrentState: ${this.LockMechanism.LockCurrentState}`); } } // Battery if (this.Battery.BatteryLevel === undefined) { - this.debugLog(`Lock: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`); } else { this.accessory.context.BatteryLevel = this.Battery.BatteryLevel; - this.Battery!.Service!.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel); - this.debugLog(`Lock: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`); + this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`); } if (this.Battery.StatusLowBattery === undefined) { - this.debugLog(`Lock: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`); } else { this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery; - this.Battery!.Service!.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery); - this.debugLog(`Lock: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.Battery.StatusLowBattery}`); + this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.Battery.StatusLowBattery}`); } // Contact Sensor if (!this.device.lock?.hide_contactsensor) { if (this.ContactSensor?.ContactSensorState === undefined) { - this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); } else { this.accessory.context.ContactSensorState = this.ContactSensor?.ContactSensorState; - this.ContactSensor!.Service!.updateCharacteristic(this.hap.Characteristic.ContactSensorState, this.ContactSensor?.ContactSensorState); - this.debugLog(`Lock: ${this.accessory.displayName} updateCharacteristic` + this.ContactSensor.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState, this.ContactSensor.ContactSensorState); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} updateCharacteristic` + ` ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); } } @@ -348,7 +357,7 @@ export class LockMechanism extends deviceBase { async setLockTargetState(value: CharacteristicValue): Promise { if (this.LockMechanism) { - this.debugLog(`Lock: ${this.accessory.displayName} Set LockTargetState: ${value}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} Set LockTargetState: ${value}`); this.accessory.context.LockMechanism.LockTargetState = this.LockMechanism.LockTargetState = value; this.doLockUpdate.next(); } @@ -357,20 +366,20 @@ export class LockMechanism extends deviceBase { async subscribeAugust(): Promise { await this.platform.augustCredentials(); await August.subscribe(this.config.credentials!, this.device.lockId, async (AugustEvent: any, timestamp: any) => { - this.debugLog(`Lock: ${this.accessory.displayName} AugustEvent: ${JSON.stringify(AugustEvent)}, ${JSON.stringify(timestamp)}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} AugustEvent: ${JSON.stringify(AugustEvent)}, ${JSON.stringify(timestamp)}`); //LockCurrentState if (!this.device.lock?.hide_lock) { if (AugustEvent.state.unlocked) { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED; this.LockMechanism!.LockTargetState = this.hap.Characteristic.LockCurrentState.UNSECURED; if (this.LockMechanism!.LockCurrentState !== this.accessory.context.LockCurrentState) { - this.infoLog(`Lock: ${this.accessory.displayName} was Unlocked`); + this.infoLog(`${this.device.Type} ${this.accessory.displayName} was Unlocked`); } } else if (AugustEvent.state.locked) { this.LockMechanism!.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED; this.LockMechanism!.LockTargetState = this.hap.Characteristic.LockCurrentState.SECURED; if (this.LockMechanism!.LockCurrentState !== this.accessory.context.LockCurrentState) { - this.infoLog(`Lock: ${this.accessory.displayName} was Locked`); + this.infoLog(`${this.device.Type} ${this.accessory.displayName} was Locked`); } } else { if (this.deviceRefreshRate !== 0) { @@ -382,15 +391,15 @@ export class LockMechanism extends deviceBase { if (!this.device.lock?.hide_contactsensor) { if (AugustEvent.state.open) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED; - this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); if (this.ContactSensor?.ContactSensorState !== this.accessory.context.ContactSensorState) { - this.infoLog(`Lock: ${this.accessory.displayName} was Opened`); + this.infoLog(`${this.device.Type} ${this.accessory.displayName} was Opened`); } } else if (AugustEvent.state.closed) { this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED; - this.debugLog(`Lock: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); + this.debugLog(`${this.device.Type} ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor?.ContactSensorState}`); if (this.ContactSensor?.ContactSensorState !== this.accessory.context.ContactSensorState) { - this.infoLog(`Lock: ${this.accessory.displayName} was Closed`); + this.infoLog(`${this.device.Type} ${this.accessory.displayName} was Closed`); } } else { if (this.deviceRefreshRate !== 0) { From 700cce6ab54fbdd0562072353580db8fe10fa340 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sat, 25 May 2024 15:35:04 -0600 Subject: [PATCH 23/27] Update device.ts --- CHANGELOG.md | 7 +++ src/devices/device.ts | 51 ++++++++++++++---- src/devices/lock.ts | 19 +++---- src/platform.ts | 122 ++++++++++++++++++++++++------------------ src/settings.ts | 5 +- 5 files changed, 132 insertions(+), 72 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c4113d..0242306 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,13 @@ All notable changes to this project will be documented in this file. This projec **Full Changelog**: https://github.com/donavanbecker/homebridge-august/compare/v2.0.0...v2.1.0 +## [2.1.0](https://github.com/donavanbecker/homebridge-august/releases/tag/v2.1.0) (2024-05-07) + +### What's Changes +- Housekeeping and updated dependencies. + +**Full Changelog**: https://github.com/donavanbecker/homebridge-august/compare/v2.0.0...v2.1.0 + ## [2.0.0](https://github.com/donavanbecker/homebridge-august/releases/tag/v2.0.0) (2024-01-31) ### What's Changes diff --git a/src/devices/device.ts b/src/devices/device.ts index 4474878..16f38ed 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -37,11 +37,10 @@ export abstract class deviceBase { accessory .getService(this.hap.Service.AccessoryInformation)! .setCharacteristic(this.hap.Characteristic.Manufacturer, 'August Home Inc.') - .setCharacteristic(this.hap.Characteristic.Model, accessory.context.model) - .setCharacteristic(this.hap.Characteristic.SerialNumber, accessory.context.serialnumber) - .setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.currentFirmwareVersion) - .getCharacteristic(this.hap.Characteristic.FirmwareRevision) - .updateValue(accessory.context.currentFirmwareVersion); + .setCharacteristic(this.hap.Characteristic.AppMatchingIdentifier, 'id648730592') + .setCharacteristic(this.hap.Characteristic.Model, device.skuNumber ?? accessory.context.model) + .setCharacteristic(this.hap.Characteristic.ProductData, accessory.context.serialnumber) + .setCharacteristic(this.hap.Characteristic.SerialNumber, device.LockId ?? accessory.context.serialnumber); } async getDeviceLogSettings(accessory: PlatformAccessory, device: device & devicesConfig): Promise { @@ -117,7 +116,7 @@ export abstract class deviceBase { async getDeviceConfigSettings(accessory: PlatformAccessory, device: device & devicesConfig): Promise { const deviceConfig = {}; - if ((device.logging !== 'standard') || (device.logging !== undefined)) { + if ((device.logging !== 'standard') && (device.logging !== undefined)) { deviceConfig['logging'] = device.logging; } if (device.refreshRate !== undefined) { @@ -144,13 +143,45 @@ export abstract class deviceBase { } async getDeviceContext(accessory: PlatformAccessory, device: device & devicesConfig): Promise { + // Firmware Version + let deviceFirmwareVersion: string; if (device.firmware) { - accessory.context.FirmwareRevision = device.firmware; - } else if (accessory.context.FirmwareRevision === undefined) { - accessory.context.FirmwareRevision = await this.platform.getVersion(); + deviceFirmwareVersion = device.firmware; + this.debugSuccessLog(`${device.Type}: ${accessory.displayName} 1 FirmwareRevision: ${device.firmware}`); + } else if (device.currentFirmwareVersion) { + deviceFirmwareVersion = device.currentFirmwareVersion; + this.debugSuccessLog(`${device.Type}: ${accessory.displayName} 2 FirmwareRevision: ${device.currentFirmwareVersion}`); + } else if (accessory.context.deviceVersion) { + deviceFirmwareVersion = accessory.context.deviceVersion; + this.debugSuccessLog(`${device.Type}: ${accessory.displayName} 3 FirmwareRevision: ${accessory.context.deviceVersion}`); + } else { + deviceFirmwareVersion = this.platform.version ?? '0.0.0'; + if (this.platform.version) { + this.debugSuccessLog(`${device.Type}: ${accessory.displayName} 4 FirmwareRevision: ${this.platform.version}`); + } else { + this.debugSuccessLog(`${device.Type}: ${accessory.displayName} 5 FirmwareRevision: ${deviceFirmwareVersion}`); + } + } + const version = deviceFirmwareVersion.toString(); + this.debugLog(`${this.device.Type}: ${accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`); + let deviceVersion: string; + if (version?.includes('.') === false) { + const replace = version?.replace(/^V|-.*$/g, ''); + const match = replace?.match(/.{1,1}/g); + const validVersion = match?.join('.'); + deviceVersion = validVersion ?? '0.0.0'; } else { - accessory.context.FirmwareRevision = '3'; + deviceVersion = version?.replace(/^V|-.*$/g, '') ?? '0.0.0'; } + accessory + .getService(this.hap.Service.AccessoryInformation)! + .setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion) + .setCharacteristic(this.hap.Characteristic.SoftwareRevision, deviceVersion) + .setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion) + .getCharacteristic(this.hap.Characteristic.FirmwareRevision) + .updateValue(deviceVersion); + accessory.context.deviceVersion = deviceVersion; + this.debugSuccessLog(`${device.Type}: ${accessory.displayName} deviceVersion: ${accessory.context.deviceVersion}`); } async statusCode(accessory: PlatformAccessory, device: device & devicesConfig, error: { message: string; }): Promise { diff --git a/src/devices/lock.ts b/src/devices/lock.ts index d983d38..026d6fb 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -132,18 +132,18 @@ export class LockMechanism extends deviceBase { }; accessory.context.Battery = this.Battery as object; // Initialize Battery Characteristics - this.Battery!.Service! + this.Battery.Service .setCharacteristic(this.hap.Characteristic.Name, this.Battery.Name) .setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE) .getCharacteristic(this.hap.Characteristic.BatteryLevel) .onGet(() => { - return this.Battery.BatteryLevel!; + return this.Battery.BatteryLevel; }); - this.Battery.Service! + this.Battery.Service .getCharacteristic(this.hap.Characteristic.StatusLowBattery) .onGet(() => { - return this.Battery.StatusLowBattery!; + return this.Battery.StatusLowBattery; }); // Initial Device Parse @@ -208,15 +208,16 @@ export class LockMechanism extends deviceBase { + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`); // Firmware Version - if (lockDetails.currentFirmwareVersion !== this.accessory.context.currentFirmwareVersion) { + if (this.accessory.context.currentFirmwareVersion !== lockDetails.currentFirmwareVersion) { this.warnLog(`${this.device.Type} ${this.accessory.displayName} Firmware Version changed to ` - + `Current Firmware Version: ${this.currentFirmwareVersion}`); + + `Current Firmware Version: ${lockDetails.currentFirmwareVersion}`); this.accessory .getService(this.hap.Service.AccessoryInformation)! - .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.currentFirmwareVersion) + .setCharacteristic(this.hap.Characteristic.HardwareRevision, lockDetails.currentFirmwareVersion) + .setCharacteristic(this.hap.Characteristic.FirmwareRevision, lockDetails.currentFirmwareVersion) .getCharacteristic(this.hap.Characteristic.FirmwareRevision) - .updateValue(this.currentFirmwareVersion); - this.accessory.context.currentFirmwareVersion = this.currentFirmwareVersion; + .updateValue(lockDetails.currentFirmwareVersion); + this.accessory.context.currentFirmwareVersion = lockDetails.currentFirmwareVersion; } // Lock Status diff --git a/src/platform.ts b/src/platform.ts index 2b9bc26..d6dd160 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -8,7 +8,7 @@ import { readFileSync, writeFileSync } from 'fs'; import { LockMechanism } from './devices/lock.js'; import { PLUGIN_NAME, PLATFORM_NAME } from './settings.js'; -import type { AugustPlatformConfig, device, devicesConfig } from './settings.js'; +import type { AugustPlatformConfig, credentials, device, devicesConfig } from './settings.js'; import type { API, DynamicPlatformPlugin, Logging, PlatformAccessory } from 'homebridge'; /** @@ -36,10 +36,12 @@ export class AugustPlatform implements DynamicPlatformPlugin { config: AugustPlatformConfig, api: API, ) { + // Initialize this.accessories = []; this.api = api; this.log = log; + // only load if configured if (!config) { return; } @@ -48,18 +50,22 @@ export class AugustPlatform implements DynamicPlatformPlugin { this.config = { platform: 'August', name: config.name, - credentials: config.credentials, // Fix: Update the type to 'credentials' - options: config.options, + credentials: config.credentials as credentials, + options: config.options as object, }; - this.platformConfigOptions(); - this.platformLogs(); + + // Plugin Configuration + this.getPlatformConfigSettings(); + this.getPlatformLogSettings(); this.getVersion(); + + // Finish initializing the plugin this.debugLog(`Finished initializing platform: ${config.name}`); // verify the config (async () => { try { - await this.verifyConfig(); + this.verifyConfig(); this.debugLog('Config OK'); } catch (e: any) { this.errorLog(`Verify Config, Error Message: ${e.message}, Submit Bugs Here: https://bit.ly/homebridge-cloudflared-tunnel-bug-report`); @@ -256,7 +262,7 @@ export class AugustPlatform implements DynamicPlatformPlugin { device.deviceName = device.configDeviceName; } this.debugLog(`August Devices: ${JSON.stringify(device)}`); - this.createLock(device); + this.Lock(device); } } else if (this.config.options.devices) { this.debugWarnLog(`August Platform Config Set: ${JSON.stringify(this.config.options?.devices)}`); @@ -277,14 +283,14 @@ export class AugustPlatform implements DynamicPlatformPlugin { device.deviceName = device.configDeviceName; } this.debugLog(`device: ${JSON.stringify(device)}`); - this.createLock(device); + this.Lock(device); } } else { this.errorLog('August ID & Password Supplied, Issue with Auth.'); } } - private async createLock(device: device & devicesConfig) { + private async Lock(device: device & devicesConfig) { const uuid = this.api.hap.uuid.generate(device.lockId); // see if an accessory with the same uuid has already been registered and restored from // the cached devices we stored in the `configureAccessory` method above @@ -343,12 +349,20 @@ export class AugustPlatform implements DynamicPlatformPlugin { } private registerDevice(device: device & devicesConfig) { - if (!device.hide_device) { + if (!device.hide_device && (!device.homeKitEnabled && device.overrideHomeKitEnabled)) { this.registeringDevice = true; this.debugLog(`Device: ${device.LockName} Enabled`); + } else if (device.homeKitEnabled && device.overrideHomeKitEnabled) { + this.registeringDevice = true; + this.debugWarnLog(`Device: ${device.LockName} HomeKit Enabled: ${device.homeKitEnabled}, ` + + `Override HomeKit Enabled: ${device.overrideHomeKitEnabled}`); + } else if (device.homeKitEnabled && !device.overrideHomeKitEnabled) { + this.registeringDevice = false; + this.debugErrorLog(`Device: ${device.LockName} HomeKit Enabled: ` + + `${device.homeKitEnabled}, device will not be registered. To enable, set overrideHomeKitEnabled to true.`); } else { this.registeringDevice = false; - this.debugLog(`Device: ${device.LockName} is Disabled`); + this.debugLog(`Device: ${device.LockName} is Hidden.`); } return this.registeringDevice; } @@ -373,9 +387,19 @@ export class AugustPlatform implements DynamicPlatformPlugin { this.warnLog(`Removing existing accessory from cache: ${device.LockName}`); } - async platformConfigOptions() { - const platformConfig: AugustPlatformConfig['options'] = { - }; + async getVersion() { + const json = JSON.parse( + readFileSync( + new URL('../package.json', import.meta.url), + 'utf-8', + ), + ); + this.debugLog(`Plugin Version: ${json.version}`); + this.version = json.version; + } + + async getPlatformConfigSettings() { + const platformConfig: AugustPlatformConfig['options'] = {}; if (this.config.options) { if (this.config.options.logging) { platformConfig.logging = this.config.options.logging; @@ -383,8 +407,11 @@ export class AugustPlatform implements DynamicPlatformPlugin { if (this.config.options.refreshRate) { platformConfig.refreshRate = this.config.options.refreshRate; } + if (this.config.options.updateRate) { + platformConfig.updateRate = this.config.options.updateRate; + } if (this.config.options.pushRate) { - platformConfig.refreshRate = this.config.options.pushRate; + platformConfig.pushRate = this.config.options.pushRate; } if (Object.entries(platformConfig).length !== 0) { this.debugLog(`Platform Config: ${JSON.stringify(platformConfig)}`); @@ -393,59 +420,52 @@ export class AugustPlatform implements DynamicPlatformPlugin { } } - async platformLogs() { + async getPlatformLogSettings() { this.debugMode = process.argv.includes('-D') || process.argv.includes('--debug'); - this.platformLogging = this.config.options?.logging ?? 'standard'; if (this.config.options?.logging === 'debug' || this.config.options?.logging === 'standard' || this.config.options?.logging === 'none') { this.platformLogging = this.config.options.logging; - if (this.platformLogging?.includes('debug')) { - this.debugWarnLog(`Using Config Logging: ${this.platformLogging}`); - } + this.debugWarnLog(`Using Platform Config Logging: ${this.platformLogging}`); } else if (this.debugMode) { this.platformLogging = 'debugMode'; - if (this.platformLogging?.includes('debug')) { - this.debugWarnLog(`Using ${this.platformLogging} Logging`); - } + this.debugWarnLog(`Using ${this.platformLogging} Logging`); } else { this.platformLogging = 'standard'; - if (this.platformLogging?.includes('debug')) { - this.debugWarnLog(`Using ${this.platformLogging} Logging`); - } + this.debugWarnLog(`Using ${this.platformLogging} Logging`); } - if (this.debugMode) { - this.platformLogging = 'debugMode'; - } - } - - async getVersion() { - const json = JSON.parse( - readFileSync( - new URL('../package.json', import.meta.url), - 'utf-8', - ), - ); - this.debugLog(`Plugin Version: ${json.version}`); - this.version = json.version; } /** - * If device level logging is turned on, log to log.warn - * Otherwise send debug logs to log.debug - */ + * If device level logging is turned on, log to log.warn + * Otherwise send debug logs to log.debug + */ infoLog(...log: any[]): void { - if (this.enablingPlatfromLogging()) { + if (this.enablingPlatformLogging()) { this.log.info(String(...log)); } } + successLog(...log: any[]): void { + if (this.enablingPlatformLogging()) { + this.log.success(String(...log)); + } + } + + debugSuccessLog(...log: any[]): void { + if (this.enablingPlatformLogging()) { + if (this.platformLogging?.includes('debug')) { + this.log.success('[DEBUG]', String(...log)); + } + } + } + warnLog(...log: any[]): void { - if (this.enablingPlatfromLogging()) { + if (this.enablingPlatformLogging()) { this.log.warn(String(...log)); } } debugWarnLog(...log: any[]): void { - if (this.enablingPlatfromLogging()) { + if (this.enablingPlatformLogging()) { if (this.platformLogging?.includes('debug')) { this.log.warn('[DEBUG]', String(...log)); } @@ -453,13 +473,13 @@ export class AugustPlatform implements DynamicPlatformPlugin { } errorLog(...log: any[]): void { - if (this.enablingPlatfromLogging()) { + if (this.enablingPlatformLogging()) { this.log.error(String(...log)); } } debugErrorLog(...log: any[]): void { - if (this.enablingPlatfromLogging()) { + if (this.enablingPlatformLogging()) { if (this.platformLogging?.includes('debug')) { this.log.error('[DEBUG]', String(...log)); } @@ -467,7 +487,7 @@ export class AugustPlatform implements DynamicPlatformPlugin { } debugLog(...log: any[]): void { - if (this.enablingPlatfromLogging()) { + if (this.enablingPlatformLogging()) { if (this.platformLogging === 'debugMode') { this.log.debug(String(...log)); } else if (this.platformLogging === 'debug') { @@ -476,7 +496,7 @@ export class AugustPlatform implements DynamicPlatformPlugin { } } - enablingPlatfromLogging(): boolean { + enablingPlatformLogging(): boolean { return this.platformLogging?.includes('debug') || this.platformLogging === 'standard'; } -} +} \ No newline at end of file diff --git a/src/settings.ts b/src/settings.ts index 19a6b58..6b5e9d1 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -23,8 +23,8 @@ export type credentials = { apiKey?: string; pnSubKey?: string; installId: string; - augustId?: string; // Phone must be formatted +[countrycode][number] - password?: string; + augustId: string; // Phone must be formatted +[countrycode][number] + password: string; countryCode: string; validateCode?: string; isValidated?: boolean; @@ -122,6 +122,7 @@ export interface devicesConfig extends device { configLockName?: string; lockId: string; lock?: lock; + overrideHomeKitEnabled: boolean hide_device?: boolean; external?: boolean; logging?: string; From 4264fde18991c3a06bb88ce2d4c443847afa65ef Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sat, 25 May 2024 15:36:01 -0600 Subject: [PATCH 24/27] Update device.ts --- src/devices/device.ts | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index 16f38ed..0df7e5f 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -4,7 +4,7 @@ */ import type { AugustPlatform } from '../platform.js'; import type { device, devicesConfig, AugustPlatformConfig } from '../settings.js'; -import type { API, HAP, Logging, PlatformAccessory } from 'homebridge'; +import type { API, HAP, Logging, PlatformAccessory, CharacteristicValue, Service } from 'homebridge'; export abstract class deviceBase { public readonly api: API; @@ -12,6 +12,14 @@ export abstract class deviceBase { public readonly config!: AugustPlatformConfig; protected readonly hap: HAP; + // Service + FirmwareUpdate!: { + Name: string; + Service: Service; + FirmwareUpdateReadiness: CharacteristicValue; + FirmwareUpdateStatus: CharacteristicValue; + }; + // Config protected deviceLogging!: string; protected deviceRefreshRate!: number; @@ -182,6 +190,25 @@ export abstract class deviceBase { .updateValue(deviceVersion); accessory.context.deviceVersion = deviceVersion; this.debugSuccessLog(`${device.Type}: ${accessory.displayName} deviceVersion: ${accessory.context.deviceVersion}`); + + // Initialize FirmwareUpdate Service + accessory.context.FirmwareUpdate = accessory.context.FirmwareUpdate ?? {}; + this.FirmwareUpdate = { + Name: accessory.context.Battery.Name ?? `${accessory.displayName} Firmware Update`, + Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery) as Service, + FirmwareUpdateStatus: accessory.context.FirmwareUpdateStatus ?? 0, + FirmwareUpdateReadiness: accessory.context.FirmwareUpdateReadiness ?? 0, + }; + accessory.context.FirmwareUpdate = this.FirmwareUpdate as object; + // Initialize FirmwareUpdate Characteristics + this.FirmwareUpdate.Service + .setCharacteristic(this.hap.Characteristic.Name, this.FirmwareUpdate.Name) + .setCharacteristic(this.hap.Characteristic.FirmwareUpdateStatus, true) + .setCharacteristic(this.hap.Characteristic.FirmwareUpdateReadiness, true) + .getCharacteristic(this.hap.Characteristic.FirmwareUpdateReadiness) + .onGet(() => { + return this.FirmwareUpdate.FirmwareUpdateReadiness; + }); } async statusCode(accessory: PlatformAccessory, device: device & devicesConfig, error: { message: string; }): Promise { From 1feb5a2aff0c08578b31ce505b3cd074f1b1b9ff Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sat, 25 May 2024 15:47:23 -0600 Subject: [PATCH 25/27] overrideHomeKitEnabled --- config.schema.json | 55 +++++++++++++++++++++++++++++++++------------- src/platform.ts | 2 +- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/config.schema.json b/config.schema.json index a1cf309..ddbcdc3 100644 --- a/config.schema.json +++ b/config.schema.json @@ -217,7 +217,7 @@ "type": "object", "properties": { "lockId": { - "title": "Device ID", + "title": "Lock ID", "type": "string", "placeholder": "TSSQ97FRDMX7TPGU3Z2HWNRDPQXJ9YSM" }, @@ -245,24 +245,32 @@ "description": "Allows you to hide the lock and only show the Contact Sensor. Useful for locks that already support HomeKit.", "type": "boolean", "condition": { - "functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].lockId);" + "functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].lockId && !model.options.devices[arrayIndices].hide_device);" } }, "hide_contactsensor": { "title": "Hide Lock's Contact Sensor", "type": "boolean", "condition": { - "functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].lockId);" + "functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].lockId && !model.options.devices[arrayIndices].hide_device);" } } } }, + "overrideHomeKitEnabled": { + "title": "Override HomeKit Enabled", + "type": "boolean", + "description": "By default, devices tht are HomeKit enabled will be shown in HomeKit. If you want to override this, set this to true and the device will display in the Home app.", + "condition": { + "functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].lockId && !model.options.devices[arrayIndices].hide_device);" + } + }, "firmware": { "title": "Firmware Override", "type": "string", "placeholder": "1.2.8", "condition": { - "functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].lockId);" + "functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].lockId && !model.options.devices[arrayIndices].hide_device);" } }, "refreshRate": { @@ -274,6 +282,24 @@ "functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].lockId && !model.options.devices[arrayIndices].hide_device);" } }, + "updateRate": { + "title": "Device Update Rate", + "type": "number", + "placeholder": 1, + "description": "Indicates the number of seconds between pushes to August API.", + "condition": { + "functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].lockId && !model.options.devices[arrayIndices].hide_device);" + } + }, + "pushRate": { + "title": "Device Push Rate", + "type": "number", + "placeholder": 1, + "description": "Indicates the number of seconds between pushes to August API.", + "condition": { + "functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].lockId && !model.options.devices[arrayIndices].hide_device);" + } + }, "external": { "title": "External Accessory", "type": "boolean", @@ -419,10 +445,13 @@ "options.devices[].configLockName", "options.devices[].lockId", "options.devices[].hide_device", + "options.devices[].overrideHomeKitEnabled", "options.devices[].lock.hide_lock", "options.devices[].lock.hide_contactsensor", "options.devices[].firmware", "options.devices[].refreshRate", + "options.devices[].updateRate", + "options.devices[].pushRate", "options.devices[].external", "options.devices[].logging" ] @@ -435,22 +464,18 @@ "expandable": true, "expanded": false, "items": [ - { - "type": "help", - "helpvalue": "
Refresh Rate
Refresh Rate indicates the number of seconds between polls of August API." - }, { "key": "options.refreshRate", - "notitle": true - }, + "description": "Specifies the interval, in seconds, for retrieving the latest device status from the SwitchBot API." + }, { - "type": "help", - "helpvalue": "
Push Rate
Push Rate indicates the number of seconds between pushes to August API." - }, + "key": "options.updateRate", + "description": "Specifies the interval, in seconds, at which devices will request updates from the SwitchBot API while in motion, for Curtain(s) and Blind Tilt(s) only." + }, { "key": "options.pushRate", - "notitle": true - }, + "description": "Specifies the interval, in seconds, between pushes to the SwitchBot API." + }, "options.logging" ] } diff --git a/src/platform.ts b/src/platform.ts index d6dd160..927fc90 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -349,7 +349,7 @@ export class AugustPlatform implements DynamicPlatformPlugin { } private registerDevice(device: device & devicesConfig) { - if (!device.hide_device && (!device.homeKitEnabled && device.overrideHomeKitEnabled)) { + if (!device.hide_device && !device.homeKitEnabled) { this.registeringDevice = true; this.debugLog(`Device: ${device.LockName} Enabled`); } else if (device.homeKitEnabled && device.overrideHomeKitEnabled) { From a60fac36ae6379a5ce9a5c2a5d6acf311fdc4f63 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sat, 25 May 2024 15:58:27 -0600 Subject: [PATCH 26/27] Revert "Update device.ts" This reverts commit 4264fde18991c3a06bb88ce2d4c443847afa65ef. --- src/devices/device.ts | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/src/devices/device.ts b/src/devices/device.ts index 0df7e5f..16f38ed 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -4,7 +4,7 @@ */ import type { AugustPlatform } from '../platform.js'; import type { device, devicesConfig, AugustPlatformConfig } from '../settings.js'; -import type { API, HAP, Logging, PlatformAccessory, CharacteristicValue, Service } from 'homebridge'; +import type { API, HAP, Logging, PlatformAccessory } from 'homebridge'; export abstract class deviceBase { public readonly api: API; @@ -12,14 +12,6 @@ export abstract class deviceBase { public readonly config!: AugustPlatformConfig; protected readonly hap: HAP; - // Service - FirmwareUpdate!: { - Name: string; - Service: Service; - FirmwareUpdateReadiness: CharacteristicValue; - FirmwareUpdateStatus: CharacteristicValue; - }; - // Config protected deviceLogging!: string; protected deviceRefreshRate!: number; @@ -190,25 +182,6 @@ export abstract class deviceBase { .updateValue(deviceVersion); accessory.context.deviceVersion = deviceVersion; this.debugSuccessLog(`${device.Type}: ${accessory.displayName} deviceVersion: ${accessory.context.deviceVersion}`); - - // Initialize FirmwareUpdate Service - accessory.context.FirmwareUpdate = accessory.context.FirmwareUpdate ?? {}; - this.FirmwareUpdate = { - Name: accessory.context.Battery.Name ?? `${accessory.displayName} Firmware Update`, - Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery) as Service, - FirmwareUpdateStatus: accessory.context.FirmwareUpdateStatus ?? 0, - FirmwareUpdateReadiness: accessory.context.FirmwareUpdateReadiness ?? 0, - }; - accessory.context.FirmwareUpdate = this.FirmwareUpdate as object; - // Initialize FirmwareUpdate Characteristics - this.FirmwareUpdate.Service - .setCharacteristic(this.hap.Characteristic.Name, this.FirmwareUpdate.Name) - .setCharacteristic(this.hap.Characteristic.FirmwareUpdateStatus, true) - .setCharacteristic(this.hap.Characteristic.FirmwareUpdateReadiness, true) - .getCharacteristic(this.hap.Characteristic.FirmwareUpdateReadiness) - .onGet(() => { - return this.FirmwareUpdate.FirmwareUpdateReadiness; - }); } async statusCode(accessory: PlatformAccessory, device: device & devicesConfig, error: { message: string; }): Promise { From 954b70a9224cf87333908d4999f05f1bc60a38d5 Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Sat, 25 May 2024 16:32:54 -0600 Subject: [PATCH 27/27] v2.2.0 ## [2.2.0](https://github.com/donavanbecker/homebridge-august/releases/tag/v2.2.0) (2024-05-25) ### What's Changes #### Major Changes - Devices that are Homekit enabled will now not display unless the new `overrideHomekitEnabled` device config flag is set. #### Other Changes - All for overriding `PushRate` which allows you to set how quick changes are pushed to August API with the `PushRate` config - This can be set at device or plugin level - Added Success Logs(`green`) which requires Homebridge 1.8.0 or higher - Housekeeping and updated dependencies. **Full Changelog**: https://github.com/donavanbecker/homebridge-august/compare/v2.1.0...v2.2.0 --- CHANGELOG.md | 11 +- config.schema.json | 21 +- package-lock.json | 1168 +++++++++++++++++++++-------------------- package.json | 4 +- src/devices/device.ts | 5 +- src/devices/lock.ts | 4 +- 6 files changed, 617 insertions(+), 596 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0242306..63d361c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,19 @@ All notable changes to this project will be documented in this file. This project uses [Semantic Versioning](https://semver.org/) -## [2.1.0](https://github.com/donavanbecker/homebridge-august/releases/tag/v2.1.0) (2024-05-07) +## [2.2.0](https://github.com/donavanbecker/homebridge-august/releases/tag/v2.2.0) (2024-05-25) ### What's Changes +#### Major Changes +- Devices that are Homekit enabled will now not display unless the new `overrideHomekitEnabled` device config flag is set. + +#### Other Changes +- All for overriding `PushRate` which allows you to set how quick changes are pushed to August API with the `PushRate` config + - This can be set at device or plugin level +- Added Success Logs(`green`) which requires Homebridge 1.8.0 or higher - Housekeeping and updated dependencies. -**Full Changelog**: https://github.com/donavanbecker/homebridge-august/compare/v2.0.0...v2.1.0 +**Full Changelog**: https://github.com/donavanbecker/homebridge-august/compare/v2.1.0...v2.2.0 ## [2.1.0](https://github.com/donavanbecker/homebridge-august/releases/tag/v2.1.0) (2024-05-07) diff --git a/config.schema.json b/config.schema.json index ddbcdc3..28d2764 100644 --- a/config.schema.json +++ b/config.schema.json @@ -449,8 +449,15 @@ "options.devices[].lock.hide_lock", "options.devices[].lock.hide_contactsensor", "options.devices[].firmware", + { + "key": "options.devices[].refreshRate", + "description": "Specifies the interval, in seconds, for retrieving the latest device status from the August API. This interval applies only to this specific device. Set to 0 if you would like to just receive updates from the August API" + }, + { + "key": "options.devices[].pushRate", + "description": "Specifies the interval, in seconds, between pushes to the August API for this specific device." + }, "options.devices[].refreshRate", - "options.devices[].updateRate", "options.devices[].pushRate", "options.devices[].external", "options.devices[].logging" @@ -466,16 +473,12 @@ "items": [ { "key": "options.refreshRate", - "description": "Specifies the interval, in seconds, for retrieving the latest device status from the SwitchBot API." - }, - { - "key": "options.updateRate", - "description": "Specifies the interval, in seconds, at which devices will request updates from the SwitchBot API while in motion, for Curtain(s) and Blind Tilt(s) only." - }, + "description": "Specifies the interval, in seconds, for retrieving the latest device status from the August API." + }, { "key": "options.pushRate", - "description": "Specifies the interval, in seconds, between pushes to the SwitchBot API." - }, + "description": "Specifies the interval, in seconds, between pushes to the August API." + }, "options.logging" ] } diff --git a/package-lock.json b/package-lock.json index d12f593..c1bfc58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "homebridge-august", - "version": "2.1.0", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "homebridge-august", - "version": "2.1.0", + "version": "2.2.0", "funding": [ { "type": "Paypal", @@ -20,7 +20,7 @@ "license": "ISC", "dependencies": { "@homebridge/plugin-ui-utils": "^1.0.3", - "august-yale": "^1.0.1-beta.1", + "august-yale": "^1.0.1", "rxjs": "^7.8.1" }, "devDependencies": { @@ -58,12 +58,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "peer": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.6", "picocolors": "^1.0.0" }, "engines": { @@ -71,30 +71,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -119,12 +119,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "peer": true, "dependencies": { - "@babel/types": "^7.24.5", + "@babel/types": "^7.24.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -134,37 +134,37 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", + "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", "peer": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", + "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", "peer": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "peer": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -198,19 +198,19 @@ "peer": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", + "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "semver": "^6.3.1" }, "engines": { @@ -230,12 +230,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", + "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -272,74 +272,74 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "peer": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "peer": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", + "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", "peer": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "peer": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -349,35 +349,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", + "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", "peer": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", + "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-wrap-function": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -387,14 +387,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", + "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -404,103 +404,102 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "peer": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", + "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", "peer": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "peer": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "peer": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", - "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", + "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", "peer": true, "dependencies": { - "@babel/helper-function-name": "^7.23.0", - "@babel/template": "^7.24.0", - "@babel/types": "^7.24.5" + "@babel/helper-function-name": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "peer": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -581,9 +580,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "peer": true, "bin": { "parser": "bin/babel-parser.js" @@ -593,13 +592,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", - "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", + "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -609,12 +608,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz", + "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -624,14 +623,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", + "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -641,13 +640,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", + "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -693,13 +692,13 @@ } }, "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz", - "integrity": "sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.6.tgz", + "integrity": "sha512-qPPDbYs9j5IArMFqYi85QxatHURSzRyskKpIbjrVoVglDuGdhu1s7UTCmXvP/qR2aHa3EdJ8X3iZvQAHjmdHUw==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-default-from": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-export-default-from": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -878,12 +877,12 @@ } }, "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz", - "integrity": "sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.6.tgz", + "integrity": "sha512-Nzl7kZ4tjOM2LJpejBMPwZs7OJfc26++2HsMQuSrw6gxpqXGtZZ3Rj4Zt4Qm7vulMZL2gHIGGc2stnlQnHQCqA==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -905,12 +904,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", - "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.6.tgz", + "integrity": "sha512-gNkksSdV8RbsCoHF9sjVYrHfYACMl/8U32UfUhJ9+84/ASXw8dlx+eHyyF0m6ncQJ9IBSxfuCkB36GJqYdXTOA==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -920,12 +919,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", + "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -935,12 +934,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", + "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -974,12 +973,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz", + "integrity": "sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1091,12 +1090,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz", + "integrity": "sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1122,12 +1121,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", + "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1137,14 +1136,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", + "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", "peer": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1155,14 +1154,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", + "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1172,12 +1171,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", + "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1187,12 +1186,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", + "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1202,13 +1201,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", + "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1218,13 +1217,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", + "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1235,18 +1234,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", + "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", + "peer": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "globals": "^11.1.0" }, "engines": { @@ -1266,13 +1265,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", + "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/template": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1282,12 +1281,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", + "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1297,13 +1296,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", + "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1313,12 +1312,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", + "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1328,12 +1327,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", + "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1344,13 +1343,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", + "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", "peer": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1360,12 +1359,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", + "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1376,13 +1375,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", - "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.6.tgz", + "integrity": "sha512-1l8b24NoCpaQ13Vi6FtLG1nv6kNoi8PWvQb1AYO7GHZDpFfBYc3lbXArx1lP2KRt8b4pej1eWc/zrRmsQTfOdQ==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-flow": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-flow": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1392,13 +1391,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", + "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1408,14 +1407,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", + "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1425,12 +1424,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", + "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1441,12 +1440,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", + "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1456,12 +1455,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", + "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1472,12 +1471,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", + "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1487,13 +1486,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", + "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1503,14 +1502,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", + "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1520,15 +1519,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", + "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", "peer": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1538,13 +1537,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", + "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", "peer": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1554,13 +1553,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", + "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1570,12 +1569,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", + "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1585,12 +1584,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", + "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1601,12 +1600,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", + "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1617,15 +1616,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", + "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" + "@babel/plugin-transform-parameters": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1635,13 +1634,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", + "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1651,12 +1650,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", + "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1667,13 +1666,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", + "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1684,12 +1683,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", + "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1699,13 +1698,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", + "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1715,14 +1714,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", + "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1733,12 +1732,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", + "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1748,12 +1747,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.6.tgz", + "integrity": "sha512-/3iiEEHDsJuj9QU09gbyWGSUxDboFcD7Nj6dnHIlboWSodxXAoaY/zlNMHeYAC0WsERMqgO9a7UaM77CsYgWcg==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1763,16 +1762,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.6.tgz", + "integrity": "sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-jsx": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1782,12 +1781,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.5.tgz", - "integrity": "sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.6.tgz", + "integrity": "sha512-FfZfHXtQ5jYPQsCRyLpOv2GeLIIJhs8aydpNh39vRDjhD411XcfWDni5i7OjP/Rs8GAtTn7sWFFELJSHqkIxYg==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1797,12 +1796,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", - "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.6.tgz", + "integrity": "sha512-BQTBCXmFRreU3oTUXcGKuPOfXAGb1liNY4AvvFKsOBAJ89RKcTsIrSsnMYkj59fNa66OFKnSa4AJZfy5Y4B9WA==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1812,12 +1811,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", + "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1828,12 +1827,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", + "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1843,13 +1842,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.6.tgz", + "integrity": "sha512-W3gQydMb0SY99y/2lV0Okx2xg/8KzmZLQsLaiCmwNRl1kKomz14VurEm+2TossUb+sRvBCnGe+wx8KtIgDtBbQ==", "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.1", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -1872,12 +1871,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", + "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1887,13 +1886,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", + "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1903,12 +1902,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", + "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1918,12 +1917,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", + "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1933,12 +1932,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", + "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1948,15 +1947,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", - "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.6.tgz", + "integrity": "sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1966,12 +1965,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", + "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1981,13 +1980,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", + "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1997,13 +1996,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", + "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2013,13 +2012,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", + "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2029,27 +2028,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", + "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -2061,54 +2060,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.6", + "@babel/plugin-transform-async-generator-functions": "^7.24.6", + "@babel/plugin-transform-async-to-generator": "^7.24.6", + "@babel/plugin-transform-block-scoped-functions": "^7.24.6", + "@babel/plugin-transform-block-scoping": "^7.24.6", + "@babel/plugin-transform-class-properties": "^7.24.6", + "@babel/plugin-transform-class-static-block": "^7.24.6", + "@babel/plugin-transform-classes": "^7.24.6", + "@babel/plugin-transform-computed-properties": "^7.24.6", + "@babel/plugin-transform-destructuring": "^7.24.6", + "@babel/plugin-transform-dotall-regex": "^7.24.6", + "@babel/plugin-transform-duplicate-keys": "^7.24.6", + "@babel/plugin-transform-dynamic-import": "^7.24.6", + "@babel/plugin-transform-exponentiation-operator": "^7.24.6", + "@babel/plugin-transform-export-namespace-from": "^7.24.6", + "@babel/plugin-transform-for-of": "^7.24.6", + "@babel/plugin-transform-function-name": "^7.24.6", + "@babel/plugin-transform-json-strings": "^7.24.6", + "@babel/plugin-transform-literals": "^7.24.6", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", + "@babel/plugin-transform-member-expression-literals": "^7.24.6", + "@babel/plugin-transform-modules-amd": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-modules-systemjs": "^7.24.6", + "@babel/plugin-transform-modules-umd": "^7.24.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", + "@babel/plugin-transform-new-target": "^7.24.6", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", + "@babel/plugin-transform-numeric-separator": "^7.24.6", + "@babel/plugin-transform-object-rest-spread": "^7.24.6", + "@babel/plugin-transform-object-super": "^7.24.6", + "@babel/plugin-transform-optional-catch-binding": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6", + "@babel/plugin-transform-parameters": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.24.6", + "@babel/plugin-transform-private-property-in-object": "^7.24.6", + "@babel/plugin-transform-property-literals": "^7.24.6", + "@babel/plugin-transform-regenerator": "^7.24.6", + "@babel/plugin-transform-reserved-words": "^7.24.6", + "@babel/plugin-transform-shorthand-properties": "^7.24.6", + "@babel/plugin-transform-spread": "^7.24.6", + "@babel/plugin-transform-sticky-regex": "^7.24.6", + "@babel/plugin-transform-template-literals": "^7.24.6", + "@babel/plugin-transform-typeof-symbol": "^7.24.6", + "@babel/plugin-transform-unicode-escapes": "^7.24.6", + "@babel/plugin-transform-unicode-property-regex": "^7.24.6", + "@babel/plugin-transform-unicode-regex": "^7.24.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -2133,14 +2132,14 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.1.tgz", - "integrity": "sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.6.tgz", + "integrity": "sha512-huoe0T1Qs9fQhMWbmqE/NHUeZbqmHDsN6n/jYvPcUUHfuKiPV32C9i8tDhMbQ1DEKTjbBP7Rjm3nSLwlB2X05g==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-flow-strip-types": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-transform-flow-strip-types": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2164,16 +2163,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.6.tgz", + "integrity": "sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-syntax-jsx": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2183,9 +2182,9 @@ } }, "node_modules/@babel/register": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", - "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", + "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", "peer": true, "dependencies": { "clone-deep": "^4.0.1", @@ -2208,9 +2207,9 @@ "peer": true }, "node_modules/@babel/runtime": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "peer": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2226,33 +2225,33 @@ "peer": true }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "peer": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2270,13 +2269,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "peer": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3905,6 +3904,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -4103,6 +4103,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -4135,6 +4136,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -5455,9 +5457,9 @@ } }, "node_modules/august-yale": { - "version": "1.0.1-beta.1", - "resolved": "https://registry.npmjs.org/august-yale/-/august-yale-1.0.1-beta.1.tgz", - "integrity": "sha512-p0UwPLIHCV1QsMMS708hGVm1OESIYVembOUioJ3zfO4a+iYhALNN/4RpV3FifHTKEdNHGOciG7IvEfLGCWbdFA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/august-yale/-/august-yale-1.0.1.tgz", + "integrity": "sha512-DQxQUAiRutyIvlu5s0aOPKdKidSklzamkPw7U8AVYh/gqJ8W3WFQfekbhR9RkxXatjxT5g/+qw+97tOL+HgeZw==", "funding": [ { "type": "Paypal - donavanbecker", @@ -5469,7 +5471,7 @@ } ], "dependencies": { - "pubnub": "^8.0.1", + "pubnub": "^8.2.1", "tiny-json-http": "^7.5.1" }, "engines": { @@ -6021,9 +6023,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001620", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", - "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==", + "version": "1.0.30001621", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", + "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==", "funding": [ { "type": "opencollective", @@ -7091,9 +7093,9 @@ "peer": true }, "node_modules/electron-to-chromium": { - "version": "1.4.774", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.774.tgz", - "integrity": "sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==", + "version": "1.4.783", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.783.tgz", + "integrity": "sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==", "peer": true }, "node_modules/emoji-regex": { @@ -10670,6 +10672,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -10690,6 +10693,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -10919,6 +10923,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -10960,6 +10965,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -13171,9 +13177,9 @@ "dev": true }, "node_modules/pubnub": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/pubnub/-/pubnub-8.1.0.tgz", - "integrity": "sha512-f8T+vh414WayMNokKueOZykn3tosxF1ruu3KAM/4uLy1GzLWsL5/k46lGaxqVljkMtplM/8nJlbzA+/k8kkQ3A==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/pubnub/-/pubnub-8.2.1.tgz", + "integrity": "sha512-5p7jYxygBaDJ6knP3b9apgfITYXUZS56Xnpdr9JddVKUEcmHA4tSMcLk3zhf2rKdNyiZSFiAeWy4T1ZvNrWZHg==", "dependencies": { "agentkeepalive": "^3.5.2", "buffer": "^6.0.3", @@ -15026,6 +15032,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -15046,6 +15053,7 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "peer": true, "dependencies": { "glob": "^7.1.3" diff --git a/package.json b/package.json index 1474bd4..c1b9184 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "displayName": "August", "name": "homebridge-august", - "version": "2.1.0", + "version": "2.2.0", "description": "The August plugin allows you to access your August & Yale device(s) from HomeKit.", "author": { "name": "donavanbecker", @@ -51,7 +51,7 @@ ], "dependencies": { "@homebridge/plugin-ui-utils": "^1.0.3", - "august-yale": "^1.0.1-beta.1", + "august-yale": "^1.0.1", "rxjs": "^7.8.1" }, "devDependencies": { diff --git a/src/devices/device.ts b/src/devices/device.ts index 16f38ed..37f7fdc 100644 --- a/src/devices/device.ts +++ b/src/devices/device.ts @@ -3,8 +3,8 @@ * device.ts: homebridge-august. */ import type { AugustPlatform } from '../platform.js'; -import type { device, devicesConfig, AugustPlatformConfig } from '../settings.js'; import type { API, HAP, Logging, PlatformAccessory } from 'homebridge'; +import type { device, devicesConfig, AugustPlatformConfig } from '../settings.js'; export abstract class deviceBase { public readonly api: API; @@ -122,6 +122,9 @@ export abstract class deviceBase { if (device.refreshRate !== undefined) { deviceConfig['refreshRate'] = device.refreshRate; } + if (device.overrideHomeKitEnabled === true) { + deviceConfig['refreshRate'] = device.refreshRate; + } if (device.updateRate !== undefined) { deviceConfig['refreshRate'] = device.updateRate; } diff --git a/src/devices/lock.ts b/src/devices/lock.ts index 026d6fb..a114cc4 100644 --- a/src/devices/lock.ts +++ b/src/devices/lock.ts @@ -2,10 +2,10 @@ * * lock.ts: homebridge-august. */ +import August from 'august-yale'; +import { deviceBase } from './device.js'; import { interval, Subject } from 'rxjs'; import { debounceTime, skipWhile, tap } from 'rxjs/operators'; -import { deviceBase } from './device.js'; -import August from 'august-yale'; import type { AugustPlatform } from '../platform.js'; import type { device, lockDetails, devicesConfig } from '../settings.js';