diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8f23cd8e..cca06f33 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file.
If you like this project and find it useful, please consider giving it a star on GitHub at https://github.com/Luligu/matterbridge and sponsoring it.
+### Home Assistant Community Add-ons
+
+The Home Assistant Community Add-ons and plugins are not verified to work with Matterbridge. I strongly advise against using them. If you do use them and encounter an issue (which is likely because some do not meet the Matterbridge guidelines), please do not open an issue in the Matterbridge repository.
+
+## [1.5.5] - 2024-09-09
+
+### Changed
+
+- [matterbridge]: Changed startMatterInterval from 30 to 60 seconds.
+- [package]: Update matter-node.js to 0.10.1.
+- [package]: Update matter-history to 1.1.11.
+- [package]: Update dependencies.
+
+
+
+
+
## [1.5.4] - 2024-09-05
### Changed
diff --git a/README-DEV.md b/README-DEV.md
index c945635f..de644e7a 100644
--- a/README-DEV.md
+++ b/README-DEV.md
@@ -38,14 +38,21 @@ Matterbridge exports from:
- NodeStorage classes.
# **********
-A plugin will never ever install and import from matter-node.js or matter.js directly cause this leads to a second instance of matter.js that causes instability and unpredictable errors like "The only instance is Enpoint".
+A plugin must never install or import from `matter-node.js` or `matter.js` directly, as this leads to a second instance of `matter.js`, causing instability and unpredictable errors such as "The only instance is Endpoint". Additionally, when Matterbridge updates the `matter.js` version, it should be consistent across all plugins.
# **********
-A plugin will never ever install matterbridge (not dependencies and not devDependencies). Matterbridge must be linked to the plugin.
+A plugin must never install Matterbridge (neither as dependencies nor as devDependencies). Matterbridge must be linked to the plugin:
+```json
+"scripts": {
+ '''
+ "install": "node link-matterbridge-script.js",
+ '''
+}
+```
# **********
In the next releases I will remove the duplicated exports so please update your plugins.
-I will also add some error messages when a plugin has wrong imports.
+I added some error messages when a plugin has wrong imports or configurations and the plugin will be disabled to prevent instability and crashes.
## Guidelines on the migration to matter.js V8
diff --git a/README.md b/README.md
index 7c34fda4..764f402d 100644
--- a/README.md
+++ b/README.md
@@ -132,6 +132,10 @@ Config editor:
[Advanced configurations](https://github.com/Luligu/matterbridge/blob/main/README-DOCKER.md)
+### Home Assistant Community Add-ons
+
+The Home Assistant Community Add-ons and plugins are not verified to work with Matterbridge. I strongly advise against using them. If you do use them and encounter an issue (which is likely because some do not meet the Matterbridge guidelines), please do not open an issue in the Matterbridge repository.
+
## Development
[Development](https://github.com/Luligu/matterbridge/blob/main/README-DEV.md)
@@ -201,14 +205,29 @@ An Accessory platform plugin only exposes one device.
This an example of a dynamic platform plugin.
-It exposes a switch with onOff, a light with onOff-levelControl-colorControl, an outlet with onOff and a WindoweCovering device.
+It exposes:
+- a switch with onOff cluster
+- a light with onOff
+- a light with onOff and levelControl (dimmer)
+- a light with onOff, levelControl and colorControl (with XY, HS and CT) clusters
+- a light with onOff, levelControl and colorControl (with HS only) clusters
+- a light with onOff, levelControl and colorControl (with XY only) clusters
+- a light with onOff, levelControl and colorControl (with CT only) clusters
+- an outlet (plug) with onOff cluster
+- a cover with windowCovering cluster
+- a lock with doorLock cluster
+- a thermo with thermostat cluster and 3 sub endpoints with flowMeasurement cluster, temperatureMeasurement cluster
+ and relativeHumidityMeasurement cluster (to show how to create a composed device with sub endpoints)
+- a fan with FanControl cluster
+- a rainSensor device
+- a waterFreezeDetector device
+- a waterLeakDetector device
+- a smokeCoAlarm device
All these virtual devices continuously change state and position. The plugin also shows how to use all the command handlers (you can control all the devices).
A Dynamic platform plugin exposes as many devices as you need (the limit for the Home app is 150 accessories for bridge).
-Matterbridge can run as many plugins as you want.
-
[See the plugin homepage here](https://github.com/Luligu/matterbridge-example-dynamic-platform)
### Example plugins to show the usage of history in matter
@@ -231,7 +250,6 @@ The Eve app only shows the history when the plugins run like an AccessoryPlatfor
Just open the frontend on the link provided in the log, select a plugin and click install.
-
## How to install and add a plugin manually from a terminal (from npm)
To install i.e. https://github.com/Luligu/matterbridge-zigbee2mqtt
@@ -314,15 +332,18 @@ All issues have been solved from the version 17.5 of the HomePod/AppleTV. Now th
So far is the only controller supporting some Matter 1.2 and 1.3 device type:
-- air quality sensor (Matter 1.2)
-
-Also supports (probably only like BooleanState cluster):
+- airQualitySensor code 0x002c (Matter 1.2)
+- waterFreezeDetector code 0x0041 (Matter 1.3 with only BooleanState cluster)
+- waterLeakDetector code 0x0043 (Matter 1.3 with only BooleanState cluster)
+- rainSensor code 0x0044 (Matter 1.3 with only BooleanState cluster)
+- deviceEnergyManagement code 0x050d (Matter 1.3 with only DeviceEnergyManagementMode cluster)
-- waterFreezeDetector (Matter 1.3)
-- waterLeakDetector (Matter 1.3)
-- rainSensor (Matter 1.3)
+Electrical measurements:
+- electrical measurements from EveHistoryCluster (used in Matterbridge plugins)
+- electricalSensor code 0x0510 with clusters: ElectricalPowerMeasurement and ElectricalEnergyMeasurement (still in dev but fully working!)
-HA also support electrical measurements from EveHistoryCluster (used in Matterbridge plugins)
+Other supported cluster:
+- ModeSelect
## Home Assistant issues (Matter Server for HA is still in Beta)
diff --git a/package-lock.json b/package-lock.json
index 1f20c4a8..e7500a55 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,21 +1,21 @@
{
"name": "matterbridge",
- "version": "1.5.3",
+ "version": "1.5.5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "matterbridge",
- "version": "1.5.3",
+ "version": "1.5.5",
"license": "Apache-2.0",
"dependencies": {
- "@project-chip/matter-node.js": "0.10.0",
- "@project-chip/matter.js": "0.10.0",
+ "@project-chip/matter-node.js": "0.10.1",
+ "@project-chip/matter.js": "0.10.1",
"archiver": "7.0.1",
"express": "4.19.2",
"glob": "11.0.0",
"https": "1.0.0",
- "matter-history": "^1.1.8",
+ "matter-history": "1.1.11",
"node-ansi-logger": "3.0.0",
"node-persist-manager": "1.0.8",
"ws": "8.18.0"
@@ -24,23 +24,23 @@
"matterbridge": "dist/cli.js"
},
"devDependencies": {
- "@eslint/js": "9.9.1",
+ "@eslint/js": "9.10.0",
"@types/archiver": "6.0.2",
"@types/eslint__js": "8.42.3",
"@types/express": "4.17.21",
"@types/jest": "29.5.12",
- "@types/node": "22.5.1",
+ "@types/node": "22.5.4",
"@types/ws": "8.5.12",
- "eslint": "9.9.1",
+ "eslint": "9.10.0",
"eslint-config-prettier": "9.1.0",
- "eslint-plugin-jest": "28.8.1",
+ "eslint-plugin-jest": "28.8.3",
"eslint-plugin-prettier": "5.2.1",
"jest": "29.7.0",
"prettier": "3.3.3",
"rimraf": "6.0.1",
"ts-jest": "29.2.5",
"typescript": "5.5.4",
- "typescript-eslint": "8.3.0"
+ "typescript-eslint": "8.4.0"
},
"engines": {
"node": ">=18.0.0"
@@ -767,9 +767,9 @@
}
},
"node_modules/@eslint/js": {
- "version": "9.9.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz",
- "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==",
+ "version": "9.10.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz",
+ "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -786,6 +786,19 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz",
+ "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -1431,12 +1444,12 @@
}
},
"node_modules/@project-chip/matter-node.js": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/@project-chip/matter-node.js/-/matter-node.js-0.10.0.tgz",
- "integrity": "sha512-J0S5ZTU3UaTU+PVlZtXzEJ2Wpdlzfez82KsDC62kzClPOWcI2rz6543c8nkFJQ+8+scwkQmUowC/DoqecjOvtw==",
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@project-chip/matter-node.js/-/matter-node.js-0.10.1.tgz",
+ "integrity": "sha512-yr8kALp9cfnoR/14QXA063CUayHa33uQWVO3/UPKL2AWysvtBPNcF2O0siFNNXWcdbFJFckr4O7Fqj0HejOg4A==",
"license": "Apache-2.0",
"dependencies": {
- "@project-chip/matter.js": "0.10.0",
+ "@project-chip/matter.js": "0.10.1",
"node-localstorage": "^3.0.5"
},
"engines": {
@@ -1444,9 +1457,9 @@
}
},
"node_modules/@project-chip/matter.js": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/@project-chip/matter.js/-/matter.js-0.10.0.tgz",
- "integrity": "sha512-dCiZkhMspdj2rehFRHWb4DCV7mpPvKTcQRLnwfjyXIBurfo7PDxPTp3IF0SyzW5+llLwaX76H9UXZxaok3Qt1w==",
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@project-chip/matter.js/-/matter.js-0.10.1.tgz",
+ "integrity": "sha512-A+FooC/xJadFJYLFMj3O+taNi70QrHDTQjWvb/9woJx5AYwca89Coid+LQV4GNtAH4qjVcLot9wbOY2MpKs+Mw==",
"license": "Apache-2.0",
"dependencies": {
"@noble/curves": "^1.5.0"
@@ -1679,9 +1692,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.5.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.1.tgz",
- "integrity": "sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==",
+ "version": "22.5.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz",
+ "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1770,17 +1783,17 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz",
- "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz",
+ "integrity": "sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.3.0",
- "@typescript-eslint/type-utils": "8.3.0",
- "@typescript-eslint/utils": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0",
+ "@typescript-eslint/scope-manager": "8.4.0",
+ "@typescript-eslint/type-utils": "8.4.0",
+ "@typescript-eslint/utils": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0",
"graphemer": "^1.4.0",
"ignore": "^5.3.1",
"natural-compare": "^1.4.0",
@@ -1803,158 +1816,17 @@
}
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz",
- "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz",
- "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz",
- "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "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.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz",
- "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.3.0",
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/typescript-estree": "8.3.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/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz",
- "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/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,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/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,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@typescript-eslint/parser": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz",
- "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.4.0.tgz",
+ "integrity": "sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.3.0",
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/typescript-estree": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0",
+ "@typescript-eslint/scope-manager": "8.4.0",
+ "@typescript-eslint/types": "8.4.0",
+ "@typescript-eslint/typescript-estree": "8.4.0",
+ "@typescript-eslint/visitor-keys": "8.4.0",
"debug": "^4.3.4"
},
"engines": {
@@ -1973,124 +1845,6 @@
}
}
},
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz",
- "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz",
- "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz",
- "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "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.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz",
- "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/parser/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,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@typescript-eslint/parser/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,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@typescript-eslint/scope-manager": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz",
@@ -2110,76 +1864,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz",
- "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/typescript-estree": "8.3.0",
- "@typescript-eslint/utils": "8.3.0",
- "debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
- },
- "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/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz",
- "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz",
- "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz",
+ "integrity": "sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz",
- "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==",
- "dev": true,
- "license": "BSD-2-Clause",
"dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0",
+ "@typescript-eslint/typescript-estree": "8.4.0",
+ "@typescript-eslint/utils": "8.4.0",
"debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
"ts-api-utils": "^1.3.0"
},
"engines": {
@@ -2195,86 +1888,6 @@
}
}
},
- "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz",
- "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.3.0",
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/typescript-estree": "8.3.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/type-utils/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz",
- "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils/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,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@typescript-eslint/type-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,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@typescript-eslint/types": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz",
@@ -3026,9 +2639,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001655",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz",
- "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==",
+ "version": "1.0.30001659",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001659.tgz",
+ "integrity": "sha512-Qxxyfv3RdHAfJcXelgf0hU4DFUVXBGTjqrBUZLUh8AtlGnsDo+CnncYtTd95+ZKfnANUOzxyIQCuU/UeBZBYoA==",
"dev": true,
"funding": [
{
@@ -3090,9 +2703,9 @@
}
},
"node_modules/cjs-module-lexer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz",
- "integrity": "sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz",
+ "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
"dev": true,
"license": "MIT"
},
@@ -3321,13 +2934,13 @@
}
},
"node_modules/debug": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
- "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -3455,9 +3068,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.13",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz",
- "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==",
+ "version": "1.5.18",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.18.tgz",
+ "integrity": "sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==",
"dev": true,
"license": "ISC"
},
@@ -3550,9 +3163,9 @@
}
},
"node_modules/eslint": {
- "version": "9.9.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz",
- "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==",
+ "version": "9.10.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz",
+ "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3560,7 +3173,8 @@
"@eslint-community/regexpp": "^4.11.0",
"@eslint/config-array": "^0.18.0",
"@eslint/eslintrc": "^3.1.0",
- "@eslint/js": "9.9.1",
+ "@eslint/js": "9.10.0",
+ "@eslint/plugin-kit": "^0.1.0",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.3.0",
"@nodelib/fs.walk": "^1.2.8",
@@ -3583,7 +3197,6 @@
"is-glob": "^4.0.0",
"is-path-inside": "^3.0.3",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
@@ -3623,9 +3236,9 @@
}
},
"node_modules/eslint-plugin-jest": {
- "version": "28.8.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.1.tgz",
- "integrity": "sha512-G46XMyYu6PtSNJUkQ0hsPjzXYpzq/O4vpCciMizTKRJG8kNsRreGoMRDG6H9FIB/xVgfFuclVnuX4XRvFUzrZQ==",
+ "version": "28.8.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz",
+ "integrity": "sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5670,13 +5283,13 @@
}
},
"node_modules/matter-history": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/matter-history/-/matter-history-1.1.8.tgz",
- "integrity": "sha512-jHYJYwyRu7yAnGInlPAGMr0vVTE3qe/Sl93C9K2aPdhvGLBe6TrQp8C5CUq2Mj7FyhjLZ5yXZkC1dFYPUc0m/A==",
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/matter-history/-/matter-history-1.1.11.tgz",
+ "integrity": "sha512-wbdg/mIN22PDKFKKv1nTrtYMArWDmbI2KdhfRQeNlAX992aKZ+moQC98cyQ3RBR21EBSAFv3pwA7LuczzIJurQ==",
"license": "Apache-2.0",
"dependencies": {
- "@project-chip/matter-node.js": "0.10.0",
- "@project-chip/matter.js": "0.10.0",
+ "@project-chip/matter-node.js": "0.10.1",
+ "@project-chip/matter.js": "0.10.1",
"moment": "2.30.1",
"node-ansi-logger": "3.0.0"
},
@@ -5818,10 +5431,9 @@
}
},
"node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true,
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/natural-compare": {
@@ -6149,9 +5761,9 @@
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz",
- "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==",
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz",
+ "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==",
"license": "ISC",
"engines": {
"node": "20 || >=22"
@@ -6721,12 +6333,6 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
@@ -7332,76 +6938,15 @@
}
},
"node_modules/typescript-eslint": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.3.0.tgz",
- "integrity": "sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/eslint-plugin": "8.3.0",
- "@typescript-eslint/parser": "8.3.0",
- "@typescript-eslint/utils": "8.3.0"
- },
- "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/typescript-eslint/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz",
- "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz",
- "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.4.0.tgz",
+ "integrity": "sha512-67qoc3zQZe3CAkO0ua17+7aCLI0dU+sSQd1eKPGq06QE4rfQjstVXR6woHO5qQvGUa550NfGckT4tzh3b3c8Pw==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz",
- "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==",
- "dev": true,
- "license": "BSD-2-Clause",
"dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/visitor-keys": "8.3.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "@typescript-eslint/eslint-plugin": "8.4.0",
+ "@typescript-eslint/parser": "8.4.0",
+ "@typescript-eslint/utils": "8.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -7416,86 +6961,6 @@
}
}
},
- "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz",
- "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.3.0",
- "@typescript-eslint/types": "8.3.0",
- "@typescript-eslint/typescript-estree": "8.3.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/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz",
- "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.3.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/typescript-eslint/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,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/typescript-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==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/typescript-eslint/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/undici-types": {
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
diff --git a/package.json b/package.json
index 0a234183..2383de45 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "matterbridge",
- "version": "1.5.4",
+ "version": "1.5.5",
"description": "Matterbridge plugin manager for Matter",
"author": "https://github.com/Luligu",
"license": "Apache-2.0",
@@ -77,6 +77,7 @@
"scripts": {
"build": "tsc",
"watch": "tsc --watch",
+ "start": "node ./dist/cli.js",
"start:test": "node ./dist/cli.js -test",
"start:bridge": "node ./dist/cli.js -bridge",
"start:childbridge": "node ./dist/cli.js -childbridge",
@@ -100,9 +101,9 @@
"format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,json,css,md}\"",
"clean": "rimraf tsconfig.tsbuildinfo ./dist",
"cleanBuild": "npm run clean && npm run build",
- "deepClean": "rimraf tsconfig.tsbuildinfo package-lock.json ./dist ./node_modules",
+ "deepClean": "rimraf tsconfig.tsbuildinfo package-lock.json npm-shrinkwrap.json ./dist ./node_modules",
"deepCleanRebuild": "npm run deepClean && npm install && npm run build",
- "prepublishOnly": "npm run lint && npm run cleanBuild",
+ "prepublishOnly": "npm run lint && npm run cleanBuild && npm shrinkwrap",
"checkDependencies": "npx npm-check-updates",
"updateDependencies": "npx npm-check-updates -u && npm install & npm run cleanBuild",
"updateMatter:latest": "npm run deepClean && npm install @project-chip/matter-node.js@latest @project-chip/matter.js@latest && npm install && npm run build",
@@ -125,34 +126,34 @@
"install:jest": "npm install --save-dev jest ts-jest @types/jest eslint-plugin-jest"
},
"dependencies": {
- "@project-chip/matter-node.js": "0.10.0",
- "@project-chip/matter.js": "0.10.0",
+ "@project-chip/matter-node.js": "0.10.1",
+ "@project-chip/matter.js": "0.10.1",
"archiver": "7.0.1",
"express": "4.19.2",
"glob": "11.0.0",
"https": "1.0.0",
- "matter-history": "^1.1.8",
+ "matter-history": "1.1.11",
"node-ansi-logger": "3.0.0",
"node-persist-manager": "1.0.8",
"ws": "8.18.0"
},
"devDependencies": {
- "@eslint/js": "9.9.1",
+ "@eslint/js": "9.10.0",
"@types/archiver": "6.0.2",
"@types/eslint__js": "8.42.3",
"@types/express": "4.17.21",
"@types/jest": "29.5.12",
- "@types/node": "22.5.1",
+ "@types/node": "22.5.4",
"@types/ws": "8.5.12",
- "eslint": "9.9.1",
+ "eslint": "9.10.0",
"eslint-config-prettier": "9.1.0",
- "eslint-plugin-jest": "28.8.1",
+ "eslint-plugin-jest": "28.8.3",
"eslint-plugin-prettier": "5.2.1",
"jest": "29.7.0",
"prettier": "3.3.3",
"rimraf": "6.0.1",
"ts-jest": "29.2.5",
"typescript": "5.5.4",
- "typescript-eslint": "8.3.0"
+ "typescript-eslint": "8.4.0"
}
}
\ No newline at end of file
diff --git a/src/matterbridge.ts b/src/matterbridge.ts
index 29b478f1..09f8a9ce 100644
--- a/src/matterbridge.ts
+++ b/src/matterbridge.ts
@@ -257,7 +257,7 @@ export class Matterbridge extends EventEmitter {
if (hasParameter('docker')) this.restartMode = 'docker';
// Set the matterbridge directory
- this.homeDirectory = os.homedir();
+ this.homeDirectory = getParameter('homedir') ?? os.homedir();
this.matterbridgeDirectory = path.join(this.homeDirectory, '.matterbridge');
// Initialize nodeStorage and nodeContext
@@ -651,7 +651,7 @@ export class Matterbridge extends EventEmitter {
plugin.schemaJson = await this.plugins.loadSchema(plugin);
// Check if the plugin is available
if (!(await this.plugins.resolve(plugin.path))) {
- this.log.error(`Plugin ${plg}${plugin.name}${er} not found. Disabling it.`);
+ this.log.error(`Plugin ${plg}${plugin.name}${er} not found or not validated. Disabling it.`);
plugin.enabled = false;
plugin.error = true;
continue;
@@ -692,7 +692,7 @@ export class Matterbridge extends EventEmitter {
plugin.schemaJson = await this.plugins.loadSchema(plugin);
// Check if the plugin is available
if (!(await this.plugins.resolve(plugin.path))) {
- this.log.error(`Plugin ${plg}${plugin.name}${er} not found. Disabling it.`);
+ this.log.error(`Plugin ${plg}${plugin.name}${er} not found or not validated. Disabling it.`);
plugin.enabled = false;
plugin.error = true;
continue;
@@ -818,7 +818,7 @@ export class Matterbridge extends EventEmitter {
this.log.debug(`- System Uptime: ${this.systemInformation.systemUptime}`);
// Home directory
- this.homeDirectory = os.homedir();
+ this.homeDirectory = getParameter('homedir') ?? os.homedir();
this.matterbridgeInformation.homeDirectory = this.homeDirectory;
this.log.debug(`Home Directory: ${this.homeDirectory}`);
@@ -1508,7 +1508,7 @@ export class Matterbridge extends EventEmitter {
// Plugins are loaded and started by loadPlugin on startup and plugin.loaded and plugin.started are set to true
// Plugins are configured by a timer when matter server is started and plugin.configured is set to true
- this.log.debug('***Starting startMatterInterval in bridge mode');
+ this.log.debug('Starting startMatterInterval in bridge mode');
let failCount = 0;
this.startMatterInterval = setInterval(async () => {
for (const plugin of this.plugins) {
@@ -1517,7 +1517,7 @@ export class Matterbridge extends EventEmitter {
if (plugin.error) {
clearInterval(this.startMatterInterval);
this.startMatterInterval = undefined;
- this.log.debug('***Cleared startMatterInterval interval for Matterbridge for plugin in error state');
+ this.log.debug('Cleared startMatterInterval interval for Matterbridge for plugin in error state');
this.log.error(`The plugin ${plg}${plugin.name}${er} is in error state.`);
this.log.error('The bridge will not start until the problem is solved to prevent the controllers from deleting all registered devices.');
this.log.error('If you want to start the bridge disable the plugin in error state and restart.');
@@ -1525,9 +1525,9 @@ export class Matterbridge extends EventEmitter {
}
if (!plugin.loaded || !plugin.started) {
- this.log.debug(`***Waiting (failSafeCount=${failCount}/30) in startMatterInterval interval for plugin ${plg}${plugin.name}${db} loaded: ${plugin.loaded} started: ${plugin.started}...`);
+ this.log.debug(`Waiting (failSafeCount=${failCount}/60) in startMatterInterval interval for plugin ${plg}${plugin.name}${db} loaded: ${plugin.loaded} started: ${plugin.started}...`);
failCount++;
- if (failCount > 30) {
+ if (failCount > 60) {
this.log.error(`Error waiting for plugin ${plg}${plugin.name}${er} to load and start. Plugin is in error state.`);
plugin.error = true;
}
@@ -1536,7 +1536,7 @@ export class Matterbridge extends EventEmitter {
}
clearInterval(this.startMatterInterval);
this.startMatterInterval = undefined;
- this.log.debug('***Cleared startMatterInterval interval for Matterbridge');
+ this.log.debug('Cleared startMatterInterval interval for Matterbridge');
await this.startMatterServer();
this.log.notice('Matter server started');
@@ -1576,7 +1576,7 @@ export class Matterbridge extends EventEmitter {
// addDevice and addBridgedDeevice create the commissionig servers and add the devices to the the commissioning server or to the aggregator
// Plugins are configured by a timer when matter server is started and plugin.configured is set to true
- this.log.debug('***Starting start matter interval in childbridge mode...');
+ this.log.debug('Starting start matter interval in childbridge mode...');
let failCount = 0;
this.startMatterInterval = setInterval(async () => {
let allStarted = true;
@@ -1586,19 +1586,19 @@ export class Matterbridge extends EventEmitter {
if (plugin.error) {
clearInterval(this.startMatterInterval);
this.startMatterInterval = undefined;
- this.log.debug('***Cleared startMatterInterval interval for Matterbridge for plugin in error state');
+ this.log.debug('Cleared startMatterInterval interval for Matterbridge for plugin in error state');
this.log.error(`The plugin ${plg}${plugin.name}${er} is in error state.`);
this.log.error('The bridge will not start until the problem is solved to prevent the controllers from deleting all registered devices.');
this.log.error('If you want to start the bridge disable the plugin in error state and restart.');
return;
}
- this.log.debug(`***Checking plugin ${plg}${plugin.name}${db} to start matter in childbridge mode...`);
+ this.log.debug(`Checking plugin ${plg}${plugin.name}${db} to start matter in childbridge mode...`);
if (!plugin.loaded || !plugin.started) {
allStarted = false;
- this.log.debug(`***Waiting (failSafeCount=${failCount}/30) for plugin ${plg}${plugin.name}${db} to load (${plugin.loaded}) and start (${plugin.started}) ...`);
+ this.log.debug(`Waiting (failSafeCount=${failCount}/60) for plugin ${plg}${plugin.name}${db} to load (${plugin.loaded}) and start (${plugin.started}) ...`);
failCount++;
- if (failCount > 30) {
+ if (failCount > 60) {
this.log.error(`Error waiting for plugin ${plg}${plugin.name}${er} to load and start. Plugin is in error mode.`);
plugin.error = true;
}
@@ -1607,7 +1607,7 @@ export class Matterbridge extends EventEmitter {
if (!allStarted) return;
clearInterval(this.startMatterInterval);
this.startMatterInterval = undefined;
- this.log.debug('***Cleared startMatterInterval interval in childbridge mode');
+ this.log.debug('Cleared startMatterInterval interval in childbridge mode');
await this.startMatterServer();
this.log.notice('Matter server started');
diff --git a/src/matterbridgeDevice.test.ts b/src/matterbridgeDevice.test.ts
index 9b33be1f..391e79f7 100644
--- a/src/matterbridgeDevice.test.ts
+++ b/src/matterbridgeDevice.test.ts
@@ -592,11 +592,11 @@ describe('Matterbridge device', () => {
expect(() => device.verifyRequiredClusters()).not.toThrow();
expect(device.getAllClusterServers()).toHaveLength(5);
device.createDefaultLatchingSwitchClusterServer();
- expect(device.getAllClusterServers()).toHaveLength(6);
+ expect(device.getAllClusterServers()).toHaveLength(5);
device.createDefaultLatchingSwitchClusterServer();
- expect(device.getAllClusterServers()).toHaveLength(6);
+ expect(device.getAllClusterServers()).toHaveLength(5);
device.createDefaultSwitchClusterServer();
- expect(device.getAllClusterServers()).toHaveLength(6);
+ expect(device.getAllClusterServers()).toHaveLength(5);
// logEndpoint(device);
});
diff --git a/src/matterbridgeDevice.ts b/src/matterbridgeDevice.ts
index cc2b04bb..7177fe75 100644
--- a/src/matterbridgeDevice.ts
+++ b/src/matterbridgeDevice.ts
@@ -1927,8 +1927,6 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods {
- this.log.debug('Matter command: changeToMode', data.request);
+ this.log.debug('Matter command: ModeSelectCluster.changeToMode', data.request);
await this.commandHandler.executeHandler('changeToMode', data);
},
},
diff --git a/src/matterbridgePlatform.ts b/src/matterbridgePlatform.ts
index e965e471..8a74f685 100644
--- a/src/matterbridgePlatform.ts
+++ b/src/matterbridgePlatform.ts
@@ -120,4 +120,30 @@ export class MatterbridgePlatform {
async unregisterAllDevices() {
await this.matterbridge.removeAllBridgedDevices(this.name);
}
+
+ /**
+ * Verifies if the Matterbridge version meets the required version.
+ * @param {string} requiredVersion - The required version to compare against.
+ * @returns {boolean} True if the Matterbridge version meets or exceeds the required version, false otherwise.
+ */
+ verifyMatterbridgeVersion(requiredVersion: string): boolean {
+ const compareVersions = (matterbridgeVersion: string, requiredVersion: string): boolean => {
+ const stripTag = (v: string) => v.split('-')[0];
+ const v1Parts = stripTag(matterbridgeVersion).split('.').map(Number);
+ const v2Parts = stripTag(requiredVersion).split('.').map(Number);
+ for (let i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) {
+ const v1Part = v1Parts[i] || 0;
+ const v2Part = v2Parts[i] || 0;
+ if (v1Part < v2Part) {
+ return false;
+ } else if (v1Part > v2Part) {
+ return true;
+ }
+ }
+ return true;
+ };
+
+ if (!compareVersions(this.matterbridge.matterbridgeVersion, requiredVersion)) return false;
+ return true;
+ }
}
diff --git a/src/mock/plugin1/package.json b/src/mock/plugin1/package.json
index 2207467d..e28ec82d 100644
--- a/src/mock/plugin1/package.json
+++ b/src/mock/plugin1/package.json
@@ -6,5 +6,8 @@
"license": "Apache-2.0",
"type": "module",
"main": "./index.js",
- "types": "./index.d.ts"
-}
+ "types": "./index.d.ts",
+ "scripts": {
+ "install": "node link-matterbridge-script.js"
+ }
+}
\ No newline at end of file
diff --git a/src/mock/plugin2/package.json b/src/mock/plugin2/package.json
index c06238fa..9e377b82 100644
--- a/src/mock/plugin2/package.json
+++ b/src/mock/plugin2/package.json
@@ -6,5 +6,8 @@
"license": "Apache-2.0",
"type": "module",
"main": "./index.js",
- "types": "./index.d.ts"
-}
+ "types": "./index.d.ts",
+ "scripts": {
+ "install": "node link-matterbridge-script.js"
+ }
+}
\ No newline at end of file
diff --git a/src/mock/plugin3/package.json b/src/mock/plugin3/package.json
index 961632f8..c375056d 100644
--- a/src/mock/plugin3/package.json
+++ b/src/mock/plugin3/package.json
@@ -6,5 +6,8 @@
"license": "Apache-2.0",
"type": "module",
"main": "./index.js",
- "types": "./index.d.ts"
-}
+ "types": "./index.d.ts",
+ "scripts": {
+ "install": "node link-matterbridge-script.js"
+ }
+}
\ No newline at end of file
diff --git a/src/pluginManager.test.ts b/src/pluginManager.test.ts
index 8b9393d5..a30deae1 100644
--- a/src/pluginManager.test.ts
+++ b/src/pluginManager.test.ts
@@ -132,7 +132,8 @@ describe('PluginManager', () => {
// loggerLogSpy.mockRestore();
// consoleLogSpy.mockRestore();
- expect(await plugins.resolve('')).not.toBeNull(); // Should return the package.json file of the matterbridge
+ // expect(await plugins.resolve('./package.json')).toBeNull(); // Should return the package.json file of the matterbridge with wrong imports
+ // expect((plugins as any).log.log).toHaveBeenCalledWith(LogLevel.ERROR, `Please open an issue on the plugin repository to remove them.`);
expect(await plugins.resolve('xyz')).toBeNull();
expect(await plugins.resolve('./src/mock/plugin1')).not.toBeNull();
expect(await plugins.resolve('./src/mock/plugin2')).not.toBeNull();
diff --git a/src/pluginManager.ts b/src/pluginManager.ts
index 7b90ad18..5a4fd421 100644
--- a/src/pluginManager.ts
+++ b/src/pluginManager.ts
@@ -153,9 +153,62 @@ export class PluginManager {
// Load the package.json of the plugin
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
if (!packageJson.name) {
- this.log.debug(`Package.json name not found at ${packageJsonPath}`);
+ this.log.error(`Package.json name not found at ${packageJsonPath}`);
return null;
}
+
+ // Check for main issues
+ if (!packageJson.type || packageJson.type !== 'module') {
+ this.log.error(`Plugin at ${packageJsonPath} is not a module`);
+ return null;
+ }
+ if (!packageJson.main) {
+ this.log.error(`Plugin at ${packageJsonPath} has no main entrypoint in package.json`);
+ return null;
+ }
+ if (!packageJson.types) {
+ this.log.error(`Plugin at ${packageJsonPath} has no types in package.json`);
+ return null;
+ }
+ if (!packageJson.scripts.install || packageJson.scripts.install !== 'node link-matterbridge-script.js') {
+ this.log.error(`Plugin at ${packageJsonPath} has not the correct install script in package.json`);
+ return null;
+ }
+
+ // Check for @project-chip packages in dependencies and devDependencies
+ const checkForProjectChipPackages = (dependencies: Record) => {
+ return Object.keys(dependencies).filter((pkg) => pkg.startsWith('@project-chip'));
+ };
+ const projectChipDependencies = checkForProjectChipPackages(packageJson.dependencies || {});
+ if (projectChipDependencies.length > 0) {
+ this.log.error(`Found @project-chip packages "${projectChipDependencies.join(', ')}" in plugin dependencies.`);
+ this.log.error(`Please open an issue on the plugin repository to remove them.`);
+ return null;
+ }
+ const projectChipDevDependencies = checkForProjectChipPackages(packageJson.devDependencies || {});
+ if (projectChipDevDependencies.length > 0) {
+ this.log.error(`Found @project-chip packages "${projectChipDevDependencies.join(', ')}" in plugin devDependencies.`);
+ this.log.error(`Please open an issue on the plugin repository to remove them.`);
+ return null;
+ }
+
+ // Check for matterbridge package in dependencies and devDependencies
+ const checkForMatterbridgePackage = (dependencies: Record) => {
+ return Object.keys(dependencies).filter((pkg) => pkg === 'matterbridge');
+ };
+ const matterbridgeDependencies = checkForMatterbridgePackage(packageJson.dependencies || {});
+ if (matterbridgeDependencies.length > 0) {
+ this.log.error(`Found matterbridge package in the plugin dependencies.`);
+ this.log.error(`Please open an issue on the plugin repository to remove them.`);
+ return null;
+ }
+ const matterbridgeDevDependencies = checkForMatterbridgePackage(packageJson.devDependencies || {});
+ if (matterbridgeDevDependencies.length > 0) {
+ this.log.error(`Found matterbridge package in the plugin devDependencies.`);
+ this.log.error(`Please open an issue on the plugin repository to remove them.`);
+ return null;
+ }
+
this.log.debug(`Resolved plugin path ${plg}${pluginPath}${db}: ${packageJsonPath}`);
return packageJsonPath;
} catch (err) {
@@ -180,6 +233,7 @@ export class PluginManager {
if (!packageJson.type || packageJson.type !== 'module') this.log.error(`Plugin ${plg}${plugin.name}${er} is not a module`);
if (!packageJson.main) this.log.error(`Plugin ${plg}${plugin.name}${er} has no main entrypoint in package.json`);
if (!packageJson.types) this.log.error(`Plugin ${plg}${plugin.name}${er} has no types in package.json`);
+ if (!packageJson.scripts.install || packageJson.scripts.install !== 'node link-matterbridge-script.js') this.log.error(`Plugin ${plg}${plugin.name}${er} has not the correct install script in package.json`);
plugin.name = packageJson.name || 'Unknown name';
plugin.version = packageJson.version || '1.0.0';
plugin.description = packageJson.description || 'Unknown description';