├── .eslintrc.json ├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── branding └── delayswitch_homebridge.png ├── config.schema.json ├── index.js ├── package-lock.json └── package.json /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es2021": true 6 | }, 7 | "extends": "eslint:recommended", 8 | "parserOptions": { 9 | "ecmaVersion": "latest" 10 | }, 11 | "rules": { 12 | "indent": [ 13 | "error", 14 | "tab" 15 | ], 16 | "linebreak-style": [ 17 | "error", 18 | "unix" 19 | ], 20 | "quotes": [ 21 | "error", 22 | "single" 23 | ], 24 | "semi": [ 25 | "error", 26 | "never" 27 | ] 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | patreon: nitaybz 4 | ko_fi: nitaybz 5 | custom: ['https://paypal.me/nitaybz'] 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | 4 | .vscode -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Nitay Ben Zvi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | logo 2 | 3 | # Homebridge-Delay-Switch 4 | 5 | [![Downloads](https://img.shields.io/npm/dt/homebridge-delay-switch.svg?color=critical)](https://www.npmjs.com/package/homebridge-delay-switch) 6 | [![Version](https://img.shields.io/npm/v/homebridge-delay-switch)](https://www.npmjs.com/package/homebridge-delay-switch) 7 | 8 | [![verified-by-homebridge](https://badgen.net/badge/homebridge/verified/purple)](https://github.com/homebridge/homebridge/wiki/Verified-Plugins) [![Homebridge Discord](https://img.shields.io/discord/432663330281226270?color=728ED5&logo=discord&label=discord)](https://discord.gg/HWUKH9C) 9 | [![certified-hoobs-plugin](https://badgen.net/badge/HOOBS/Certified/yellow)](https://plugins.hoobs.org?ref=10876) [![hoobs-support](https://badgen.net/badge/HOOBS/Support/yellow)](https://support.hoobs.org?ref=10876) 10 | 11 | With this plugin, you can create any number of fake switches that will start a timer when turned ON, when the delay time is reached the switch will automatically turn OFF and trigger a dedicated sensor (motion/contact/occupancy) for 3 seconds. This can be very useful for advanced automation with HomeKit scenes - when delayed actions are required. 12 | 13 | ## Installations 14 | 15 | This plugin is Homebridge verified and HOOBS certified and can be easily installed and configured through their UI. 16 | 17 | If you don't use Homebridge UI or HOOBS, keep reading: 18 | 19 | * ```sudo npm install -g homebridge-delay-switch``` 20 | * Create an accessory in your config.json file 21 | * Restart homebridge 22 | 23 | ## Example config.json 24 | 25 | ``` 26 | "accessories": [ 27 | { 28 | "accessory": "DelaySwitch", 29 | "name": "DelaySwitch", 30 | "startOnReboot": false, 31 | "delay": 5, 32 | "delayUnit": "ms", 33 | "sensorType": "motion", 34 | "flipSensorState": false 35 | } 36 | ] 37 | 38 | ``` 39 | 40 | | Parameter | Description | Required | Default | type | 41 | | -------------------------------- | --------------------------- |:--------:|:--------:|:--------:| 42 | | `accessory` | always `"DelaySwitch"` | ✓ | - | String | 43 | | `name` | Name for your accessory | ✓ | - | String | 44 | | `startOnReboot` | When set to `true`, the switch will be turned ON and start the timer when Homebridge restarts | | `false` | Boolean | 45 | | `delay` | Delay/Timer time. 0 - timer disabled | ✓ | 0 | Integer | 46 | | `delayUnit` | Delay Time Unit: ms / s / m / h / d | ✓ | "ms" | String | 47 | | `sensorType` | The sensor type that will trigger when the time has ended (`null` for no sensor) | | `motion` | String | 48 | | `flipSensorState` | Flips the trigger sensor state (close/open, detected/not detected) | | `false` | Boolean | 49 | 50 | ## Why do we need this Plugin? 51 | 52 | The most common use of this plugin is to turn ON/OFF lights based on a motion/door sensor. This can be achieved by setting an automation to turn ON a light and the delay switch when motion is detected and turn OFF the light when the dedicated delay sensor is triggered (or delay switch is turned OFF). 53 | 54 | Another great example, when using a smart wall switch (to turn ON) and RGB light bulb (to switch color) together on the same scene can cause no action on the bulb since the bulb might not even be ON when the command is sent from Homebridge. 55 | To fix this, we can set an automation to change the bulb color a few seconds after the wall switch ON command. 56 | 57 | Also it can be use with any device that requires a certain delay time after other devices (TV + RPi-Kodi / PC + SSH / etc...) 58 | 59 | ## How it Works 60 | 61 | Basically, all you need to do is: 62 | 63 | 1. Set the desired `delay` time in the config file. 0 - timer disabled. 64 | 2. The plugin will create one switch and optional sensor (motion/contact/occupancy/leak). 65 | 3. Use this switch in any scene or automation. 66 | 4. Set an automation to trigger when this switch is turned OFF or the sensor is triggered, using the Home app or another app such as the Eve app. 67 | 68 | ## Why Add a Trigger Sensor? 69 | 70 | A sensor (motion/contact/occupancy/leak) is created for each accessory in order to be able to cancel the timer and the attached automations. 71 | How does it works? You can set the automation to be triggered from the attached "trigger" sensor instead of the switch OFF command and therefore you can turn OFF the switch and prevent the sensor from triggering or any attached automations from executing. 72 | If you have no use of the sensor you can remove it by setting `"sensorType": null` to your config. 73 | 74 | ## Good to Know 75 | 76 | * **When manually turning OFF the switch, the timer will stop and the sensor will NOT be triggered.** 77 | 78 | * **When the delay switch receives ON command while it's already ON, the timer will restart and the sensor trigger will be delayed.** 79 | 80 | _________________________________________ 81 | 82 | ## Support homebridge-delay-switch 83 | 84 | **homebridge-delay-switch** is a free plugin under the MIT license. it was developed as a contribution to the homebridge/hoobs community with lots of love and thoughts. 85 | Creating and maintaining Homebridge plugins consume a lot of time and effort and if you would like to share your appreciation, feel free to "Star" or donate. 86 | 87 | [![PayPal](https://img.shields.io/badge/PayPal-Donate-blue.svg?logo=paypal)](https://www.paypal.me/nitaybz) 88 | [![Patreon](https://img.shields.io/badge/PATREON-Become%20a%20Patreon-red.svg?logo=patreon)](https://www.patreon.com/nitaybz) 89 | [![Ko-Fi](https://img.shields.io/badge/Ko--Fi-Buy%20me%20a%20coffee-29abe0.svg?logo=ko-fi)](https://ko-fi.com/nitaybz) -------------------------------------------------------------------------------- /branding/delayswitch_homebridge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nitaybz/homebridge-delay-switch/47d90d5861035137206cb5383d8485bd2f72082e/branding/delayswitch_homebridge.png -------------------------------------------------------------------------------- /config.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "pluginAlias": "DelaySwitch", 3 | "pluginType": "accessory", 4 | "singular": false, 5 | "headerDisplay": "Homebridge plugin for creating delay/timer switches and sensors for delayed actions/automations", 6 | "footerDisplay": "Created by @nitaybz", 7 | "schema": { 8 | "type": "object", 9 | "properties": { 10 | "name": { 11 | "title": "Accessory Name", 12 | "description": "Name for the accessory", 13 | "type": "string", 14 | "required": true 15 | }, 16 | "delay": { 17 | "title": "Delay Time", 18 | "description": "Delay to wait until the switch will be turned OFF. Each activation of the switch will reactivate timer (time will restart). 0 - Timer and sensor are disabled.", 19 | "type": "integer", 20 | "default": 5000, 21 | "required": true 22 | }, 23 | "delayUnit": { 24 | "title": "Delay Time Unit", 25 | "description": "Delay Time Unit (milliseconds/seconds/minutes/hours/days).", 26 | "type": "string", 27 | "default": "ms", 28 | "required": true, 29 | "oneOf": [ 30 | { "title": "milliseconds", "enum": ["ms"] }, 31 | { "title": "seconds", "enum": ["s"] }, 32 | { "title": "minutes", "enum": ["m"] }, 33 | { "title": "hours", "enum": ["h"] }, 34 | { "title": "days", "enum": ["d"] } 35 | ] 36 | }, 37 | "sensorType": { 38 | "title": "Trigger Sensor Type", 39 | "description": "Adds an optional sensor that will be activated when the timer comes to an end.", 40 | "type": "string", 41 | "default": "motion", 42 | "required": false, 43 | "oneOf": [ 44 | { "title": "Motion Sensor", "enum": ["motion"] }, 45 | { "title": "Contact Sensor", "enum": ["contact"] }, 46 | { "title": "Occupancy Sensor", "enum": ["occupancy"] }, 47 | { "title": "Leak Sensor", "enum": ["leak"] } 48 | ] 49 | }, 50 | "flipSensorState": { 51 | "title": "Flip Sensor State", 52 | "description": "Enable to flip the trigger sensor state (close/open, detected/not detected).", 53 | "type": "boolean", 54 | "default": false, 55 | "required": false 56 | }, 57 | "startOnReboot": { 58 | "title": "Turn ON when Homebridge Restarts", 59 | "description": "Activate switch after Homebridge restart.", 60 | "type": "boolean", 61 | "default": false, 62 | "required": false 63 | }, 64 | "debug": { 65 | "title": "Enable Debug Logs", 66 | "description": "Produce extra logs for debugging purposes", 67 | "type": "boolean", 68 | "default": false, 69 | "required": false 70 | } 71 | } 72 | }, 73 | "layout": [ 74 | { 75 | "type": "fieldset", 76 | "title": "Basic settings", 77 | "description": "", 78 | "expandable": true, 79 | "expanded": true, 80 | "items": [ 81 | { 82 | "type": "flex", 83 | "flex-flow": "row wrap", 84 | "items": ["name"] 85 | }, 86 | { 87 | "type": "flex", 88 | "flex-flow": "row wrap", 89 | "items": ["startOnReboot"] 90 | } 91 | ] 92 | }, 93 | { 94 | "type": "fieldset", 95 | "title": "Timer", 96 | "description": "", 97 | "expandable": true, 98 | "expanded": false, 99 | "items": [ 100 | { 101 | "type": "flex", 102 | "flex-flow": "row wrap", 103 | "items": ["delay", "delayUnit"] 104 | } 105 | ] 106 | }, 107 | { 108 | "type": "fieldset", 109 | "title": "Trigger Sensor", 110 | "description": "", 111 | "expandable": true, 112 | "expanded": false, 113 | "items": [ 114 | { 115 | "type": "flex", 116 | "flex-flow": "row wrap", 117 | "items": ["sensorType", "flipSensorState"] 118 | } 119 | ] 120 | }, 121 | { 122 | "type": "fieldset", 123 | "title": "Logs", 124 | "description": "", 125 | "expandable": true, 126 | "expanded": false, 127 | "items": [ 128 | { 129 | "type": "flex", 130 | "flex-flow": "row wrap", 131 | "items": ["debug"] 132 | } 133 | ] 134 | } 135 | ] 136 | } 137 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var Service, Characteristic 2 | 3 | module.exports = function (homebridge) { 4 | Service = homebridge.hap.Service 5 | Characteristic = homebridge.hap.Characteristic 6 | homebridge.registerAccessory('homebridge-delay-switch', 'DelaySwitch', delaySwitch) 7 | } 8 | 9 | 10 | function delaySwitch(log, config, api) { 11 | let UUIDGen = api.hap.uuid 12 | 13 | this.log = log 14 | this.name = config['name'] 15 | this.delay = config['delay'] || 0 16 | this.delayUnit = config['delayUnit'] || 'ms' 17 | this.debug = config.debug || false 18 | this.sensorType = config['sensorType'] 19 | if (typeof this.sensorType === 'undefined') 20 | this.sensorType = 'motion' 21 | this.flipSensor = config['flipSensorState'] 22 | this.disableSensor = config['disableSensor'] || !config['sensorType'] || this.delay === 0 23 | this.startOnReboot = config['startOnReboot'] || false 24 | this.switchOn = false 25 | this.sensorTriggered = 0 26 | this.uuid = UUIDGen.generate(this.name) 27 | 28 | 29 | switch (this.delayUnit) { 30 | case 's': 31 | this.delayTime = this.delay * 1000 32 | break 33 | case 'm': 34 | this.delayTime = this.delay * 60 * 1000 35 | break 36 | case 'h': 37 | this.delayTime = this.delay * 60 * 60 * 1000 38 | break 39 | case 'd': 40 | this.delayTime = this.delay * 24 * 60 * 60 * 1000 41 | break 42 | default: 43 | this.delayTime = this.delay 44 | break 45 | } 46 | 47 | // define debug method to output debug logs when enabled in the config 48 | this.log.easyDebug = (...content) => { 49 | if (this.debug) { 50 | this.log(content.reduce((previous, current) => { 51 | return previous + ' ' + current 52 | })) 53 | } else 54 | this.log.debug(content.reduce((previous, current) => { 55 | return previous + ' ' + current 56 | })) 57 | } 58 | 59 | this.getSensorState = () => { 60 | const state = this.sensorTriggered 61 | if (this.flipSensor && this.sensorType === 'motion') 62 | return !state 63 | if (this.sensorType === 'motion') 64 | return !!state 65 | if (this.flipSensor) 66 | return state ^ 1 67 | return state 68 | } 69 | } 70 | 71 | delaySwitch.prototype.getServices = function () { 72 | var informationService = new Service.AccessoryInformation() 73 | 74 | informationService 75 | .setCharacteristic(Characteristic.Manufacturer, 'Delay Switch') 76 | .setCharacteristic(Characteristic.Model, `Delay-${this.delay}${this.delayUnit}`) 77 | .setCharacteristic(Characteristic.SerialNumber, this.uuid) 78 | 79 | 80 | this.switchService = new Service.Switch(this.name) 81 | this.switchService.getCharacteristic(Characteristic.On) 82 | .on('get', this.getOn.bind(this)) 83 | .on('set', this.setOn.bind(this)) 84 | .updateValue(this.startOnReboot) 85 | 86 | var services = [informationService, this.switchService] 87 | 88 | if (!this.disableSensor) { 89 | switch (this.sensorType) { 90 | case 'contact': 91 | this.sensorService = new Service.ContactSensor(this.name + ' Trigger') 92 | this.sensorCharacteristic = Characteristic.ContactSensorState 93 | break 94 | case 'occupancy': 95 | this.sensorService = new Service.OccupancySensor(this.name + ' Trigger') 96 | this.sensorCharacteristic = Characteristic.OccupancyDetected 97 | break 98 | case 'leak': 99 | this.sensorService = new Service.LeakSensor(this.name + ' Trigger') 100 | this.sensorCharacteristic = Characteristic.LeakDetected 101 | break 102 | default: 103 | this.sensorService = new Service.MotionSensor(this.name + ' Trigger') 104 | this.sensorCharacteristic = Characteristic.MotionDetected 105 | break 106 | } 107 | 108 | this.sensorService 109 | .getCharacteristic(this.sensorCharacteristic) 110 | .on('get', (callback) => { 111 | callback(null, this.getSensorState()) 112 | }) 113 | 114 | services.push(this.sensorService) 115 | } 116 | 117 | return services 118 | 119 | } 120 | 121 | delaySwitch.prototype.setOn = function (value, callback) { 122 | 123 | if (value === false) { 124 | this.log.easyDebug('Stopping the Timer') 125 | this.switchOn = false 126 | clearTimeout(this.timer) 127 | this.sensorTriggered = 0 128 | if (!this.disableSensor) 129 | this.sensorService.getCharacteristic(this.sensorCharacteristic).updateValue(this.getSensorState()) 130 | } else if (value === true) { 131 | this.switchOn = true 132 | clearTimeout(this.timer) 133 | if (this.delay > 0) { 134 | this.log.easyDebug('Starting the Timer') 135 | this.timer = setTimeout(function () { 136 | this.log.easyDebug('Time is Up!') 137 | this.switchService.getCharacteristic(Characteristic.On).updateValue(false) 138 | this.switchOn = false 139 | 140 | if (!this.disableSensor) { 141 | this.sensorTriggered = 1 142 | this.sensorService.getCharacteristic(this.sensorCharacteristic).updateValue(this.getSensorState()) 143 | this.log.easyDebug('Triggering Sensor') 144 | setTimeout(function () { 145 | this.sensorTriggered = 0 146 | this.sensorService.getCharacteristic(this.sensorCharacteristic).updateValue(this.getSensorState()) 147 | }.bind(this), 3000) 148 | } 149 | 150 | }.bind(this), this.delayTime) 151 | } 152 | } 153 | callback() 154 | } 155 | 156 | delaySwitch.prototype.getOn = function (callback) { 157 | callback(null, this.switchOn) 158 | } 159 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homebridge-delay-switch", 3 | "version": "3.2.5", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "homebridge-delay-switch", 9 | "version": "3.2.5", 10 | "funding": [ 11 | { 12 | "type": "paypal", 13 | "url": "https://paypal.me/nitaybz" 14 | }, 15 | { 16 | "type": "patreon", 17 | "url": "https://www.patreon.com/nitaybz" 18 | }, 19 | { 20 | "type": "kofi", 21 | "url": "https://ko-fi.com/nitaybz" 22 | } 23 | ], 24 | "license": "MIT", 25 | "devDependencies": { 26 | "eslint": "^8.55.0" 27 | }, 28 | "engines": { 29 | "homebridge": ">=1.5.0", 30 | "node": ">=15.0.0" 31 | } 32 | }, 33 | "node_modules/@aashutoshrathi/word-wrap": { 34 | "version": "1.2.6", 35 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 36 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 37 | "dev": true, 38 | "engines": { 39 | "node": ">=0.10.0" 40 | } 41 | }, 42 | "node_modules/@eslint-community/eslint-utils": { 43 | "version": "4.4.0", 44 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 45 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 46 | "dev": true, 47 | "dependencies": { 48 | "eslint-visitor-keys": "^3.3.0" 49 | }, 50 | "engines": { 51 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 52 | }, 53 | "peerDependencies": { 54 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 55 | } 56 | }, 57 | "node_modules/@eslint-community/regexpp": { 58 | "version": "4.10.0", 59 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", 60 | "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", 61 | "dev": true, 62 | "engines": { 63 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 64 | } 65 | }, 66 | "node_modules/@eslint/eslintrc": { 67 | "version": "2.1.4", 68 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", 69 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 70 | "dev": true, 71 | "dependencies": { 72 | "ajv": "^6.12.4", 73 | "debug": "^4.3.2", 74 | "espree": "^9.6.0", 75 | "globals": "^13.19.0", 76 | "ignore": "^5.2.0", 77 | "import-fresh": "^3.2.1", 78 | "js-yaml": "^4.1.0", 79 | "minimatch": "^3.1.2", 80 | "strip-json-comments": "^3.1.1" 81 | }, 82 | "engines": { 83 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 84 | }, 85 | "funding": { 86 | "url": "https://opencollective.com/eslint" 87 | } 88 | }, 89 | "node_modules/@eslint/js": { 90 | "version": "8.55.0", 91 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", 92 | "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", 93 | "dev": true, 94 | "engines": { 95 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 96 | } 97 | }, 98 | "node_modules/@humanwhocodes/config-array": { 99 | "version": "0.11.13", 100 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", 101 | "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", 102 | "dev": true, 103 | "dependencies": { 104 | "@humanwhocodes/object-schema": "^2.0.1", 105 | "debug": "^4.1.1", 106 | "minimatch": "^3.0.5" 107 | }, 108 | "engines": { 109 | "node": ">=10.10.0" 110 | } 111 | }, 112 | "node_modules/@humanwhocodes/module-importer": { 113 | "version": "1.0.1", 114 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 115 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 116 | "dev": true, 117 | "engines": { 118 | "node": ">=12.22" 119 | }, 120 | "funding": { 121 | "type": "github", 122 | "url": "https://github.com/sponsors/nzakas" 123 | } 124 | }, 125 | "node_modules/@humanwhocodes/object-schema": { 126 | "version": "2.0.1", 127 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", 128 | "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", 129 | "dev": true 130 | }, 131 | "node_modules/@nodelib/fs.scandir": { 132 | "version": "2.1.5", 133 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 134 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 135 | "dev": true, 136 | "dependencies": { 137 | "@nodelib/fs.stat": "2.0.5", 138 | "run-parallel": "^1.1.9" 139 | }, 140 | "engines": { 141 | "node": ">= 8" 142 | } 143 | }, 144 | "node_modules/@nodelib/fs.stat": { 145 | "version": "2.0.5", 146 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 147 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 148 | "dev": true, 149 | "engines": { 150 | "node": ">= 8" 151 | } 152 | }, 153 | "node_modules/@nodelib/fs.walk": { 154 | "version": "1.2.8", 155 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 156 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 157 | "dev": true, 158 | "dependencies": { 159 | "@nodelib/fs.scandir": "2.1.5", 160 | "fastq": "^1.6.0" 161 | }, 162 | "engines": { 163 | "node": ">= 8" 164 | } 165 | }, 166 | "node_modules/@ungap/structured-clone": { 167 | "version": "1.2.0", 168 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 169 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 170 | "dev": true 171 | }, 172 | "node_modules/acorn": { 173 | "version": "8.11.2", 174 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", 175 | "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", 176 | "dev": true, 177 | "bin": { 178 | "acorn": "bin/acorn" 179 | }, 180 | "engines": { 181 | "node": ">=0.4.0" 182 | } 183 | }, 184 | "node_modules/acorn-jsx": { 185 | "version": "5.3.2", 186 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 187 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 188 | "dev": true, 189 | "peerDependencies": { 190 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 191 | } 192 | }, 193 | "node_modules/ajv": { 194 | "version": "6.12.6", 195 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 196 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 197 | "dev": true, 198 | "dependencies": { 199 | "fast-deep-equal": "^3.1.1", 200 | "fast-json-stable-stringify": "^2.0.0", 201 | "json-schema-traverse": "^0.4.1", 202 | "uri-js": "^4.2.2" 203 | }, 204 | "funding": { 205 | "type": "github", 206 | "url": "https://github.com/sponsors/epoberezkin" 207 | } 208 | }, 209 | "node_modules/ansi-regex": { 210 | "version": "5.0.1", 211 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 212 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 213 | "dev": true, 214 | "engines": { 215 | "node": ">=8" 216 | } 217 | }, 218 | "node_modules/ansi-styles": { 219 | "version": "4.3.0", 220 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 221 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 222 | "dev": true, 223 | "dependencies": { 224 | "color-convert": "^2.0.1" 225 | }, 226 | "engines": { 227 | "node": ">=8" 228 | }, 229 | "funding": { 230 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 231 | } 232 | }, 233 | "node_modules/argparse": { 234 | "version": "2.0.1", 235 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 236 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 237 | "dev": true 238 | }, 239 | "node_modules/balanced-match": { 240 | "version": "1.0.2", 241 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 242 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 243 | "dev": true 244 | }, 245 | "node_modules/brace-expansion": { 246 | "version": "1.1.11", 247 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 248 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 249 | "dev": true, 250 | "dependencies": { 251 | "balanced-match": "^1.0.0", 252 | "concat-map": "0.0.1" 253 | } 254 | }, 255 | "node_modules/callsites": { 256 | "version": "3.1.0", 257 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 258 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 259 | "dev": true, 260 | "engines": { 261 | "node": ">=6" 262 | } 263 | }, 264 | "node_modules/chalk": { 265 | "version": "4.1.2", 266 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 267 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 268 | "dev": true, 269 | "dependencies": { 270 | "ansi-styles": "^4.1.0", 271 | "supports-color": "^7.1.0" 272 | }, 273 | "engines": { 274 | "node": ">=10" 275 | }, 276 | "funding": { 277 | "url": "https://github.com/chalk/chalk?sponsor=1" 278 | } 279 | }, 280 | "node_modules/color-convert": { 281 | "version": "2.0.1", 282 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 283 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 284 | "dev": true, 285 | "dependencies": { 286 | "color-name": "~1.1.4" 287 | }, 288 | "engines": { 289 | "node": ">=7.0.0" 290 | } 291 | }, 292 | "node_modules/color-name": { 293 | "version": "1.1.4", 294 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 295 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 296 | "dev": true 297 | }, 298 | "node_modules/concat-map": { 299 | "version": "0.0.1", 300 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 301 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 302 | "dev": true 303 | }, 304 | "node_modules/cross-spawn": { 305 | "version": "7.0.3", 306 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 307 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 308 | "dev": true, 309 | "dependencies": { 310 | "path-key": "^3.1.0", 311 | "shebang-command": "^2.0.0", 312 | "which": "^2.0.1" 313 | }, 314 | "engines": { 315 | "node": ">= 8" 316 | } 317 | }, 318 | "node_modules/debug": { 319 | "version": "4.3.4", 320 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 321 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 322 | "dev": true, 323 | "dependencies": { 324 | "ms": "2.1.2" 325 | }, 326 | "engines": { 327 | "node": ">=6.0" 328 | }, 329 | "peerDependenciesMeta": { 330 | "supports-color": { 331 | "optional": true 332 | } 333 | } 334 | }, 335 | "node_modules/deep-is": { 336 | "version": "0.1.4", 337 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 338 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 339 | "dev": true 340 | }, 341 | "node_modules/doctrine": { 342 | "version": "3.0.0", 343 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 344 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 345 | "dev": true, 346 | "dependencies": { 347 | "esutils": "^2.0.2" 348 | }, 349 | "engines": { 350 | "node": ">=6.0.0" 351 | } 352 | }, 353 | "node_modules/escape-string-regexp": { 354 | "version": "4.0.0", 355 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 356 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 357 | "dev": true, 358 | "engines": { 359 | "node": ">=10" 360 | }, 361 | "funding": { 362 | "url": "https://github.com/sponsors/sindresorhus" 363 | } 364 | }, 365 | "node_modules/eslint": { 366 | "version": "8.55.0", 367 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", 368 | "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", 369 | "dev": true, 370 | "dependencies": { 371 | "@eslint-community/eslint-utils": "^4.2.0", 372 | "@eslint-community/regexpp": "^4.6.1", 373 | "@eslint/eslintrc": "^2.1.4", 374 | "@eslint/js": "8.55.0", 375 | "@humanwhocodes/config-array": "^0.11.13", 376 | "@humanwhocodes/module-importer": "^1.0.1", 377 | "@nodelib/fs.walk": "^1.2.8", 378 | "@ungap/structured-clone": "^1.2.0", 379 | "ajv": "^6.12.4", 380 | "chalk": "^4.0.0", 381 | "cross-spawn": "^7.0.2", 382 | "debug": "^4.3.2", 383 | "doctrine": "^3.0.0", 384 | "escape-string-regexp": "^4.0.0", 385 | "eslint-scope": "^7.2.2", 386 | "eslint-visitor-keys": "^3.4.3", 387 | "espree": "^9.6.1", 388 | "esquery": "^1.4.2", 389 | "esutils": "^2.0.2", 390 | "fast-deep-equal": "^3.1.3", 391 | "file-entry-cache": "^6.0.1", 392 | "find-up": "^5.0.0", 393 | "glob-parent": "^6.0.2", 394 | "globals": "^13.19.0", 395 | "graphemer": "^1.4.0", 396 | "ignore": "^5.2.0", 397 | "imurmurhash": "^0.1.4", 398 | "is-glob": "^4.0.0", 399 | "is-path-inside": "^3.0.3", 400 | "js-yaml": "^4.1.0", 401 | "json-stable-stringify-without-jsonify": "^1.0.1", 402 | "levn": "^0.4.1", 403 | "lodash.merge": "^4.6.2", 404 | "minimatch": "^3.1.2", 405 | "natural-compare": "^1.4.0", 406 | "optionator": "^0.9.3", 407 | "strip-ansi": "^6.0.1", 408 | "text-table": "^0.2.0" 409 | }, 410 | "bin": { 411 | "eslint": "bin/eslint.js" 412 | }, 413 | "engines": { 414 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 415 | }, 416 | "funding": { 417 | "url": "https://opencollective.com/eslint" 418 | } 419 | }, 420 | "node_modules/eslint-scope": { 421 | "version": "7.2.2", 422 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 423 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 424 | "dev": true, 425 | "dependencies": { 426 | "esrecurse": "^4.3.0", 427 | "estraverse": "^5.2.0" 428 | }, 429 | "engines": { 430 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 431 | }, 432 | "funding": { 433 | "url": "https://opencollective.com/eslint" 434 | } 435 | }, 436 | "node_modules/eslint-visitor-keys": { 437 | "version": "3.4.3", 438 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 439 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 440 | "dev": true, 441 | "engines": { 442 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 443 | }, 444 | "funding": { 445 | "url": "https://opencollective.com/eslint" 446 | } 447 | }, 448 | "node_modules/espree": { 449 | "version": "9.6.1", 450 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 451 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 452 | "dev": true, 453 | "dependencies": { 454 | "acorn": "^8.9.0", 455 | "acorn-jsx": "^5.3.2", 456 | "eslint-visitor-keys": "^3.4.1" 457 | }, 458 | "engines": { 459 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 460 | }, 461 | "funding": { 462 | "url": "https://opencollective.com/eslint" 463 | } 464 | }, 465 | "node_modules/esquery": { 466 | "version": "1.5.0", 467 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 468 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 469 | "dev": true, 470 | "dependencies": { 471 | "estraverse": "^5.1.0" 472 | }, 473 | "engines": { 474 | "node": ">=0.10" 475 | } 476 | }, 477 | "node_modules/esrecurse": { 478 | "version": "4.3.0", 479 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 480 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 481 | "dev": true, 482 | "dependencies": { 483 | "estraverse": "^5.2.0" 484 | }, 485 | "engines": { 486 | "node": ">=4.0" 487 | } 488 | }, 489 | "node_modules/estraverse": { 490 | "version": "5.3.0", 491 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 492 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 493 | "dev": true, 494 | "engines": { 495 | "node": ">=4.0" 496 | } 497 | }, 498 | "node_modules/esutils": { 499 | "version": "2.0.3", 500 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 501 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 502 | "dev": true, 503 | "engines": { 504 | "node": ">=0.10.0" 505 | } 506 | }, 507 | "node_modules/fast-deep-equal": { 508 | "version": "3.1.3", 509 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 510 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 511 | "dev": true 512 | }, 513 | "node_modules/fast-json-stable-stringify": { 514 | "version": "2.1.0", 515 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 516 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 517 | "dev": true 518 | }, 519 | "node_modules/fast-levenshtein": { 520 | "version": "2.0.6", 521 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 522 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 523 | "dev": true 524 | }, 525 | "node_modules/fastq": { 526 | "version": "1.15.0", 527 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 528 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 529 | "dev": true, 530 | "dependencies": { 531 | "reusify": "^1.0.4" 532 | } 533 | }, 534 | "node_modules/file-entry-cache": { 535 | "version": "6.0.1", 536 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 537 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 538 | "dev": true, 539 | "dependencies": { 540 | "flat-cache": "^3.0.4" 541 | }, 542 | "engines": { 543 | "node": "^10.12.0 || >=12.0.0" 544 | } 545 | }, 546 | "node_modules/find-up": { 547 | "version": "5.0.0", 548 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 549 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 550 | "dev": true, 551 | "dependencies": { 552 | "locate-path": "^6.0.0", 553 | "path-exists": "^4.0.0" 554 | }, 555 | "engines": { 556 | "node": ">=10" 557 | }, 558 | "funding": { 559 | "url": "https://github.com/sponsors/sindresorhus" 560 | } 561 | }, 562 | "node_modules/flat-cache": { 563 | "version": "3.2.0", 564 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 565 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 566 | "dev": true, 567 | "dependencies": { 568 | "flatted": "^3.2.9", 569 | "keyv": "^4.5.3", 570 | "rimraf": "^3.0.2" 571 | }, 572 | "engines": { 573 | "node": "^10.12.0 || >=12.0.0" 574 | } 575 | }, 576 | "node_modules/flatted": { 577 | "version": "3.2.9", 578 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", 579 | "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", 580 | "dev": true 581 | }, 582 | "node_modules/fs.realpath": { 583 | "version": "1.0.0", 584 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 585 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 586 | "dev": true 587 | }, 588 | "node_modules/glob": { 589 | "version": "7.2.3", 590 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 591 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 592 | "dev": true, 593 | "dependencies": { 594 | "fs.realpath": "^1.0.0", 595 | "inflight": "^1.0.4", 596 | "inherits": "2", 597 | "minimatch": "^3.1.1", 598 | "once": "^1.3.0", 599 | "path-is-absolute": "^1.0.0" 600 | }, 601 | "engines": { 602 | "node": "*" 603 | }, 604 | "funding": { 605 | "url": "https://github.com/sponsors/isaacs" 606 | } 607 | }, 608 | "node_modules/glob-parent": { 609 | "version": "6.0.2", 610 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 611 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 612 | "dev": true, 613 | "dependencies": { 614 | "is-glob": "^4.0.3" 615 | }, 616 | "engines": { 617 | "node": ">=10.13.0" 618 | } 619 | }, 620 | "node_modules/globals": { 621 | "version": "13.24.0", 622 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 623 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 624 | "dev": true, 625 | "dependencies": { 626 | "type-fest": "^0.20.2" 627 | }, 628 | "engines": { 629 | "node": ">=8" 630 | }, 631 | "funding": { 632 | "url": "https://github.com/sponsors/sindresorhus" 633 | } 634 | }, 635 | "node_modules/graphemer": { 636 | "version": "1.4.0", 637 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 638 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 639 | "dev": true 640 | }, 641 | "node_modules/has-flag": { 642 | "version": "4.0.0", 643 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 644 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 645 | "dev": true, 646 | "engines": { 647 | "node": ">=8" 648 | } 649 | }, 650 | "node_modules/ignore": { 651 | "version": "5.3.0", 652 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", 653 | "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", 654 | "dev": true, 655 | "engines": { 656 | "node": ">= 4" 657 | } 658 | }, 659 | "node_modules/import-fresh": { 660 | "version": "3.3.0", 661 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 662 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 663 | "dev": true, 664 | "dependencies": { 665 | "parent-module": "^1.0.0", 666 | "resolve-from": "^4.0.0" 667 | }, 668 | "engines": { 669 | "node": ">=6" 670 | }, 671 | "funding": { 672 | "url": "https://github.com/sponsors/sindresorhus" 673 | } 674 | }, 675 | "node_modules/imurmurhash": { 676 | "version": "0.1.4", 677 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 678 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 679 | "dev": true, 680 | "engines": { 681 | "node": ">=0.8.19" 682 | } 683 | }, 684 | "node_modules/inflight": { 685 | "version": "1.0.6", 686 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 687 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 688 | "dev": true, 689 | "dependencies": { 690 | "once": "^1.3.0", 691 | "wrappy": "1" 692 | } 693 | }, 694 | "node_modules/inherits": { 695 | "version": "2.0.4", 696 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 697 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 698 | "dev": true 699 | }, 700 | "node_modules/is-extglob": { 701 | "version": "2.1.1", 702 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 703 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 704 | "dev": true, 705 | "engines": { 706 | "node": ">=0.10.0" 707 | } 708 | }, 709 | "node_modules/is-glob": { 710 | "version": "4.0.3", 711 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 712 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 713 | "dev": true, 714 | "dependencies": { 715 | "is-extglob": "^2.1.1" 716 | }, 717 | "engines": { 718 | "node": ">=0.10.0" 719 | } 720 | }, 721 | "node_modules/is-path-inside": { 722 | "version": "3.0.3", 723 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 724 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 725 | "dev": true, 726 | "engines": { 727 | "node": ">=8" 728 | } 729 | }, 730 | "node_modules/isexe": { 731 | "version": "2.0.0", 732 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 733 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 734 | "dev": true 735 | }, 736 | "node_modules/js-yaml": { 737 | "version": "4.1.0", 738 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 739 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 740 | "dev": true, 741 | "dependencies": { 742 | "argparse": "^2.0.1" 743 | }, 744 | "bin": { 745 | "js-yaml": "bin/js-yaml.js" 746 | } 747 | }, 748 | "node_modules/json-buffer": { 749 | "version": "3.0.1", 750 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 751 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 752 | "dev": true 753 | }, 754 | "node_modules/json-schema-traverse": { 755 | "version": "0.4.1", 756 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 757 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 758 | "dev": true 759 | }, 760 | "node_modules/json-stable-stringify-without-jsonify": { 761 | "version": "1.0.1", 762 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 763 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 764 | "dev": true 765 | }, 766 | "node_modules/keyv": { 767 | "version": "4.5.4", 768 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 769 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 770 | "dev": true, 771 | "dependencies": { 772 | "json-buffer": "3.0.1" 773 | } 774 | }, 775 | "node_modules/levn": { 776 | "version": "0.4.1", 777 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 778 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 779 | "dev": true, 780 | "dependencies": { 781 | "prelude-ls": "^1.2.1", 782 | "type-check": "~0.4.0" 783 | }, 784 | "engines": { 785 | "node": ">= 0.8.0" 786 | } 787 | }, 788 | "node_modules/locate-path": { 789 | "version": "6.0.0", 790 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 791 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 792 | "dev": true, 793 | "dependencies": { 794 | "p-locate": "^5.0.0" 795 | }, 796 | "engines": { 797 | "node": ">=10" 798 | }, 799 | "funding": { 800 | "url": "https://github.com/sponsors/sindresorhus" 801 | } 802 | }, 803 | "node_modules/lodash.merge": { 804 | "version": "4.6.2", 805 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 806 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 807 | "dev": true 808 | }, 809 | "node_modules/minimatch": { 810 | "version": "3.1.2", 811 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 812 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 813 | "dev": true, 814 | "dependencies": { 815 | "brace-expansion": "^1.1.7" 816 | }, 817 | "engines": { 818 | "node": "*" 819 | } 820 | }, 821 | "node_modules/ms": { 822 | "version": "2.1.2", 823 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 824 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 825 | "dev": true 826 | }, 827 | "node_modules/natural-compare": { 828 | "version": "1.4.0", 829 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 830 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 831 | "dev": true 832 | }, 833 | "node_modules/once": { 834 | "version": "1.4.0", 835 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 836 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 837 | "dev": true, 838 | "dependencies": { 839 | "wrappy": "1" 840 | } 841 | }, 842 | "node_modules/optionator": { 843 | "version": "0.9.3", 844 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 845 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 846 | "dev": true, 847 | "dependencies": { 848 | "@aashutoshrathi/word-wrap": "^1.2.3", 849 | "deep-is": "^0.1.3", 850 | "fast-levenshtein": "^2.0.6", 851 | "levn": "^0.4.1", 852 | "prelude-ls": "^1.2.1", 853 | "type-check": "^0.4.0" 854 | }, 855 | "engines": { 856 | "node": ">= 0.8.0" 857 | } 858 | }, 859 | "node_modules/p-limit": { 860 | "version": "3.1.0", 861 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 862 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 863 | "dev": true, 864 | "dependencies": { 865 | "yocto-queue": "^0.1.0" 866 | }, 867 | "engines": { 868 | "node": ">=10" 869 | }, 870 | "funding": { 871 | "url": "https://github.com/sponsors/sindresorhus" 872 | } 873 | }, 874 | "node_modules/p-locate": { 875 | "version": "5.0.0", 876 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 877 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 878 | "dev": true, 879 | "dependencies": { 880 | "p-limit": "^3.0.2" 881 | }, 882 | "engines": { 883 | "node": ">=10" 884 | }, 885 | "funding": { 886 | "url": "https://github.com/sponsors/sindresorhus" 887 | } 888 | }, 889 | "node_modules/parent-module": { 890 | "version": "1.0.1", 891 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 892 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 893 | "dev": true, 894 | "dependencies": { 895 | "callsites": "^3.0.0" 896 | }, 897 | "engines": { 898 | "node": ">=6" 899 | } 900 | }, 901 | "node_modules/path-exists": { 902 | "version": "4.0.0", 903 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 904 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 905 | "dev": true, 906 | "engines": { 907 | "node": ">=8" 908 | } 909 | }, 910 | "node_modules/path-is-absolute": { 911 | "version": "1.0.1", 912 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 913 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 914 | "dev": true, 915 | "engines": { 916 | "node": ">=0.10.0" 917 | } 918 | }, 919 | "node_modules/path-key": { 920 | "version": "3.1.1", 921 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 922 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 923 | "dev": true, 924 | "engines": { 925 | "node": ">=8" 926 | } 927 | }, 928 | "node_modules/prelude-ls": { 929 | "version": "1.2.1", 930 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 931 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 932 | "dev": true, 933 | "engines": { 934 | "node": ">= 0.8.0" 935 | } 936 | }, 937 | "node_modules/punycode": { 938 | "version": "2.3.1", 939 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 940 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 941 | "dev": true, 942 | "engines": { 943 | "node": ">=6" 944 | } 945 | }, 946 | "node_modules/queue-microtask": { 947 | "version": "1.2.3", 948 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 949 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 950 | "dev": true, 951 | "funding": [ 952 | { 953 | "type": "github", 954 | "url": "https://github.com/sponsors/feross" 955 | }, 956 | { 957 | "type": "patreon", 958 | "url": "https://www.patreon.com/feross" 959 | }, 960 | { 961 | "type": "consulting", 962 | "url": "https://feross.org/support" 963 | } 964 | ] 965 | }, 966 | "node_modules/resolve-from": { 967 | "version": "4.0.0", 968 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 969 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 970 | "dev": true, 971 | "engines": { 972 | "node": ">=4" 973 | } 974 | }, 975 | "node_modules/reusify": { 976 | "version": "1.0.4", 977 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 978 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 979 | "dev": true, 980 | "engines": { 981 | "iojs": ">=1.0.0", 982 | "node": ">=0.10.0" 983 | } 984 | }, 985 | "node_modules/rimraf": { 986 | "version": "3.0.2", 987 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 988 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 989 | "dev": true, 990 | "dependencies": { 991 | "glob": "^7.1.3" 992 | }, 993 | "bin": { 994 | "rimraf": "bin.js" 995 | }, 996 | "funding": { 997 | "url": "https://github.com/sponsors/isaacs" 998 | } 999 | }, 1000 | "node_modules/run-parallel": { 1001 | "version": "1.2.0", 1002 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1003 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1004 | "dev": true, 1005 | "funding": [ 1006 | { 1007 | "type": "github", 1008 | "url": "https://github.com/sponsors/feross" 1009 | }, 1010 | { 1011 | "type": "patreon", 1012 | "url": "https://www.patreon.com/feross" 1013 | }, 1014 | { 1015 | "type": "consulting", 1016 | "url": "https://feross.org/support" 1017 | } 1018 | ], 1019 | "dependencies": { 1020 | "queue-microtask": "^1.2.2" 1021 | } 1022 | }, 1023 | "node_modules/shebang-command": { 1024 | "version": "2.0.0", 1025 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1026 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1027 | "dev": true, 1028 | "dependencies": { 1029 | "shebang-regex": "^3.0.0" 1030 | }, 1031 | "engines": { 1032 | "node": ">=8" 1033 | } 1034 | }, 1035 | "node_modules/shebang-regex": { 1036 | "version": "3.0.0", 1037 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1038 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1039 | "dev": true, 1040 | "engines": { 1041 | "node": ">=8" 1042 | } 1043 | }, 1044 | "node_modules/strip-ansi": { 1045 | "version": "6.0.1", 1046 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1047 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1048 | "dev": true, 1049 | "dependencies": { 1050 | "ansi-regex": "^5.0.1" 1051 | }, 1052 | "engines": { 1053 | "node": ">=8" 1054 | } 1055 | }, 1056 | "node_modules/strip-json-comments": { 1057 | "version": "3.1.1", 1058 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1059 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1060 | "dev": true, 1061 | "engines": { 1062 | "node": ">=8" 1063 | }, 1064 | "funding": { 1065 | "url": "https://github.com/sponsors/sindresorhus" 1066 | } 1067 | }, 1068 | "node_modules/supports-color": { 1069 | "version": "7.2.0", 1070 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1071 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1072 | "dev": true, 1073 | "dependencies": { 1074 | "has-flag": "^4.0.0" 1075 | }, 1076 | "engines": { 1077 | "node": ">=8" 1078 | } 1079 | }, 1080 | "node_modules/text-table": { 1081 | "version": "0.2.0", 1082 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1083 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1084 | "dev": true 1085 | }, 1086 | "node_modules/type-check": { 1087 | "version": "0.4.0", 1088 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1089 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1090 | "dev": true, 1091 | "dependencies": { 1092 | "prelude-ls": "^1.2.1" 1093 | }, 1094 | "engines": { 1095 | "node": ">= 0.8.0" 1096 | } 1097 | }, 1098 | "node_modules/type-fest": { 1099 | "version": "0.20.2", 1100 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1101 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1102 | "dev": true, 1103 | "engines": { 1104 | "node": ">=10" 1105 | }, 1106 | "funding": { 1107 | "url": "https://github.com/sponsors/sindresorhus" 1108 | } 1109 | }, 1110 | "node_modules/uri-js": { 1111 | "version": "4.4.1", 1112 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1113 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1114 | "dev": true, 1115 | "dependencies": { 1116 | "punycode": "^2.1.0" 1117 | } 1118 | }, 1119 | "node_modules/which": { 1120 | "version": "2.0.2", 1121 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1122 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1123 | "dev": true, 1124 | "dependencies": { 1125 | "isexe": "^2.0.0" 1126 | }, 1127 | "bin": { 1128 | "node-which": "bin/node-which" 1129 | }, 1130 | "engines": { 1131 | "node": ">= 8" 1132 | } 1133 | }, 1134 | "node_modules/wrappy": { 1135 | "version": "1.0.2", 1136 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1137 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1138 | "dev": true 1139 | }, 1140 | "node_modules/yocto-queue": { 1141 | "version": "0.1.0", 1142 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1143 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1144 | "dev": true, 1145 | "engines": { 1146 | "node": ">=10" 1147 | }, 1148 | "funding": { 1149 | "url": "https://github.com/sponsors/sindresorhus" 1150 | } 1151 | } 1152 | } 1153 | } 1154 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homebridge-delay-switch", 3 | "version": "3.2.5", 4 | "description": "Delay switches for Homebridge", 5 | "license": "MIT", 6 | "keywords": [ 7 | "homebridge-plugin", 8 | "delay", 9 | "timer", 10 | "automation" 11 | ], 12 | "repository": { 13 | "type": "git", 14 | "url": "git://github.com/nitaybz/homebridge-delay-switch.git" 15 | }, 16 | "bugs": { 17 | "url": "https://github.com/nitaybz/homebridge-delay-switch/issues" 18 | }, 19 | "engines": { 20 | "node": ">=15.0.0", 21 | "homebridge": ">=1.5.0" 22 | }, 23 | "funding": [ 24 | { 25 | "type": "paypal", 26 | "url": "https://paypal.me/nitaybz" 27 | }, 28 | { 29 | "type": "patreon", 30 | "url": "https://www.patreon.com/nitaybz" 31 | }, 32 | { 33 | "type": "kofi", 34 | "url": "https://ko-fi.com/nitaybz" 35 | } 36 | ], 37 | "scripts": { 38 | "lint": "eslint .", 39 | "lint:fix": "eslint . --fix", 40 | "test": "" 41 | }, 42 | "devDependencies": { 43 | "eslint": "^8.55.0" 44 | } 45 | } 46 | --------------------------------------------------------------------------------