diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 0386024..13bde8d 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -9,7 +9,7 @@ jobs:
strategy:
matrix:
# the Node.js versions to build on
- node-version: [14.x, 16.x, 18.x]
+ node-version: [18.x, 20.x]
steps:
- uses: actions/checkout@v2
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 263d9c6..af3019b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,28 @@
All notable changes to this project will be documented in this file. This project uses [Semantic Versioning](https://semver.org/).
+## v4.0.0
+* Added Local UDP API support! Optionally you can choose to listen to your Weather Stations observations directly over your local network. No Station ID or API Token needed. Observations are broadcasted every 60 seconds.
+
+## v3.0.3
+* Update node-version: [18.x, 20.x], remove 16.x which is no longer supported by homebridge.
+* Reformated `getStationObservation()` and `getStationCurrentObservation()` in `tempestApi.ts`.
+* Addresses `observation_data is undefined, skipping update` error in `platform.ts` polling loop.
+
+## v3.0.2
+* Update node-version: [16.x, 18.x, 20.x], remove 14.x which is no longer supported by homebridge.
+* Update `devDependencies` and `dependencies` to latest versions. Update/lock `axios` to version `1.5.1`.
+* Updates to `tempestApi.ts`:
+ * Add `import https from 'https';`
+ * Add `axios.defaults.httpsAgent = new https.Agent({ keepAlive: true });`
+ * Add `axios.defaults.timeout = 10000;`
+ * Add explicit `Promise` returns to `getStationObservation`
+ * Change `validateStatus` from `<500` to `>= 200 && status < 300` for `axios.get` calls
+ * Delete `isResponseGood` function as additional `obs` parsing is not required.
+ * Refactor `getStationCurrentObservation` so that retry loop is executed.
+* Updates to `package.ts`:
+ * Revise `setInterval` loop to make use of `async/await`.
+
## v3.0.1
* Update `config.schema.json` to include sensor `name` field.
* Add cautionary note to `README.md` when upgrading from a previous version of the plugin.
diff --git a/README.md b/README.md
index 3002568..0921782 100644
--- a/README.md
+++ b/README.md
@@ -2,10 +2,14 @@
[![verified-by-homebridge](https://badgen.net/badge/homebridge/verified/purple)](https://github.com/homebridge/homebridge/wiki/Verified-Plugins) ![npm-version](https://badgen.net/npm/v/homebridge-weatherflow-tempest?icon=npm&label) ![npm-downloads](https://badgen.net/npm/dt/homebridge-weatherflow-tempest?icon=npm&label) [![donate](https://badgen.net/badge/donate/paypal/yellow)](https://paypal.me/chasenicholl)
-
-
-
-
+
+
+ |
+ |
+
+
+
+*New* in v4.0.0 Local API Support!
Homebridge Plugin providing basic WeatherFlow Tempest support. Exposing 7 Acessories.
@@ -32,9 +36,10 @@ It is recommended when upgrading to v3.0 of the plugin from a prior version that
You will need to create an account at https://tempestwx.com/ and then generate a Personal Use Token https://tempestwx.com/settings/tokens.
- `name`: _(Required)_ Must always be set to `WeatherFlow Tempest Platform`.
-- `token`: _(Required)_ Oauth2 Personal Use Token, create via your tempestwx account.
-- `station_id`: _(Required)_ The station ID you are pulling weather data from.
-- `interval`: _(Required)_ How often to poll the Tempest REST API. Default 10 seconds. Minimum every second.
+- `local_api`: _(Required)_ Use the Local API versus HTTP API.
+- `token`: _(Required for HTTP API)_ Oauth2 Personal Use Token, create via your tempestwx account.
+- `station_id`: _(Required for HTTP API)_ The station ID you are pulling weather data from.
+- `interval`: _(Required for HTTP API)_ How often to poll the Tempest REST API. Default 10 seconds. Minimum every second.
- `sensors`: _(Required)_ An array of sensors to create. This is dynamic incase you want to target different temperature or wind speed attributes.
- `sensors[].name`: _(Required)_ Display name of Sensor in Apple Home.
- `sensors[].sensor_type`: _(Required)_ The type of Home Sensor to create. There are 6 options ["Temperature Sensor", "Light Sensor", "Humidity Sensor", "Fan", "Motion Sensor", "Occupancy Sensor"].
@@ -67,11 +72,90 @@ sensor_type `{2}` | value_key | metric units | std units | additional_properties
`{4}` NOTE: There is a current limitation with v3.0.0 of the plug-in in that HomeKit accessory names are set when the accessory is initially added and cannot be dynamically updated. The accessories are correctly displayed and updated in the Homebridge "Accessories" tab of the webpage interface. Occupancy sensors `trigger_value` status is correctly displayed in both HomeKit and Homebridge.
-### Config Example
+### Local API Config Example
+
+```json
+{
+ "name": "WeatherFlow Tempest Platform",
+ "local_api": true,
+ "units": "Standard",
+ "sensors": [
+ {
+ "name": "Temperature",
+ "sensor_type": "Temperature Sensor"
+ },
+ {
+ "name": "Relative Humidity",
+ "sensor_type": "Humidity Sensor"
+ },
+ {
+ "name": "Light Level",
+ "sensor_type": "Light Sensor"
+ },
+ {
+ "name": "Wind Speed",
+ "sensor_type": "Fan"
+ },
+ {
+ "name": "Wind Gust",
+ "sensor_type": "Motion Sensor",
+ "motion_properties": {
+ "trigger_value": 10
+ }
+ },
+ {
+ "name": "Barometer",
+ "sensor_type": "Occupancy Sensor",
+ "occupancy_properties": {
+ "trigger_value": 30
+ }
+ },
+ {
+ "name": "Solar Radiation",
+ "sensor_type": "Occupancy Sensor",
+ "occupancy_properties": {
+ "trigger_value": 1000
+ }
+ },
+ {
+ "name": "UV",
+ "sensor_type": "Occupancy Sensor",
+ "occupancy_properties": {
+ "trigger_value": 3
+ }
+ },
+ {
+ "name": "Precipitation Rate",
+ "sensor_type": "Occupancy Sensor",
+ "occupancy_properties": {
+ "trigger_value": 0.25
+ }
+ },
+ {
+ "name": "Precipitation Today",
+ "sensor_type": "Occupancy Sensor",
+ "occupancy_properties": {
+ "trigger_value": 1
+ }
+ },
+ {
+ "name": "Wind Direction",
+ "sensor_type": "Occupancy Sensor",
+ "occupancy_properties": {
+ "trigger_value": 360
+ }
+ }
+ ],
+ "platform": "WeatherFlowTempest"
+}
+```
+
+### HTTP API Config Example
```json
{
"name": "WeatherFlow Tempest Platform",
+ "local_api": false,
"token": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"station_id": 10000,
"interval": 10,
diff --git a/config.schema.json b/config.schema.json
index ff4810f..a7f30a7 100644
--- a/config.schema.json
+++ b/config.schema.json
@@ -1,182 +1,214 @@
{
- "pluginAlias": "WeatherFlowTempest",
- "pluginType": "platform",
- "singular": false,
- "schema": {
- "type": "object",
- "properties": {
- "name": {
- "title": "Name",
- "type": "string",
- "required": true,
- "default": "WeatherFlow Tempest Platform"
- },
- "token": {
- "title": "Token",
- "type": "string",
- "required": true
- },
- "station_id": {
- "title": "Station ID (Integer)",
- "type": "number",
- "required": true
- },
- "interval": {
- "title": "Interval (seconds)",
- "type": "integer",
- "default": 10,
- "minimum": 1
- },
- "units": {
- "title": "Units",
- "type": "string",
- "enum": [
- "Standard",
- "Metric"
- ],
- "default": "Standard"
- },
- "sensors": {
- "title": "Weather Sensors",
- "description": "Enable WeatherFlow Tempest Sensors.",
- "type": "array",
- "items": {
- "type": "object",
- "properties": {
- "name": {
- "title": "Name",
- "type": "string",
- "required": true
- },
- "sensor_type": {
- "type": "string",
- "enum": [
- "Temperature Sensor",
- "Light Sensor",
- "Humidity Sensor",
- "Fan",
- "Motion Sensor",
- "Occupancy Sensor"
- ],
- "default": "Temperature Sensor"
- },
- "fan_properties": {
- "title": "Fan Properties",
- "type": "object",
- "condition": {
- "functionBody": "if (model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Fan') { return true; } else { return false; };"
- },
- "properties": {
- "value_key": {
- "type": "string",
- "enum": [
- "wind_avg"
- ]
- }
- }
- },
- "light_properties": {
- "title": "Light Properties",
- "type": "object",
- "condition": {
- "functionBody": "if (model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Light Sensor') { return true; } else { return false; };"
- },
- "properties": {
- "value_key": {
- "type": "string",
- "enum": [
- "brightness"
- ]
- }
- }
- },
- "humidity_properties": {
- "title": "Humidity Properties",
- "type": "object",
- "condition": {
- "functionBody": "if (model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Humidity Sensor') { return true; } else { return false; };"
- },
- "properties": {
- "value_key": {
- "type": "string",
- "enum": [
- "relative_humidity"
- ]
- }
- }
- },
- "temperature_properties": {
- "title": "Temperature Properties",
- "type": "object",
- "condition": {
- "functionBody": "if (model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Temperature Sensor') { return true; } else { return false; };"
- },
- "properties": {
- "value_key": {
- "type": "string",
- "enum": [
- "air_temperature",
- "dew_point",
- "feels_like",
- "wind_chill"
- ]
- }
- }
- },
- "motion_properties": {
- "title": "Motion Properties",
- "type": "object",
- "condition": {
- "functionBody": "if (model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Motion Sensor') { return true; } else { return false; };"
- },
- "properties": {
- "value_key": {
- "type": "string",
- "enum": [
- "wind_gust"
- ]
- },
- "trigger_value": {
- "type": "number",
- "minimum": 1,
- "description": "At what point (value) to trigger motion detected on/off (1 minimum)."
- }
- }
- },
- "occupancy_properties": {
- "title": "Occupancy Properties",
- "type": "object",
- "condition": {
- "functionBody": "if (model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Occupancy Sensor') { return true; } else { return false; };"
- },
- "properties": {
- "value_key": {
- "type": "string",
- "enum": [
- "barometric_pressure",
- "precip",
- "precip_accum_local_day",
- "wind_direction",
- "wind_gust",
- "solar_radiation",
- "uv"
- ]
- },
- "trigger_value": {
- "type": "number",
- "minimum": 0,
- "description": "At what point (value) to trigger occupancy detected on/off (0 minimum)."
- }
- }
- }
- }
- },
- "required": [
- "name",
- "sensor_type",
- "value_key"
- ]
- }
- }
- }
+ "pluginAlias": "WeatherFlowTempest",
+ "pluginType": "platform",
+ "singular": false,
+ "schema": {
+ "type": "object",
+
+ "properties": {
+ "name": {
+ "title": "Name",
+ "type": "string",
+ "required": true,
+ "default": "WeatherFlow Tempest Platform"
+ },
+ "local_api": {
+ "title": "Use Local API",
+ "type": "boolean",
+ "required": true,
+ "default": true
+ },
+ "token": {
+ "title": "Token",
+ "type": "string",
+ "default": "",
+ "condition": {
+ "functionBody": "if (model.local_api != undefined && !model.local_api) { return true; } else { return false; };"
+ }
+ },
+ "station_id": {
+ "title": "Station ID (Integer)",
+ "type": "number",
+ "default": 0,
+ "condition": {
+ "functionBody": "if (model.local_api != undefined && !model.local_api) { return true; } else { return false; };"
+ }
+ },
+ "interval": {
+ "title": "Interval (seconds)",
+ "type": "integer",
+ "default": 10,
+ "minimum": 1,
+ "condition": {
+ "functionBody": "if (model.local_api != undefined && !model.local_api) { return true; } else { return false; };"
+ }
+ },
+ "units": {
+ "title": "Units",
+ "type": "string",
+ "enum": [
+ "Standard",
+ "Metric"
+ ],
+ "default": "Standard"
+ },
+ "sensors": {
+ "title": "Weather Sensors",
+ "description": "Enable WeatherFlow Tempest Sensors.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "title": "Name",
+ "type": "string",
+ "required": true
+ },
+ "sensor_type": {
+ "type": "string",
+ "enum": [
+ "Temperature Sensor",
+ "Light Sensor",
+ "Humidity Sensor",
+ "Fan",
+ "Motion Sensor",
+ "Occupancy Sensor"
+ ],
+ "default": "Temperature Sensor"
+ },
+ "fan_properties": {
+ "title": "Fan Properties",
+ "type": "object",
+ "condition": {
+ "functionBody": "if (!model.local_api && model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Fan') { return true; } else { return false; };"
+ },
+ "properties": {
+ "value_key": {
+ "type": "string",
+ "enum": [
+ "wind_avg"
+ ]
+ }
+ }
+ },
+ "light_properties": {
+ "title": "Light Properties",
+ "type": "object",
+ "condition": {
+ "functionBody": "if (!model.local_api && model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Light Sensor') { return true; } else { return false; };"
+ },
+ "properties": {
+ "value_key": {
+ "type": "string",
+ "enum": [
+ "brightness"
+ ]
+ }
+ }
+ },
+ "humidity_properties": {
+ "title": "Humidity Properties",
+ "type": "object",
+ "condition": {
+ "functionBody": "if (!model.local_api && model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Humidity Sensor') { return true; } else { return false; };"
+ },
+ "properties": {
+ "value_key": {
+ "type": "string",
+ "enum": [
+ "relative_humidity"
+ ]
+ }
+ }
+ },
+ "temperature_properties": {
+ "title": "Temperature Properties",
+ "type": "object",
+ "condition": {
+ "functionBody": "if (!model.local_api && model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Temperature Sensor') { return true; } else { return false; };"
+ },
+ "properties": {
+ "value_key": {
+ "type": "string",
+ "enum": [
+ "air_temperature",
+ "dew_point",
+ "feels_like",
+ "wind_chill"
+ ]
+ }
+ }
+ },
+ "motion_properties": {
+ "title": "Motion Properties",
+ "type": "object",
+ "condition": {
+ "functionBody": "if (model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Motion Sensor') { return true; } else { return false; };"
+ },
+ "properties": {
+ "value_key": {
+ "type": "string",
+ "enum": [
+ "wind_gust"
+ ],
+ "condition": {
+ "functionBody": "if (!model.local_api && model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Temperature Sensor') { return true; } else { return false; };"
+ }
+ },
+ "trigger_value": {
+ "type": "number",
+ "minimum": 1,
+ "description": "At what point (value) to trigger motion detected on/off (1 minimum)."
+ }
+ }
+ },
+ "occupancy_properties": {
+ "title": "Occupancy Properties",
+ "type": "object",
+ "condition": {
+ "functionBody": "if (model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Occupancy Sensor') { return true; } else { return false; };"
+ },
+ "properties": {
+ "value_key": {
+ "type": "string",
+ "enum": [
+ "barometric_pressure",
+ "precip",
+ "precip_accum_local_day",
+ "wind_direction",
+ "wind_gust",
+ "solar_radiation",
+ "uv"
+ ],
+ "condition": {
+ "functionBody": "if (!model.local_api && model.sensors[arrayIndices] && model.sensors[arrayIndices].sensor_type && model.sensors[arrayIndices].sensor_type === 'Temperature Sensor') { return true; } else { return false; };"
+ }
+ },
+ "trigger_value": {
+ "type": "number",
+ "minimum": 0,
+ "description": "At what point (value) to trigger occupancy detected on/off (0 minimum)."
+ }
+ }
+ }
+ }
+ },
+ "required": [
+ "name",
+ "sensor_type",
+ "value_key"
+ ]
+ }
+ },
+ "required": ["local_api"],
+ "dependencies": {
+ "local_api": {
+ "not": {
+ "type": "boolean",
+ "const": true
+ },
+ "required": ["token", "station_id"]
+ }
+ }
+ }
}
diff --git a/package-lock.json b/package-lock.json
index 4900f03..ac6a6d7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,26 +1,28 @@
{
"name": "homebridge-weatherflow-tempest",
- "version": "3.0.1",
+ "version": "3.0.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "homebridge-weatherflow-tempest",
- "version": "3.0.1",
+ "version": "3.0.3",
"license": "Apache-2.0",
"dependencies": {
- "axios": "1.3.4"
+ "axios": "1.5.1"
},
"devDependencies": {
- "@types/node": "^16.10.9",
- "@typescript-eslint/eslint-plugin": "^5.0.0",
- "@typescript-eslint/parser": "^5.0.0",
- "eslint": "^8.0.1",
- "homebridge": "^1.3.5",
- "nodemon": "^2.0.13",
- "rimraf": "^3.0.2",
- "ts-node": "^10.3.0",
- "typescript": "^4.4.4"
+ "@types/node": "^20.1.0",
+ "@typescript-eslint/eslint-plugin": "^6.1.0",
+ "@typescript-eslint/parser": "^6.1.0",
+ "eslint": "^8.5.0",
+ "follow-redirects": "^1.14.7",
+ "homebridge": "^1.1.3",
+ "minimist": "^1.2.7",
+ "nodemon": "^3.0.1",
+ "rimraf": "^5.0.0",
+ "ts-node": "^10.0.0",
+ "typescript": "^5.0.2"
},
"engines": {
"homebridge": ">=1.3.5",
@@ -31,6 +33,15 @@
"url": "https://paypal.me/chasenicholl"
}
},
+ "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/@cspotcode/source-map-support": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
@@ -59,23 +70,23 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
- "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz",
+ "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/eslintrc": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz",
- "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
+ "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
- "espree": "^9.5.1",
+ "espree": "^9.6.0",
"globals": "^13.19.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
@@ -91,27 +102,30 @@
}
},
"node_modules/@eslint/js": {
- "version": "8.39.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz",
- "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==",
+ "version": "8.52.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz",
+ "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@homebridge/ciao": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.1.5.tgz",
- "integrity": "sha512-ZI9tcbPfX2d8oP1PNeLzrZLXISAIDUtJQWk4JVVJKCxktC6tQ3JyWXT9t1FbB5xtl82M1jdCgyAbWbjhUtRWcA==",
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.1.7.tgz",
+ "integrity": "sha512-q8XRDFn2peboPHGV+wbLCpp52anKiZsoNHZGA+t3I2iJ0/Qn+/8YNO0ILiJnPlVYos6fHceYiL75fhNIISTBRg==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
"fast-deep-equal": "^3.1.3",
"source-map-support": "^0.5.21",
- "tslib": "^2.4.0"
+ "tslib": "^2.5.0"
},
"bin": {
"ciao-bcs": "lib/bonjour-conformance-testing.js"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@homebridge/dbus-native": {
@@ -148,12 +162,12 @@
}
},
"node_modules/@humanwhocodes/config-array": {
- "version": "0.11.8",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
- "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "version": "0.11.13",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
+ "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
"dev": true,
"dependencies": {
- "@humanwhocodes/object-schema": "^1.2.1",
+ "@humanwhocodes/object-schema": "^2.0.1",
"debug": "^4.1.1",
"minimatch": "^3.0.5"
},
@@ -175,11 +189,55 @@
}
},
"node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
+ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
"dev": true
},
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
@@ -246,6 +304,16 @@
"node": ">= 8"
}
},
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@tsconfig/node10": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
@@ -265,56 +333,60 @@
"dev": true
},
"node_modules/@tsconfig/node16": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz",
- "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"dev": true
},
"node_modules/@types/json-schema": {
- "version": "7.0.11",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
- "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "version": "7.0.14",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz",
+ "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==",
"dev": true
},
"node_modules/@types/node": {
- "version": "16.18.25",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.25.tgz",
- "integrity": "sha512-rUDO6s9Q/El1R1I21HG4qw/LstTHCPO/oQNAwI/4b2f9EWvMnqt4d3HJwPMawfZ3UvodB8516Yg+VAq54YM+eA==",
- "dev": true
+ "version": "20.8.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz",
+ "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.25.1"
+ }
},
"node_modules/@types/semver": {
- "version": "7.3.13",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
- "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==",
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "5.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz",
- "integrity": "sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz",
+ "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==",
"dev": true,
"dependencies": {
- "@eslint-community/regexpp": "^4.4.0",
- "@typescript-eslint/scope-manager": "5.59.2",
- "@typescript-eslint/type-utils": "5.59.2",
- "@typescript-eslint/utils": "5.59.2",
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.8.0",
+ "@typescript-eslint/type-utils": "6.8.0",
+ "@typescript-eslint/utils": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0",
"debug": "^4.3.4",
- "grapheme-splitter": "^1.0.4",
- "ignore": "^5.2.0",
- "natural-compare-lite": "^1.4.0",
- "semver": "^7.3.7",
- "tsutils": "^3.21.0"
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^16.0.0 || >=18.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^5.0.0",
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -323,25 +395,26 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "5.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz",
- "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz",
+ "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "5.59.2",
- "@typescript-eslint/types": "5.59.2",
- "@typescript-eslint/typescript-estree": "5.59.2",
+ "@typescript-eslint/scope-manager": "6.8.0",
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/typescript-estree": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0",
"debug": "^4.3.4"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^16.0.0 || >=18.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ "eslint": "^7.0.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -350,16 +423,16 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "5.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz",
- "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz",
+ "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "5.59.2",
- "@typescript-eslint/visitor-keys": "5.59.2"
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^16.0.0 || >=18.0.0"
},
"funding": {
"type": "opencollective",
@@ -367,25 +440,25 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "5.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz",
- "integrity": "sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz",
+ "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==",
"dev": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "5.59.2",
- "@typescript-eslint/utils": "5.59.2",
+ "@typescript-eslint/typescript-estree": "6.8.0",
+ "@typescript-eslint/utils": "6.8.0",
"debug": "^4.3.4",
- "tsutils": "^3.21.0"
+ "ts-api-utils": "^1.0.1"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^16.0.0 || >=18.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "*"
+ "eslint": "^7.0.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -394,12 +467,12 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "5.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz",
- "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz",
+ "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==",
"dev": true,
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^16.0.0 || >=18.0.0"
},
"funding": {
"type": "opencollective",
@@ -407,21 +480,21 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "5.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz",
- "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz",
+ "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "5.59.2",
- "@typescript-eslint/visitor-keys": "5.59.2",
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
- "semver": "^7.3.7",
- "tsutils": "^3.21.0"
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^16.0.0 || >=18.0.0"
},
"funding": {
"type": "opencollective",
@@ -434,48 +507,53 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "5.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.2.tgz",
- "integrity": "sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz",
+ "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==",
"dev": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@types/json-schema": "^7.0.9",
- "@types/semver": "^7.3.12",
- "@typescript-eslint/scope-manager": "5.59.2",
- "@typescript-eslint/types": "5.59.2",
- "@typescript-eslint/typescript-estree": "5.59.2",
- "eslint-scope": "^5.1.1",
- "semver": "^7.3.7"
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.8.0",
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/typescript-estree": "6.8.0",
+ "semver": "^7.5.4"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^16.0.0 || >=18.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ "eslint": "^7.0.0 || ^8.0.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "5.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz",
- "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz",
+ "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "5.59.2",
- "eslint-visitor-keys": "^3.3.0"
+ "@typescript-eslint/types": "6.8.0",
+ "eslint-visitor-keys": "^3.4.1"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^16.0.0 || >=18.0.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/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -483,9 +561,9 @@
"dev": true
},
"node_modules/acorn": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
- "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -623,9 +701,9 @@
}
},
"node_modules/axios": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
- "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
+ "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
@@ -689,13 +767,14 @@
"dev": true
},
"node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
"dev": true,
"dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -847,15 +926,15 @@
}
},
"node_modules/deep-equal": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz",
- "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz",
+ "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==",
"dev": true,
"dependencies": {
"array-buffer-byte-length": "^1.0.0",
"call-bind": "^1.0.2",
"es-get-iterator": "^1.1.3",
- "get-intrinsic": "^1.2.0",
+ "get-intrinsic": "^1.2.1",
"is-arguments": "^1.1.1",
"is-array-buffer": "^3.0.2",
"is-date-object": "^1.0.5",
@@ -881,12 +960,27 @@
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
+ "node_modules/define-data-property": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+ "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/define-properties": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
- "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"dev": true,
"dependencies": {
+ "define-data-property": "^1.0.1",
"has-property-descriptors": "^1.0.0",
"object-keys": "^1.1.1"
},
@@ -927,9 +1021,9 @@
}
},
"node_modules/dns-packet": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz",
- "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==",
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
"dev": true,
"dependencies": {
"@leichtgewicht/ip-codec": "^2.0.1"
@@ -956,6 +1050,18 @@
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
"dev": true
},
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
"node_modules/es-get-iterator": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
@@ -989,27 +1095,28 @@
}
},
"node_modules/eslint": {
- "version": "8.39.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz",
- "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==",
+ "version": "8.52.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz",
+ "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.4.0",
- "@eslint/eslintrc": "^2.0.2",
- "@eslint/js": "8.39.0",
- "@humanwhocodes/config-array": "^0.11.8",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.2",
+ "@eslint/js": "8.52.0",
+ "@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
- "ajv": "^6.10.0",
+ "@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.0",
- "eslint-visitor-keys": "^3.4.0",
- "espree": "^9.5.1",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@@ -1017,22 +1124,19 @@
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
"globals": "^13.19.0",
- "grapheme-splitter": "^1.0.4",
+ "graphemer": "^1.4.0",
"ignore": "^5.2.0",
- "import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"is-path-inside": "^3.0.3",
- "js-sdsl": "^4.1.4",
"js-yaml": "^4.1.0",
"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",
- "optionator": "^0.9.1",
+ "optionator": "^0.9.3",
"strip-ansi": "^6.0.1",
- "strip-json-comments": "^3.1.0",
"text-table": "^0.2.0"
},
"bin": {
@@ -1046,23 +1150,14 @@
}
},
"node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
"dev": true,
"dependencies": {
"esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
+ "estraverse": "^5.2.0"
},
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
- "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
- "dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
@@ -1070,15 +1165,11 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/eslint-scope": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
- "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
+ "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,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
@@ -1086,24 +1177,15 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
"node_modules/espree": {
- "version": "9.5.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz",
- "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==",
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
"dev": true,
"dependencies": {
- "acorn": "^8.8.0",
+ "acorn": "^8.9.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.0"
+ "eslint-visitor-keys": "^3.4.1"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1124,15 +1206,6 @@
"node": ">=0.10"
}
},
- "node_modules/esquery/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
"node_modules/esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
@@ -1145,7 +1218,7 @@
"node": ">=4.0"
}
},
- "node_modules/esrecurse/node_modules/estraverse": {
+ "node_modules/estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
@@ -1154,15 +1227,6 @@
"node": ">=4.0"
}
},
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@@ -1194,9 +1258,9 @@
"dev": true
},
"node_modules/fast-glob": {
- "version": "3.2.12",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
- "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
@@ -1292,28 +1356,64 @@
}
},
"node_modules/flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz",
+ "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==",
"dev": true,
"dependencies": {
- "flatted": "^3.1.0",
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
"rimraf": "^3.0.2"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=12.0.0"
+ }
+ },
+ "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/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_modules/flatted": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
"dev": true
},
"node_modules/follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "version": "1.15.3",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
+ "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
"funding": [
{
"type": "individual",
@@ -1338,6 +1438,22 @@
"is-callable": "^1.1.3"
}
},
+ "node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -1378,9 +1494,9 @@
"dev": true
},
"node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
"optional": true,
@@ -1392,10 +1508,13 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/functions-have-names": {
"version": "1.2.3",
@@ -1416,34 +1535,37 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
- "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
"dev": true,
"dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "version": "10.3.10",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+ "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
"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"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.5",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+ "path-scurry": "^1.10.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
},
"engines": {
- "node": "*"
+ "node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -1461,10 +1583,34 @@
"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.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/globals": {
- "version": "13.20.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "version": "13.23.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
+ "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
@@ -1514,10 +1660,10 @@
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true
},
- "node_modules/grapheme-splitter": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
- "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
"dev": true
},
"node_modules/hap-nodejs": {
@@ -1541,18 +1687,6 @@
"node": ">=10.17.0"
}
},
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
"node_modules/has-bigints": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
@@ -1572,12 +1706,24 @@
}
},
"node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.1.1"
+ "get-intrinsic": "^1.2.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -1610,6 +1756,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/hexy": {
"version": "0.2.11",
"resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz",
@@ -1697,13 +1855,13 @@
"dev": true
},
"node_modules/internal-slot": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
- "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
+ "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.2.0",
- "has": "^1.0.3",
+ "get-intrinsic": "^1.2.2",
+ "hasown": "^2.0.0",
"side-channel": "^1.0.4"
},
"engines": {
@@ -1822,6 +1980,15 @@
"node": ">=0.10.0"
}
},
+ "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/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -1944,16 +2111,12 @@
}
},
"node_modules/is-typed-array": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
- "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
"dev": true,
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
+ "which-typed-array": "^1.1.11"
},
"engines": {
"node": ">= 0.4"
@@ -1996,14 +2159,22 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
- "node_modules/js-sdsl": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz",
- "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==",
+ "node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
"dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/js-sdsl"
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
}
},
"node_modules/js-yaml": {
@@ -2018,6 +2189,12 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -2042,6 +2219,15 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -2077,15 +2263,12 @@
"dev": true
},
"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==",
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
+ "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
"dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
"engines": {
- "node": ">=10"
+ "node": "14 || >=16.14"
}
},
"node_modules/make-error": {
@@ -2162,6 +2345,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/minipass": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+ "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -2205,12 +2397,6 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
- "node_modules/natural-compare-lite": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
- "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
- "dev": true
- },
"node_modules/node-persist": {
"version": "0.0.11",
"resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz",
@@ -2222,9 +2408,9 @@
}
},
"node_modules/nodemon": {
- "version": "2.0.22",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
- "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
+ "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
"dev": true,
"dependencies": {
"chokidar": "^3.5.2",
@@ -2232,8 +2418,8 @@
"ignore-by-default": "^1.0.1",
"minimatch": "^3.1.2",
"pstree.remy": "^1.1.8",
- "semver": "^5.7.1",
- "simple-update-notifier": "^1.0.7",
+ "semver": "^7.5.3",
+ "simple-update-notifier": "^2.0.0",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.5"
@@ -2242,7 +2428,7 @@
"nodemon": "bin/nodemon.js"
},
"engines": {
- "node": ">=8.10.0"
+ "node": ">=10"
},
"funding": {
"type": "opencollective",
@@ -2267,15 +2453,6 @@
"node": ">=4"
}
},
- "node_modules/nodemon/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
"node_modules/nodemon/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -2313,9 +2490,9 @@
}
},
"node_modules/object-inspect": {
- "version": "1.12.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
- "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -2374,17 +2551,17 @@
}
},
"node_modules/optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
"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",
- "word-wrap": "^1.2.3"
+ "type-check": "^0.4.0"
},
"engines": {
"node": ">= 0.8.0"
@@ -2459,6 +2636,22 @@
"node": ">=8"
}
},
+ "node_modules/path-scurry": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
+ "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^9.1.1 || ^10.0.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -2570,14 +2763,14 @@
}
},
"node_modules/regexp.prototype.flags": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
- "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
+ "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
- "functions-have-names": "^1.2.3"
+ "set-function-name": "^2.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -2606,15 +2799,18 @@
}
},
"node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz",
+ "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==",
"dev": true,
"dependencies": {
- "glob": "^7.1.3"
+ "glob": "^10.3.7"
},
"bin": {
- "rimraf": "bin.js"
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -2664,15 +2860,15 @@
]
},
"node_modules/sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
+ "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==",
"dev": true
},
"node_modules/semver": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz",
- "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -2684,6 +2880,47 @@
"node": ">=10"
}
},
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
+ "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
+ "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -2719,25 +2956,28 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/simple-update-notifier": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
- "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
- "dependencies": {
- "semver": "~7.0.0"
- },
"engines": {
- "node": ">=8.10.0"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/simple-update-notifier/node_modules/semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
}
},
"node_modules/slash": {
@@ -2802,6 +3042,71 @@
"through": "~2.3.4"
}
},
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "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",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -2814,6 +3119,19 @@
"node": ">=8"
}
},
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -2880,6 +3198,18 @@
"nodetouch": "bin/nodetouch.js"
}
},
+ "node_modules/ts-api-utils": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
+ "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
"node_modules/ts-node": {
"version": "10.9.1",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
@@ -2924,30 +3254,9 @@
}
},
"node_modules/tslib": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
- "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
- "dev": true
- },
- "node_modules/tsutils": {
- "version": "3.21.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
- "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
- "dev": true,
- "dependencies": {
- "tslib": "^1.8.1"
- },
- "engines": {
- "node": ">= 6"
- },
- "peerDependencies": {
- "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
- }
- },
- "node_modules/tsutils/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
"dev": true
},
"node_modules/tweetnacl": {
@@ -2981,16 +3290,16 @@
}
},
"node_modules/typescript": {
- "version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
+ "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
- "node": ">=4.2.0"
+ "node": ">=14.17"
}
},
"node_modules/undefsafe": {
@@ -2999,6 +3308,12 @@
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
"dev": true
},
+ "node_modules/undici-types": {
+ "version": "5.25.3",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz",
+ "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==",
+ "dev": true
+ },
"node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
@@ -3070,17 +3385,16 @@
}
},
"node_modules/which-typed-array": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
- "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
+ "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
"dev": true,
"dependencies": {
"available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
+ "call-bind": "^1.0.4",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.10"
+ "has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -3089,13 +3403,98 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "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",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/wrappy": {
diff --git a/package.json b/package.json
index 2466688..37665ee 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"private": false,
"displayName": "Homebridge WeatherFlow Tempest",
"name": "homebridge-weatherflow-tempest",
- "version": "3.0.1",
+ "version": "4.0.0",
"description": "Exposes WeatherFlow Tempest Station data as Temperature Sensors, Light Sensors, Humidity Sensors and Fan Sensors (for Wind Speed).",
"license": "Apache-2.0",
"repository": {
@@ -29,18 +29,20 @@
"Tempest"
],
"devDependencies": {
- "@types/node": "^16.10.9",
- "@typescript-eslint/eslint-plugin": "^5.0.0",
- "@typescript-eslint/parser": "^5.0.0",
- "eslint": "^8.0.1",
- "homebridge": "^1.3.5",
- "nodemon": "^2.0.13",
- "rimraf": "^3.0.2",
- "ts-node": "^10.3.0",
- "typescript": "^4.4.4"
+ "@types/node": "^20.1.0",
+ "@typescript-eslint/eslint-plugin": "^6.1.0",
+ "@typescript-eslint/parser": "^6.1.0",
+ "eslint": "^8.5.0",
+ "follow-redirects": "^1.14.7",
+ "homebridge": "^1.1.3",
+ "minimist": "^1.2.7",
+ "nodemon": "^3.0.1",
+ "rimraf": "^5.0.0",
+ "ts-node": "^10.0.0",
+ "typescript": "^5.0.2"
},
"dependencies": {
- "axios": "1.3.4"
+ "axios": "1.5.1"
},
"funding": {
"type": "paypal",
diff --git a/src/platform.ts b/src/platform.ts
index 8a5b50b..ce865c0 100644
--- a/src/platform.ts
+++ b/src/platform.ts
@@ -3,7 +3,7 @@ import { API, DynamicPlatformPlugin, Logger, PlatformAccessory, PlatformConfig,
import { PLATFORM_NAME, PLUGIN_NAME } from './settings';
import { WeatherFlowTempestPlatformAccessory } from './platformAccessory';
-import { TempestApi, Observation } from './tempest';
+import { TempestApi, TempestSocket, Observation } from './tempest';
interface TempestSensor {
name: string;
@@ -24,7 +24,8 @@ export class WeatherFlowTempestPlatform implements DynamicPlatformPlugin {
public readonly Characteristic: typeof Characteristic = this.api.hap.Characteristic;
public readonly accessories: PlatformAccessory[] = [];
- private tempestApi: TempestApi;
+ private tempestApi: TempestApi | undefined;
+ private tempestSocket: TempestSocket | undefined;
public observation_data: Observation; // Observation data for Accessories to use.
public tempest_battery_level!: number; // Tempest battery level
@@ -40,8 +41,7 @@ export class WeatherFlowTempestPlatform implements DynamicPlatformPlugin {
log.info('Finished initializing platform:', this.config.name);
- // Initialize TempestApi
- this.tempestApi = new TempestApi(this.config.token, this.config.station_id, log);
+ // Initialize observation_data
this.observation_data = {
air_temperature: 0,
barometric_pressure: 0,
@@ -61,13 +61,15 @@ export class WeatherFlowTempestPlatform implements DynamicPlatformPlugin {
this.tempest_battery_level = 0;
this.tempest_device_id = 0;
- // Make sure the Station ID is the integer ID
- if (isNaN(this.config.station_id)) {
- log.warn(
- 'Station ID is not an Integer! Please make sure you are using the ID integer found here: ' +
- 'https://tempestwx.com/station//',
- );
- return;
+ if (this.config.local_api === false) {
+ // Make sure the Station ID is the integer ID
+ if (isNaN(this.config.station_id)) {
+ log.warn(
+ 'Station ID is not an Integer! Please make sure you are using the ID integer found here: ' +
+ 'https://tempestwx.com/station//',
+ );
+ return;
+ }
}
this.api.on('didFinishLaunching', () => {
@@ -79,56 +81,111 @@ export class WeatherFlowTempestPlatform implements DynamicPlatformPlugin {
return;
}
- try {
+ // Initialize Tempest Interfaces
+ if (this.config.local_api === true) {
+ this.initializeBySocket();
+ } else {
+ this.initializeByApi();
+ }
- this.tempestApi.getStationCurrentObservation(0).then( (observation_data: Observation) => {
+ });
- if (!observation_data) {
- log.warn('Failed to fetch initial Station Current Observations after retrying. Refusing to continue.');
- return;
- }
+ }
- // Cache the observation results
- this.observation_data = observation_data;
+ private initializeBySocket() {
- // Initialize sensors after first API response.
- this.discoverDevices();
+ try {
+ this.log.info('Using Tempest Local API.');
+ this.tempestSocket = new TempestSocket(this.log);
+ this.tempestSocket.start();
+ // Hold thread for first message.
+ this.log.info('Waiting for first local broadcast. This could take up to 60 seconds...');
+ while (!this.tempestSocket.hasData()) {
+ continue;
+ }
+ this.log.info('Local broadcast recieved.');
- this.log.debug ('discoverDevices completed');
+ // Set values
+ this.observation_data = this.tempestSocket.getStationCurrentObservation();
+ this.tempest_battery_level = this.tempestSocket.getBatteryLevel();
- // Remove cached sensors that are no longer required.
- this.removeDevices();
+ // Initialize sensors after first API response.
+ this.discoverDevices();
+ this.log.debug ('discoverDevices completed');
- this.log.debug ('removeDevices completed');
+ // Poll every minute for local API
+ this.pollLocalStationCurrentObservation();
- // Determine Tempest device_id & initial battery level
- this.tempestApi.getTempestDeviceId().then( (device_id: number) => {
- this.tempest_device_id = device_id;
+ } catch(exception) {
+ this.log.error(exception as string);
+ }
+ }
- this.tempestApi.getTempestBatteryLevel(this.tempest_device_id).then( (battery_level: number) => {
+ private initializeByApi() {
- if (battery_level === undefined) {
- this.log.warn('Failed to fetch initial Tempest battery level');
- return;
- }
- this.tempest_battery_level = battery_level;
+ try {
+ this.log.info('Using Tempest RESTful API.');
+ this.tempestApi = new TempestApi(this.config.token, this.config.station_id, this.log);
+ this.tempestApi.getStationCurrentObservation(0).then( (observation_data: Observation) => {
- });
+ if (!observation_data) {
+ this.log.warn('Failed to fetch initial Station Current Observations after retrying. Refusing to continue.');
+ return;
+ }
- });
+ if (this.tempestApi === undefined) {
+ return;
+ }
- // Then begin to poll the station current observations data.
- this.pollStationCurrentObservation();
+ // Cache the observation results
+ this.observation_data = observation_data;
+ // Initialize sensors after first API response.
+ this.discoverDevices();
+ this.log.debug ('discoverDevices completed');
+
+ // Remove cached sensors that are no longer required.
+ this.removeDevices();
+ this.log.debug ('removeDevices completed');
+
+ // Determine Tempest device_id & initial battery level
+ this.tempestApi.getTempestDeviceId().then( (device_id: number) => {
+ this.tempest_device_id = device_id;
+ if (this.tempestApi === undefined) {
+ return;
+ }
+ this.tempestApi.getTempestBatteryLevel(this.tempest_device_id).then( (battery_level: number) => {
+ if (battery_level === undefined) {
+ this.log.warn('Failed to fetch initial Tempest battery level');
+ return;
+ }
+ this.tempest_battery_level = battery_level;
+ });
});
- } catch(exception) {
+ // Then begin to poll the station current observations data.
+ this.pollStationCurrentObservation();
+ });
+
+ } catch(exception) {
+ this.log.error(exception as string);
+ }
+
+ }
+
+ private pollLocalStationCurrentObservation(): void {
- this.log.error(exception as string);
+ setInterval( async () => {
+ if (this.tempestSocket === undefined) {
+ return;
}
- });
+ // Update values
+ this.observation_data = this.tempestSocket.getStationCurrentObservation();
+ this.tempest_battery_level = this.tempestSocket.getBatteryLevel();
+
+ }, 60 * 1000); // Tempest local API broadcasts every minute.
}
@@ -138,10 +195,14 @@ export class WeatherFlowTempestPlatform implements DynamicPlatformPlugin {
const interval = (this.config.interval as number || 10) * 1000;
this.log.debug(`Tempest API Polling interval (ms) -> ${interval}`);
- setInterval( () => {
+ setInterval( async () => {
+
+ if (this.tempestApi === undefined) {
+ return;
+ }
// Update Observation data
- this.tempestApi.getStationCurrentObservation(0).then( (observation_data: Observation) => {
+ await this.tempestApi.getStationCurrentObservation(0).then( (observation_data: Observation) => {
if (observation_data === undefined) {
this.log.warn('observation_data is undefined, skipping update');
@@ -152,7 +213,7 @@ export class WeatherFlowTempestPlatform implements DynamicPlatformPlugin {
});
// Update Battery percentage
- this.tempestApi.getTempestBatteryLevel(this.tempest_device_id).then( (battery_level: number) => {
+ await this.tempestApi.getTempestBatteryLevel(this.tempest_device_id).then( (battery_level: number) => {
if (battery_level === undefined) {
this.log.warn('battery_level is undefined, skipping update');
diff --git a/src/tempest.ts b/src/tempest.ts
index 31698b5..853947f 100644
--- a/src/tempest.ts
+++ b/src/tempest.ts
@@ -1,6 +1,12 @@
import { Logger } from 'homebridge';
import axios, { AxiosResponse } from 'axios';
import * as dgram from 'dgram';
+import https from 'https';
+
+
+axios.defaults.timeout = 10000; // same as default interval
+axios.defaults.httpsAgent = new https.Agent({ keepAlive: true });
+
export interface Observation {
// temperature sensors
@@ -17,7 +23,7 @@ export interface Observation {
wind_gust: number; // m/s, used for motion sensor
// occupancy sensors
- barometric_pressure: number; // mb
+ barometric_pressure: number; // mbar
precip: number; // mm/min (minute sampling)
precip_accum_local_day: number; // mm
wind_direction: number; // degrees
@@ -27,44 +33,34 @@ export interface Observation {
brightness: number; // Lux
}
-export interface SocketObservation {
-
- timestamp: number;
- windLull: number;
- windSpeed: number;
- windGust: number;
- windDirection: number;
- pressure: number;
- temperature: number;
- humidity: number;
- illumination: number;
- uvIndex: number;
- solarRadiation: number;
- rain: number;
- strikes: number;
- lightningDistance: number;
- reportingInterval: number;
-
-}
-
export class TempestSocket {
private log: Logger;
private s: dgram.Socket;
+ private data: object | undefined;
+ private tempest_battery_level: number;
- constructor(log: Logger, address = '0.0.0.0', port = 50222) {
+ constructor(log: Logger) {
this.log = log;
+ this.data = undefined;
+ this.tempest_battery_level = 0;
this.s = dgram.createSocket('udp4');
+
+ this.log.info('TempestSocket initialized.');
+
+ }
+
+ public start(address = '0.0.0.0', port = 50222) {
+
this.setupSocket(address, port);
this.setupSignalHandlers();
+
}
private setupSocket(address: string, port: number) {
- // this.s.setsockopt(dgram.SOL_SOCKET, dgram.SO_REUSEADDR, 1);
- // this.s.setsockopt(dgram.SOL_SOCKET, dgram.SO_REUSEPORT, 1);
this.s.bind({ address: address, port: port });
this.s.on('message', (msg) => {
try {
@@ -84,52 +80,44 @@ export class TempestSocket {
}
private processReceivedData(data: any) {
- // if (data.type === 'obs_air') {
- // console.log(data);
- // // air_tm = this.air_data(data, air_tm);
- // }
if (data.type === 'obs_st') {
- // console.log(data);
- this.parseTempestData(data);
- // st_tm = this.tempest_data(data, st_tm);
+ this.setTempestData(data);
}
- // if (data.type === 'obs_sky') {
- // console.log(data);
- // // sky_tm = this.sky_data(data, sky_tm);
- // }
}
- private parseTempestData(data: any): SocketObservation {
+ private setTempestData(data: any): void {
+
const obs = data.obs[0];
- const windLull = (obs[1] !== null) ? obs[1] * 2.2369 : 0;
+ // const windLull = (obs[1] !== null) ? obs[1] * 2.2369 : 0;
const windSpeed = (obs[2] !== null) ? obs[2] * 2.2369 : 0;
const windGust = (obs[3] !== null) ? obs[3] * 2.2369 : 0;
- return {
- timestamp: obs[0],
- windLull: windLull,
- windSpeed: windSpeed,
- windGust: windGust,
- windDirection: obs[4],
- pressure: obs[6],
- temperature: obs[7],
- humidity: obs[8],
- illumination: obs[9],
- uvIndex: obs[10],
- solarRadiation: obs[11],
- rain: parseFloat(obs[12]),
- strikes: obs[14],
- lightningDistance: obs[15],
- reportingInterval: obs[17],
- } as SocketObservation;
+ this.data = {
+ air_temperature: obs[7],
+ feels_like: obs[7],
+ wind_chill: obs[7],
+ dew_point: obs[7] - ((100 - obs[8]) / 5.0), // Td = T - ((100 - RH)/5.)
+ relative_humidity: obs[8],
+ wind_avg: windSpeed,
+ wind_gust: windGust,
+ barometric_pressure: obs[6],
+ precip: obs[12],
+ precip_accum_local_day: obs[12],
+ wind_direction: obs[4],
+ solar_radiation: obs[11],
+ uv: obs[10],
+ brightness: obs[9],
+ };
+ this.tempest_battery_level = Math.round((obs[16] - 1.8) * 100); // 2.80V = 100%, 1.80V = 0%
}
- private setupSignalHandlers() {
+ private setupSignalHandlers(): void {
process.on('SIGTERM', () => {
this.log.info('Got SIGTERM, shutting down Tempest Homebridge...');
+ this.s.close();
});
process.on('SIGINT', () => {
@@ -139,6 +127,18 @@ export class TempestSocket {
}
+ public hasData(): boolean {
+ return this.data !== undefined;
+ }
+
+ public getStationCurrentObservation(): Observation {
+ return this.data as Observation;
+ }
+
+ public getBatteryLevel(): number {
+ return this.tempest_battery_level;
+ }
+
}
export class TempestApi {
@@ -164,44 +164,34 @@ export class TempestApi {
}
- private async getStationObservation() {
-
- try {
- const url = `https://swd.weatherflow.com/swd/rest/observations/station/${this.station_id}`;
- const options = {
- headers: {
- 'Authorization': `Bearer ${this.token}`,
- },
- validateStatus: (status: number) => status < 500, // Resolve only if the status code is less than 500
- };
- return await axios.get(url, options);
- } catch(exception) {
- this.log.debug(`[WeatherFlow] ${exception}`);
- return;
- }
+ private async getStationObservation(): Promise {
- }
+ let observation: AxiosResponse | undefined;
- private async delay(ms: number): Promise {
+ const url = `https://swd.weatherflow.com/swd/rest/observations/station/${this.station_id}`;
+ const options = {
+ headers: {
+ 'Authorization': `Bearer ${this.token}`,
+ },
+ validateStatus: (status: number) => status >= 200 && status < 300, // Default
+ };
- return new Promise(resolve => setTimeout(resolve, ms));
+ await axios.get(url, options)
+ .then(response => {
+ observation = response.data['obs'][0];
+ })
+
+ .catch(exception => {
+ this.log.warn(`[WeatherFlow] ${exception}`);
+ });
+
+ return observation;
}
- private isResponseGood(response: AxiosResponse): boolean {
+ private async delay(ms: number): Promise {
- try {
- if (!response || !response.data) {
- return false;
- } else if (typeof response.data === 'string') {
- return ('obs' in JSON.parse(response.data));
- } else {
- return ('obs' in response.data);
- }
- } catch(exception) {
- this.log.error(exception as string);
- return false;
- }
+ return new Promise(resolve => setTimeout(resolve, ms));
}
@@ -212,23 +202,27 @@ export class TempestApi {
return;
}
- const response = await this.getStationObservation();
- if (!response || !this.isResponseGood(response)) {
+ const observation = await this.getStationObservation();
+
+ if (observation === undefined) {
this.log.warn('Response missing "obs" data.');
+
if (this.data !== undefined) {
this.log.warn('Returning last cached response.');
return this.data;
+
+ } else {
+ this.log.warn(`Retrying ${retry_count + 1} of ${this.max_retries}. No cached "obs" data.`);
+ retry_count += 1;
+ await this.delay(1000 * retry_count);
+ return this.getStationCurrentObservation(retry_count);
}
- this.log.warn(`Retrying ${retry_count + 1} of ${this.max_retries}. No cached "obs" data.`);
- retry_count += 1;
- await this.delay(1000 * retry_count);
- return await this.getStationCurrentObservation(retry_count);
+
} else {
- if (typeof response.data === 'string') {
- response.data = JSON.parse(response.data);
- }
- this.data = response.data['obs'][0];
+
+ this.data = observation;
return this.data;
+
}
}
@@ -240,7 +234,7 @@ export class TempestApi {
headers: {
'Authorization': `Bearer ${this.token}`,
},
- validateStatus: (status: number) => status < 500, // Resolve only if the status code is less than 500
+ validateStatus: (status: number) => status >= 200 && status < 300, // Default
};
await axios.get(url, options) // assumes single Tempest station
@@ -250,7 +244,7 @@ export class TempestApi {
})
.catch(exception => {
- this.log.debug(`[WeatherFlow] ${exception}`);
+ this.log.warn(`[WeatherFlow] ${exception}`);
});
return this.tempest_battery_level;
@@ -264,7 +258,7 @@ export class TempestApi {
headers: {
'Authorization': `Bearer ${this.token}`,
},
- validateStatus: (status: number) => status < 500, // Resolve only if the status code is less than 500
+ validateStatus: (status: number) => status >= 200 && status < 300, // Default
};
await axios.get(url, options) // assumes single hub with single Tempest station
@@ -273,8 +267,9 @@ export class TempestApi {
})
.catch(exception => {
- this.log.debug(`[WeatherFlow] ${exception}`);
+ this.log.warn(`[WeatherFlow] ${exception}`);
});
+
return this.tempest_device_id;
}
diff --git a/src/test.ts b/src/test.ts
deleted file mode 100644
index 23cb813..0000000
--- a/src/test.ts
+++ /dev/null
@@ -1,119 +0,0 @@
-import * as dgram from 'dgram';
-
-export interface SocketObservation {
-
- timestamp: number;
- windLull: number;
- windSpeed: number;
- windGust: number;
- windDirection: number;
- pressure: number;
- temperature: number;
- humidity: number;
- illumination: number;
- uvIndex: number;
- solarRadiation: number;
- rain: number;
- strikes: number;
- lightningDistance: number;
- reportingInterval: number;
-
-}
-
-
-export class TempestSocket {
-
- // private log: Logger;
- private s: dgram.Socket;
-
- constructor(address = '0.0.0.0', port = 50222) {
-
- // this.log = log;
- this.s = dgram.createSocket('udp4');
- this.setupSocket(address, port);
- this.setupSignalHandlers();
- }
-
- private setupSocket(address: string, port: number) {
-
- // this.s.setsockopt(dgram.SOL_SOCKET, dgram.SO_REUSEADDR, 1);
- // this.s.setsockopt(dgram.SOL_SOCKET, dgram.SO_REUSEPORT, 1);
- this.s.bind({ address: address, port: port });
- this.s.on('message', (msg) => {
- try {
- const message_string = msg.toString('utf-8');
- const data = JSON.parse(message_string);
- console.log(data);
- this.processReceivedData(data);
- } catch (error) {
- console.log('JSON processing of data failed');
- console.log(error as string);
- }
- });
-
- this.s.on('error', (err) => {
- console.log('Socket error:', err);
- });
-
- }
-
- private processReceivedData(data: any) {
- // if (data.type === 'obs_air') {
- // console.log(data);
- // // air_tm = this.air_data(data, air_tm);
- // }
-
- if (data.type === 'obs_st') {
- // console.log(data);
- const parsed_data = this.parseTempestData(data);
- console.log(parsed_data);
- // st_tm = this.tempest_data(data, st_tm);
- }
-
- // if (data.type === 'obs_sky') {
- // console.log(data);
- // // sky_tm = this.sky_data(data, sky_tm);
- // }
- }
-
- private parseTempestData(data: any): SocketObservation {
- const obs = data.obs[0];
- const windLull = (obs[1] !== null) ? obs[1] * 2.2369 : 0;
- const windSpeed = (obs[2] !== null) ? obs[2] * 2.2369 : 0;
- const windGust = (obs[3] !== null) ? obs[3] * 2.2369 : 0;
- return {
- timestamp: obs[0],
- windLull: windLull,
- windSpeed: windSpeed,
- windGust: windGust,
- windDirection: obs[4],
- pressure: obs[6],
- temperature: obs[7],
- humidity: obs[8],
- illumination: obs[9],
- uvIndex: obs[10],
- solarRadiation: obs[11],
- rain: parseFloat(obs[12]),
- strikes: obs[14],
- lightningDistance: obs[15],
- reportingInterval: obs[17],
- } as SocketObservation;
-
- }
-
- private setupSignalHandlers() {
-
- process.on('SIGTERM', () => {
- console.log('Got SIGTERM, shutting down Tempest Homebridge...');
- });
-
- process.on('SIGINT', () => {
- console.log('Got SIGINT, shutting down Tempest Homebridge...');
- this.s.close();
- });
-
- }
-
-}
-
-new TempestSocket();
\ No newline at end of file
diff --git a/src/tester.py b/src/tester.py
deleted file mode 100644
index 7a06a7e..0000000
--- a/src/tester.py
+++ /dev/null
@@ -1,30 +0,0 @@
-s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
-s.bind(("0.0.0.0", 50222))
-
-stopped = False
-try:
- while not stopped:
- try:
- hub = s.recvfrom(1024)
- data = json.loads(hub[0].decode("utf-8")) # hub is a truple (json, ip, port)
- except json.JSONDecodeError:
- print("JSON processing of data failed")
- continue
-
- if (data["type"] == "obs_air"):
- print(data)
- # air_tm = self.air_data(data, air_tm)
-
- if (data["type"] == "obs_st"):
- print(data)
- parse_tempest_data(data)
- # st_tm = self.tempest_data(data, st_tm)
-
- if (data["type"] == "obs_sky"):
- print(data)
- # sky_tm = self.sky_data(data, sky_tm)
-except KeyboardInterrupt:
- print("Keyboard Interupt")
-s.close()
\ No newline at end of file
diff --git a/test.py b/test.py
deleted file mode 100644
index 876b1ea..0000000
--- a/test.py
+++ /dev/null
@@ -1,72 +0,0 @@
-import json
-import socket
-
-
-def open_socket_connection():
-
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
- s.bind(("0.0.0.0", 50222))
-
- stopped = False
- try:
- while not stopped:
- try:
- hub = s.recvfrom(1024)
- data = json.loads(hub[0].decode("utf-8")) # hub is a truple (json, ip, port)
- except json.JSONDecodeError:
- print("JSON processing of data failed")
- continue
-
- if (data["type"] == "obs_air"):
- print(data)
- # air_tm = self.air_data(data, air_tm)
-
- if (data["type"] == "obs_st"):
- print(data)
- parse_tempest_data(data)
- # st_tm = self.tempest_data(data, st_tm)
-
- if (data["type"] == "obs_sky"):
- print(data)
- # sky_tm = self.sky_data(data, sky_tm)
- except KeyboardInterrupt:
- print("Keyboard Interupt")
- s.close()
-
-
-def parse_tempest_data(data):
- timestamp = data['obs'][0][0] # ts
- # convert wind speed from m/s to MPH
- if (data["obs"][0][1] is not None):
- wind_lull = data["obs"][0][1] * 2.2369 # wind lull
- else:
- wind_lull = 0
- if (data["obs"][0][2] is not None):
- wind_speed = data["obs"][0][2] * 2.2369 # wind speed
- else:
- wind_speed = 0
- if (data["obs"][0][3] is not None):
- wind_gust = data["obs"][0][3] * 2.2369 # wind gust
- else:
- wind_gust = 0
- wind_direction = data['obs'][0][4] # wind direction
- pressure = data['obs'][0][6] # pressure
- temperature = data['obs'][0][7] # temp
- humidity = data['obs'][0][8] # humidity
- illumination = data['obs'][0][9] # Illumination
- uv_index = data['obs'][0][10] # UV Index
- solar_radiation = data['obs'][0][11] # solar radiation
- rain = float(data['obs'][0][12]) # rain
- strikes = data['obs'][0][14] # strikes
- lightening_distance = data['obs'][0][15] # distance
- reporting_interval = data['obs'][0][17] # reporting interval
-
-
-def main():
- open_socket_connection()
-
-
-if __name__ == "__main__":
- main()
\ No newline at end of file